withoutMiddleware(EnsurePlatformSession::class); if (method_exists($this, 'withoutVite')) { $this->withoutVite(); } } private function user(): User { return User::create([ 'public_id' => (string) Str::uuid(), 'name' => 'Owner', 'email' => 'owner+'.uniqid().'@example.com', ]); } private function link(User $user, array $attrs = []): ShortLink { return ShortLink::create(array_merge([ 'user_id' => $user->id, 'slug' => strtolower(Str::random(8)), 'source_app' => 'link', 'source_kind' => 'redirect', 'is_managed_here' => true, 'destination_url' => 'https://example.com', 'is_active' => true, 'clicks_total' => 12, 'unique_clicks_total' => 7, ], $attrs)); } public function test_owner_can_create_campaign_and_attach_links(): void { $user = $this->user(); $link = $this->link($user); $this->actingAs($user) ->post(route('link.campaigns.store'), [ 'name' => 'Launch week', 'description' => 'Homepage CTAs', 'status' => Campaign::STATUS_ACTIVE, ]) ->assertRedirect(); $campaign = Campaign::first(); $this->assertNotNull($campaign); $this->assertSame('Launch week', $campaign->name); $this->actingAs($user) ->post(route('link.campaigns.attach', $campaign), [ 'short_link_ids' => [$link->id], ]) ->assertRedirect() ->assertSessionHas('success'); $this->assertSame($campaign->id, $link->fresh()->campaign_id); $this->actingAs($user) ->get(route('link.campaigns.show', $campaign)) ->assertOk() ->assertSee('Launch week') ->assertSee($link->slug); } public function test_owner_can_detach_and_delete_campaign(): void { $user = $this->user(); $campaign = Campaign::create([ 'user_id' => $user->id, 'name' => 'Temp', 'status' => Campaign::STATUS_ACTIVE, ]); $link = $this->link($user, ['campaign_id' => $campaign->id]); $this->actingAs($user) ->delete(route('link.campaigns.detach', [$campaign, $link])) ->assertRedirect(); $this->assertNull($link->fresh()->campaign_id); $link->update(['campaign_id' => $campaign->id]); $this->actingAs($user) ->delete(route('link.campaigns.destroy', $campaign)) ->assertRedirect(route('link.campaigns.index')); $this->assertDatabaseMissing('campaigns', ['id' => $campaign->id]); $this->assertNull($link->fresh()->campaign_id); } public function test_index_lists_campaigns(): void { $user = $this->user(); Campaign::create([ 'user_id' => $user->id, 'name' => 'Visible campaign', 'status' => Campaign::STATUS_ACTIVE, ]); $this->actingAs($user) ->get(route('link.campaigns.index')) ->assertOk() ->assertSee('Visible campaign') ->assertSee('New campaign'); } }