createMock(Connection::class); $connection ->method('fetchOne') ->willReturn('48'); $reader = new DatabaseParentGradeDelayReader($connection); $result = $reader->delayHoursForTenant(TenantId::fromString(self::TENANT_ID)); self::assertSame(48, $result); } #[Test] public function itReturnsDefault24HoursWhenNoRowFound(): void { $connection = $this->createMock(Connection::class); $connection ->method('fetchOne') ->willReturn(false); $reader = new DatabaseParentGradeDelayReader($connection); $result = $reader->delayHoursForTenant(TenantId::fromString(self::TENANT_ID)); self::assertSame(24, $result); } #[Test] public function itReturnsDefault24HoursWhenResultIsNonNumeric(): void { $connection = $this->createMock(Connection::class); $connection ->method('fetchOne') ->willReturn('not-a-number'); $reader = new DatabaseParentGradeDelayReader($connection); $result = $reader->delayHoursForTenant(TenantId::fromString(self::TENANT_ID)); self::assertSame(24, $result); } #[Test] public function itPassesTenantIdToQuery(): void { $tenantId = TenantId::fromString(self::TENANT_ID); $connection = $this->createMock(Connection::class); $connection ->expects(self::once()) ->method('fetchOne') ->with( self::stringContains('tenant_id'), self::equalTo(['tenant_id' => (string) $tenantId]), ) ->willReturn('12'); $reader = new DatabaseParentGradeDelayReader($connection); $result = $reader->delayHoursForTenant($tenantId); self::assertSame(12, $result); } #[Test] public function itCastsNumericStringToInt(): void { $connection = $this->createMock(Connection::class); $connection ->method('fetchOne') ->willReturn('0'); $reader = new DatabaseParentGradeDelayReader($connection); $result = $reader->delayHoursForTenant(TenantId::fromString(self::TENANT_ID)); self::assertSame(0, $result); } }