Upgraded drupal core with security updates
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Theme / AjaxBasePageNegotiatorTest.php
1 <?php
2
3 namespace Drupal\Tests\Core\Theme;
4
5 use Drupal\Core\Access\CsrfTokenGenerator;
6 use Drupal\Core\Routing\RouteMatch;
7 use Drupal\Core\Theme\AjaxBasePageNegotiator;
8 use Drupal\Tests\UnitTestCase;
9 use Prophecy\Argument;
10 use Symfony\Component\HttpFoundation\Request;
11 use Symfony\Component\HttpFoundation\RequestStack;
12
13 /**
14  * @coversDefaultClass \Drupal\Core\Theme\AjaxBasePageNegotiator
15  * @group Theme
16  */
17 class AjaxBasePageNegotiatorTest extends UnitTestCase {
18
19   /**
20    * @var \Drupal\Core\Theme\AjaxBasePageNegotiator
21    *
22    * The AJAX base page negotiator.
23    */
24   protected $negotiator;
25
26   /**
27    * @var \Drupal\Core\Access\CsrfTokenGenerator|\Prophecy\Prophecy\ProphecyInterface
28    *
29    * The CSRF token generator.
30    */
31   protected $tokenGenerator;
32
33   /**
34    * @var \Symfony\Component\HttpFoundation\RequestStack
35    *
36    * The request stack.
37    */
38   protected $requestStack;
39
40   /**
41    * {@inheritdoc}
42    */
43   public function setUp() {
44     parent::setUp();
45
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);
50   }
51
52   /**
53    * @covers ::applies
54    * @dataProvider providerTestApplies
55    */
56   public function testApplies($request_data, $expected) {
57     $request = new Request([], $request_data);
58     $route_match = RouteMatch::createFromRequest($request);
59     $this->requestStack->push($request);
60
61     $result = $this->negotiator->applies($route_match);
62     $this->assertSame($expected, $result);
63   }
64
65   public function providerTestApplies() {
66     $data = [];
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];
71     return $data;
72   }
73
74   /**
75    * @covers ::determineActiveTheme
76    */
77   public function testDetermineActiveThemeValidToken() {
78     $theme = 'seven';
79     $theme_token = 'valid_theme_token';
80
81     $request = new Request([], ['ajax_page_state' => ['theme' => $theme, 'theme_token' => $theme_token]]);
82     $this->requestStack->push($request);
83     $route_match = RouteMatch::createFromRequest($request);
84
85     $this->tokenGenerator->validate($theme_token, $theme)->willReturn(TRUE);
86
87     $result = $this->negotiator->determineActiveTheme($route_match);
88     $this->assertSame($theme, $result);
89   }
90
91   /**
92    * @covers ::determineActiveTheme
93    */
94   public function testDetermineActiveThemeInvalidToken() {
95     $theme = 'seven';
96     $theme_token = 'invalid_theme_token';
97
98     $request = new Request([], ['ajax_page_state' => ['theme' => $theme, 'theme_token' => $theme_token]]);
99     $this->requestStack->push($request);
100     $route_match = RouteMatch::createFromRequest($request);
101
102     $this->tokenGenerator->validate($theme_token, $theme)->willReturn(FALSE);
103
104     $result = $this->negotiator->determineActiveTheme($route_match);
105     $this->assertSame(NULL, $result);
106   }
107
108   /**
109    * @covers ::determineActiveTheme
110    */
111   public function testDetermineActiveThemeDefaultTheme() {
112     $theme = 'bartik';
113     // When the theme is the system default, an empty string is provided as the
114     // theme token. See system_js_settings_alter().
115     $theme_token = '';
116
117     $request = new Request([], ['ajax_page_state' => ['theme' => $theme, 'theme_token' => $theme_token]]);
118     $this->requestStack->push($request);
119     $route_match = RouteMatch::createFromRequest($request);
120
121     $this->tokenGenerator->validate(Argument::cetera())->shouldNotBeCalled();
122
123     $result = $this->negotiator->determineActiveTheme($route_match);
124     $this->assertSame($theme, $result);
125   }
126
127 }