'4', 'title' => 'Cancellation', 'slug' => 'cancellation', 'current_version_id' => '9', 'acceptance_scope' => Policy::SCOPE_BOTH, ]); self::assertSame(4, $policy->id); self::assertSame('cancellation', $policy->slug); self::assertSame(9, $policy->currentVersionId); self::assertSame(Policy::SCOPE_BOTH, $policy->acceptanceScope); self::assertArrayHasKey('acceptance_scope', $policy->toArray()); } public function testPolicyHandlesNullCurrentVersion(): void { $policy = Policy::fromRow((object) [ 'id' => '4', 'title' => 'Cancellation', 'slug' => 'cancellation', 'current_version_id' => null, 'acceptance_scope' => Policy::SCOPE_BOOKING, ]); self::assertNull($policy->currentVersionId); } public function testPolicyAppliesToScopeAndBoth(): void { $signup = new Policy('Terms', 'terms', acceptanceScope: Policy::SCOPE_SIGNUP); self::assertTrue($signup->appliesTo(Policy::SCOPE_SIGNUP)); self::assertFalse($signup->appliesTo(Policy::SCOPE_BOOKING)); $both = new Policy('Both', 'both', acceptanceScope: Policy::SCOPE_BOTH); self::assertTrue($both->appliesTo(Policy::SCOPE_SIGNUP)); self::assertTrue($both->appliesTo(Policy::SCOPE_BOOKING)); } public function testPolicyVersionFromRowAndStatusHelper(): void { $version = PolicyVersion::fromRow((object) [ 'id' => '9', 'policy_id' => '4', 'version_number' => '2', 'body' => '
Policy
', 'status' => PolicyVersion::STATUS_PUBLISHED, 'published_at' => '2026-06-01 10:00:00', ]); self::assertSame(9, $version->id); self::assertSame(2, $version->versionNumber); self::assertTrue($version->isPublished()); self::assertSame('2026-06-01 10:00:00', $version->publishedAt); } public function testPolicyVersionDefaultsToDraft(): void { $version = new PolicyVersion(4, 1); self::assertSame(PolicyVersion::STATUS_DRAFT, $version->status); self::assertFalse($version->isPublished()); self::assertNull($version->publishedAt); self::assertContains(PolicyVersion::STATUS_ARCHIVED, PolicyVersion::VALID_STATUSES); } public function testPolicyAcceptanceFromRowAndToArray(): void { $acceptance = PolicyAcceptance::fromRow((object) [ 'id' => '1', 'policy_version_id' => '9', 'student_id' => '5', 'registration_type' => PolicyAcceptance::REG_LESSON, 'registration_id' => '12', 'accepted_at' => '2026-06-02 09:00:00', 'ip_address' => '203.0.113.7', ]); self::assertSame(9, $acceptance->policyVersionId); self::assertSame(PolicyAcceptance::REG_LESSON, $acceptance->registrationType); self::assertSame('203.0.113.7', $acceptance->ipAddress); self::assertArrayHasKey('policy_version_id', $acceptance->toArray()); self::assertContains(PolicyAcceptance::REG_ENROLLMENT, PolicyAcceptance::VALID_REGISTRATION_TYPES); } }