Files
octopus/myproject/inventory/tests/README.md
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

138 lines
6.5 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🧪 Критические тесты переходов между статусами заказов
## 📋 Описание
Набор из **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