Add tests for featured thumbnail generation; apply Pint formatting and related edits

This commit is contained in:
2026-05-06 18:55:40 +02:00
parent 7a8bc8e22a
commit 82f2b1f660
65 changed files with 11325 additions and 49545 deletions

View File

@@ -4,11 +4,13 @@ declare(strict_types=1);
use App\Models\Artwork;
use App\Models\User;
use App\Services\HomepageService;
use App\Services\ArtworkService;
use App\Services\HomepageService;
use App\Support\ArtworkFeaturedImagePath;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
uses(RefreshDatabase::class);
@@ -132,6 +134,29 @@ test('featured query excludes inactive and expired feature rows', function () {
->and($featuredIds)->not->toContain($expiredArtwork->id);
});
test('featured page ignores type filtering when the feature type column is absent', function () {
$owner = User::factory()->create();
$artwork = makeFeaturedArtwork(['user_id' => $owner->id, 'title' => 'Type Filter Fallback']);
DB::table('artwork_features')->insert([
'artwork_id' => $artwork->id,
'featured_at' => now()->subHour(),
'expires_at' => null,
'priority' => 100,
'label' => null,
'note' => null,
'is_active' => true,
'created_by' => null,
'created_at' => now(),
'updated_at' => now(),
'deleted_at' => null,
]);
$this->get(route('featured', ['type' => 3]))
->assertOk()
->assertSee('Type Filter Fallback', false);
});
test('featured hero sorts by priority before featured_at', function () {
$owner = User::factory()->create();
$higherPriority = makeFeaturedArtwork(['user_id' => $owner->id, 'title' => 'Higher Priority']);
@@ -276,6 +301,60 @@ test('homepage hero payload uses the forced hero artwork when one is set', funct
->and($hero['title'])->toBe('Forced Homepage Hero');
});
test('homepage renders featured hero picture and preload from dedicated featured thumbnails', function () {
Cache::flush();
Storage::fake('s3');
config([
'uploads.object_storage.disk' => 's3',
'cdn.files_url' => 'https://files.skinbase.org',
]);
$owner = User::factory()->create();
$artwork = makeFeaturedArtwork([
'user_id' => $owner->id,
'title' => 'Hero With Dedicated Featured Images',
'hash' => str_repeat('a', 64),
'file_ext' => 'png',
'thumb_ext' => 'webp',
]);
DB::table('artwork_features')->insert([
'artwork_id' => $artwork->id,
'featured_at' => now()->subHour(),
'expires_at' => null,
'priority' => 900,
'label' => null,
'note' => null,
'is_active' => true,
'force_hero' => true,
'created_by' => null,
'created_at' => now(),
'updated_at' => now(),
'deleted_at' => null,
]);
$paths = app(ArtworkFeaturedImagePath::class);
foreach ($paths->variantNames() as $variant) {
Storage::disk('s3')->put($paths->objectPath($artwork, $variant), 'featured-image');
}
$desktopUrl = $paths->url($artwork, 'desktop');
$desktopXlUrl = $paths->url($artwork, 'desktop_xl');
$xsUrl = $paths->url($artwork, 'xs');
$mobileUrl = $paths->url($artwork, 'mobile');
$this->get(route('index'))
->assertOk()
->assertSee($desktopUrl, false)
->assertSee($desktopXlUrl, false)
->assertSee($xsUrl, false)
->assertSee($mobileUrl, false)
->assertSee('rel="preload"', false)
->assertSee('type="image/webp"', false)
->assertSee('fetchpriority="high"', false);
});
test('community favorites returns artworks ordered by recent medal score', function () {
$owner = User::factory()->create();
$leader = makeFeaturedArtwork(['user_id' => $owner->id, 'title' => 'Leader']);
@@ -412,4 +491,4 @@ test('trending backfills with archive artworks when the recent ranking pool is s
->and($resultIds[0])->toBe($recentLeader->id)
->and($resultIds)->toContain($archiveA->id)
->and($resultIds)->toContain($archiveB->id);
});
});