feat(brand): implement update functionality and validation for brand details

This commit is contained in:
2026-09-29 15:49:18 -03:00
parent a9d9854e5e
commit 3b6d6bf28b
6 changed files with 290 additions and 3 deletions

View File

@@ -11,6 +11,7 @@ use App\Shared\Attachable\Models\Attachment;
use App\Shared\Attachable\Models\AttachmentCrop;
use Database\Seeders\AuthorizationSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Laravel\Sanctum\Sanctum;
use Tests\TestCase;
@@ -80,8 +81,10 @@ class AdminAppBrandControllerTest extends TestCase
foreach (['header_logo' => $header, 'footer_logo' => $footer] as $field => $image) {
$this->assertStringContainsString($image->path, $response->json("data.{$field}"));
$response->assertJsonPath("data.{$field}_key", $image->key);
}
foreach ([$first, $second] as $index => $image) {
$response->assertJsonPath("data.banner_images.{$index}.key", $image->key);
$this->assertStringContainsString(
$image->path,
$response->json("data.banner_images.{$index}.original_url")
@@ -94,6 +97,63 @@ class AdminAppBrandControllerTest extends TestCase
$this->assertStringNotContainsString('other.png', $response->getContent());
}
public function test_update_keeps_original_carousel_attachment_and_returns_its_crop(): void
{
$websiteType = $this->websiteType('shopit');
$carousel = $websiteType->extras()->create([
'codigo' => 'carousel', 'nombre' => 'Carrusel', 'is_required' => false,
'config_schema' => ['request_rules' => [], 'transforms' => [
'$.*' => ['handler' => 'attachment', 'attachment_type' => 'image'],
]],
]);
$tenant = $this->tenant('acme', $websiteType, [
'primary_color' => '#112233', 'footer_bg_color' => '#112233',
]);
Sanctum::actingAs($this->admin($tenant));
$file = UploadedFile::fake()->image('banner.png', 400, 100);
$dataUrl = 'data:image/png;base64,'.base64_encode(file_get_contents($file->getRealPath()));
$response = $this->putJson('/api/v1/adminapp/tenant/brand', [
'nombre' => 'Acme Nueva', 'primary_color' => '#abcdef',
'footer_bg_color' => '#abcdef', 'header_logo' => null, 'footer_logo' => null,
'banner_images' => [[
'image' => $dataUrl,
'crop_horizontal' => ['start_percentage' => 10, 'end_percentage' => 90],
'crop_vertical' => ['start_percentage' => 0, 'end_percentage' => 100],
]],
])->assertOk()
->assertJsonPath('data.nombre', 'Acme Nueva')
->assertJsonPath('data.footer_color', 'primary')
->assertJsonPath('data.banner_images.0.crop.crop_horizontal.start_percentage', 10);
$original = Attachment::query()->where('key', $response->json('data.banner_images.0.key'))->firstOrFail();
$this->assertSame([$original->id], $tenant->websiteExtras()
->where('website_type_extra_id', $carousel->id)->firstOrFail()->config);
$this->assertStringContainsString($original->path, $response->json('data.banner_images.0.original_url'));
$this->assertNotSame($response->json('data.banner_images.0.original_url'),
$response->json('data.banner_images.0.url'));
$updated = $this->putJson('/api/v1/adminapp/tenant/brand', [
'nombre' => 'Acme Nueva', 'primary_color' => '#abcdef',
'footer_bg_color' => '#abcdef', 'header_logo' => null, 'footer_logo' => null,
'banner_images' => [[
'image' => $original->key,
'crop_horizontal' => ['start_percentage' => 20, 'end_percentage' => 80],
'crop_vertical' => ['start_percentage' => 0, 'end_percentage' => 100],
]],
])->assertOk()
->assertJsonPath('data.banner_images.0.key', $original->key)
->assertJsonPath('data.banner_images.0.crop.crop_horizontal.start_percentage', 20);
$this->assertSame([$original->id], $tenant->websiteExtras()
->where('website_type_extra_id', $carousel->id)->firstOrFail()->config);
$this->assertNotSame($response->json('data.banner_images.0.url'),
$updated->json('data.banner_images.0.url'));
$this->assertSame('#abcdef', $tenant->refresh()->footer_bg_color);
$tenant->update(['primary_color' => '#123456']);
$this->assertSame('#abcdef', $tenant->refresh()->footer_bg_color);
}
public function test_footer_color_is_mapped_to_a_supported_option(): void
{
$websiteType = $this->websiteType('shopit');