justReturn(true); Functions\when('wp_doing_ajax')->justReturn(false); Functions\when('add_action')->justReturn(true); // Default: all WP conditionals return false. Functions\when('is_404')->justReturn(false); Functions\when('is_search')->justReturn(false); Functions\when('is_singular')->justReturn(false); Functions\when('is_page')->justReturn(false); Functions\when('is_archive')->justReturn(false); Functions\when('is_home')->justReturn(false); Functions\when('is_category')->justReturn(false); Functions\when('get_page_template_slug')->justReturn(''); $this->controller = new TemplateController(); $this->resolveTemplate = new ReflectionMethod($this->controller, 'resolveTemplate'); $this->resolveTemplate->setAccessible(true); } protected function tearDown(): void { Monkey\tearDown(); parent::tearDown(); } private function resolve(): ?string { return $this->resolveTemplate->invoke($this->controller); } // ── Template resolution ───────────────────────────────────── public function testResolveTemplate404(): void { Functions\when('is_404')->justReturn(true); $this->assertSame('pages/404.html.twig', $this->resolve()); } public function testResolveTemplateSearch(): void { Functions\when('is_search')->justReturn(true); $this->assertSame('pages/search.html.twig', $this->resolve()); } public function testResolveTemplateSinglePostDefault(): void { Functions\when('is_singular')->alias(fn($type = '') => $type === 'post'); $this->assertSame('pages/single-sidebar.html.twig', $this->resolve()); } public function testResolveTemplateSinglePostFullWidth(): void { Functions\when('is_singular')->alias(fn($type = '') => $type === 'post'); Functions\when('get_page_template_slug')->justReturn('page-full-width'); $this->assertSame('pages/single.html.twig', $this->resolve()); } public function testResolveTemplatePageDefault(): void { Functions\when('is_page')->justReturn(true); $this->assertSame('pages/page.html.twig', $this->resolve()); } public function testResolveTemplatePageLanding(): void { Functions\when('is_page')->justReturn(true); Functions\when('get_page_template_slug')->justReturn('page-landing'); $this->assertSame('pages/landing.html.twig', $this->resolve()); } public function testResolveTemplatePageFullWidth(): void { Functions\when('is_page')->justReturn(true); Functions\when('get_page_template_slug')->justReturn('page-full-width'); $this->assertSame('pages/full-width.html.twig', $this->resolve()); } public function testResolveTemplatePageHero(): void { Functions\when('is_page')->justReturn(true); Functions\when('get_page_template_slug')->justReturn('page-hero'); $this->assertSame('pages/hero.html.twig', $this->resolve()); } public function testResolveTemplatePageSidebar(): void { Functions\when('is_page')->justReturn(true); Functions\when('get_page_template_slug')->justReturn('page-sidebar'); $this->assertSame('pages/page-sidebar.html.twig', $this->resolve()); } public function testResolveTemplateArchive(): void { Functions\when('is_archive')->justReturn(true); $this->assertSame('pages/archive.html.twig', $this->resolve()); } public function testResolveTemplateHome(): void { Functions\when('is_home')->justReturn(true); $this->assertSame('pages/index.html.twig', $this->resolve()); } public function testResolveTemplateFallback(): void { // All conditionals already return false in setUp. $this->assertSame('pages/index.html.twig', $this->resolve()); } }