4f0f20659d
PHP Tests / php-tests (push) Has been cancelled
EvCompanyResource returned the raw disk-relative path stored by Filament's FileUpload (e.g. "logos/xxx.png"), not something API consumers can render directly. - EvCompany::logoUrl() builds an absolute URL from the configured filesystem disk, guarding against a disk (e.g. s3) that already returns an absolute URL so it isn't double-prefixed. - EvCompanyResource now exposes that as 'logo' instead of the raw path.
89 lines
3.3 KiB
PHP
89 lines
3.3 KiB
PHP
<?php
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Modules\Catalog\Models\Destination;
|
|
use Modules\Catalog\Models\EvCompany;
|
|
|
|
beforeEach(function () {
|
|
$this->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();
|
|
});
|