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()