token = User::factory()->create()->createToken('test-token')->plainTextToken; }); test('lists active ev companies', function () { $active = EvCompany::factory()->create(['is_active' => true]); EvCompany::factory()->create(['is_active' => false]); $this->withHeader('Authorization', "Bearer {$this->token}") ->getJson('/api/v1/companies') ->assertSuccessful() ->assertJsonCount(1, 'data') ->assertJsonFragment(['id' => $active->id]); }); test('returns the company logo as a full absolute url', function () { $company = EvCompany::factory()->create(['is_active' => true, 'logo' => 'logos/example.png']); $this->withHeader('Authorization', "Bearer {$this->token}") ->getJson('/api/v1/companies') ->assertSuccessful() ->assertJsonFragment(['logo' => url(Storage::disk(config('filesystems.default'))->url($company->logo))]); }); test('returns a null logo when the company has none', function () { EvCompany::factory()->create(['is_active' => true, 'logo' => null]); $this->withHeader('Authorization', "Bearer {$this->token}") ->getJson('/api/v1/companies') ->assertSuccessful() ->assertJsonFragment(['logo' => null]); }); test('lists active destinations', function () { $active = Destination::factory()->create(['is_active' => true]); Destination::factory()->create(['is_active' => false]); $this->withHeader('Authorization', "Bearer {$this->token}") ->getJson('/api/v1/destinations') ->assertSuccessful() ->assertJsonCount(1, 'data') ->assertJsonFragment(['id' => $active->id]); }); test('paginates companies and destinations', function () { EvCompany::factory()->count(20)->create(['is_active' => true]); Destination::factory()->count(20)->create(['is_active' => true]); $this->withHeader('Authorization', "Bearer {$this->token}") ->getJson('/api/v1/companies') ->assertSuccessful() ->assertJsonCount(15, 'data') ->assertJsonPath('meta.total', 20); $this->withHeader('Authorization', "Bearer {$this->token}") ->getJson('/api/v1/destinations') ->assertSuccessful() ->assertJsonCount(15, 'data') ->assertJsonPath('meta.total', 20); }); test('searches destinations by comma-separated terms', function () { $yangon = Destination::factory()->create(['is_active' => true, 'name' => 'Yangon']); $mandalay = Destination::factory()->create(['is_active' => true, 'name' => 'Mandalay']); Destination::factory()->create(['is_active' => true, 'name' => 'Bagan']); $this->withHeader('Authorization', "Bearer {$this->token}") ->getJson('/api/v1/destinations?search=yangon,mandalay') ->assertSuccessful() ->assertJsonCount(2, 'data') ->assertJsonFragment(['id' => $yangon->id]) ->assertJsonFragment(['id' => $mandalay->id]); }); test('companies endpoint rejects unauthenticated requests', function () { $this->getJson('/api/v1/companies')->assertUnauthorized(); }); test('destinations endpoint rejects unauthenticated requests', function () { $this->getJson('/api/v1/destinations')->assertUnauthorized(); });