# Тесты десктопа (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.