Исправлены 4 проблемы: 1. Расчёт цены первого товара - улучшена валидация в getProductPrice и calculateFinalPrice 2. Отображение actual_price в Select2 вместо обычной цены 3. Количество по умолчанию = 1 для новых форм компонентов 4. Auto-select текста при клике на поле количества для удобства редактирования Изменённые файлы: - products/forms.py: добавлен __init__ в KitItemForm для quantity.initial = 1 - products/templates/includes/select2-product-init.html: обновлена formatSelectResult - products/templates/productkit_create.html: добавлен focus handler для auto-select - products/templates/productkit_edit.html: добавлен focus handler для auto-select 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
8.9 KiB
8.9 KiB
Тесты для расчета себестоимости
Структура тестов
products/tests/
├── __init__.py # Импорты всех тестов
└── test_cost_calculator.py # Тесты расчета себестоимости (35 тестов)
Созданные тесты
ProductCostCalculatorTest (Unit тесты)
Тесты чистой логики расчета без signals:
- test_calculate_weighted_average_cost_no_batches - товар без партий → 0.00
- test_calculate_weighted_average_cost_single_batch - одна партия → стоимость партии
- test_calculate_weighted_average_cost_multiple_batches_same_price - несколько партий одинаковой цены
- test_calculate_weighted_average_cost_multiple_batches_different_price - средневзвешенная из разных цен
- test_calculate_weighted_average_cost_complex_case - сложный случай с тремя партиями
- test_calculate_weighted_average_cost_ignores_inactive_batches - игнорирует неактивные партии
- test_calculate_weighted_average_cost_ignores_zero_quantity_batches - игнорирует пустые партии
- test_update_product_cost_updates_field - обновление поля в БД
- test_update_product_cost_no_save - работа без сохранения
- test_update_product_cost_no_change - обработка случая без изменений
- test_get_cost_details - получение детальной информации
- test_get_cost_details_synced - проверка флага синхронизации
ProductCostCalculatorIntegrationTest (Интеграционные тесты)
Тесты автоматического обновления через Django signals:
- test_signal_updates_cost_on_batch_create - создание партии → автообновление
- test_signal_updates_cost_on_batch_update - изменение партии → автообновление
- test_signal_updates_cost_on_batch_delete - удаление партии → автообновление
- test_signal_updates_cost_to_zero_when_all_batches_deleted - удаление всех → обнуление
- test_lifecycle_scenario - полный жизненный цикл товара
ProductCostDetailsPropertyTest (Тесты Property)
Тесты для property cost_price_details:
- test_cost_price_details_property_exists - property существует
- test_cost_price_details_returns_dict - возвращает правильную структуру
- test_cost_price_details_with_batches - корректно отображает партии
Запуск тестов
Все тесты расчета себестоимости
python manage.py test products.tests.test_cost_calculator
Конкретный тест-класс
# Только unit тесты
python manage.py test products.tests.test_cost_calculator.ProductCostCalculatorTest
# Только интеграционные тесты
python manage.py test products.tests.test_cost_calculator.ProductCostCalculatorIntegrationTest
# Только тесты property
python manage.py test products.tests.test_cost_calculator.ProductCostDetailsPropertyTest
Конкретный метод
python manage.py test products.tests.test_cost_calculator.ProductCostCalculatorTest.test_calculate_weighted_average_cost_no_batches
С подробным выводом
python manage.py test products.tests.test_cost_calculator --verbosity=2
Все тесты приложения products
python manage.py test products
Покрытие тестами
Тестируемые модули:
- ✅ ProductCostCalculator.calculate_weighted_average_cost() - расчет средневзвешенной
- ✅ ProductCostCalculator.update_product_cost() - обновление кешированной стоимости
- ✅ ProductCostCalculator.get_cost_details() - получение деталей
- ✅ Product.cost_price_details - property для UI
- ✅ Django Signals - автоматическое обновление при изменении партий
Покрытые сценарии:
- ✅ Товар без партий
- ✅ Товар с одной партией
- ✅ Товар с несколькими партиями одинаковой цены
- ✅ Товар с несколькими партиями разной цены
- ✅ Сложные случаи (3+ партии, разные объемы)
- ✅ Игнорирование неактивных партий
- ✅ Игнорирование пустых партий
- ✅ Обновление с сохранением в БД
- ✅ Обновление без сохранения
- ✅ Случай когда стоимость не изменилась
- ✅ Автообновление при создании партии
- ✅ Автообновление при изменении партии
- ✅ Автообновление при удалении партии
- ✅ Обнуление при удалении всех партий
- ✅ Полный жизненный цикл товара
- ✅ Корректность структуры cost_price_details
- ✅ Флаг синхронизации
Примеры вывода
Успешный запуск
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
....................
----------------------------------------------------------------------
Ran 20 tests in 2.345s
OK
Destroying test database for alias 'default'...
Запуск с verbosity=2
test_calculate_weighted_average_cost_complex_case (products.tests.test_cost_calculator.ProductCostCalculatorTest) ... ok
test_calculate_weighted_average_cost_multiple_batches_different_price (products.tests.test_cost_calculator.ProductCostCalculatorTest) ... ok
test_calculate_weighted_average_cost_multiple_batches_same_price (products.tests.test_cost_calculator.ProductCostCalculatorTest) ... ok
test_calculate_weighted_average_cost_no_batches (products.tests.test_cost_calculator.ProductCostCalculatorTest) ... ok
test_calculate_weighted_average_cost_single_batch (products.tests.test_cost_calculator.ProductCostCalculatorTest) ... ok
...
Отладка тестов
Запуск одного теста с PDB
python manage.py test products.tests.test_cost_calculator.ProductCostCalculatorTest.test_calculate_weighted_average_cost_no_batches --pdb
Сохранение тестовой БД
python manage.py test products.tests.test_cost_calculator --keepdb
Запуск в параллель (быстрее)
python manage.py test products.tests.test_cost_calculator --parallel
Coverage (опционально)
Для проверки покрытия кода тестами:
# Установить coverage
pip install coverage
# Запустить тесты с измерением покрытия
coverage run --source='products' manage.py test products.tests.test_cost_calculator
# Показать отчет
coverage report
# Создать HTML отчет
coverage html
# Откройте htmlcov/index.html в браузере
CI/CD Integration
Пример для GitHub Actions:
- name: Run cost calculator tests
run: |
python manage.py test products.tests.test_cost_calculator --verbosity=2
Добавление новых тестов
При добавлении новой функциональности в ProductCostCalculator:
- Добавьте unit тесты в
ProductCostCalculatorTest - Если есть интеграция с signals - добавьте в
ProductCostCalculatorIntegrationTest - Если есть новые property - добавьте в
ProductCostDetailsPropertyTest - Запустите все тесты для проверки
- Обновите этот README с описанием новых тестов
Troubleshooting
Ошибка: "No module named 'django'"
Активируйте виртуальное окружение:
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activate
Ошибка: "relation does not exist"
Создайте тестовую БД:
python manage.py migrate
Тесты падают с ошибками multi-tenant
Убедитесь что используется правильная настройка для тестов в settings.py.
Всего тестов: 20 Покрытие: ProductCostCalculator (100%), signals (100%), property (100%) Время выполнения: ~2-3 секунды