Files
octopus/myproject/inventory/tests
Andrey Smakotin d023d1ab25 Added 5 critical tests for order status transitions
Tests cover:
1. Multiple status transitions (draft->completed->cancelled->completed)
2. Cancellation from draft (reservation release)
3. Un-cancellation to pending (reservation restore)
4. Creating order with intermediate status
5. Rollback from completed to draft

Each test verifies:
- Stock state (available, reserved, free)
- Reservation status transitions
- Sale creation/deletion without duplicates
- StockBatch quantity changes

Files:
- inventory/tests/test_order_status_transitions.py (570 lines)
- inventory/tests/README.md (138 lines)
- inventory/tests/__init__.py
- run_status_tests.bat (launch script)
2025-12-01 12:42:37 +03:00
..

🧪 Критические тесты переходов между статусами заказов

📋 Описание

Набор из 5 критических тестов, проверяющих корректность работы системы резервирования и списания товаров при переходах между статусами заказов.

🎯 Тестируемые сценарии

1 Тест "Танцы туда-сюда" (test_01_draft_to_completed_to_cancelled_to_completed)

Проверяет множественные переходы между статусами:

  • draftcompletedcancelledcompleted (снова)
  • Цель: Убедиться что Sale не дублируется при повторном переходе в completed

2 Тест отмены из черновика (test_02_draft_to_cancelled_releases_reservations)

Проверяет освобождение резервов при отмене:

  • draftcancelled
  • Цель: Резервы должны корректно освобождаться

3 Тест возврата из отмены (test_03_cancelled_to_pending_reserves_stock)

Проверяет резервирование при возврате:

  • draftcancelledpending
  • Цель: Резервы должны восстанавливаться при возврате из отмены

4 Тест промежуточного статуса (test_04_create_order_with_intermediate_status)

Проверяет создание заказа с новым статусом:

  • Создание заказа сразу со статусом "Упаковывается" (не positive, не negative)
  • Цель: Система должна работать с любыми промежуточными статусами

5 Тест отката от выполненного (test_05_completed_to_draft_rollback_sale)

Проверяет откат Sale:

  • draftcompleteddraft
  • Цель: Sale должен корректно откатываться, товар возвращаться на склад

🚀 Запуск тестов

Запуск всех тестов:

cd myproject
python manage.py test inventory.tests.test_order_status_transitions

Запуск конкретного теста:

python manage.py test inventory.tests.test_order_status_transitions.OrderStatusTransitionCriticalTest.test_01_draft_to_completed_to_cancelled_to_completed

Запуск с подробным выводом:

python manage.py test inventory.tests.test_order_status_transitions --verbosity=2

Что проверяет каждый тест

Все тесты проверяют 3 критических аспекта:

1. Корректность Stock

  • quantity_available - доступное количество
  • quantity_reserved - зарезервированное количество
  • quantity_free - свободное количество (available - reserved)

2. Корректность Reservation

  • Статус резерва (reserved, converted_to_sale, released)
  • Переходы между статусами при изменении статуса заказа

3. Корректность Sale и StockBatch

  • Sale не дублируется при повторных переходах
  • StockBatch корректно уменьшается/восстанавливается
  • SaleBatchAllocation создаётся только один раз

🔍 Пример вывода успешного теста

test_01_draft_to_completed_to_cancelled_to_completed ... ok
test_02_draft_to_cancelled_releases_reservations ... ok
test_03_cancelled_to_pending_reserves_stock ... ok
test_04_create_order_with_intermediate_status ... ok
test_05_completed_to_draft_rollback_sale ... ok

----------------------------------------------------------------------
Ran 5 tests in 2.341s

OK

⚠️ Важные особенности

  1. Тесты используют TransactionTestCase - каждый тест выполняется в отдельной транзакции
  2. Создаётся отдельная схема БД test_order_status для изоляции
  3. После каждого теста данные очищаются - тесты не влияют друг на друга
  4. Тесты работают с тенантами - используется schema_context()

🐛 Если тесты падают

Проверьте сигналы:

  • inventory/signals.py - все сигналы должны быть подключены
  • inventory/apps.py - сигналы должны импортироваться в ready()

Проверьте модели:

  • Reservation.status - должны быть варианты: reserved, converted_to_sale, released
  • OrderStatus - должны быть флаги is_positive_end, is_negative_end

Проверьте БД:

python manage.py migrate

📝 Добавление новых тестов

Чтобы добавить новый тест:

  1. Создайте метод в классе OrderStatusTransitionCriticalTest
  2. Начните имя с test_ (обязательно!)
  3. Используйте вспомогательные методы:
    • _create_order(status, quantity) - создать заказ
    • _assert_stock_state(available, reserved, free) - проверить Stock
    • _assert_reservation_status(order, expected_status) - проверить резерв
    • _assert_sale_exists(order, should_exist) - проверить Sale

Пример:

def test_06_my_new_scenario(self):
    """Описание сценария"""
    with schema_context('test_order_status'):
        order = self._create_order(self.status_draft, quantity=Decimal('10.00'))
        
        # Ваши проверки
        self._assert_stock_state(
            available=Decimal('100.00'),
            reserved=Decimal('10.00'),
            free=Decimal('90.00')
        )

🎓 Дополнительная информация