instructorId); self::assertSame('2026-04-01 09:00:00', $slot->startDt); self::assertSame('2026-04-01 10:00:00', $slot->endDt); self::assertFalse($slot->isBooked); self::assertSame(42, $slot->id); } public function testFromRowMapsCorrectly(): void { $row = (object) [ 'id' => '7', 'instructor_id' => '3', 'start_dt' => '2026-05-10 14:00:00', 'end_dt' => '2026-05-10 15:00:00', 'is_booked' => '1', ]; $slot = AvailabilitySlot::fromRow($row); self::assertSame(7, $slot->id); self::assertSame(3, $slot->instructorId); self::assertTrue($slot->isBooked); } public function testToArrayContainsExpectedKeys(): void { $slot = new AvailabilitySlot(1, '2026-04-01 09:00:00', '2026-04-01 10:00:00', false, 10); $arr = $slot->toArray(); self::assertArrayHasKey('id', $arr); self::assertArrayHasKey('instructor_id', $arr); self::assertArrayHasKey('start_dt', $arr); self::assertArrayHasKey('end_dt', $arr); self::assertArrayHasKey('is_booked', $arr); } public function testDefaultIsBookedIsFalse(): void { $slot = new AvailabilitySlot(1, '2026-04-01 09:00:00', '2026-04-01 10:00:00'); self::assertFalse($slot->isBooked); } public function testDefaultIdIsNull(): void { $slot = new AvailabilitySlot(1, '2026-04-01 09:00:00', '2026-04-01 10:00:00'); self::assertNull($slot->id); } }