justReturn('rawtoken'); Functions\expect('update_user_meta') ->once() ->with(7, RegistrationStatus::META_AWAITING_APPROVAL, '1'); Functions\expect('update_user_meta') ->once() ->with(7, RegistrationStatus::META_CONFIRM_TOKEN, hash('sha256', 'rawtoken')); Functions\expect('update_user_meta') ->once() ->with(7, RegistrationStatus::META_CONFIRM_EXPIRES, \Mockery::type('string')); self::assertSame('rawtoken', RegistrationStatus::markPending(7)); } public function testConfirmEmailSetsFlagAndClearsToken(): void { Functions\expect('update_user_meta') ->once() ->with(7, RegistrationStatus::META_EMAIL_CONFIRMED, '1'); Functions\expect('delete_user_meta')->once()->with(7, RegistrationStatus::META_CONFIRM_TOKEN); Functions\expect('delete_user_meta')->once()->with(7, RegistrationStatus::META_CONFIRM_EXPIRES); RegistrationStatus::confirmEmail(7); } public function testApproveClearsPendingFlags(): void { Functions\expect('delete_user_meta')->once()->with(7, RegistrationStatus::META_AWAITING_APPROVAL); Functions\expect('delete_user_meta')->once()->with(7, RegistrationStatus::META_CONFIRM_TOKEN); Functions\expect('delete_user_meta')->once()->with(7, RegistrationStatus::META_CONFIRM_EXPIRES); RegistrationStatus::approve(7); } public function testAwaitingApprovalAndEmailConfirmedReadMeta(): void { Functions\when('get_user_meta')->alias(static function (int $id, string $key) { return $key === RegistrationStatus::META_AWAITING_APPROVAL ? '1' : ''; }); self::assertTrue(RegistrationStatus::isAwaitingApproval(7)); self::assertFalse(RegistrationStatus::emailConfirmed(7)); } public function testUserIdForTokenLooksUpByHashOnly(): void { Functions\expect('get_users') ->once() ->with(\Mockery::on(static fn (array $args): bool => $args['meta_key'] === RegistrationStatus::META_CONFIRM_TOKEN && $args['meta_value'] === hash('sha256', 'rawtoken'))) ->andReturn([9]); self::assertSame(9, RegistrationStatus::userIdForToken('rawtoken')); } public function testUserIdForTokenReturnsNullWhenNoMatch(): void { Functions\when('get_users')->justReturn([]); self::assertNull(RegistrationStatus::userIdForToken('rawtoken')); } public function testEmptyTokenShortCircuits(): void { // get_users must never be called for an empty token. Functions\expect('get_users')->never(); self::assertNull(RegistrationStatus::userIdForToken('')); } public function testTokenExpiredWhenExpiryPassed(): void { Functions\when('get_user_meta')->justReturn('2020-01-01 00:00:00'); self::assertTrue(RegistrationStatus::isTokenExpired(7, '2020-01-02 00:00:00')); } public function testTokenNotExpiredWhenExpiryInFuture(): void { Functions\when('get_user_meta')->justReturn('2020-01-03 00:00:00'); self::assertFalse(RegistrationStatus::isTokenExpired(7, '2020-01-02 00:00:00')); } public function testMissingExpiryTreatedAsExpired(): void { Functions\when('get_user_meta')->justReturn(''); self::assertTrue(RegistrationStatus::isTokenExpired(7, '2020-01-02 00:00:00')); } }