food-market/tests/food-market.IntegrationTests
nns 8e54e2e0d6 feat(s13): security headers + rate-limits + sensitive-ops audit + session revoke + Grafana
Sprint 13 — security + observability deep. 7 пунктов чек-листа ✓.

Подробности — docs/sprint13-progress.md и docs/food-market-server-postgres-role.md.

Главное:
- food-market-server (back.food-market.kz, legacy backend) теперь
  работает на dedicated PG-роли food_market_server_app (NOSUPERUSER /
  NOCREATEDB / NOCREATEROLE / NOREPLICATION / NOBYPASSRLS) с CRUD-only
  грантами. Раньше использовался postgres-superuser с паролем 1q2w3e4r.
  Бэкап конфига сохранён, rollback одной командой.
- SecurityHeadersMiddleware навешивает CSP / X-Frame-Options DENY /
  X-Content-Type-Options nosniff / Referrer-Policy strict-origin /
  Permissions-Policy. HSTS 365d + includeSubDomains + preload.
  Те же заголовки в deploy/nginx.conf для SPA HTML.
- Rate-limit:
  • Signup-IP — 3/час + 10/день (на stage'е переопределено через
    .env RATE_SIGNUP_HOUR=30 чтобы не ломать e2e).
  • Forgot-password — per-email 3/час + per-IP 10/час.
- SensitiveOpsAudit сервис, wired в:
  • TwoFactor enroll/disable
  • Employees.Update при смене RoleId (action=AssignRole,
    payload с prev/next role + полный RolePermissions)
  • MeAccount.ChangePassword (новый endpoint)
  • MeSessions.RevokeAll (новый endpoint)
- POST /api/me/sessions/revoke-all — через
  IOpenIddictAuthorizationManager.FindBySubjectAsync + TryRevokeAsync.
  Integration-тест: refresh после revoke → 400/401.
- Hangfire dashboard — nginx-route добавлен (раньше /hangfire ловился
  SPA-fallback'ом). Фильтр SuperAdmin'ом уже был. Тест: anon/tenant →
  401/403/404.
- Grafana dashboard JSON (deploy/grafana/dashboards/food-market.json,
  9 панелей) + инструкции импорта в docs/observability.md.

Проверено на stage'е: все 6 security-заголовков видны на /;
/hangfire → 401 (закрыт); 4-я форгот → 429; stage-smoke (5 этапов) ✓.

Тесты: 68 unit + 9 integration (включая 3 новых: SessionRevokeTests,
HangfireAccessTests).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 12:30: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
FiscalMockFlowTests.cs feat(s11): ОФД-scaffolding — IFiscalProvider + 4 провайдера + UI/тесты 2026-06-07 02:27:17 +05:00
food-market.IntegrationTests.csproj feat(realtime): SignalR hub /hubs/notifications per-org + dashboard live 2026-05-31 19:29:59 +05:00
HangfireAccessTests.cs feat(s13): security headers + rate-limits + sensitive-ops audit + session revoke + Grafana 2026-06-07 12:30:10 +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
LoyaltyFlowTests.cs feat(loyalty+promotions): P2-12 + P2-13 — лояльность и промокоды (Sprint 9 п.1-2) 2026-05-31 21:06:10 +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
PromotionFlowTests.cs feat(loyalty+promotions): P2-12 + P2-13 — лояльность и промокоды (Sprint 9 п.1-2) 2026-05-31 21:06:10 +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
SessionRevokeTests.cs feat(s13): security headers + rate-limits + sensitive-ops audit + session revoke + Grafana 2026-06-07 12:30:10 +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