seed(RoleSeeder::class); $this->org = Organisation::factory()->create(); $this->orgAdmin = User::factory()->create(); $this->org->users()->attach($this->orgAdmin, ['role' => 'org_admin']); $this->event = Event::factory()->create(['organisation_id' => $this->org->id]); $this->artist = Artist::factory()->create(['organisation_id' => $this->org->id]); } private function url(string $tail = ''): string { return "/api/v1/organisations/{$this->org->id}/events/{$this->event->id}/engagements{$tail}"; } public function test_index_returns_engagements(): void { $a = Artist::factory()->create(['organisation_id' => $this->org->id]); $b = Artist::factory()->create(['organisation_id' => $this->org->id]); ArtistEngagement::factory()->create(['artist_id' => $a->id, 'event_id' => $this->event->id]); ArtistEngagement::factory()->create(['artist_id' => $b->id, 'event_id' => $this->event->id]); Sanctum::actingAs($this->orgAdmin); $this->getJson($this->url())->assertOk()->assertJsonCount(2, 'data'); } public function test_create_engagement(): void { Sanctum::actingAs($this->orgAdmin); $response = $this->postJson($this->url(), [ 'artist_id' => $this->artist->id, 'booking_status' => ArtistEngagementStatus::Draft->value, ]); $response->assertCreated(); } public function test_create_with_invalid_status_transition_returns_422(): void { Sanctum::actingAs($this->orgAdmin); $response = $this->postJson($this->url(), [ 'artist_id' => $this->artist->id, 'booking_status' => ArtistEngagementStatus::Option->value, // Missing option_expires_at — service should refuse ]); $response->assertStatus(422); } public function test_update_status_transition(): void { $eng = ArtistEngagement::factory()->create([ 'artist_id' => $this->artist->id, 'event_id' => $this->event->id, 'booking_status' => ArtistEngagementStatus::Draft, ]); Sanctum::actingAs($this->orgAdmin); $response = $this->patchJson($this->url("/{$eng->id}"), [ 'booking_status' => ArtistEngagementStatus::Requested->value, ]); $response->assertOk(); $this->assertSame( ArtistEngagementStatus::Requested, $eng->refresh()->booking_status, ); } public function test_destroy_soft_deletes(): void { $eng = ArtistEngagement::factory()->create([ 'artist_id' => $this->artist->id, 'event_id' => $this->event->id, ]); Sanctum::actingAs($this->orgAdmin); $this->deleteJson($this->url("/{$eng->id}"))->assertNoContent(); $this->assertSoftDeleted('artist_engagements', ['id' => $eng->id]); } }