diff --git a/app/Domains/Tenant/Controllers/AdminApp/WebsiteExtraController.php b/app/Domains/Tenant/Controllers/AdminApp/WebsiteExtraController.php index 9ce51dd..4dbe244 100644 --- a/app/Domains/Tenant/Controllers/AdminApp/WebsiteExtraController.php +++ b/app/Domains/Tenant/Controllers/AdminApp/WebsiteExtraController.php @@ -4,7 +4,7 @@ namespace App\Domains\Tenant\Controllers\AdminApp; use App\Domains\Auth\Models\User; use App\Domains\Tenant\Models\Tenant; -use App\Domains\Tenant\Requests\AdminApp\UpdateWebsiteExtrasRequest; +use App\Domains\Tenant\Requests\AdminApp\UpdateWebsiteExtraRequest; use App\Domains\Tenant\Resources\AdminApp\WebsiteExtrasResource; use App\Domains\Tenant\Services\TenantInformationService; use App\Domains\Tenant\Services\WebsiteExtraService; @@ -25,13 +25,16 @@ class WebsiteExtraController extends Controller ); } - public function update(UpdateWebsiteExtrasRequest $request): WebsiteExtrasResource - { + public function update( + UpdateWebsiteExtraRequest $request, + string $websiteExtraCode + ): WebsiteExtrasResource { $tenant = $request->user()->tenant()->firstOrFail(); - $this->websiteExtraService->replaceForTenant( + $this->websiteExtraService->updateForTenant( $tenant, - $request->validated('extras', []) + $websiteExtraCode, + $request->validated('config') ); return WebsiteExtrasResource::make( diff --git a/app/Domains/Tenant/Models/WebsiteTypeExtra.php b/app/Domains/Tenant/Models/WebsiteTypeExtra.php index cdcd09b..87be8c3 100644 --- a/app/Domains/Tenant/Models/WebsiteTypeExtra.php +++ b/app/Domains/Tenant/Models/WebsiteTypeExtra.php @@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; #[Fillable([ 'website_type_code', + 'codigo', 'nombre', 'descripcion', 'is_required', diff --git a/app/Domains/Tenant/Requests/AdminApp/UpdateWebsiteExtrasRequest.php b/app/Domains/Tenant/Requests/AdminApp/UpdateWebsiteExtraRequest.php similarity index 57% rename from app/Domains/Tenant/Requests/AdminApp/UpdateWebsiteExtrasRequest.php rename to app/Domains/Tenant/Requests/AdminApp/UpdateWebsiteExtraRequest.php index c063648..e5e19dd 100644 --- a/app/Domains/Tenant/Requests/AdminApp/UpdateWebsiteExtrasRequest.php +++ b/app/Domains/Tenant/Requests/AdminApp/UpdateWebsiteExtraRequest.php @@ -5,7 +5,7 @@ namespace App\Domains\Tenant\Requests\AdminApp; use App\Domains\Tenant\Services\WebsiteExtraService; use Illuminate\Foundation\Http\FormRequest; -class UpdateWebsiteExtrasRequest extends FormRequest +class UpdateWebsiteExtraRequest extends FormRequest { public function authorize(): bool { @@ -17,8 +17,11 @@ class UpdateWebsiteExtrasRequest extends FormRequest */ public function rules(): array { - return app(WebsiteExtraService::class)->requestRules( - $this->user()?->tenant?->website_type_code + $tenant = $this->user()->tenant()->firstOrFail(); + + return app(WebsiteExtraService::class)->requestRulesForExtra( + $tenant, + (string) $this->route('websiteExtraCode') ); } } diff --git a/app/Domains/Tenant/Resources/AdminApp/WebsiteExtrasResource.php b/app/Domains/Tenant/Resources/AdminApp/WebsiteExtrasResource.php index e979d0d..a539d44 100644 --- a/app/Domains/Tenant/Resources/AdminApp/WebsiteExtrasResource.php +++ b/app/Domains/Tenant/Resources/AdminApp/WebsiteExtrasResource.php @@ -18,7 +18,7 @@ class WebsiteExtrasResource extends JsonResource public function toArray(Request $request): array { $websiteExtras = $this->websiteExtras->keyBy( - fn ($extra) => $extra->websiteTypeExtra->nombre + fn ($extra) => $extra->websiteTypeExtra->codigo ); return [ @@ -28,20 +28,22 @@ class WebsiteExtrasResource extends JsonResource ] : null, 'definitions' => $this->websiteType?->extras ->mapWithKeys(fn ($definition) => [ - $definition->nombre => [ + $definition->codigo => [ + 'codigo' => $definition->codigo, + 'nombre' => $definition->nombre, 'descripcion' => $definition->descripcion, 'is_required' => $definition->is_required, 'request_rules' => $definition->config_schema['request_rules'] ?? [], ], ]) ?? [], 'extras' => $websiteExtras->mapWithKeys(fn ($extra) => [ - $extra->websiteTypeExtra->nombre => $this->formatConfig( + $extra->websiteTypeExtra->codigo => $this->formatConfig( $extra->resolvedConfig(), fn (Attachment $attachment): string => $attachment->key ), ]), 'resolved_extras' => $websiteExtras->mapWithKeys(fn ($extra) => [ - $extra->websiteTypeExtra->nombre => $this->formatConfig( + $extra->websiteTypeExtra->codigo => $this->formatConfig( $extra->resolvedConfig(), fn (Attachment $attachment): string => $attachment->getTemporaryUrl(1440) ), diff --git a/app/Domains/Tenant/Resources/TenantResource.php b/app/Domains/Tenant/Resources/TenantResource.php index 8ed48d9..035a59f 100644 --- a/app/Domains/Tenant/Resources/TenantResource.php +++ b/app/Domains/Tenant/Resources/TenantResource.php @@ -42,7 +42,7 @@ class TenantResource extends JsonResource 'extras' => $this->whenLoaded( 'websiteExtras', fn () => $this->websiteExtras->mapWithKeys(fn ($extra) => [ - $extra->websiteTypeExtra->nombre => $this->formatExtraConfig( + $extra->websiteTypeExtra->codigo => $this->formatExtraConfig( $extra->resolvedConfig() ), ]) diff --git a/app/Domains/Tenant/Services/WebsiteExtraService.php b/app/Domains/Tenant/Services/WebsiteExtraService.php index ecd10e8..4d4f3c5 100644 --- a/app/Domains/Tenant/Services/WebsiteExtraService.php +++ b/app/Domains/Tenant/Services/WebsiteExtraService.php @@ -7,6 +7,7 @@ use App\Domains\Attachable\Models\Attachment; use App\Domains\Attachable\Services\AttachmentService; use App\Domains\Shared\Rules\ImageOrBase64Rule; use App\Domains\Tenant\Models\Tenant; +use App\Domains\Tenant\Models\WebsiteExtra; use App\Domains\Tenant\Models\WebsiteType; use App\Domains\Tenant\Models\WebsiteTypeExtra; use Illuminate\Support\Collection; @@ -34,7 +35,7 @@ class WebsiteExtraService } $definitions = $this->definitionsFor($websiteTypeCode); - $allowedNames = $definitions->pluck('nombre')->all(); + $allowedCodes = $definitions->pluck('codigo')->all(); $hasRequiredExtras = $definitions->contains( fn (WebsiteTypeExtra $definition): bool => $definition->is_required ); @@ -43,17 +44,17 @@ class WebsiteExtraService 'extras' => [ $hasRequiredExtras ? 'required' : 'sometimes', 'array', - function (string $attribute, mixed $value, \Closure $fail) use ($allowedNames): void { + function (string $attribute, mixed $value, \Closure $fail) use ($allowedCodes): void { if (! is_array($value)) { return; } - $unknownNames = array_diff(array_keys($value), $allowedNames); + $unknownCodes = array_diff(array_keys($value), $allowedCodes); - if ($unknownNames !== []) { + if ($unknownCodes !== []) { $fail( 'The '.$attribute.' field contains extras not supported by the website type: ' - .implode(', ', $unknownNames).'.' + .implode(', ', $unknownCodes).'.' ); } }, @@ -69,14 +70,14 @@ class WebsiteExtraService )); array_unshift($rootRules, $definition->is_required ? 'required' : 'sometimes'); - $rules["extras.{$definition->nombre}"] = $rootRules; + $rules["extras.{$definition->codigo}"] = $rootRules; foreach ($schemaRules as $path => $pathRules) { if ($path === '$') { continue; } - $rules[$this->requestAttribute($definition->nombre, $path)] = $this->compileRules($pathRules); + $rules[$this->requestAttribute($definition->codigo, $path)] = $this->compileRules($pathRules); } } @@ -95,7 +96,7 @@ class WebsiteExtraService } $definitions = $this->definitionsFor((string) $tenant->website_type_code) - ->keyBy('nombre'); + ->keyBy('codigo'); foreach ($extras as $name => $config) { /** @var WebsiteTypeExtra|null $definition */ @@ -107,8 +108,14 @@ class WebsiteExtraService ]); } - $transformedConfig = $this->applyTransforms($tenant, $definition, $config); - $this->validateDatabaseConfig($definition, $transformedConfig); + $requestRoot = "extras.{$definition->codigo}"; + $transformedConfig = $this->applyTransforms( + $tenant, + $definition, + $config, + $requestRoot + ); + $this->validateDatabaseConfig($definition, $transformedConfig, $requestRoot); $tenant->websiteExtras()->create([ 'website_type_extra_id' => $definition->id, @@ -120,18 +127,55 @@ class WebsiteExtraService } /** - * Replace all configured extras for a tenant. + * Build request rules for one extra addressed by its stable code. * - * @param array $extras + * @return array */ - public function replaceForTenant(Tenant $tenant, array $extras): void + public function requestRulesForExtra(Tenant $tenant, string $extraCode): array { - DB::transaction(function () use ($tenant, $extras): void { - $tenant->websiteExtras()->delete(); - $this->createForTenant($tenant, $extras); - }); + $definition = $this->definitionForTenant($tenant, $extraCode); + $schemaRules = $definition->config_schema['request_rules'] ?? []; + $rootRules = $this->compileRules($schemaRules['$'] ?? []); + $rootRules = array_values(array_filter( + $rootRules, + fn (mixed $rule): bool => ! in_array($rule, ['required', 'sometimes'], true) + )); + array_unshift($rootRules, 'required'); - $tenant->unsetRelation('websiteExtras'); + $rules = ['config' => $rootRules]; + + foreach ($schemaRules as $path => $pathRules) { + if ($path === '$') { + continue; + } + + $rules[$this->configAttribute('config', $path)] = $this->compileRules($pathRules); + } + + return $rules; + } + + public function updateForTenant(Tenant $tenant, string $extraCode, mixed $config): WebsiteExtra + { + $definition = $this->definitionForTenant($tenant, $extraCode); + + return DB::transaction(function () use ($tenant, $definition, $config): WebsiteExtra { + $transformedConfig = $this->applyTransforms($tenant, $definition, $config, 'config'); + $this->validateDatabaseConfig($definition, $transformedConfig, 'config'); + + return $tenant->websiteExtras()->updateOrCreate( + ['website_type_extra_id' => $definition->id], + ['config' => $transformedConfig] + ); + }); + } + + public function definitionForTenant(Tenant $tenant, string $extraCode): WebsiteTypeExtra + { + return WebsiteTypeExtra::query() + ->where('website_type_code', $tenant->website_type_code) + ->where('codigo', $extraCode) + ->firstOrFail(); } /** @@ -163,23 +207,29 @@ class WebsiteExtraService ); } - private function requestAttribute(string $extraName, string $path): string + private function requestAttribute(string $extraCode, string $path): string + { + return $this->configAttribute("extras.{$extraCode}", $path); + } + + private function configAttribute(string $root, string $path): string { if ($path === '$') { - return "extras.{$extraName}"; + return $root; } if (str_starts_with($path, '$.')) { $path = substr($path, 2); } - return "extras.{$extraName}.{$path}"; + return "{$root}.{$path}"; } private function applyTransforms( Tenant $tenant, WebsiteTypeExtra $definition, - mixed $config + mixed $config, + string $requestRoot ): mixed { foreach ($definition->config_schema['transforms'] ?? [] as $path => $transform) { $segments = $this->pathSegments($path); @@ -191,7 +241,8 @@ class WebsiteExtraService $definition, $path, $value, - $transform + $transform, + $requestRoot ) ); } @@ -245,7 +296,8 @@ class WebsiteExtraService WebsiteTypeExtra $definition, string $path, mixed $value, - array $transform + array $transform, + string $requestRoot ): mixed { if ($value === null) { return null; @@ -253,7 +305,7 @@ class WebsiteExtraService if (($transform['handler'] ?? null) !== 'attachment') { throw new InvalidArgumentException( - "Unsupported transform handler for {$definition->nombre}: ".($transform['handler'] ?? 'null') + "Unsupported transform handler for {$definition->codigo}: ".($transform['handler'] ?? 'null') ); } @@ -262,7 +314,7 @@ class WebsiteExtraService if (! $attachment) { throw ValidationException::withMessages([ - $this->requestAttribute($definition->nombre, $path) => [ + $this->configAttribute($requestRoot, $path) => [ 'The selected attachment does not exist.', ], ]); @@ -270,7 +322,7 @@ class WebsiteExtraService } else { $attachment = $this->attachmentService->store( $value, - "tenants/{$tenant->codigo}/extras/{$definition->nombre}" + "tenants/{$tenant->codigo}/extras/{$definition->codigo}" ); } @@ -282,7 +334,7 @@ class WebsiteExtraService && $attachment->type->value !== $expectedType ) { throw ValidationException::withMessages([ - $this->requestAttribute($definition->nombre, $path) => [ + $this->configAttribute($requestRoot, $path) => [ "The attachment must be of type {$expectedType}.", ], ]); @@ -293,7 +345,8 @@ class WebsiteExtraService private function validateDatabaseConfig( WebsiteTypeExtra $definition, - mixed $config + mixed $config, + string $requestRoot ): void { $schemaRules = $definition->config_schema['database_rules'] ?? []; $rules = []; @@ -312,7 +365,7 @@ class WebsiteExtraService foreach ($validator->errors()->toArray() as $attribute => $errors) { $suffix = $attribute === 'config' ? '' : substr($attribute, strlen('config')); - $messages["extras.{$definition->nombre}{$suffix}"] = $errors; + $messages["{$requestRoot}{$suffix}"] = $errors; } throw ValidationException::withMessages($messages); diff --git a/app/Domains/Tenant/routes/adminapp.php b/app/Domains/Tenant/routes/adminapp.php index 14ae745..fff3616 100644 --- a/app/Domains/Tenant/routes/adminapp.php +++ b/app/Domains/Tenant/routes/adminapp.php @@ -8,6 +8,6 @@ Route::prefix('v1/adminapp/tenant') ->group(function (): void { Route::get('website-extras', [WebsiteExtraController::class, 'show']) ->name('adminapp.tenant.website-extras.show'); - Route::put('website-extras', [WebsiteExtraController::class, 'update']) + Route::put('website-extras/{websiteExtraCode}', [WebsiteExtraController::class, 'update']) ->name('adminapp.tenant.website-extras.update'); }); diff --git a/database/migrations/2026_07_31_000200_add_codigo_to_website_type_extras_table.php b/database/migrations/2026_07_31_000200_add_codigo_to_website_type_extras_table.php new file mode 100644 index 0000000..e04a264 --- /dev/null +++ b/database/migrations/2026_07_31_000200_add_codigo_to_website_type_extras_table.php @@ -0,0 +1,52 @@ +string('codigo')->nullable()->after('website_type_code'); + }); + + Schema::table('websites_extras', function (Blueprint $table): void { + $table->unique( + ['website_code', 'website_type_extra_id'], + 'websites_extras_website_definition_unique' + ); + }); + + DB::table('website_type_extras') + ->select(['id', 'nombre']) + ->orderBy('id') + ->each(function (object $extra): void { + DB::table('website_type_extras') + ->where('id', $extra->id) + ->update(['codigo' => $extra->nombre]); + }); + + Schema::table('website_type_extras', function (Blueprint $table): void { + $table->string('codigo')->nullable(false)->change(); + $table->unique( + ['website_type_code', 'codigo'], + 'website_type_extras_type_code_unique' + ); + }); + } + + public function down(): void + { + Schema::table('websites_extras', function (Blueprint $table): void { + $table->dropUnique('websites_extras_website_definition_unique'); + }); + + Schema::table('website_type_extras', function (Blueprint $table): void { + $table->dropUnique('website_type_extras_type_code_unique'); + $table->dropColumn('codigo'); + }); + } +}; diff --git a/database/seeders/WebsiteTypeSeeder.php b/database/seeders/WebsiteTypeSeeder.php index 35ab298..217edfe 100644 --- a/database/seeders/WebsiteTypeSeeder.php +++ b/database/seeders/WebsiteTypeSeeder.php @@ -15,8 +15,9 @@ class WebsiteTypeSeeder extends Seeder ); $shopIt->extras()->updateOrCreate( - ['nombre' => 'carousel'], + ['codigo' => 'carousel'], [ + 'nombre' => 'Carrusel principal', 'descripcion' => 'Listado de attachments que se muestran en el carousel principal.', 'is_required' => false, 'config_schema' => [ @@ -44,8 +45,9 @@ class WebsiteTypeSeeder extends Seeder ); $onTicket->extras()->updateOrCreate( - ['nombre' => 'heroConfig'], + ['codigo' => 'heroConfig'], [ + 'nombre' => 'Configuración del hero', 'descripcion' => 'Configuracion del hero principal del evento.', 'is_required' => false, 'config_schema' => [ @@ -76,8 +78,9 @@ class WebsiteTypeSeeder extends Seeder ); $onTicket->extras()->updateOrCreate( - ['nombre' => 'eventConfig'], + ['codigo' => 'eventConfig'], [ + 'nombre' => 'Información del evento', 'descripcion' => 'Informacion principal del evento.', 'is_required' => false, 'config_schema' => [ diff --git a/tests/Feature/Seeders/TenantSeederTest.php b/tests/Feature/Seeders/TenantSeederTest.php index 15005be..106db33 100644 --- a/tests/Feature/Seeders/TenantSeederTest.php +++ b/tests/Feature/Seeders/TenantSeederTest.php @@ -63,7 +63,7 @@ class TenantSeederTest extends TestCase $this->assertSame('shopit', $sonder->website_type_code); $carousel = $sonder->websiteExtras - ->firstWhere('websiteTypeExtra.nombre', 'carousel'); + ->firstWhere('websiteTypeExtra.codigo', 'carousel'); $this->assertNotNull($carousel); $this->assertCount(6, $carousel->config); @@ -82,7 +82,7 @@ class TenantSeederTest extends TestCase $this->assertSame('onticket', $fiesta->website_type_code); - $extras = $fiesta->websiteExtras->keyBy('websiteTypeExtra.nombre'); + $extras = $fiesta->websiteExtras->keyBy('websiteTypeExtra.codigo'); $this->assertEqualsCanonicalizing( ['heroConfig', 'eventConfig'], $extras->keys()->all(), diff --git a/tests/Feature/Seeders/WebsiteTypeSeederTest.php b/tests/Feature/Seeders/WebsiteTypeSeederTest.php index 0c9e991..f009d49 100644 --- a/tests/Feature/Seeders/WebsiteTypeSeederTest.php +++ b/tests/Feature/Seeders/WebsiteTypeSeederTest.php @@ -24,7 +24,8 @@ class WebsiteTypeSeederTest extends TestCase ->sole(); $this->assertSame('ShopIt', $shopIt->nombre); - $this->assertSame(['carousel'], $shopIt->extras->pluck('nombre')->all()); + $this->assertSame(['carousel'], $shopIt->extras->pluck('codigo')->all()); + $this->assertSame('Carrusel principal', $shopIt->extras->sole()->nombre); $this->assertSame([ 'request_rules' => [ '$' => 'required|array|max:10', @@ -50,10 +51,10 @@ class WebsiteTypeSeederTest extends TestCase $this->assertSame('OnTicket', $onTicket->nombre); $this->assertEqualsCanonicalizing( ['heroConfig', 'eventConfig'], - $onTicket->extras->pluck('nombre')->all(), + $onTicket->extras->pluck('codigo')->all(), ); - $heroSchema = $onTicket->extras->firstWhere('nombre', 'heroConfig')->config_schema; + $heroSchema = $onTicket->extras->firstWhere('codigo', 'heroConfig')->config_schema; $this->assertSame([ 'request_rules' => [ '$' => 'required|array', @@ -79,7 +80,7 @@ class WebsiteTypeSeederTest extends TestCase ], ], $heroSchema); - $eventSchema = $onTicket->extras->firstWhere('nombre', 'eventConfig')->config_schema; + $eventSchema = $onTicket->extras->firstWhere('codigo', 'eventConfig')->config_schema; $this->assertSame([ 'request_rules' => [ '$' => 'required|array', diff --git a/tests/Feature/Tenant/AdminAppWebsiteExtraControllerTest.php b/tests/Feature/Tenant/AdminAppWebsiteExtraControllerTest.php index a783a2d..57022ff 100644 --- a/tests/Feature/Tenant/AdminAppWebsiteExtraControllerTest.php +++ b/tests/Feature/Tenant/AdminAppWebsiteExtraControllerTest.php @@ -29,7 +29,8 @@ class AdminAppWebsiteExtraControllerTest extends TestCase ]); $this->websiteType->extras()->create([ - 'nombre' => 'contactConfig', + 'codigo' => 'contactConfig', + 'nombre' => 'Configuración de contacto', 'descripcion' => 'Datos de contacto visibles en la tienda.', 'is_required' => false, 'config_schema' => [ @@ -79,16 +80,29 @@ class AdminAppWebsiteExtraControllerTest extends TestCase $this->getJson('/api/v1/adminapp/tenant/website-extras') ->assertOk() ->assertJsonPath('data.website_type.codigo', 'test-store') + ->assertJsonPath('data.definitions.contactConfig.codigo', 'contactConfig') + ->assertJsonPath('data.definitions.contactConfig.nombre', 'Configuración de contacto') ->assertJsonPath('data.definitions.contactConfig.is_required', false) ->assertJsonPath('data.extras.contactConfig.phone', '+54 341 555 0101') ->assertJsonPath('data.resolved_extras.contactConfig.phone', '+54 341 555 0101'); } - public function test_adminapp_user_replaces_only_its_tenant_extras(): void + public function test_adminapp_user_updates_one_extra_without_touching_other_tenants(): void { $tenant = $this->createTenant('acme'); $otherTenant = $this->createTenant('other'); $definition = $this->websiteType->extras()->firstOrFail(); + $secondaryDefinition = $this->websiteType->extras()->create([ + 'codigo' => 'footerConfig', + 'nombre' => 'Configuración del pie', + 'descripcion' => 'Configuración adicional del pie.', + 'is_required' => false, + 'config_schema' => [ + 'request_rules' => ['$' => 'required|array'], + 'transforms' => [], + 'database_rules' => ['$' => 'required|array'], + ], + ]); $tenant->websiteExtras()->create([ 'website_type_extra_id' => $definition->id, @@ -98,14 +112,16 @@ class AdminAppWebsiteExtraControllerTest extends TestCase 'website_type_extra_id' => $definition->id, 'config' => ['phone' => 'untouched'], ]); + $tenant->websiteExtras()->create([ + 'website_type_extra_id' => $secondaryDefinition->id, + 'config' => ['text' => 'also untouched'], + ]); Sanctum::actingAs($this->createAdminAppUser($tenant)); - $this->putJson('/api/v1/adminapp/tenant/website-extras', [ - 'extras' => [ - 'contactConfig' => [ - 'phone' => '+54 341 555 9999', - ], + $this->putJson('/api/v1/adminapp/tenant/website-extras/contactConfig', [ + 'config' => [ + 'phone' => '+54 341 555 9999', ], ]) ->assertOk() @@ -119,20 +135,24 @@ class AdminAppWebsiteExtraControllerTest extends TestCase ['phone' => 'untouched'], $otherTenant->websiteExtras()->firstOrFail()->config ); + $this->assertSame( + ['text' => 'also untouched'], + $tenant->websiteExtras() + ->where('website_type_extra_id', $secondaryDefinition->id) + ->firstOrFail() + ->config + ); } - public function test_update_rejects_extras_not_supported_by_the_website_type(): void + public function test_update_returns_not_found_for_an_unsupported_extra_code(): void { $tenant = $this->createTenant('acme'); Sanctum::actingAs($this->createAdminAppUser($tenant)); - $this->putJson('/api/v1/adminapp/tenant/website-extras', [ - 'extras' => [ - 'unknown' => ['enabled' => true], - ], + $this->putJson('/api/v1/adminapp/tenant/website-extras/unknown', [ + 'config' => ['enabled' => true], ]) - ->assertUnprocessable() - ->assertJsonValidationErrors('extras'); + ->assertNotFound(); } private function createTenant(string $code): Tenant diff --git a/tests/Feature/Tenant/StoreTenantWithExtrasTest.php b/tests/Feature/Tenant/StoreTenantWithExtrasTest.php index 818d434..025d706 100644 --- a/tests/Feature/Tenant/StoreTenantWithExtrasTest.php +++ b/tests/Feature/Tenant/StoreTenantWithExtrasTest.php @@ -153,7 +153,7 @@ class StoreTenantWithExtrasTest extends TestCase ->websiteExtras() ->whereHas( 'websiteTypeExtra', - fn ($query) => $query->where('nombre', 'heroConfig') + fn ($query) => $query->where('codigo', 'heroConfig') ) ->sole() ->config; diff --git a/tests/Feature/Tenant/WebsiteExtrasTest.php b/tests/Feature/Tenant/WebsiteExtrasTest.php index efae4df..c396ee4 100644 --- a/tests/Feature/Tenant/WebsiteExtrasTest.php +++ b/tests/Feature/Tenant/WebsiteExtrasTest.php @@ -27,6 +27,7 @@ class WebsiteExtrasTest extends TestCase $this->assertEqualsCanonicalizing([ 'id', 'website_type_code', + 'codigo', 'nombre', 'descripcion', 'is_required', @@ -52,6 +53,7 @@ class WebsiteExtrasTest extends TestCase 'nombre' => 'Tienda', ]); $typeExtra = $type->extras()->create([ + 'codigo' => 'whatsapp', 'nombre' => 'WhatsApp', 'descripcion' => 'Configuracion del canal de WhatsApp', 'is_required' => true, @@ -69,6 +71,7 @@ class WebsiteExtrasTest extends TestCase $this->assertTrue($type->extras()->firstOrFail()->is($typeExtra)); $this->assertSame($type->codigo, $typeExtra->website_type_code); + $this->assertSame('whatsapp', $typeExtra->codigo); $this->assertTrue($type->tenants()->firstOrFail()->is($tenant)); $this->assertTrue($tenant->websiteType()->firstOrFail()->is($type)); $this->assertSame($type->codigo, $tenant->website_type_code); @@ -91,6 +94,7 @@ class WebsiteExtrasTest extends TestCase 'nombre' => 'Tienda', ]); $typeExtra = $type->extras()->create([ + 'codigo' => 'whatsapp', 'nombre' => 'WhatsApp', 'descripcion' => 'Configuracion del canal de WhatsApp', 'config_schema' => ['type' => 'object'],