124 lines
4.2 KiB
PHP
124 lines
4.2 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace WPMultiCity\Tests;
|
|
|
|
use WPMultiCity\Router;
|
|
|
|
final class RouterTest extends TestCase
|
|
{
|
|
public function test_register_attaches_wp_action_at_priority_9999(): void
|
|
{
|
|
Router::register();
|
|
|
|
self::assertSame(
|
|
9999,
|
|
has_action('wp', [Router::class, 'route']),
|
|
'Router::register() must hook wp action at priority 9999'
|
|
);
|
|
}
|
|
|
|
public function test_register_attaches_query_vars_filter(): void
|
|
{
|
|
Router::register();
|
|
|
|
self::assertNotFalse(
|
|
has_filter('query_vars', [Router::class, 'add_town_query_var']),
|
|
'Router::register() must hook query_vars filter'
|
|
);
|
|
}
|
|
|
|
public function test_add_town_query_var_appends_town(): void
|
|
{
|
|
$vars = ['p', 'page_id'];
|
|
$result = Router::add_town_query_var($vars);
|
|
|
|
self::assertContains('town', $result);
|
|
}
|
|
|
|
public function test_route_skips_when_is_admin(): void
|
|
{
|
|
\Brain\Monkey\Functions\expect('get_terms')->never();
|
|
\Brain\Monkey\Functions\when('is_admin')->justReturn(true);
|
|
|
|
Router::route();
|
|
|
|
self::assertArrayNotHasKey('wp_query', $GLOBALS);
|
|
}
|
|
|
|
public function test_route_skips_when_current_town_is_null(): void
|
|
{
|
|
\Brain\Monkey\Functions\expect('url_to_postid')->never();
|
|
\Brain\Monkey\Functions\when('is_admin')->justReturn(false);
|
|
$_SERVER['REQUEST_URI'] = '/something-not-a-city/';
|
|
\Brain\Monkey\Functions\when('get_terms')->justReturn([10 => 'spb']);
|
|
\Brain\Monkey\Functions\when('get_field')->justReturn(false);
|
|
|
|
Router::route();
|
|
|
|
self::assertArrayNotHasKey('wp_query', $GLOBALS);
|
|
}
|
|
|
|
public function test_route_skips_when_current_town_equals_main_town(): void
|
|
{
|
|
\Brain\Monkey\Functions\expect('url_to_postid')->never();
|
|
\Brain\Monkey\Functions\when('is_admin')->justReturn(false);
|
|
$_SERVER['REQUEST_URI'] = '/spb/';
|
|
\Brain\Monkey\Functions\when('get_terms')->justReturn([10 => 'spb']);
|
|
\Brain\Monkey\Functions\when('get_field')->alias(function ($name) {
|
|
if ($name === 'main_town_slug') return 'spb';
|
|
return false;
|
|
});
|
|
|
|
Router::route();
|
|
|
|
self::assertArrayNotHasKey('wp_query', $GLOBALS);
|
|
}
|
|
|
|
public function test_route_skips_when_path_not_routable(): void
|
|
{
|
|
\Brain\Monkey\Functions\expect('url_to_postid')->never();
|
|
\Brain\Monkey\Functions\when('is_admin')->justReturn(false);
|
|
$_SERVER['REQUEST_URI'] = '/tyumen/privacy/';
|
|
\Brain\Monkey\Functions\when('get_terms')->justReturn([11 => 'tyumen']);
|
|
\Brain\Monkey\Functions\when('get_field')->alias(function ($name) {
|
|
if ($name === 'main_town_slug') return 'spb';
|
|
if ($name === 'page_no_rep') return [['link' => '/privacy/']];
|
|
return false;
|
|
});
|
|
|
|
Router::route();
|
|
|
|
self::assertArrayNotHasKey('wp_query', $GLOBALS);
|
|
}
|
|
|
|
public function test_route_uses_main_page_alt_term_meta_for_root_url(): void
|
|
{
|
|
\Brain\Monkey\Functions\when('is_admin')->justReturn(false);
|
|
$_SERVER['REQUEST_URI'] = '/tyumen/';
|
|
\Brain\Monkey\Functions\when('get_terms')->justReturn([11 => 'tyumen']);
|
|
|
|
$term = new \WP_Term();
|
|
$term->term_id = 11;
|
|
$term->slug = 'tyumen';
|
|
\Brain\Monkey\Functions\when('get_term_by')->justReturn($term);
|
|
|
|
\Brain\Monkey\Functions\when('get_field')->alias(function ($name, $where = null) {
|
|
if ($name === 'main_town_slug') return 'spb';
|
|
if ($name === 'page_no_rep') return false;
|
|
if ($name === 'main_page_alt' && $where === 'town_11') return 555;
|
|
return false;
|
|
});
|
|
\Brain\Monkey\Functions\when('get_post')->justReturn((object) ['ID' => 555]);
|
|
\Brain\Monkey\Functions\when('status_header')->justReturn(null);
|
|
|
|
Router::route();
|
|
|
|
self::assertInstanceOf(\WP_Query::class, $GLOBALS['wp_query']);
|
|
self::assertSame(555, $GLOBALS['wp_query']->constructor_args['page_id']);
|
|
self::assertSame('tyumen', $GLOBALS['wp_query']->constructor_args['town']);
|
|
self::assertTrue($GLOBALS['wp_query']->is_front_page);
|
|
self::assertTrue($GLOBALS['wp_query']->is_page);
|
|
}
|
|
}
|