subscribe('Ada Lovelace', ' Ada@Example.COM '); expect($subscriber->email)->toBe('ada@example.com') ->and($subscriber->name)->toBe('Ada Lovelace'); $this->assertDatabaseHas('waitlist_subscribers', ['email' => 'ada@example.com']); }); it('is idempotent — re-subscribing the same email keeps a single row and returns the original', function () { $service = app(WaitlistService::class); $first = $service->subscribe('Ada', 'ada@example.com'); $second = $service->subscribe('Different Name', 'ADA@example.com'); expect($second->id)->toBe($first->id) ->and($second->name)->toBe('Ada'); expect(WaitlistSubscriber::where('email', 'ada@example.com')->count())->toBe(1); }); it('stores the source and referrer on a new subscriber', function () { $subscriber = app(WaitlistService::class)->subscribe( 'Ada', 'ada@example.com', source: 'pricing', referrer: 'https://duckduckgo.com/', ); expect($subscriber->source)->toBe('pricing') ->and($subscriber->referrer)->toBe('https://duckduckgo.com/'); }); it('preserves the original meta when an existing email re-subscribes', function () { $service = app(WaitlistService::class); $service->subscribe('Ada', 'ada@example.com', source: 'pricing', referrer: 'https://a.test'); $second = $service->subscribe('Ada', 'ada@example.com', source: 'home', referrer: 'https://b.test'); expect($second->source)->toBe('pricing') ->and($second->referrer)->toBe('https://a.test'); });