20d4682e21
Sprint 2 Phase A (modernization). Закрытие audit O-stack-01/02/03 + O-perf-07:
- O-stack-01: Pest 4 browser-tests scaffold. testsuite Browser в phpunit.xml,
Pest.php extend(...)->in('Browser'), tests/Browser/SmokeTest.php
(login-flow + deal-create-flow). На Windows native PHP плагин
pest-plugin-browser требует ext-sockets (отсутствует в стандартной
сборке) и при автозагрузке вызывает socket_create_listen() ДО старта
тестов, что ломает весь Pest. Поэтому плагин НЕ в require-dev,
тесты помечены ->skip(...) с инструкцией активации на Linux CI.
Скелет тестов в комментариях — на CI достаточно
composer require pestphp/pest-plugin-browser --dev + npx playwright
install + раскомментировать тела.
- O-stack-02: infection/infection ^0.32.7 в require-dev + app/infection.json
(minMsi=50, source: Http/Models/Services). composer mutation script.
Запуск отдельной задачей в CI (медленный). allow-plugins для
infection/extension-installer.
- O-stack-03: Laravel 13 string-based lazy-loading в routes/web.php —
убран блок use App\Http\Controllers\Api\* (16 импортов), все
ссылки заменены на строки 'App\Http\...\X@method'. Контроллеры
не загружаются автозагрузчиком при boot route'ов; класс резолвится
только при матче маршрута. Использован строковый синтаксис, а не
FQN-class — Pint default preset (fully_qualified_strict_types fixer)
сворачивает FQN-class обратно в use, на строки не действует.
- O-perf-07: Larastan result cache через tmpDir: .phpstan-cache в
phpstan.neon (cache-dir не дублируется флагом — phpstan не принимает
оба источника). lefthook job 6 (larastan) использует этот же
tmpDir автоматически. Ускорение инкрементальных pre-commit прогонов:
на правке одного файла — переанализ только зависящих, не всего
графа классов. .phpstan-cache в .gitignore.
Pest: 416/416 PASS + 2 skipped (browser smoke pending Linux CI).
Larastan: 0 errors above baseline.
Infection: vendor/bin/infection --version → 0.32.7.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
79 lines
3.6 KiB
PHP
79 lines
3.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Browser smoke-tests (Pest 4 + pest-plugin-browser)
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Sprint 2 Phase A — O-stack-01.
|
|
|
|
|
| ЗАГОТОВКА ПОД LINUX CI (pending).
|
|
|
|
|
| Pest 4 browser API (visit/fill/click/assertSee) использует Playwright
|
|
| под капотом + ext-sockets (для управления локальным сервером тестов).
|
|
|
|
|
| ПРОБЛЕМА Windows native PHP:
|
|
| - ext-sockets не входит в стандартную сборку PHP для Windows (php.net).
|
|
| - pest-plugin-browser при автозагрузке вызывает socket_create_listen()
|
|
| из Pest\Browser\Support\Port — fatal error «Call to undefined function»
|
|
| ДО запуска любого теста, что блокирует ВЕСЬ Pest-suite.
|
|
| - Плагин нельзя оставить в require-dev — composer install на Windows
|
|
| ломает CLI-команду `php artisan test`.
|
|
|
|
|
| РЕШЕНИЕ:
|
|
| - pest-plugin-browser НЕ в composer.json (не require-dev).
|
|
| - Этот файл — placeholder со скелетом тестов в комментариях.
|
|
| - На Linux CI: установить плагин (`composer require pestphp/pest-plugin-browser
|
|
| --dev`), раскомментировать тела тестов, выполнить
|
|
| `npx playwright install chromium`, запустить `php artisan test
|
|
| --testsuite=Browser`.
|
|
| - Структура файла, registered testsuite (phpunit.xml), Pest.php
|
|
| extend(...)->in('Browser') — всё на месте, инфраструктура готова.
|
|
|
|
|
| Что покрываем (когда CI Linux запустит):
|
|
| - login flow → редирект на /dashboard и видимая надпись "Dashboard"
|
|
| - deal-create flow → новая сделка появляется в списке
|
|
|
|
|
*/
|
|
|
|
it('login flow redirects to dashboard', function (): void {
|
|
// На Linux CI после установки pest-plugin-browser:
|
|
//
|
|
// use App\Models\Tenant;
|
|
// use App\Models\User;
|
|
//
|
|
// $tenant = Tenant::factory()->create();
|
|
// $user = User::factory()->for($tenant)->create([
|
|
// 'password_hash' => bcrypt('test1234'),
|
|
// ]);
|
|
//
|
|
// $page = visit('/login');
|
|
// $page->fill('input[name="email"]', $user->email);
|
|
// $page->fill('input[name="password"]', 'test1234');
|
|
// $page->click('button[type="submit"]');
|
|
// $page->assertSee('Dashboard');
|
|
expect(true)->toBeTrue();
|
|
})->skip('Browser test pending Linux CI (см. шапку файла, требует ext-sockets + Playwright + pest-plugin-browser)');
|
|
|
|
it('deal create flow appears in list', function (): void {
|
|
// На Linux CI после установки pest-plugin-browser:
|
|
//
|
|
// $tenant = Tenant::factory()->create();
|
|
// $user = User::factory()->for($tenant)->create([
|
|
// 'password_hash' => bcrypt('test1234'),
|
|
// ]);
|
|
//
|
|
// $page = visit('/login');
|
|
// $page->fill('input[name="email"]', $user->email);
|
|
// $page->fill('input[name="password"]', 'test1234');
|
|
// $page->click('button[type="submit"]');
|
|
// $page->visit('/deals');
|
|
// $page->click('[data-test="create-deal-btn"]');
|
|
// $page->fill('input[name="full_name"]', 'Test Lead');
|
|
// $page->click('button[type="submit"]');
|
|
// $page->assertSee('Test Lead');
|
|
expect(true)->toBeTrue();
|
|
})->skip('Browser test pending Linux CI (см. шапку файла, требует ext-sockets + Playwright + pest-plugin-browser)');
|