create(); $user = User::factory()->create(['tenant_id' => $tenant->id]); DB::statement('SET app.current_tenant_id = '.$tenant->id); $longCard = 'https://yandex.ru/maps/org/sib_dent/1234567890/?ll=92.852572%2C56.010569&z=17&sctx='.str_repeat('AbCd0123', 90); expect(strlen($longCard))->toBeGreaterThan(500); // именно такие ссылки и вставляют люди $resp = $this->actingAs($user)->postJson('/api/autopodbor/competitors/manual', [ 'name' => 'Сиб Дент', 'elements' => [ ['name' => 'Ленина 111', 'sites' => ['https://sib-dental.ru/'], 'cards' => [$longCard]], ], ])->assertStatus(201); $comp = AutopodborCompetitor::find($resp->json('data.id')); expect($comp->directory_urls)->toHaveCount(1) // Хвост параметров отрезан — храним чистый адрес карточки. ->and($comp->directory_urls[0])->toBe('https://yandex.ru/maps/org/sib_dent/1234567890/'); }); /** * Колонка site_url — VARCHAR(255) (db/schema.sql:1406). Валидацию мы подняли до 2000, чтобы * принимать длинные ссылки, — значит перед записью ОБЯЗАНЫ привести к домену, иначе вместо * старого «мягкого» отказа клиент получит крэш базы (22001) и невнятную ошибку. * Поймано валидатором до выката 14.07.2026. */ it('правка карточки: длинный адрес сайта не роняет базу — приводится к домену', function () { $tenant = Tenant::factory()->create(); $user = User::factory()->create(['tenant_id' => $tenant->id]); DB::statement('SET app.current_tenant_id = '.$tenant->id); $comp = AutopodborCompetitor::create([ 'tenant_id' => $tenant->id, 'name' => 'Сиб Дент', 'origin' => 'manual', 'box' => 'field', 'elements' => [], 'directory_urls' => [], 'dedup_key' => 'sib-dent|'.uniqid(), ]); $longSite = 'https://www.sib-dental.ru/uslugi/implantaciya/?utm_campaign='.str_repeat('x', 400); $this->actingAs($user)->patchJson("/api/autopodbor/competitors/{$comp->id}", [ 'elements' => [ ['name' => '', 'sites' => [$longSite], 'cards' => []], ], ])->assertOk(); expect($comp->fresh()->site_url)->toBe('sib-dental.ru'); }); it('принимает сайт, введённый целиком с http:// и путём — приводит к домену', function () { $tenant = Tenant::factory()->create(); $user = User::factory()->create(['tenant_id' => $tenant->id]); DB::statement('SET app.current_tenant_id = '.$tenant->id); $resp = $this->actingAs($user)->postJson('/api/autopodbor/competitors/manual', [ 'name' => 'Сиб Дент', 'elements' => [ ['name' => '', 'sites' => ['https://www.sib-dental.ru/uslugi/implantaciya/'], 'cards' => []], ], ])->assertStatus(201); $comp = AutopodborCompetitor::find($resp->json('data.id')); expect($comp->site_url)->toBe('sib-dental.ru'); });