From 8708cea122c38c8dec3a87ff3197fee3e696e929 Mon Sep 17 00:00:00 2001 From: ncoronel Date: Fri, 26 Jun 2026 16:23:14 -0300 Subject: [PATCH] feat: implement tenant update request validation and add feature tests for domain bootstrapping --- app/Domains/Tenant/Models/Tenant.php | 5 +++ .../Tenant/Requests/UpdateTenantRequest.php | 4 +-- .../Tenant/BootstrapTenantControllerTest.php | 31 +++++++++++++++++-- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/app/Domains/Tenant/Models/Tenant.php b/app/Domains/Tenant/Models/Tenant.php index f831704..ec60942 100644 --- a/app/Domains/Tenant/Models/Tenant.php +++ b/app/Domains/Tenant/Models/Tenant.php @@ -27,6 +27,11 @@ class Tenant extends Model use HasAttachments; use HasFactory; + public function getRouteKeyName(): string + { + return 'codigo'; + } + /** * @return BelongsTo */ diff --git a/app/Domains/Tenant/Requests/UpdateTenantRequest.php b/app/Domains/Tenant/Requests/UpdateTenantRequest.php index ab4fbc0..b2f024a 100644 --- a/app/Domains/Tenant/Requests/UpdateTenantRequest.php +++ b/app/Domains/Tenant/Requests/UpdateTenantRequest.php @@ -88,12 +88,12 @@ class UpdateTenantRequest extends FormRequest return [ 'codigo' => [ - 'required', + 'sometimes', 'string', 'max:255', Rule::unique('tenants', 'codigo')->ignore($tenant?->id), ], - 'nombre' => ['required', 'string', 'max:255'], + 'nombre' => ['sometimes', 'string', 'max:255'], 'dominio' => [ 'bail', function (string $attribute, mixed $value, Closure $fail): void { diff --git a/tests/Feature/Tenant/BootstrapTenantControllerTest.php b/tests/Feature/Tenant/BootstrapTenantControllerTest.php index 6521c18..487b3f1 100644 --- a/tests/Feature/Tenant/BootstrapTenantControllerTest.php +++ b/tests/Feature/Tenant/BootstrapTenantControllerTest.php @@ -190,7 +190,7 @@ class BootstrapTenantControllerTest extends TestCase 'mime_type' => 'image/png', ]); - $successfulResponse = $this->putJson("/api/tenants/{$tenant->id}", [ + $successfulResponse = $this->putJson("/api/tenants/{$tenant->codigo}", [ 'codigo' => 'acme', 'nombre' => 'Acme Updated', 'dominio' => 'https://ACME.com:443/admin', @@ -233,7 +233,7 @@ class BootstrapTenantControllerTest extends TestCase 'footer_logo_id' => $ftrAttachment->id, ]); - $failingResponse = $this->putJson("/api/tenants/{$otherTenant->id}", [ + $failingResponse = $this->putJson("/api/tenants/{$otherTenant->codigo}", [ 'codigo' => 'globex', 'nombre' => 'Globex', 'dominio' => 'https://ACME.com/storefront', @@ -244,6 +244,33 @@ class BootstrapTenantControllerTest extends TestCase ->assertJsonValidationErrors(['dominio']); } + public function test_it_allows_partial_update_without_required_fields(): void + { + $tenant = Tenant::create([ + 'codigo' => 'acme', + 'nombre' => 'Acme', + 'dominio' => 'acme.com', + 'primary_color' => '#ffffff', + ]); + + $response = $this->putJson("/api/tenants/{$tenant->codigo}", [ + 'primary_color' => '#000000', + ]); + + $response + ->assertOk() + ->assertJsonPath('data.codigo', 'acme') + ->assertJsonPath('data.nombre', 'Acme') + ->assertJsonPath('data.primary_color', '#000000'); + + $this->assertDatabaseHas('tenants', [ + 'id' => $tenant->id, + 'codigo' => 'acme', + 'nombre' => 'Acme', + 'primary_color' => '#000000', + ]); + } + public function test_it_validates_aesthetic_colors(): void { $response = $this->postJson('/api/tenants', [