From 8a611eb0544ff02f82f92d97bef656b6ef1b4a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 11 May 2026 02:54:06 +0300 Subject: [PATCH] =?UTF-8?q?feat(supplier):=20Plan=203=20Task=209=20?= =?UTF-8?q?=E2=80=94=20E2E=20mock-server=20skeleton=20(Linux=20CI=20comple?= =?UTF-8?q?tion=20pending)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Создан skeleton tests/Browser/SupplierIntegrationE2ETest.php с inline-комментариями содержащими full mock-server impl (react/http + react/socket). Skip pattern same as Browser/SmokeTest.php (Sprint 2 Phase A): ->skip() с указанием на Linux CI requirement (ext-sockets + pest-plugin-browser). Что покрыто другими тестами (не дублируем — see file header): - Per-supplier_project routing (Plan 2 Task 6) - SyncSupplierProjectsJob create/update flow (Plan 3 Task 6, 8 tests) - Cleanup Phase A→B→C ordering (Plan 3 Task 7, 6 tests) - Session refresh + retry (Plan 3 Task 5, 7 tests) - PortalClient cookie/CSRF + retry (Plan 3 Task 4, 9 tests) Linux CI completion (отдельная sprint после Б-1): - composer require react/http react/socket --dev - composer require pestphp/pest-plugin-browser --dev (если не установлен) - Uncomment test body (lines 41-77 в файле) - Run: php artisan test --testsuite=Browser +1 test (skipped on Windows + Linux until completion). --- .../Browser/SupplierIntegrationE2ETest.php | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 app/tests/Browser/SupplierIntegrationE2ETest.php diff --git a/app/tests/Browser/SupplierIntegrationE2ETest.php b/app/tests/Browser/SupplierIntegrationE2ETest.php new file mode 100644 index 00000000..fb68044a --- /dev/null +++ b/app/tests/Browser/SupplierIntegrationE2ETest.php @@ -0,0 +1,77 @@ + $req->getMethod(), 'path' => $req->getUri()->getPath(), 'body' => (string) $req->getBody()]; + // return new React\Http\Message\Response(200, [], json_encode(['id' => 12345])); + // }); + // $socket = new SocketServer('127.0.0.1:0'); + // $server->listen($socket); + // $port = parse_url($socket->getAddress(), PHP_URL_PORT); + // + // Cache::store('redis')->put('supplier:session', [...], now()->addHours(6)); + // config(['services.supplier.portal_url' => "http://127.0.0.1:{$port}"]); + // + // $tenant = Tenant::factory()->create(); + // $sp = SupplierProject::factory()->create(['platform' => 'B1', 'signal_type' => 'site', 'unique_key' => 'e2e.com', 'supplier_external_id' => null]); + // Project::factory()->for($tenant)->create([ + // 'is_active' => true, + // 'signal_type' => 'site', 'signal_identifier' => 'e2e.com', + // 'supplier_b1_project_id' => $sp->id, + // 'daily_limit_target' => 9, 'delivery_days_mask' => 127, + // ]); + // + // $loop->addTimer(2, fn () => $loop->stop()); + // (new SyncSupplierProjectsJob)->handle(); + // $loop->run(); + // $socket->close(); + // + // expect($receivedRequests)->not->toBeEmpty() + // ->and($receivedRequests[0]['path'])->toBe('/admin/rt-project-save'); + // + // $sp->refresh(); + // expect($sp->supplier_external_id)->toBe('12345') + // ->and($sp->sync_status)->toBe('ok'); + expect(true)->toBeTrue(); +})->skip('Plan 3 Task 9 — Linux CI completion. Requires react/http + ext-sockets unavailable on Windows native.');