create([ 'username' => 'publicworlds', 'name' => 'Public Worlds', ]); unset($attributes['creator']); return World::query()->create(array_merge([ 'title' => 'Summer Slam 2026', 'slug' => 'summer-slam-2026', 'tagline' => 'Sunlit publishing and warm-color campaigns.', 'summary' => 'A bright world for summer culture across the platform.', 'description' => 'Public world description', 'theme_key' => 'summer', 'status' => World::STATUS_PUBLISHED, 'type' => World::TYPE_SEASONAL, 'is_featured' => true, 'starts_at' => Carbon::parse('2026-06-01 00:00:00'), 'ends_at' => Carbon::parse('2026-08-31 23:59:59'), 'published_at' => Carbon::parse('2026-04-01 10:00:00'), 'created_by_user_id' => $creator->id, ], $attributes)); } it('renders public worlds index and detail pages', function (): void { $world = publicWorld(); $this->get(route('worlds.index')) ->assertOk() ->assertInertia(fn (AssertableInertia $page) => $page ->component('World/WorldIndex') ->where('featuredWorld.title', 'Summer Slam 2026') ->has('activeWorlds')); $this->get(route('worlds.show', ['world' => $world->slug])) ->assertOk() ->assertInertia(fn (AssertableInertia $page) => $page ->component('World/WorldShow') ->where('world.title', 'Summer Slam 2026') ->where('world.slug', 'summer-slam-2026')); }); it('falls back to the theme icon when the stored world icon is blank whitespace', function (): void { $world = publicWorld([ 'title' => 'Spring Vibes', 'slug' => 'spring-vibes', 'theme_key' => 'summer', 'icon_name' => ' ', ]); $this->get(route('worlds.show', ['world' => $world->slug])) ->assertOk() ->assertInertia(fn (AssertableInertia $page) => $page ->component('World/WorldShow') ->where('world.title', 'Spring Vibes') ->where('world.icon_name', 'fa-solid fa-sun') ->where('world.theme.icon_name', 'fa-solid fa-sun')); }); it('omits disabled sections from the public world payload', function (): void { $world = publicWorld([ 'title' => 'Curated Autumn 2026', 'slug' => 'curated-autumn-2026', 'section_visibility_json' => [ 'featured_creators' => false, ], ]); $world->worldRelations()->create([ 'section_key' => 'featured_creators', 'related_type' => 'user', 'related_id' => $world->created_by_user_id, 'context_label' => 'Editorial spotlight', 'sort_order' => 0, 'is_featured' => true, ]); $this->get(route('worlds.show', ['world' => $world->slug])) ->assertOk() ->assertInertia(fn (AssertableInertia $page) => $page ->component('World/WorldShow') ->where('world.title', 'Curated Autumn 2026') ->where('sections', [])); }); it('keeps archived worlds publicly visible', function (): void { $world = publicWorld([ 'title' => 'Halloween World 2025', 'slug' => 'halloween-world-2025', 'theme_key' => 'halloween', 'status' => World::STATUS_ARCHIVED, 'starts_at' => Carbon::parse('2025-10-01 00:00:00'), 'ends_at' => Carbon::parse('2025-11-01 00:00:00'), 'published_at' => Carbon::parse('2025-09-20 10:00:00'), ]); $this->get(route('worlds.show', ['world' => $world->slug])) ->assertOk() ->assertSee('Halloween World 2025'); }); it('exposes a homepage world spotlight when a featured world exists', function (): void { publicWorld([ 'title' => 'Pixel Week 2026', 'slug' => 'pixel-week-2026', 'theme_key' => 'pixel-week', ]); app(HomepageService::class)->clearGuestPayloadCache(); $this->get(route('index')) ->assertOk() ->assertSee(route('worlds.index'), false) ->assertSee('pixel-week-2026') ->assertSee('Pixel Week 2026'); });