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)
138 lines
6.5 KiB
Markdown
138 lines
6.5 KiB
Markdown
# 🧪 Критические тесты переходов между статусами заказов
|
||
|
||
## 📋 Описание
|
||
|
||
Набор из **5 критических тестов**, проверяющих корректность работы системы резервирования и списания товаров при переходах между статусами заказов.
|
||
|
||
## 🎯 Тестируемые сценарии
|
||
|
||
### 1️⃣ **Тест "Танцы туда-сюда"** (`test_01_draft_to_completed_to_cancelled_to_completed`)
|
||
Проверяет множественные переходы между статусами:
|
||
- `draft` → `completed` → `cancelled` → `completed` (снова)
|
||
- **Цель:** Убедиться что Sale не дублируется при повторном переходе в `completed`
|
||
|
||
### 2️⃣ **Тест отмены из черновика** (`test_02_draft_to_cancelled_releases_reservations`)
|
||
Проверяет освобождение резервов при отмене:
|
||
- `draft` → `cancelled`
|
||
- **Цель:** Резервы должны корректно освобождаться
|
||
|
||
### 3️⃣ **Тест возврата из отмены** (`test_03_cancelled_to_pending_reserves_stock`)
|
||
Проверяет резервирование при возврате:
|
||
- `draft` → `cancelled` → `pending`
|
||
- **Цель:** Резервы должны восстанавливаться при возврате из отмены
|
||
|
||
### 4️⃣ **Тест промежуточного статуса** (`test_04_create_order_with_intermediate_status`)
|
||
Проверяет создание заказа с новым статусом:
|
||
- Создание заказа сразу со статусом "Упаковывается" (не positive, не negative)
|
||
- **Цель:** Система должна работать с любыми промежуточными статусами
|
||
|
||
### 5️⃣ **Тест отката от выполненного** (`test_05_completed_to_draft_rollback_sale`)
|
||
Проверяет откат Sale:
|
||
- `draft` → `completed` → `draft`
|
||
- **Цель:** Sale должен корректно откатываться, товар возвращаться на склад
|
||
|
||
## 🚀 Запуск тестов
|
||
|
||
### Запуск всех тестов:
|
||
```bash
|
||
cd myproject
|
||
python manage.py test inventory.tests.test_order_status_transitions
|
||
```
|
||
|
||
### Запуск конкретного теста:
|
||
```bash
|
||
python manage.py test inventory.tests.test_order_status_transitions.OrderStatusTransitionCriticalTest.test_01_draft_to_completed_to_cancelled_to_completed
|
||
```
|
||
|
||
### Запуск с подробным выводом:
|
||
```bash
|
||
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`
|
||
|
||
### Проверьте БД:
|
||
```bash
|
||
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
|
||
|
||
Пример:
|
||
```python
|
||
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')
|
||
)
|
||
```
|
||
|
||
## 🎓 Дополнительная информация
|
||
|
||
- Документация Django Testing: https://docs.djangoproject.com/en/stable/topics/testing/
|
||
- Django Tenants Testing: https://django-tenants.readthedocs.io/en/latest/test.html
|