108 lines
3.9 KiB
Python
108 lines
3.9 KiB
Python
import unittest
|
||
from app import create_app, db
|
||
from app.models import Partners, Categories, Inventory, IssueOrders, IssueOrderItems, ReturnOrders, ReturnOrderItems
|
||
from app.utils import calculate_item_price
|
||
from datetime import datetime
|
||
|
||
class TestIntegration(unittest.TestCase):
|
||
def setUp(self):
|
||
self.app = create_app()
|
||
self.app.config['TESTING'] = True
|
||
self.app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
|
||
self.ctx = self.app.app_context()
|
||
self.ctx.push()
|
||
db.create_all()
|
||
|
||
# Создаём тестовые данные
|
||
self.partner = Partners(name='Тестовый партнёр', email='test@test.ru')
|
||
db.session.add(self.partner)
|
||
self.category = Categories(name='Тестовая категория')
|
||
db.session.add(self.category)
|
||
db.session.commit()
|
||
|
||
self.inventory = Inventory(
|
||
category_id=self.category.id,
|
||
name='Тестовый товар',
|
||
base_price=1000.0,
|
||
season_type='summer'
|
||
)
|
||
db.session.add(self.inventory)
|
||
db.session.commit()
|
||
|
||
self.issue = IssueOrders(
|
||
partner_id=self.partner.id,
|
||
issue_date=datetime.now(),
|
||
notes='Тестовая выдача'
|
||
)
|
||
db.session.add(self.issue)
|
||
db.session.commit()
|
||
|
||
self.issue_item = IssueOrderItems(
|
||
issue_order_id=self.issue.id,
|
||
inventory_id=self.inventory.id,
|
||
quantity=3
|
||
)
|
||
db.session.add(self.issue_item)
|
||
db.session.commit()
|
||
|
||
def tearDown(self):
|
||
db.session.remove()
|
||
db.drop_all()
|
||
self.ctx.pop()
|
||
|
||
def test_create_return_with_calculation(self):
|
||
"""Тест создания возврата с расчётом стоимости"""
|
||
# Создаём возврат
|
||
return_date = datetime.now()
|
||
ret = ReturnOrders(
|
||
issue_order_id=self.issue.id,
|
||
return_date=return_date,
|
||
notes='Тестовый возврат'
|
||
)
|
||
db.session.add(ret)
|
||
db.session.commit()
|
||
|
||
# Рассчитываем стоимость позиции
|
||
price = calculate_item_price(
|
||
base_price=self.inventory.base_price,
|
||
quantity=self.issue_item.quantity,
|
||
wear_level='medium',
|
||
season_type=self.inventory.season_type,
|
||
return_date=return_date
|
||
)
|
||
|
||
ret_item = ReturnOrderItems(
|
||
return_order_id=ret.id,
|
||
inventory_id=self.inventory.id,
|
||
quantity=self.issue_item.quantity,
|
||
wear_level='medium',
|
||
calculated_price=price
|
||
)
|
||
db.session.add(ret_item)
|
||
ret.total_amount = round(price, 2)
|
||
db.session.commit()
|
||
|
||
# Проверяем, что возврат создан и сумма рассчитана
|
||
saved_return = ReturnOrders.query.get(ret.id)
|
||
self.assertIsNotNone(saved_return)
|
||
self.assertEqual(saved_return.total_amount, round(price, 2))
|
||
|
||
# Проверяем, что выдача теперь закрыта (есть возврат)
|
||
self.assertIsNotNone(self.issue.return_order)
|
||
|
||
def test_return_prevents_duplicate(self):
|
||
"""Тест запрета повторного возврата для одной выдачи"""
|
||
# Создаём первый возврат
|
||
ret1 = ReturnOrders(issue_order_id=self.issue.id, return_date=datetime.now())
|
||
db.session.add(ret1)
|
||
db.session.commit()
|
||
|
||
# Пытаемся создать второй возврат для той же выдачи
|
||
ret2 = ReturnOrders(issue_order_id=self.issue.id, return_date=datetime.now())
|
||
db.session.add(ret2)
|
||
with self.assertRaises(Exception):
|
||
db.session.commit()
|
||
db.session.rollback()
|
||
|
||
if __name__ == '__main__':
|
||
unittest.main() |