You've already forked wp-bootstrap
Add PHPUnit test suite with 64 unit tests (v1.1.1)
PHPUnit 11 + Brain\Monkey for WordPress function mocking. Tests cover BlockRenderer (28), WidgetRenderer (9), NavWalker (14), and TemplateController (12). Includes functional WP_HTML_Tag_Processor stub, CI test job between lint and build-release, prebuild hook gating npm build on passing tests, and release package exclusions for test files. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
145
tests/Unit/Template/TemplateControllerTest.php
Normal file
145
tests/Unit/Template/TemplateControllerTest.php
Normal file
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace WPBootstrap\Tests\Unit\Template;
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Brain\Monkey;
|
||||
use Brain\Monkey\Functions;
|
||||
use WPBootstrap\Template\TemplateController;
|
||||
use ReflectionMethod;
|
||||
|
||||
class TemplateControllerTest extends TestCase
|
||||
{
|
||||
private TemplateController $controller;
|
||||
private ReflectionMethod $resolveTemplate;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
Monkey\setUp();
|
||||
|
||||
// TemplateController constructor: new ContextBuilder() + add_action().
|
||||
// ContextBuilder constructor: new NavWalker() (no WP calls).
|
||||
Functions\when('is_admin')->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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user