alias(static fn ($v) => $v); Functions\when('sanitize_key')->alias(static fn ($v) => $v); } protected function tearDown(): void { unset($_REQUEST['action']); parent::tearDown(); } private function handler(): EmailConfirmationHandler { return new EmailConfirmationHandler(new StudioSettings(), new RegistrationMailer()); } private function stubMode(string $mode): void { Functions\when('get_option')->alias(static function (string $name, $default = false) use ($mode) { if ($name === StudioSettings::OPT_REGISTRATION_MODE) { return $mode; } if ($name === RegistrationController::OPTION_PAGE) { return 5; } return $default; }); } public function testRegisterUrlPassesThroughWhenClosed(): void { $this->stubMode(StudioSettings::MODE_INVITE); self::assertSame('http://wp/register', $this->handler()->registerUrl('http://wp/register')); } public function testRegisterUrlPointsAtRegistrationPageWhenOpen(): void { $this->stubMode(StudioSettings::MODE_SELF_APPROVAL); Functions\when('get_permalink')->justReturn('http://studio.test/register'); self::assertSame('http://studio.test/register', $this->handler()->registerUrl('http://wp/register')); } public function testBlockNativeRegistrationIsNoOpWhenClosed(): void { $this->stubMode(StudioSettings::MODE_INVITE); $_REQUEST['action'] = 'register'; // Must not redirect/exit when open registration is off. Functions\expect('wp_safe_redirect')->never(); $this->handler()->blockNativeRegistration(); unset($_REQUEST['action']); self::assertTrue(true); } public function testBlockNativeRegistrationIgnoresOtherActions(): void { $this->stubMode(StudioSettings::MODE_SELF_APPROVAL); $_REQUEST['action'] = 'lostpassword'; Functions\expect('wp_safe_redirect')->never(); $this->handler()->blockNativeRegistration(); unset($_REQUEST['action']); self::assertTrue(true); } public function testBlockRegistrationErrorsRejectsWhenOpen(): void { $this->stubMode(StudioSettings::MODE_SELF_APPROVAL); $errors = $this->handler()->blockRegistrationErrors(new \WP_Error()); self::assertSame('us_registration_redirect', $errors->get_error_code()); } public function testBlockRegistrationErrorsPassesThroughWhenClosed(): void { $this->stubMode(StudioSettings::MODE_INVITE); $errors = $this->handler()->blockRegistrationErrors(new \WP_Error()); self::assertSame('', $errors->get_error_code()); } }