origThemePath = Config::get('cms.themesPath'); // Set temporary themes path for tests Config::set('cms.themesPath', '/modules/cms/tests/fixtures/themes'); Model::clearBootedModels(); Model::flushEventListeners(); View::clearVarCache(); include_once base_path() . '/modules/system/tests/fixtures/plugins/winter/tester/components/Archive.php'; include_once base_path() . '/modules/system/tests/fixtures/plugins/winter/tester/components/Post.php'; include_once base_path() . '/modules/system/tests/fixtures/plugins/winter/tester/components/MainMenu.php'; include_once base_path() . '/modules/system/tests/fixtures/plugins/winter/tester/components/ContentBlock.php'; include_once base_path() . '/modules/system/tests/fixtures/plugins/winter/tester/components/Comments.php'; include_once base_path() . '/modules/system/tests/fixtures/plugins/winter/tester/classes/Users.php'; } public function tearDown(): void { // Restore original themes path Config::set('cms.themesPath', $this->origThemePath); parent::tearDown(); } public function testThemeUrl() { $theme = Theme::load('test'); $controller = new Controller($theme); $url = $controller->themeUrl(); $this->assertEquals(url('/modules/cms/tests/fixtures/themes/test'), $url); $url = $controller->themeUrl('assets/css/style1.css'); $this->assertEquals(url('/modules/cms/tests/fixtures/themes/test/assets/css/style1.css'), $url); $pathSymbolTests = [ '~/modules/cms/tests/fixtures/themes/test/assets/css/style1.css' => '/', '$/fakeauthor/fakeplugin/assets/src/app.js' => '/plugins/', '#/faketheme/assets/css/style1.css' => '/themes/', ]; foreach ($pathSymbolTests as $symbolizedPath => $urlPrefix) { $url = $controller->themeUrl($symbolizedPath); $this->assertEquals(url(str_replace(substr($symbolizedPath, 0, 2), $urlPrefix, $symbolizedPath)), $url); } } public function testThemeCombineAssets(): void { $theme = Theme::load('test'); $controller = new Controller($theme); // Generate a url $url = $controller->themeUrl(['~/modules/cms/tests/fixtures/themes/test/assets/css/style1.css', 'assets/css/style2.css']); $this->assertIsString($url); // Grab the cache key from the url $cacheKey = 'combiner.' . str_before(basename($url), '-'); // Load the cached config $combinerConfig = \Cache::get($cacheKey); $this->assertIsString($combinerConfig); // Decode the config $combinerConfig = unserialize(base64_decode($combinerConfig)); // Assert the result is an array and includes files $this->assertIsArray($combinerConfig); $this->assertArrayHasKey('files', $combinerConfig); $this->assertCount(2, $combinerConfig['files']); // Check our input file names against our output file names $files = array_map('basename', $combinerConfig['files']); $this->assertTrue(in_array('style1.css', $files)); $this->assertTrue(in_array('style2.css', $files)); } public function testPageUrl() { $theme = Theme::load('test'); $controller = new Controller($theme); $loadUrl = '/filters-test/current-slug'; $response = $controller->run($loadUrl); // Check pageUrl for current page $url = $controller->pageUrl(''); $this->assertEquals(url($loadUrl), $url); // Check pageUrl for persistent URL parameters $url = $controller->pageUrl('blog-post'); $this->assertEquals(url('/blog/post/current-slug'), $url); // Check pageUrl for providing values for URL parameters $url = $controller->pageUrl('blog-post', ['url_title' => 'test-slug']); $this->assertEquals(url('/blog/post/test-slug'), $url); // Check pageUrl for disabling persistent URL parameters $url = $controller->pageUrl('blog-post', [], false); $this->assertEquals(url('/blog/post/default'), $url); // Check pageUrl for disabling persistent URL parameters with the second argument being routePersistence $url = $controller->pageUrl('blog-post', false); $this->assertEquals(url('/blog/post/default'), $url); // Check the Twig render results $results = $response->getContent(); $lines = explode("\n", str_replace("\r\n", "\n", $results)); foreach ($lines as $test) { list($result, $expected) = explode(' -> ', $test); $this->assertEquals($expected, $result); } } public function test404() { /* * Test the built-in 404 page */ $theme = Theme::load('apitest'); $controller = new Controller($theme); $response = $controller->run('/some-page-that-doesnt-exist'); $this->assertNotEmpty($response); $this->assertInstanceOf('\Illuminate\Http\Response', $response); ob_start(); include base_path() . '/modules/cms/views/404.php'; $page404Content = ob_get_contents(); ob_end_clean(); $this->assertEquals($page404Content, $response->getContent()); /* * Test the theme 404 page */ $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/some-page-that-doesnt-exist'); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $response); $content = $response->getContent(); $this->assertIsString($content); $this->assertEquals('
Page not found
', $content); } public function testRoot() { /* * Test the / route and the fallback layout */ $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/'); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $response); $content = $response->getContent(); $this->assertIsString($content); $this->assertEquals('Hey
Hey PAGE PARTIAL Homer Simpson A partial
Hey PAGE PARTIAL Homer Simpson A child partial
Hey PAGE CONTENT A content
Hey PAGE CONTENT A child content
Hey PAGE CONTENT
Hey PAGE CONTENT
This page uses components.
Post Content #1
Second Post Content
ESC; $this->assertEquals(str_replace(PHP_EOL, "\n", $content), $response); $this->assertEquals(69, $component->property('posts-per-page')); $this->assertEquals('Blog Archive Dummy Component', $details['name']); $this->assertEquals('Displays an archive of blog posts.', $details['description']); } public function testComponentAliases() { include_once base_path() . '/modules/system/tests/fixtures/plugins/winter/tester/components/Archive.php'; $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/with-components')->getContent(); $page = self::getProtectedProperty($controller, 'page'); $this->assertArrayHasKey('firstAlias', $page->components); $this->assertArrayHasKey('secondAlias', $page->components); $component = $page->components['firstAlias']; $component2 = $page->components['secondAlias']; $content = <<This page uses components.
Post Content #1
Second Post Content
ESC; $this->assertEquals(str_replace(PHP_EOL, "\n", $content), $response); $this->assertEquals(6, $component->property('posts-per-page')); $this->assertEquals(9, $component2->property('posts-per-page')); } public function testComponentAjax() { Request::swap($this->configAjaxRequestMock('testArchive::onTestAjax', 'ajax-result')); $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/with-component'); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $response); $content = $response->getOriginalContent(); $this->assertIsArray($content); $this->assertEquals(200, $response->getStatusCode()); $this->assertCount(1, $content); $this->assertArrayHasKey('ajax-result', $content); $this->assertEquals('page', $content['ajax-result']); } public function testComponentClassNotFound() { $this->expectException(\Winter\Storm\Exception\SystemException::class); $this->expectExceptionMessageMatches('/is\snot\sregistered\sfor\sthe\scomponent/'); $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/no-component-class')->getContent(); } public function testSoftComponentClassNotFound() { $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/no-soft-component-class')->getContent(); $this->assertEquals('Hey
', $response); } public function testSoftComponentClassFound() { $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/with-soft-component-class')->getContent(); $page = $controller->getPage(); $this->assertArrayHasKey('testArchive', $page->components); $component = $page->components['testArchive']; $details = $component->componentDetails(); $content = <<This page uses components.
Post Content #1
Second Post Content
ESC; $this->assertEquals(str_replace(PHP_EOL, "\n", $content), $response); $this->assertEquals(69, $component->property('posts-per-page')); $this->assertEquals('Blog Archive Dummy Component', $details['name']); $this->assertEquals('Displays an archive of blog posts.', $details['description']); } public function testSoftComponentWithAliasClassFound() { $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/with-soft-component-class-alias')->getContent(); $page = $controller->getPage(); $this->assertArrayHasKey('someAlias', $page->components); $component = $page->components['someAlias']; $details = $component->componentDetails(); $content = <<This page uses components.
Post Content #1
Second Post Content
ESC; $this->assertEquals(str_replace(PHP_EOL, "\n", $content), $response); $this->assertEquals(69, $component->property('posts-per-page')); $this->assertEquals('Blog Archive Dummy Component', $details['name']); $this->assertEquals('Displays an archive of blog posts.', $details['description']); } public function testComponentNotFound() { // // This test should probably be throwing an exception... -sg // $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/no-component')->getContent(); $this->assertEquals('Hey
', $response); } public function testComponentPartial() { $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/component-partial')->getContent(); $this->assertEquals('DEFAULT MARKUP: I am a post yay
', $response); } public function testComponentPartialAliasOverride() { $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/component-partial-alias-override')->getContent(); // // Testing case sensitivity // // Component alias: overRide1 // Target path: partials\override1\default.htm // $this->assertEquals('I am an override alias partial! Yay
', $response); } public function testComponentPartialOverride() { $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/component-partial-override')->getContent(); // // Testing case sensitivity // // Component code: testPost // Target path: partials\testpost\default.htm // $this->assertEquals('I am an override partial! Yay
', $response); } public function testComponentPartialNesting() { $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/component-partial-nesting')->getContent(); $content = <<DEFAULT MARKUP: I am a post yay
I am another post, deep down
Insert post here
ESC; $this->assertEquals(str_replace(PHP_EOL, "\n", $content), $response); } public function testComponentWithOnRender() { $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/component-custom-render')->getContent(); $content = <<with-macro.htmwith-macro.htm
', $response ); } public function testSharedVariable() { $this->app['view']->share('winterStatus', 'Is Awesome'); $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/shared-variable')->getContent(); $this->assertStringContainsString( 'Winter Is Awesome
', $response ); $this->assertStringContainsString( '/shared-variable
', $response ); } public function testSharedVariableCannotOverrideSystemGlobals() { $this->app['view']->share('winterStatus', 'Is Awesome'); // This override should not apply and change the page URL in the fixture template $this->app['view']->share('this', [ 'page' => [ 'url' => '/overriden', ], ]); $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/shared-variable')->getContent(); $this->assertStringContainsString( 'Winter Is Awesome
', $response ); $this->assertStringContainsString( '/shared-variable
', $response ); } public function testSharedVariableCanBeOverriddenLocally() { $this->app['view']->share('winterStatus', 'Is Awesome'); $theme = Theme::load('test'); $controller = new Controller($theme); $response = $controller->run('/shared-variable-override')->getContent(); $this->assertStringContainsString( 'Winter Is Coming
', $response ); $this->assertStringContainsString( '/shared-variable-override
', $response ); } }