whisper-money/tests/Feature/Services/LeadCohortResolverTest.php

64 lines
2.4 KiB
PHP

<?php
use App\Enums\LeadCohort;
use App\Models\UserLead;
use App\Services\LeadCohortResolver;
use Illuminate\Database\Eloquent\Factories\Sequence;
beforeEach(function (): void {
$this->resolver = app(LeadCohortResolver::class);
});
it('returns null for leads without a positive position', function (): void {
$lead = UserLead::factory()->unverified()->create();
expect($this->resolver->resolve($lead))->toBeNull();
});
it('classifies the first ten ranked leads as founders', function (): void {
$leads = collect(range(1, 12))->map(
fn (int $position) => UserLead::factory()->ranked(500 + $position)->create(),
);
expect($this->resolver->resolve($leads[0]))->toBe(LeadCohort::Founder);
expect($this->resolver->resolve($leads[9]))->toBe(LeadCohort::Founder);
expect($this->resolver->resolve($leads[10]))->toBe(LeadCohort::EarlyBird);
});
it('classifies ranks 11-100 as early bird', function (): void {
UserLead::factory()->count(10)->state(new Sequence(
...array_map(fn (int $i) => ['position' => $i, 'email_verified_at' => now()], range(1, 10)),
))->create();
$eleventh = UserLead::factory()->ranked(11)->create();
$hundredth = UserLead::factory()->ranked(100)->create();
UserLead::factory()->count(88)->state(new Sequence(
...array_map(fn (int $i) => ['position' => $i, 'email_verified_at' => now()], range(12, 99)),
))->create();
expect($this->resolver->resolve($eleventh))->toBe(LeadCohort::EarlyBird);
expect($this->resolver->resolve($hundredth))->toBe(LeadCohort::EarlyBird);
});
it('classifies ranks 101+ as waitlist', function (): void {
UserLead::factory()->count(100)->state(new Sequence(
...array_map(fn (int $i) => ['position' => $i, 'email_verified_at' => now()], range(1, 100)),
))->create();
$lead = UserLead::factory()->ranked(101)->create();
expect($this->resolver->resolve($lead))->toBe(LeadCohort::Waitlist);
});
it('marks referrers of founders as founder_referrer regardless of own rank', function (): void {
$referrer = UserLead::factory()->ranked(750)->create();
UserLead::factory()->ranked(1)->create(['referred_by_id' => $referrer->id]);
UserLead::factory()->count(9)->state(new Sequence(
...array_map(fn (int $i) => ['position' => $i, 'email_verified_at' => now()], range(2, 10)),
))->create();
expect($this->resolver->resolve($referrer))->toBe(LeadCohort::FounderReferrer);
});