3 namespace Drupal\Tests\Core\Theme;
5 use Drupal\Core\Access\CsrfTokenGenerator;
6 use Drupal\Core\Routing\RouteMatch;
7 use Drupal\Core\Theme\AjaxBasePageNegotiator;
8 use Drupal\Tests\UnitTestCase;
10 use Symfony\Component\HttpFoundation\Request;
11 use Symfony\Component\HttpFoundation\RequestStack;
14 * @coversDefaultClass \Drupal\Core\Theme\AjaxBasePageNegotiator
17 class AjaxBasePageNegotiatorTest extends UnitTestCase {
20 * @var \Drupal\Core\Theme\AjaxBasePageNegotiator
22 * The AJAX base page negotiator.
24 protected $negotiator;
27 * @var \Drupal\Core\Access\CsrfTokenGenerator|\Prophecy\Prophecy\ProphecyInterface
29 * The CSRF token generator.
31 protected $tokenGenerator;
34 * @var \Symfony\Component\HttpFoundation\RequestStack
38 protected $requestStack;
43 public function setUp() {
46 $this->tokenGenerator = $this->prophesize(CsrfTokenGenerator::class);
47 $config_factory = $this->getConfigFactoryStub(['system.theme' => ['default' => 'bartik']]);
48 $this->requestStack = new RequestStack();
49 $this->negotiator = new AjaxBasePageNegotiator($this->tokenGenerator->reveal(), $config_factory, $this->requestStack);
54 * @dataProvider providerTestApplies
56 public function testApplies($request_data, $expected) {
57 $request = new Request([], $request_data);
58 $route_match = RouteMatch::createFromRequest($request);
59 $this->requestStack->push($request);
61 $result = $this->negotiator->applies($route_match);
62 $this->assertSame($expected, $result);
65 public function providerTestApplies() {
67 $data['empty'] = [[], FALSE];
68 $data['no_theme'] = [['ajax_page_state' => ['theme' => '', 'theme_token' => '']], FALSE];
69 $data['valid_theme_empty_theme_token'] = [['ajax_page_state' => ['theme' => 'seven', 'theme_token' => '']], TRUE];
70 $data['valid_theme_valid_theme_token'] = [['ajax_page_state' => ['theme' => 'seven', 'theme_token' => 'valid_theme_token']], TRUE];
75 * @covers ::determineActiveTheme
77 public function testDetermineActiveThemeValidToken() {
79 $theme_token = 'valid_theme_token';
81 $request = new Request([], ['ajax_page_state' => ['theme' => $theme, 'theme_token' => $theme_token]]);
82 $this->requestStack->push($request);
83 $route_match = RouteMatch::createFromRequest($request);
85 $this->tokenGenerator->validate($theme_token, $theme)->willReturn(TRUE);
87 $result = $this->negotiator->determineActiveTheme($route_match);
88 $this->assertSame($theme, $result);
92 * @covers ::determineActiveTheme
94 public function testDetermineActiveThemeInvalidToken() {
96 $theme_token = 'invalid_theme_token';
98 $request = new Request([], ['ajax_page_state' => ['theme' => $theme, 'theme_token' => $theme_token]]);
99 $this->requestStack->push($request);
100 $route_match = RouteMatch::createFromRequest($request);
102 $this->tokenGenerator->validate($theme_token, $theme)->willReturn(FALSE);
104 $result = $this->negotiator->determineActiveTheme($route_match);
105 $this->assertSame(NULL, $result);
109 * @covers ::determineActiveTheme
111 public function testDetermineActiveThemeDefaultTheme() {
113 // When the theme is the system default, an empty string is provided as the
114 // theme token. See system_js_settings_alter().
117 $request = new Request([], ['ajax_page_state' => ['theme' => $theme, 'theme_token' => $theme_token]]);
118 $this->requestStack->push($request);
119 $route_match = RouteMatch::createFromRequest($request);
121 $this->tokenGenerator->validate(Argument::cetera())->shouldNotBeCalled();
123 $result = $this->negotiator->determineActiveTheme($route_match);
124 $this->assertSame($theme, $result);