Commit Graph

2 Commits

Author SHA1 Message Date
Дмитрий c52d42d447 fix(supplier): Plan 3 final review C-1 + I-2 — TestCase autowire + lock TTL
C-1: PlaywrightBridgeTest + RefreshSupplierSessionJobTest swap line order
- uses(TestCase::class) was BEFORE use Tests\TestCase → Pest resolved to
  non-existent \TestCase → file-load fatal → 6 tests NEVER ran since 71c999b.
- Fix: import BEFORE uses() call (pattern matches 3 working files в same dir).
- Misdiagnosis correction: ранее "pao stream_filter" symptoms attributed to
  laravel/pao env quirk были фактически C-1. Full suite parallel:
  617 tests / 614 passed / 3 skipped / 0 failed.

I-2: RefreshSupplierSessionJob lock TTL bump 30s → 90s
- PlaywrightBridge::TIMEOUT_SECONDS=75s. Lock TTL 30s → auto-expiry while
  real chromium boot+login still в процессе → concurrent refresh race.
- Fix: lock(name, 90)->block(95, ...) — exceeds PlaywrightBridge timeout.

Baseline regenerated после C-1 fix (stale entries removed, fresh Mockery
type errors captured).

Verification:
- tests/Unit/Supplier/: 30/30 pass (was 22/30 — 6 не запускались, 2 skip)
- Full parallel suite: 617/614+3 skipped/0 failed
- PHPStan: 0 errors. Pint: clean.

Final code-review (subagent verdict pre-C-1): "Ready to merge, with C-1 fix".
После этого commit'а — verdict satisfied.

Issues defer-to-post-merge per reviewer (follow-up tracking в memory):
- I-1 onOneServer (multi-server scaling; gated на Б-1 production)
- I-3 save_orphan recovery path (rare DB-write fail during HTTP success)
- I-4 region_mode='exclude' regions_reverse passthrough
- I-5 #4 acceptance criterion deferred until Task 1 closes
2026-05-11 06:51:22 +03:00
Дмитрий f298984055 feat(supplier): Plan 3 Task 5 — RefreshSupplierSessionJob + PlaywrightBridge
Компоненты:
- app/playwright/{package.json, refresh-session.js} — изолированный Node.js
  + Playwright chromium subprocess для headless логина
- PlaywrightProcessHandle interface + SymfonyPlaywrightProcessHandle (prod) +
  StubPlaywrightProcessHandle (test) для DI без extending Symfony Process
- ProcessFactory + SymfonyProcessFactory
- PlaywrightBridge: PHP-обёртка, timeout 75s, JSON contract, exit code
  → SupplierAuthException
- RefreshSupplierSessionJob: stub → real (tries=3, backoff [2m/10m/30m],
  Cache::lock concurrent guard, Redis TTL 6h)
- supplier:session:refresh Console command
- AppServiceProvider binds ProcessFactory → SymfonyProcessFactory

+7 tests (4 PlaywrightBridge + 2 Job + 1 Command).

NOTE: DOM-селекторы placeholder — финализация после Task 1 discovery.
NOTE: app/playwright/node_modules в .gitignore.

Quirks resolved:
- Mockery::mock(Process::class) + laravel/pao = stream_filter_remove fatal.
  Решение: handle interface, pure-PHP test stub без extends Process.
- PHPStan Mockery union types — baseline entries (known Mockery+PHPStan compat).

KNOWN LIMITATION: на этой Windows машине pao stream filter conflict при
serial run SupplierPortalClient+RefreshSupplierSessionJob combo.
Tests pass individually + парами. Production Linux CI не affected.
2026-05-11 06:46:13 +03:00