alias(static fn ($v) => $v); Functions\when('sanitize_key')->alias(static fn ($v) => $v); Functions\when('absint')->alias(static fn ($v) => (int) $v); $_POST = []; } protected function tearDown(): void { $_POST = []; parent::tearDown(); } public function testRenderPageDiesWithoutCapability(): void { Functions\when('current_user_can')->justReturn(false); Functions\when('wp_die')->alias(static function (): void { throw new \RuntimeException('wp_die'); }); $this->expectException(\RuntimeException::class); (new RegistrationApprovalController(Mockery::mock(RegistrationMailer::class)))->renderPage(); } public function testApproveClearsPendingMetaAndEmailsStudent(): void { $_POST = [ 'usc_action' => 'approve', 'user_id' => 7 ]; Functions\when('get_user_meta')->justReturn('1'); // awaiting approval Functions\expect('delete_user_meta')->atLeast()->once(); $user = Mockery::mock(\WP_User::class); Functions\when('get_user_by')->justReturn($user); $mailer = Mockery::mock(RegistrationMailer::class); $mailer->shouldReceive('sendApproved')->once()->with($user); $this->handleAction(new RegistrationApprovalController($mailer)); } public function testRejectEmailsAndHardDeletesTheAccount(): void { $_POST = [ 'usc_action' => 'reject', 'user_id' => 7 ]; Functions\when('get_user_meta')->justReturn('1'); // awaiting approval $user = Mockery::mock(\WP_User::class); $user->user_email = 'a@b.test'; Functions\when('get_user_by')->justReturn($user); $mailer = Mockery::mock(RegistrationMailer::class); $mailer->shouldReceive('sendRejected')->once()->with('a@b.test'); Functions\expect('wp_delete_user')->once()->with(7); $this->handleAction(new RegistrationApprovalController($mailer)); } public function testIgnoresUserNotAwaitingApproval(): void { $_POST = [ 'usc_action' => 'approve', 'user_id' => 7 ]; Functions\when('get_user_meta')->justReturn(''); // not pending $mailer = Mockery::mock(RegistrationMailer::class); $mailer->shouldReceive('sendApproved')->never(); $this->handleAction(new RegistrationApprovalController($mailer)); // isAwaitingApproval guarded the action; nothing happened. self::assertFalse(RegistrationStatus::isAwaitingApproval(7)); } private function handleAction(RegistrationApprovalController $controller): void { $method = new \ReflectionMethod(RegistrationApprovalController::class, 'handleAction'); $method->invoke($controller); } }