# Тесты десктопа (Elfisa.Tests)

Автотесты для кросс-платформенного клиента ЭльФиСА (`Elfisa.Core` + `Elfisa.Avalonia`).

## Запуск

```bash
dotnet test tests/Elfisa.Tests/Elfisa.Tests.csproj
```

или всё решение:

```bash
dotnet test Elfisa.sln
```

CI (`.github/workflows/desktop-tests.yml`) гоняет их автоматически при пуше в `src/**` или `tests/**`.

## Что покрыто (56 тестов)

| Файл | Область |
|---|---|
| `UpdateServiceTests` | разбор версий тегов (`v2.0.4`→`2.0.4.0`), сравнение «новее», URL установщика |
| `SessionTests` | срок JWT-сессии (`IsJwtExpired`): будущий/просроченный/битый токен, запас 60с |
| `ApiClientTests` | сборка URL, маппинг ошибок (401/429), ретраи на транзиентных сбоях, парсинг сводного прайса, требование токена |
| `DtoTests` | JSON-контракты (snake_case) DTO: `PriceItem`, `BuyerOrderCreateRequest`, `LoginResponse`, `AppSettings` |
| `DraftTests` | суммы черновиков заказа (`LineSum`, `Total`, `ItemsCount`) |
| `CartServiceTests` | корзина: добавление, слияние по `supplier_price_id`, удаление, очистка, событие Changed |
| `PriceLogicTests` | дрилдаун прайса: извлечение дозировки (МГ) и базового наименования |

## Как устроены моки

- `FakeHttpHandler` (в `TestHelpers.cs`) — подменяет HTTP у `ApiClient` через internal-конструктор `ApiClient(HttpMessageHandler, baseUrl)`. Позволяет тестировать ретраи/ошибки/парсинг без сети.
- `Jwt.Make(exp)` — генерирует JWT с нужным `exp` для тестов сессии.
- Тестируемые внутренние методы открыты через `InternalsVisibleTo("Elfisa.Tests")` (в csproj `Elfisa.Core` и `Elfisa.Avalonia`).

## Задел (не сделано)

Headless UI-тесты (рендер вьюх без экрана) — `Avalonia.Headless.XUnit` под Avalonia 12 требует **xUnit v3**, что конфликтует с текущим v2. Добавить после миграции тест-проекта на xUnit v3.
