diff --git a/tests/Feature/Http/Controllers/SponsorControllerTest.php b/tests/Feature/Http/Controllers/SponsorControllerTest.php index b46239f..a050720 100644 --- a/tests/Feature/Http/Controllers/SponsorControllerTest.php +++ b/tests/Feature/Http/Controllers/SponsorControllerTest.php @@ -1,7 +1,70 @@ conference = Conference::create([ + 'uuid' => 'test-conference-uuid', + 'name' => 'PHP Tek 2026', + 'venue_name' => 'Test Venue', + 'venue_city' => 'Chicago', + 'venue_state' => 'IL', + 'venue_country' => 'US', + 'start_date' => '2026-05-19', + 'end_date' => '2026-05-21', + ]); + + config(['tek.conference.uuid' => 'test-conference-uuid']); +}); + +test('partners section renders sponsors with website', function () { + $sponsor = Sponsor::factory()->withTestLogo()->create([ + 'website' => 'https://example.com', + ]); + + $this->conference->sponsors()->attach($sponsor->uuid, [ + 'sponsorship_level' => 'gold', + ]); + + $response = $this->get('/'); + + $response->assertStatus(200); + $response->assertSee($sponsor->name, false); + $response->assertSee('example.com', false); +}); + +test('partners section renders sponsors without website without errors', function () { + $sponsor = Sponsor::factory()->withTestLogo()->withoutWebsite()->create(); + + $this->conference->sponsors()->attach($sponsor->uuid, [ + 'sponsorship_level' => 'gold', + ]); + + $response = $this->get('/'); + + $response->assertStatus(200); + $response->assertSee($sponsor->name, false); +}); + +test('partners section handles mix of sponsors with and without websites', function () { + $sponsorWithSite = Sponsor::factory()->withTestLogo()->create([ + 'website' => 'https://has-website.com', + ]); + + $sponsorWithoutSite = Sponsor::factory()->withTestLogo()->withoutWebsite()->create(); + + $this->conference->sponsors()->attach($sponsorWithSite->uuid, [ + 'sponsorship_level' => 'gold', + ]); + + $this->conference->sponsors()->attach($sponsorWithoutSite->uuid, [ + 'sponsorship_level' => 'silver', + ]); + $response = $this->get('/'); $response->assertStatus(200); + $response->assertSee($sponsorWithSite->name, false); + $response->assertSee($sponsorWithoutSite->name, false); }); diff --git a/tests/Feature/RelationshipTest.php b/tests/Feature/RelationshipTest.php new file mode 100644 index 0000000..74b9593 --- /dev/null +++ b/tests/Feature/RelationshipTest.php @@ -0,0 +1,97 @@ + 'rel-test-conf-uuid', + 'name' => 'Relationship Test Conference', + 'venue_name' => 'Test Venue', + 'start_date' => '2026-05-19', + 'end_date' => '2026-05-21', + ]); + + $sponsor = Sponsor::factory()->withTestLogo()->create(); + + $conference->sponsors()->attach($sponsor->uuid, [ + 'sponsorship_level' => 'gold', + ]); + + $conference->refresh(); + + expect($conference->sponsors)->toHaveCount(1); + expect($conference->sponsors->first()->name)->toBe($sponsor->name); + expect($conference->sponsors->first()->pivot->sponsorship_level)->toBe('gold'); +}); + +test('sponsor belongs to many conferences through pivot', function () { + $conference = Conference::create([ + 'uuid' => 'rel-test-conf-uuid-2', + 'name' => 'Reverse Relationship Conference', + 'venue_name' => 'Test Venue', + 'start_date' => '2026-05-19', + 'end_date' => '2026-05-21', + ]); + + $sponsor = Sponsor::factory()->withTestLogo()->create(); + + $conference->sponsors()->attach($sponsor->uuid, [ + 'sponsorship_level' => 'silver', + ]); + + $sponsor->refresh(); + + expect($sponsor->conferences)->toHaveCount(1); + expect($sponsor->conferences->first()->name)->toBe($conference->name); + expect($sponsor->conferences->first()->pivot->sponsorship_level)->toBe('silver'); +}); + +test('conference has many users through pivot', function () { + $conference = Conference::create([ + 'uuid' => 'rel-test-conf-uuid-3', + 'name' => 'User Relationship Conference', + 'venue_name' => 'Test Venue', + 'start_date' => '2026-05-19', + 'end_date' => '2026-05-21', + ]); + + $user = User::factory()->create(); + + $conference->users()->attach($user->uuid); + + $conference->refresh(); + + expect($conference->users)->toHaveCount(1); + expect($conference->users->first()->email)->toBe($user->email); +}); + +test('conference can have multiple sponsors at different levels', function () { + $conference = Conference::create([ + 'uuid' => 'rel-test-conf-uuid-4', + 'name' => 'Multi Sponsor Conference', + 'venue_name' => 'Test Venue', + 'start_date' => '2026-05-19', + 'end_date' => '2026-05-21', + ]); + + $goldSponsor = Sponsor::factory()->withTestLogo()->create(); + $silverSponsor = Sponsor::factory()->withTestLogo()->create(); + + $conference->sponsors()->attach($goldSponsor->uuid, [ + 'sponsorship_level' => 'gold', + ]); + + $conference->sponsors()->attach($silverSponsor->uuid, [ + 'sponsorship_level' => 'silver', + ]); + + $conference->refresh(); + + expect($conference->sponsors)->toHaveCount(2); + + $levels = $conference->sponsors->pluck('pivot.sponsorship_level')->toArray(); + expect($levels)->toContain('gold'); + expect($levels)->toContain('silver'); +}); diff --git a/tests/Feature/SponsorModelTest.php b/tests/Feature/SponsorModelTest.php new file mode 100644 index 0000000..bd46b03 --- /dev/null +++ b/tests/Feature/SponsorModelTest.php @@ -0,0 +1,52 @@ +make(['logo' => null]); + + expect($sponsor->logo_url)->toBeNull(); +}); + +test('logoUrl returns http url as-is', function () { + $sponsor = Sponsor::factory()->make([ + 'logo' => 'https://example.com/logo.png', + ]); + + expect($sponsor->logo_url)->toBe('https://example.com/logo.png'); +}); + +test('logoUrl returns asset url for existing public file', function () { + $sponsor = Sponsor::factory()->make([ + 'logo' => 'favicon.ico', + ]); + + expect($sponsor->logo_url)->toContain('favicon.ico'); +}); + +test('logoUrl falls back to s3 for non-public relative paths', function () { + Storage::fake('s3'); + + $sponsor = Sponsor::factory()->make([ + 'logo' => 'vendor_logos/some-logo.png', + ]); + + $url = $sponsor->logo_url; + + expect($url)->toContain('vendor_logos/some-logo.png'); +}); + +test('logoUrl prepends vendor_logos prefix for bare paths on s3', function () { + Storage::fake('s3'); + + $sponsor = Sponsor::factory()->make([ + 'logo' => 'some-logo.png', + ]); + + $url = $sponsor->logo_url; + + expect($url)->toContain('vendor_logos/some-logo.png'); +});