kancelyary_project/tests/test_database.py

130 lines
5.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import unittest
import sqlite3
import os
import sys
import tempfile
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from database import get_db_connection, create_tables, calculate_discount, get_discount_description, \
calculate_discount_for_new_order
class TestDatabase(unittest.TestCase):
"""Тестирование функций базы данных"""
def setUp(self):
"""Создаем временную базу данных перед каждым тестом"""
self.db_fd, self.db_path = tempfile.mkstemp()
# Подменяем путь к БД
import database
database.DATABASE = self.db_path
# Создаем таблицы
create_tables()
# Добавляем тестовые данные
self.conn = sqlite3.connect(self.db_path)
self.conn.row_factory = sqlite3.Row
cursor = self.conn.cursor()
# Добавляем типы товаров
cursor.executemany('''
INSERT INTO product_types (type_name, description) VALUES (?, ?)
''', [
('Ручки', 'Пишущие принадлежности'),
('Тетради', 'Школьные тетради')
])
# Добавляем партнеров (БЕЗ rating)
cursor.executemany('''
INSERT INTO partners (name, director, email, phone, legal_address, inn)
VALUES (?, ?, ?, ?, ?, ?)
''', [
('ООО Тест', 'Иванов И.И.', 'test@test.ru', '+7(999)123-45-67',
'г. Москва', '7701123456'),
('ИП Тестов', 'Петров П.П.', 'test2@test.ru', '+7(999)765-43-21',
'г. Москва', '7701765432')
])
# Добавляем товары (БЕЗ quantity_in_stock)
cursor.executemany('''
INSERT INTO products (product_type_id, product_name, article, min_partner_price)
VALUES (?, ?, ?, ?)
''', [
(1, 'Ручка тестовая', 'R001', 100.0),
(2, 'Тетрадь тестовая', 'T001', 200.0)
])
# Добавляем заказы (БЕЗ status)
cursor.execute('''
INSERT INTO orders (partner_id, order_date, notes, discount_percent)
VALUES (?, ?, ?, ?)
''', (1, '2026-01-15', 'Тестовый заказ', 0))
cursor.execute('''
INSERT INTO orders (partner_id, order_date, notes, discount_percent)
VALUES (?, ?, ?, ?)
''', (1, '2026-02-15', 'Второй заказ', 15))
cursor.execute('''
INSERT INTO orders (partner_id, order_date, notes, discount_percent)
VALUES (?, ?, ?, ?)
''', (2, '2026-03-15', 'Третий заказ', 30))
# Добавляем позиции заказов
cursor.executemany('''
INSERT INTO order_items (order_id, product_id, quantity, price_at_order)
VALUES (?, ?, ?, ?)
''', [
(1, 1, 10, 100.0),
(1, 2, 5, 200.0),
(2, 1, 20, 100.0),
(3, 2, 15, 200.0)
])
self.conn.commit()
def tearDown(self):
"""Закрываем и удаляем временную базу данных"""
self.conn.close()
os.close(self.db_fd)
os.unlink(self.db_path)
def test_1_connection(self):
"""Тест подключения к базе данных"""
conn = get_db_connection()
self.assertIsNotNone(conn)
conn.close()
def test_2_calculate_discount(self):
"""Тест расчета скидки"""
self.assertEqual(calculate_discount(100000), 0)
self.assertEqual(calculate_discount(150000), 15)
self.assertEqual(calculate_discount(200000), 30)
self.assertEqual(calculate_discount(300000), 50)
self.assertEqual(calculate_discount(500000), 50)
def test_3_get_discount_description(self):
"""Тест описания скидки"""
self.assertEqual(get_discount_description(0), '0% (до 150 000 руб.)')
self.assertEqual(get_discount_description(15), '15% (150 000 - 199 999 руб.)')
self.assertEqual(get_discount_description(30), '30% (200 000 - 299 999 руб.)')
self.assertEqual(get_discount_description(50), '50% (300 000+ руб.)')
def test_4_calculate_discount_for_new_order(self):
"""Тест расчета скидки для нового заказа"""
# Первый заказ (сумма 10000) - без скидки
discount = calculate_discount_for_new_order(1, '2026-04-01', 10000)
self.assertEqual(discount, 0)
# Рассчитаем общую сумму предыдущих заказов для партнера 1
# Заказы: 1 (10*100 + 5*200 = 2000), 2 (20*100 = 2000), итого 4000
# Новый заказ 146000 - должно быть 15% скидка (4000 + 146000 = 150000)
discount = calculate_discount_for_new_order(1, '2026-04-03', 146000)
self.assertEqual(discount, 15)
if __name__ == '__main__':
unittest.main()