create(); try { $this->app->make(ArtistAdvanceSubjectResolver::class)->resolveOrProvision($submission); $this->fail('Expected PurposeSubjectResolutionException'); } catch (PurposeSubjectResolutionException $e) { $this->assertSame('artist_advance', $e->purposeSlug); $this->assertSame('no_portal_token', $e->reasonCode); } } public function test_supplier_intake_returns_company_subject(): void { $organisation = Organisation::factory()->create(); $company = Company::factory()->create(['organisation_id' => $organisation->id]); $submission = FormSubmission::factory()->forOrganisation($organisation)->create([ 'subject_type' => 'company', 'subject_id' => $company->id, ]); $resolved = $this->app->make(SupplierIntakeSubjectResolver::class) ->resolveOrProvision($submission->fresh()); $this->assertInstanceOf(Company::class, $resolved); $this->assertSame($company->id, $resolved->id); } public function test_supplier_intake_throws_without_company(): void { $submission = FormSubmission::factory()->create(); try { $this->app->make(SupplierIntakeSubjectResolver::class)->resolveOrProvision($submission); $this->fail('Expected PurposeSubjectResolutionException'); } catch (PurposeSubjectResolutionException $e) { $this->assertSame('no_production_request', $e->reasonCode); } } public function test_post_event_evaluation_resolves_person_via_user(): void { $event = Event::factory()->create(); $crowdType = CrowdType::factory()->create(['organisation_id' => $event->organisation_id]); $user = User::factory()->create(); $person = Person::factory()->create([ 'event_id' => $event->id, 'crowd_type_id' => $crowdType->id, 'user_id' => $user->id, ]); $submission = FormSubmission::factory()->forEvent($event)->create([ 'submitted_by_user_id' => $user->id, ]); $resolved = $this->app->make(PostEventEvaluationSubjectResolver::class) ->resolveOrProvision($submission->fresh()); $this->assertInstanceOf(Person::class, $resolved); $this->assertSame($person->id, $resolved->id); } public function test_post_event_evaluation_throws_when_no_auth(): void { $submission = FormSubmission::factory()->create(['submitted_by_user_id' => null]); try { $this->app->make(PostEventEvaluationSubjectResolver::class)->resolveOrProvision($submission); $this->fail('Expected PurposeSubjectResolutionException'); } catch (PurposeSubjectResolutionException $e) { $this->assertSame('no_auth', $e->reasonCode); } } public function test_incident_report_returns_null_when_anonymous(): void { $submission = FormSubmission::factory()->create(['submitted_by_user_id' => null]); $resolved = $this->app->make(IncidentReportSubjectResolver::class) ->resolveOrProvision($submission); $this->assertNull($resolved); } public function test_signature_contract_returns_user_subject(): void { $user = User::factory()->create(); $submission = FormSubmission::factory()->create([ 'submitted_by_user_id' => $user->id, ]); $resolved = $this->app->make(SignatureContractSubjectResolver::class) ->resolveOrProvision($submission); $this->assertInstanceOf(User::class, $resolved); $this->assertSame($user->id, $resolved->id); } public function test_signature_contract_throws_without_auth(): void { $submission = FormSubmission::factory()->create(['submitted_by_user_id' => null]); try { $this->app->make(SignatureContractSubjectResolver::class)->resolveOrProvision($submission); $this->fail('Expected PurposeSubjectResolutionException'); } catch (PurposeSubjectResolutionException $e) { $this->assertSame('no_auth', $e->reasonCode); } } public function test_user_profile_returns_user_subject(): void { $user = User::factory()->create(); $submission = FormSubmission::factory()->create([ 'submitted_by_user_id' => $user->id, ]); $resolved = $this->app->make(UserProfileSubjectResolver::class) ->resolveOrProvision($submission); $this->assertInstanceOf(User::class, $resolved); $this->assertSame($user->id, $resolved->id); } }