Files
portal/app/tests/Feature/Auth/PasswordResetUrlTest.php
T
Дмитрий e8e5c82b86
Accessibility (Pa11y live) / a11y (push) Has been cancelled
SAST — Semgrep / Semgrep SAST scan (push) Has been cancelled
fix(приёмка): FN-RESET + FN-LOGIN-ROUTE + диагностируемость FN-SESSION
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>
2026-06-22 08:49:19 +03:00

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'));
});