food-market/tests/food-market.IntegrationTests
nns 7de159d5f2
Some checks are pending
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker API / Build + push API (push) Waiting to run
Docker API / Deploy API on stage (push) Blocked by required conditions
feat(storage): IObjectStorage abstraction (Local + MinIO) — P2-15
Backend:
- src/food-market.api/Storage/IObjectStorage.cs — абстракция
  (SaveAsync, OpenAsync, DeleteAsync, PublicUrl). Имя реализации (Kind)
  для логов.
- LocalObjectStorage — ContentRoot/uploads/{key}. По умолчанию.
- MinioObjectStorage — S3-совместимый bucket, ключ-объекта совпадает с
  тем что хранится в БД (products/{id:N}/{guid}.png). PutObject с явным
  size (для NetworkStream копируем в MemoryStream).
- StorageOptions: Type=Local|Minio, Endpoint, AccessKey, SecretKey,
  UseSsl, Bucket=food-market-uploads.
- StorageBootstrap.AddObjectStorage — DI-регистрация с runtime fallback
  на Local если MinIO-config пустой; MinioBootstrap (IHostedService)
  создаёт bucket на старте, ловит ошибку и не валит API.
- UploadsController: GET /uploads/{**path} → стримит из IObjectStorage
  (cache-control 7 дней). Нужен когда MinIO активен — для Local nginx
  раздаёт быстрее, но фолбэк работает.
- ProductImagesController отрефакторен на IObjectStorage; URL'ы в БД
  остаются /uploads/products/{id}/{guid}.ext.

Тесты:
- StorageAbstractionTests (3/3 ✓): Local default, round-trip bytes,
  PublicUrl pattern.

Stage-готовность:
- deploy/docker-compose.yml на стейдже обновлён (через scp): добавлен
  minio container, depends_on в api, env переменные Storage__*.
  Bucket автосоздаётся.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 20:17:10 +05:00
..
Support feat(reports): отчёт «Продажи» с группировками и экспортом (P1-8) 2026-05-28 11:09:52 +05:00
AbcReportTests.cs feat(reports): ABC-анализ по Парето (P1-11) 2026-05-28 11:24:26 +05:00
ConcurrencyTokenTests.cs feat(concurrency): RowVersion на документах через Postgres xmin (TD-6) 2026-05-28 17:33:01 +05:00
CustomerReturnTests.cs feat(returns): возврат от покупателя (CustomerReturn) (P1-6) 2026-05-28 09:51:04 +05:00
DemandPostUnpostTests.cs feat(demands): оптовая отгрузка контрагенту-юрлицу (P1-5) 2026-05-28 16:18:49 +05:00
EnterPostUnpostTests.cs feat(enters): оприходование товара без поставщика (P1-1) 2026-05-28 09:18:13 +05:00
food-market.IntegrationTests.csproj feat(realtime): SignalR hub /hubs/notifications per-org + dashboard live 2026-05-31 19:29:59 +05:00
HangfireDashboardTests.cs feat(hangfire): dashboard + scheduled cleanup джобы (P1-16) 2026-05-28 10:07:14 +05:00
ImportJobPersistenceTests.cs feat(import-jobs): persisted ImportJobRegistry в БД (TD-5) 2026-05-28 16:45:08 +05:00
InventoryPostUnpostTests.cs feat(inventories): инвентаризация с CSV-импортом факта (P1-4) 2026-05-28 09:39:32 +05:00
LossPostUnpostTests.cs feat(losses): списание со склада с указанием причины (P1-2) 2026-05-28 09:24:40 +05:00
MetricsEndpointTests.cs feat(observability): Prometheus метрики /metrics + бизнес-счётчики (P1-17) 2026-05-28 12:20:01 +05:00
OrgAuditLogTests.cs feat(audit): per-tenant журнал мутаций OrgAuditLog (P1-18) 2026-05-28 16:26:36 +05:00
PermissionTests.cs test(integration): Testcontainers.PostgreSql + WebApplicationFactory, 10 тестов (P1-21) 2026-05-27 03:14:01 +05:00
PosSyncTests.cs feat(pos-api): GET /sync и POST /sales с двойной идемпотентностью (P1-12b) 2026-05-28 12:10:17 +05:00
ProfitReportTests.cs feat(reports): отчёт «Прибыль» (выручка − COGS) (P1-10) 2026-05-28 11:19:19 +05:00
RetailOversellingTests.cs test(integration): Testcontainers.PostgreSql + WebApplicationFactory, 10 тестов (P1-21) 2026-05-27 03:14:01 +05:00
SalesReportTests.cs feat(reports): отчёт «Продажи» с группировками и экспортом (P1-8) 2026-05-28 11:09:52 +05:00
SignalRNotificationsTests.cs feat(realtime): SignalR hub /hubs/notifications per-org + dashboard live 2026-05-31 19:29:59 +05:00
SignupFlowTests.cs test(integration): Testcontainers.PostgreSql + WebApplicationFactory, 10 тестов (P1-21) 2026-05-27 03:14:01 +05:00
StockReportTests.cs feat(reports): отчёт «Остатки на дату» с реконструкцией (P1-9) 2026-05-28 11:14:24 +05:00
StorageAbstractionTests.cs feat(storage): IObjectStorage abstraction (Local + MinIO) — P2-15 2026-05-31 20:17:10 +05:00
SupplierReturnTests.cs feat(supplier-returns): возврат поставщику (P1-7) 2026-05-28 09:58:29 +05:00
SupplyPostUnpostTests.cs test(integration): Testcontainers.PostgreSql + WebApplicationFactory, 10 тестов (P1-21) 2026-05-27 03:14:01 +05:00
TelegramOwnerSummaryTests.cs feat(telegram): OwnerDailySummaryJob + bot binding (P2-14) 2026-05-31 19:50:33 +05:00
TenantIsolationTests.cs test(integration): Testcontainers.PostgreSql + WebApplicationFactory, 10 тестов (P1-21) 2026-05-27 03:14:01 +05:00
TransferPostUnpostTests.cs feat(transfers): атомарное перемещение между складами (P1-3) 2026-05-28 09:32:32 +05:00
TwoFactorTests.cs feat(auth): TOTP 2FA для админов через AuthenticatorTokenProvider (P2-4) 2026-05-28 17:57:32 +05:00