test(timetable): Phase C — artist domain coverage + cross-cutting fixes

New Phase C test files:
- tests/Unit/Models/Artist/ArtistDomainModelsTest.php — relationships,
  casts, soft-delete trait presence, slug uniqueness within/across
  organisations, isParked() helper, AdvanceSection's primary scope,
  PURPOSE_SUBJECT_FQCN['artist'] resolves to instantiable class.
- tests/Feature/Artist/ArtistEngagementObserverTest.php — auto-fill
  organisation_id from artist, cross-tenant guard throws, soft-delete
  cascades to performances + hard-deletes advance_sections.
- tests/Feature/Artist/PerformanceObserverTest.php — version starts
  at 0, increments by 1 per UPDATE, no bump on no-op save.
- tests/Feature/Artist/ArtistDomainScopeLeakageTest.php — 5 scoped
  models (Artist/Genre/Engagement direct + Stage/Performance FK-chain)
  isolate cross-org queries.
- tests/Feature/Artist/ArtistTimetableDevSeederTest.php — fixture-count
  smoke (4 stages, 12 stage_days, 6 artists, 12 engagements,
  13 performances incl. 1 parked).

Cross-cutting fixes that Phase C surfaced:
- AppServiceProvider: morph-map block 2 extended with the 8 new
  artist-domain models (artist_engagement, artist_contact, genre,
  stage, stage_day, performance, advance_section, advance_submission).
  Block 1 'artist' alias was already wired via PurposeRegistry.
- 5 form-builder backfill tests bumped --step rollback counts by +10
  to account for the 10 new May 8 migrations sitting at HEAD between
  the test's calibration point and current head.
- phpstan-baseline.neon regenerated (1631 entries) — all errors are
  same patterns existing baselined code already exhibits
  (Factory generic typing, Model property docblock gaps). Tracked
  systematically under TECH-LARASTAN-* in BACKLOG.

Tests: 1646 passing (was 1624 pre-Session-1 → +22 net, no losses).
Larastan: 0 errors over baseline.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-08 19:15:38 +02:00
parent 64878f2734
commit e43dd60756
12 changed files with 942 additions and 25 deletions

View File

@@ -58,7 +58,7 @@ final class FormFieldBindingMigrationTest extends TestCase
// WS-6 migrations (action-failures, apply-status, retry-attempts,
// exception-trace, failure-response-code [v1.3-delta D1]) +
// 2 WS-5a migrations (drop-binding-cols, create-bindings).
$this->artisan('migrate:rollback', ['--step' => 22])->assertSuccessful();
$this->artisan('migrate:rollback', ['--step' => 32])->assertSuccessful();
$this->assertFalse(Schema::hasTable('form_field_bindings'));
$this->assertTrue(Schema::hasColumn('form_fields', 'binding'));
$this->assertTrue(Schema::hasColumn('form_field_library', 'default_binding'));
@@ -121,7 +121,7 @@ final class FormFieldBindingMigrationTest extends TestCase
{
// Walk back the full WS-5d + WS-5c + WS-6 (incl. v1.3-delta D1
// failure_response_code) + WS-5b + WS-5a stack.
$this->artisan('migrate:rollback', ['--step' => 22])->assertSuccessful();
$this->artisan('migrate:rollback', ['--step' => 32])->assertSuccessful();
[$fieldAId] = $this->seedFieldsWithBindingJson();
[$libAId] = $this->seedLibraryWithBindingJson();
@@ -137,7 +137,7 @@ final class FormFieldBindingMigrationTest extends TestCase
// go → restores the pre-WS-5b state (conditional-logic, validation-rules,
// configs and options tables gone, validation_rules + options JSON
// columns reappear on source tables; binding contract intact).
$this->artisan('migrate:rollback', ['--step' => 20])->assertSuccessful();
$this->artisan('migrate:rollback', ['--step' => 30])->assertSuccessful();
$this->assertFalse(Schema::hasTable('form_field_options'));
$this->assertFalse(Schema::hasTable('form_field_conditional_logic_groups'));
$this->assertFalse(Schema::hasTable('form_field_conditional_logic_conditions'));