e8e5c82b86
FN-RESET: письмо сброса строило именованный роут password.reset которого нет в SPA.
ResetPassword::createUrlUsing → /reset/{token}?email= в AppServiceProvider boot.
FN-LOGIN-ROUTE: гость без Accept json на auth:sanctum уводил в именованный роут
login которого нет → 500. redirectGuestsTo /login + render AuthenticationException
→ 401 JSON для api/*.
FN-SESSION: chromium.launch стоял вне try/catch — отказ запуска браузера маскировался
unhandled-rejection в opaque exit 1 двойник login-rejected. launch в try + top-level
catch → чистый exit 4 + JSON stderr в refresh-session.js и manage-project.js.
Тесты: PasswordResetUrlTest, UnauthenticatedApiResponseTest, node:test launch-failure
в обоих playwright-скриптах. Разбор FN-SESSION + ops-долг playwright install под
www-data + поправки отчёта приёмки + новая находка FN-INN-LOOKUP.
Прод не трогался. Накат — позже вместе с остальным.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
38 lines
1.4 KiB
PHP
38 lines
1.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
use App\Models\Tenant;
|
|
use App\Models\User;
|
|
use Illuminate\Auth\Notifications\ResetPassword;
|
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
|
use Illuminate\Support\Facades\Hash;
|
|
|
|
uses(DatabaseTransactions::class);
|
|
|
|
beforeEach(function () {
|
|
$this->tenant = Tenant::factory()->create();
|
|
});
|
|
|
|
// FN-RESET (приёмка 22.06.2026): дефолтное Laravel-уведомление ResetPassword
|
|
// строит URL через route('password.reset'), которого в SPA нет (роут сброса —
|
|
// /reset/{token}). Без фикса toMail() бросает «Route [password.reset] not defined»,
|
|
// письмо не уходит. Фикс: ResetPassword::createUrlUsing(...) в AppServiceProvider::boot.
|
|
test('ResetPassword notification строит ссылку на SPA-роут /reset/{token}?email= без route-error', function () {
|
|
$user = User::factory()->create([
|
|
'tenant_id' => $this->tenant->id,
|
|
'email' => 'reset-link@example.ru',
|
|
'password_hash' => Hash::make('old-pass-1234'),
|
|
]);
|
|
|
|
$token = 'test-token-abc123';
|
|
|
|
// Без фикса этот вызов бросит «Route [password.reset] not defined».
|
|
$mail = (new ResetPassword($token))->toMail($user);
|
|
|
|
$url = (string) $mail->actionUrl;
|
|
|
|
expect($url)->toContain('/reset/'.$token);
|
|
expect($url)->toContain('email='.urlencode('reset-link@example.ru'));
|
|
});
|