130 lines
5.1 KiB
Python
130 lines
5.1 KiB
Python
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() |