alias(static fn ($v): int => abs((int) $v)); Functions\when('get_current_user_id')->justReturn(5); $this->repository = Mockery::mock(AvailabilityRepository::class); $this->offerings = Mockery::mock(OfferingRepository::class); $this->endpoint = new AvailabilityEndpoint($this->repository, new WindowValidator($this->offerings)); } public function testCreateRejectsWindowSpanningMultipleDays(): void { $this->repository->shouldNotReceive('createFromWindow'); $request = new \WP_REST_Request([ 'start_dt' => '2026-06-01 19:52:00', 'end_dt' => '2026-06-30 19:52:00', 'duration_minutes' => 60, ]); $result = $this->endpoint->create($request); self::assertInstanceOf(\WP_Error::class, $result); self::assertSame('invalid_window', $result->get_error_code()); } public function testCreateRejectsWindowShorterThanLessonLength(): void { $this->repository->shouldNotReceive('createFromWindow'); $request = new \WP_REST_Request([ 'start_dt' => '2026-07-06 09:00:00', 'end_dt' => '2026-07-06 09:30:00', 'duration_minutes' => 60, ]); $result = $this->endpoint->create($request); self::assertInstanceOf(\WP_Error::class, $result); self::assertSame('invalid_window', $result->get_error_code()); } public function testCreateStoresWindowAsLessonLengthSlots(): void { $this->repository->shouldReceive('createFromWindow') ->once() ->with( Mockery::on(static function (AvailabilitySlot $window): bool { return $window->instructorId === 5 && $window->startDt === '2026-07-06 09:00:00' && $window->endDt === '2026-07-06 16:00:00' && $window->durationMinutes === 60; }), false, 1 ) ->andReturn([1, 2, 3, 4, 5, 6, 7]); $request = new \WP_REST_Request([ 'start_dt' => '2026-07-06 09:00:00', 'end_dt' => '2026-07-06 16:00:00', 'duration_minutes' => 60, 'recurrence' => 'single', 'weeks' => 1, ]); $result = $this->endpoint->create($request); self::assertInstanceOf(\WP_REST_Response::class, $result); self::assertSame(201, $result->get_status()); self::assertSame(['ids' => [1, 2, 3, 4, 5, 6, 7]], $result->get_data()); } public function testCreateWeeklyPassesRecurrenceThrough(): void { $this->repository->shouldReceive('createFromWindow') ->once() ->with(Mockery::type(AvailabilitySlot::class), true, 4) ->andReturn([1, 2, 3, 4]); $request = new \WP_REST_Request([ 'start_dt' => '2026-07-06 09:00:00', 'end_dt' => '2026-07-06 10:00:00', 'duration_minutes' => 60, 'recurrence' => 'weekly', 'weeks' => 4, ]); $result = $this->endpoint->create($request); self::assertInstanceOf(\WP_REST_Response::class, $result); self::assertSame(['ids' => [1, 2, 3, 4]], $result->get_data()); } }