From b8bb7926c03f79622d2c0cc25d0b61bcfd889f82 Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Thu, 29 Jan 2026 07:42:53 +0100 Subject: [PATCH] Expand support API contract coverage --- tests/Feature/Support/SupportApiTest.php | 131 +++++++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/tests/Feature/Support/SupportApiTest.php b/tests/Feature/Support/SupportApiTest.php index 9d34b31..636232d 100644 --- a/tests/Feature/Support/SupportApiTest.php +++ b/tests/Feature/Support/SupportApiTest.php @@ -11,6 +11,7 @@ use App\Models\User; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Bus; use Illuminate\Support\Facades\Hash; +use Illuminate\Testing\Fluent\AssertableJson; use Laravel\Sanctum\Sanctum; use Tests\TestCase; @@ -39,6 +40,8 @@ class SupportApiTest extends TestCase $response->assertOk() ->assertJsonStructure(['data', 'meta']); + + $this->assertSupportListSchema($response->json()); } public function test_support_token_endpoint_issues_bearer_token_and_allows_api_access(): void @@ -155,6 +158,31 @@ class SupportApiTest extends TestCase ->assertJsonPath('error.code', 'support_invalid_fields'); } + public function test_support_list_supports_search_and_sorting(): void + { + $user = User::factory()->create([ + 'role' => 'super_admin', + ]); + + Tenant::factory()->create([ + 'name' => 'Alpha Tenant', + ]); + Tenant::factory()->create([ + 'name' => 'Beta Tenant', + ]); + + Sanctum::actingAs($user, ['support-admin', 'support:read']); + + $response = $this->getJson('/api/v1/support/tenants?search=Alpha&sort=name&direction=asc'); + + $response->assertOk() + ->assertJsonStructure(['data', 'meta']); + + $payload = $response->json(); + $this->assertSupportListSchema($payload); + $this->assertNotEmpty($payload['data']); + } + public function test_support_data_export_create_sets_user_and_dispatches_job(): void { $user = User::factory()->create([ @@ -182,6 +210,45 @@ class SupportApiTest extends TestCase Bus::assertDispatched(\App\Jobs\GenerateDataExport::class); } + public function test_support_tenant_actions_require_actions_ability(): void + { + $user = User::factory()->create([ + 'role' => 'super_admin', + ]); + + $tenant = Tenant::factory()->create([ + 'is_active' => false, + ]); + + Sanctum::actingAs($user, ['support-admin', 'support:write']); + + $response = $this->postJson('/api/v1/support/tenants/'.$tenant->id.'/actions/activate'); + + $response->assertStatus(403) + ->assertJsonPath('error.code', 'forbidden'); + } + + public function test_support_tenant_actions_update_state(): void + { + $user = User::factory()->create([ + 'role' => 'super_admin', + ]); + + $tenant = Tenant::factory()->create([ + 'is_active' => false, + ]); + + Sanctum::actingAs($user, ['support-admin', 'support:actions']); + + $response = $this->postJson('/api/v1/support/tenants/'.$tenant->id.'/actions/activate'); + + $response->assertOk() + ->assertJsonPath('ok', true); + + $tenant->refresh(); + $this->assertTrue((bool) $tenant->is_active); + } + public function test_support_photo_reject_requires_moderation_notes(): void { $user = User::factory()->create([ @@ -248,4 +315,68 @@ class SupportApiTest extends TestCase $this->assertTrue(SuperAdminActionLog::query()->where('action', 'tenants.updated')->exists()); } + + public function test_support_show_returns_item_schema(): void + { + $user = User::factory()->create([ + 'role' => 'super_admin', + ]); + + $tenant = Tenant::factory()->create(); + + Sanctum::actingAs($user, ['support-admin', 'support:read']); + + $response = $this->getJson('/api/v1/support/tenants/'.$tenant->id); + + $response->assertOk(); + + $payload = $response->json(); + $this->assertSupportItemSchema($payload); + } + + public function test_support_guest_policy_settings_schema(): void + { + $user = User::factory()->create([ + 'role' => 'super_admin', + ]); + + Sanctum::actingAs($user, ['support-admin', 'support:settings']); + + $response = $this->getJson('/api/v1/support/settings/guest-policy'); + + $response->assertOk() + ->assertJson(fn (AssertableJson $json) => $json + ->has('data') + ->whereType('data', 'array') + ->has('data.join_token_failure_limit') + ->has('data.join_token_access_limit') + ->has('data.join_token_download_limit') + ->has('data.join_token_ttl_hours') + ); + } + + /** + * @param array $payload + */ + private function assertSupportListSchema(array $payload): void + { + $this->assertArrayHasKey('data', $payload); + $this->assertIsArray($payload['data']); + + $this->assertArrayHasKey('meta', $payload); + $this->assertIsArray($payload['meta']); + $this->assertArrayHasKey('page', $payload['meta']); + $this->assertArrayHasKey('per_page', $payload['meta']); + $this->assertArrayHasKey('total', $payload['meta']); + $this->assertArrayHasKey('last_page', $payload['meta']); + } + + /** + * @param array $payload + */ + private function assertSupportItemSchema(array $payload): void + { + $this->assertArrayHasKey('data', $payload); + $this->assertNotNull($payload['data']); + } }