# Тестирование модуля oc_telegram_shop

## 🚀 Быстрый старт

### Запуск всех тестов
```bash
make test
```

### Запуск только Unit тестов
```bash
make test-unit
```

### Запуск только Integration тестов
```bash
make test-integration
```

### Запуск с покрытием кода
```bash
make test-coverage
```

После выполнения откройте `coverage/index.html` в браузере для просмотра отчета.

## 📋 Структура тестов

```
tests/
├── Unit/                    # Unit тесты framework
├── Integration/             # Integration тесты сервисов
│   └── Services/
│       ├── OrderCreateServiceTest.php    # ✅ КРИТИЧНО
│       ├── ProductsServiceTest.php       # ✅ КРИТИЧНО
│       └── CartServiceTest.php           # ✅ КРИТИЧНО
├── fixtures/               # Тестовые данные
└── TestCase.php           # Базовый класс
```

## 🔴 Критические тесты

### OrderCreateServiceTest
Тестирует создание заказов и проверяет:
- ✅ Валидацию обязательных полей
- ✅ Валидацию формата email
- ✅ Защиту от пустой корзины
- ✅ Сохранение Telegram данных

### ProductsServiceTest  
Тестирует получение продуктов и проверяет:
- ✅ Пагинацию результатов
- ✅ Поиск с безопасной обработкой
- ✅ Обработку несуществующих товаров
- ✅ Экранирование HTML в названиях

### CartServiceTest
Тестирует корзину и проверяет:
- ✅ Структуру данных корзины
- ✅ Корректность расчета totals
- ✅ Очистку корзины

## 📊 Покрытие кода

Рекомендуемое покрытие:
- **Критические сервисы**: > 80%
- **Handlers**: > 60%
- **Filters**: > 70%

## 🛠️ Запуск в Docker

Все тесты запускаются внутри Docker контейнера с изолированной БД.

Конфигурация подключения к БД в `phpunit.xml`:
```xml
<env name="DB_HOSTNAME" value="mysql"/>
<env name="DB_DATABASE" value="ocstore3"/>
```

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

1. Создайте файл в соответствующей директории (`Unit/` или `Integration/`)
2. Наследуйтесь от `Tests\TestCase`
3. Используйте аннотации `/** @test */` или методы с префиксом `test_`
4. Для моков используйте Mockery

Пример:
```php
namespace Tests\Integration\Services;

use Tests\TestCase;

class MyServiceTest extends TestCase
{
    /** @test */
    public function tests_something(): void
    {
        $service = $this->factory(MyService::class);
        
        $result = $service->doSomething();
        
        $this->assertNotNull($result);
    }
}
```

## 🔧 Команды

```bash
# Все тесты
make test

# Только интеграционные
make test-integration

# Только юнит-тесты  
make test-unit

# С покрытием
make test-coverage

# Запуск конкретного теста
docker compose exec -w /module/oc_telegram_shop/upload/oc_telegram_shop web bash -c "./vendor/bin/phpunit tests/Integration/Services/OrderCreateServiceTest.php"
```

