page = new AccountPage(); Functions\when('is_user_logged_in')->justReturn(true); Functions\when('get_current_user_id')->justReturn(5); Functions\when('wp_enqueue_style')->justReturn(null); Functions\when('get_permalink')->alias( static fn (int $id = 0): string => $id > 0 ? 'https://studio.test/sign-in/' : 'https://studio.test/current/' ); Functions\when('wp_logout_url')->alias( static fn (string $redirect): string => 'https://studio.test/wp-login.php?action=logout&redirect_to=' . rawurlencode($redirect) ); Functions\when('wp_get_current_user')->justReturn($this->user('Grace', 'Hopper', 'grace@studio.test')); } private function user(string $first, string $last, string $email): \WP_User { $user = Mockery::mock(\WP_User::class); $user->ID = 5; $user->first_name = $first; $user->last_name = $last; $user->nickname = ''; $user->user_email = $email; return $user; } public function testShowsTheSignedInNameAndEmail(): void { $html = $this->page->render([]); self::assertStringContainsString('Grace Hopper', $html); self::assertStringContainsString('grace@studio.test', $html); self::assertStringContainsString('Sign out', $html); } public function testSigningOutReturnsToTheConfiguredLoginPage(): void { self::assertStringContainsString( rawurlencode('https://studio.test/sign-in/'), $this->page->render(['loginPageId' => 9]) ); } /** * With no page chosen, signing out from a header link should leave the * visitor where they were rather than navigating them somewhere. */ public function testSigningOutReturnsToTheCurrentPageWhenNoLoginPageIsSet(): void { self::assertStringContainsString( rawurlencode('https://studio.test/current/'), $this->page->render([]) ); } public function testTheShortcodeAttributeNameIsAccepted(): void { self::assertStringContainsString( rawurlencode('https://studio.test/sign-in/'), $this->page->render(['login_page_id' => 9]) ); } /** * A block whose whole job is "you are signed in as X" has nothing to say to * a stranger, and a bare notice in a site header cannot be acted on. */ public function testRendersNothingForASignedOutVisitorWithNoLoginPage(): void { Functions\when('is_user_logged_in')->justReturn(false); self::assertSame('', $this->page->render([])); } public function testOffersASignInLinkToASignedOutVisitorWhenAPageIsChosen(): void { Functions\when('is_user_logged_in')->justReturn(false); $html = $this->page->render(['loginPageId' => 9]); self::assertStringContainsString('https://studio.test/sign-in/', $html); self::assertStringContainsString('Sign in', $html); self::assertStringNotContainsString('Sign out', $html); } /** * A page can be deleted after it has been chosen in the block, which * get_permalink() reports as false. */ public function testTreatsADeletedLoginPageAsNoneChosen(): void { Functions\when('is_user_logged_in')->justReturn(false); Functions\when('get_permalink')->justReturn(false); self::assertSame('', $this->page->render(['loginPageId' => 9])); } }