db = Mockery::mock(\wpdb::class); $this->db->prefix = 'wp_'; $this->repo = new EnrollmentRepository($this->db); } public function testInsertReturnsId(): void { Functions\expect('current_time')->with('mysql')->andReturn('2026-06-02 09:00:00'); $this->db->shouldReceive('insert') ->once() ->with( 'wp_us_group_enrollments', Mockery::on(static function (array $d): bool { return $d['offering_id'] === 7 && $d['student_id'] === 5 && $d['instructor_id'] === 3 && $d['status'] === Enrollment::STATUS_ACTIVE; }), ['%d', '%d', '%d', '%s', '%d', '%s'] ); $this->db->insert_id = 12; self::assertSame(12, $this->repo->insert(new Enrollment(7, 5, 3))); } public function testCountActiveForOffering(): void { $this->db->shouldReceive('prepare') ->once() ->with(Mockery::pattern('/COUNT\(\*\).*offering_id = %d AND status = %s/s'), 'wp_us_group_enrollments', 7, Enrollment::STATUS_ACTIVE) ->andReturn('SELECT ...'); $this->db->shouldReceive('get_var')->andReturn('4'); self::assertSame(4, $this->repo->countActiveForOffering(7)); } public function testCountActiveForStudent(): void { $this->db->shouldReceive('prepare') ->once() ->with(Mockery::pattern('/student_id = %d AND status = %s/'), 'wp_us_group_enrollments', 5, Enrollment::STATUS_ACTIVE) ->andReturn('SELECT ...'); $this->db->shouldReceive('get_var')->andReturn('2'); self::assertSame(2, $this->repo->countActiveForStudent(5)); } public function testHasActiveEnrollmentTrueWhenCountPositive(): void { $this->db->shouldReceive('prepare') ->once() ->with(Mockery::pattern('/offering_id = %d AND student_id = %d AND status = %s/'), 'wp_us_group_enrollments', 7, 5, Enrollment::STATUS_ACTIVE) ->andReturn('SELECT ...'); $this->db->shouldReceive('get_var')->andReturn('1'); self::assertTrue($this->repo->hasActiveEnrollment(7, 5)); } public function testHasActiveEnrollmentFalseWhenZero(): void { $this->db->shouldReceive('prepare')->andReturn('SELECT ...'); $this->db->shouldReceive('get_var')->andReturn('0'); self::assertFalse($this->repo->hasActiveEnrollment(7, 5)); } public function testFindAllActiveMapsRows(): void { $this->db->shouldReceive('prepare')->andReturn('SELECT ...'); $this->db->shouldReceive('get_results')->andReturn([ (object) [ 'id' => '12', 'offering_id' => '7', 'student_id' => '5', 'instructor_id' => '3', 'status' => Enrollment::STATUS_ACTIVE, 'payment_id' => null, ], ]); $all = $this->repo->findAllActive(); self::assertCount(1, $all); self::assertInstanceOf(Enrollment::class, $all[0]); } public function testUpdateStatusRejectsInvalid(): void { self::assertFalse($this->repo->updateStatus(1, 'bogus')); } public function testUpdateStatusCallsWpdb(): void { $this->db->shouldReceive('update') ->once() ->with('wp_us_group_enrollments', ['status' => Enrollment::STATUS_CANCELLED], ['id' => 1], ['%s'], ['%d']) ->andReturn(1); self::assertTrue($this->repo->updateStatus(1, Enrollment::STATUS_CANCELLED)); } }