actingAs($this->operationalUser(), 'sanctum'); InstitutionCategory::factory()->count(2)->create(); $this->getJson('/api/institution-categories') ->assertOk() ->assertJsonStructure(['message', 'data' => [['id', 'value']]]) ->assertJsonCount(2, 'data'); } public function test_show_returns_a_single_category(): void { $this->actingAs($this->operationalUser(), 'sanctum'); $category = InstitutionCategory::factory()->create(); $this->getJson("/api/institution-categories/{$category->id}") ->assertOk() ->assertJsonPath('data.id', $category->id); } public function test_usage_reflects_whether_the_category_is_used(): void { $this->actingAs($this->operationalUser(), 'sanctum'); $free = InstitutionCategory::factory()->create(); $used = InstitutionCategory::factory()->create(); Institution::factory()->create(['category_id' => $used->id]); $this->getJson("/api/institution-categories/{$free->id}/usage")->assertJsonPath('in_use', false); $this->getJson("/api/institution-categories/{$used->id}/usage")->assertJsonPath('in_use', true); } // --- Scrittura (tier.admin) --------------------------------------------- public function test_admin_can_create_a_category(): void { $this->actingAs($this->adminUser(), 'sanctum'); $this->postJson('/api/institution-categories', ['value' => 'gallery']) ->assertCreated() ->assertJsonPath('data.value', 'gallery'); $this->assertDatabaseHas('institution_categories', ['value' => 'gallery']); } public function test_create_rejects_a_duplicate_value(): void { $this->actingAs($this->adminUser(), 'sanctum'); InstitutionCategory::factory()->create(['value' => 'gallery']); $this->postJson('/api/institution-categories', ['value' => 'gallery']) ->assertStatus(422) ->assertJsonValidationErrors('value'); } public function test_admin_can_update_a_category(): void { $this->actingAs($this->adminUser(), 'sanctum'); $category = InstitutionCategory::factory()->create(); $this->putJson("/api/institution-categories/{$category->id}", ['value' => 'archive']) ->assertOk() ->assertJsonPath('data.value', 'archive'); } public function test_cannot_delete_a_category_in_use(): void { $this->actingAs($this->adminUser(), 'sanctum'); $category = InstitutionCategory::factory()->create(); Institution::factory()->create(['category_id' => $category->id]); $this->deleteJson("/api/institution-categories/{$category->id}") ->assertStatus(409) ->assertJsonPath('in_use', true); $this->assertDatabaseHas('institution_categories', ['id' => $category->id]); } public function test_admin_can_delete_a_free_category(): void { $this->actingAs($this->adminUser(), 'sanctum'); $category = InstitutionCategory::factory()->create(); $this->deleteJson("/api/institution-categories/{$category->id}")->assertOk(); $this->assertDatabaseMissing('institution_categories', ['id' => $category->id]); } public function test_a_non_admin_cannot_write(): void { $this->actingAs($this->operationalUser(), 'sanctum'); $this->postJson('/api/institution-categories', ['value' => 'x'])->assertForbidden(); } }