From 2c5f9eba6be0aca6e032feb0ed0fecde4615b402 Mon Sep 17 00:00:00 2001 From: Samuel Georges Date: Sat, 15 Aug 2015 13:39:44 +1000 Subject: [PATCH] Write tests that verify the truth of #1373 --- modules/cms/classes/ComponentManager.php | 2 +- modules/cms/classes/PartialStack.php | 4 + .../plugins/october/tester/Plugin.php | 4 +- .../tester/components/ContentBlock.php | 25 ++++ .../october/tester/components/MainMenu.php | 21 +++ .../tester/components/mainmenu/default.htm | 4 + .../tester/components/mainmenu/items.htm | 3 + .../tester/components/post/default.htm | 1 + .../test/pages/component-custom-render.htm | 10 ++ .../test/pages/component-partial-nesting.htm | 3 + .../test/pages/component-partial-override.htm | 5 + .../themes/test/pages/component-partial.htm | 5 + .../themes/test/pages/no-component-class.htm | 5 + .../themes/test/pages/no-component.htm | 3 + .../fixtures/themes/test/pages/no-partial.htm | 1 - .../themes/test/partials/nesting/level1.htm | 6 + .../themes/test/partials/nesting/level2.htm | 6 + .../themes/test/partials/nesting/level3.htm | 4 + .../test/partials/override1/default.htm | 1 + .../test/partials/override2/default.htm | 7 + .../themes/test/partials/override2/items.htm | 3 + .../test/partials/override3/default.htm | 1 + .../test/partials/override4/default.htm | 3 + .../unit/cms/classes/ComponentManagerTest.php | 2 + tests/unit/cms/classes/ControllerTest.php | 126 +++++++++++++++--- tests/unit/cms/classes/PartialStackTest.php | 59 ++++++++ 26 files changed, 296 insertions(+), 18 deletions(-) create mode 100644 tests/fixtures/plugins/october/tester/components/ContentBlock.php create mode 100644 tests/fixtures/plugins/october/tester/components/MainMenu.php create mode 100644 tests/fixtures/plugins/october/tester/components/mainmenu/default.htm create mode 100644 tests/fixtures/plugins/october/tester/components/mainmenu/items.htm create mode 100644 tests/fixtures/plugins/october/tester/components/post/default.htm create mode 100644 tests/fixtures/themes/test/pages/component-custom-render.htm create mode 100644 tests/fixtures/themes/test/pages/component-partial-nesting.htm create mode 100644 tests/fixtures/themes/test/pages/component-partial-override.htm create mode 100644 tests/fixtures/themes/test/pages/component-partial.htm create mode 100644 tests/fixtures/themes/test/pages/no-component-class.htm create mode 100644 tests/fixtures/themes/test/pages/no-component.htm create mode 100644 tests/fixtures/themes/test/partials/nesting/level1.htm create mode 100644 tests/fixtures/themes/test/partials/nesting/level2.htm create mode 100644 tests/fixtures/themes/test/partials/nesting/level3.htm create mode 100644 tests/fixtures/themes/test/partials/override1/default.htm create mode 100644 tests/fixtures/themes/test/partials/override2/default.htm create mode 100644 tests/fixtures/themes/test/partials/override2/items.htm create mode 100644 tests/fixtures/themes/test/partials/override3/default.htm create mode 100644 tests/fixtures/themes/test/partials/override4/default.htm create mode 100644 tests/unit/cms/classes/PartialStackTest.php diff --git a/modules/cms/classes/ComponentManager.php b/modules/cms/classes/ComponentManager.php index 252cfe526..5402b07b5 100644 --- a/modules/cms/classes/ComponentManager.php +++ b/modules/cms/classes/ComponentManager.php @@ -205,7 +205,7 @@ class ComponentManager if (!class_exists($className)) { throw new SystemException(sprintf( - 'Component class not found %s.Check the component plugin.', + 'Component class not found %s. Check the component plugin.', $className )); } diff --git a/modules/cms/classes/PartialStack.php b/modules/cms/classes/PartialStack.php index 7779d1833..d49db3465 100644 --- a/modules/cms/classes/PartialStack.php +++ b/modules/cms/classes/PartialStack.php @@ -58,6 +58,10 @@ class PartialStack */ public function getComponent($name) { + if (!$this->activePartial) { + return null; + } + $component = $this->findComponentFromStack($name, $this->activePartial); if ($component !== null) { return $component; diff --git a/tests/fixtures/plugins/october/tester/Plugin.php b/tests/fixtures/plugins/october/tester/Plugin.php index 110cd7ea8..a0c80bac0 100644 --- a/tests/fixtures/plugins/october/tester/Plugin.php +++ b/tests/fixtures/plugins/october/tester/Plugin.php @@ -18,7 +18,9 @@ class Plugin extends PluginBase { return [ 'October\Tester\Components\Archive' => 'testArchive', - 'October\Tester\Components\Post' => 'testPost' + 'October\Tester\Components\Post' => 'testPost', + 'October\Tester\Components\MainMenu' => 'testMainMenu', + 'October\Tester\Components\ContentBlock' => 'testContentBlock' ]; } diff --git a/tests/fixtures/plugins/october/tester/components/ContentBlock.php b/tests/fixtures/plugins/october/tester/components/ContentBlock.php new file mode 100644 index 000000000..0728999b8 --- /dev/null +++ b/tests/fixtures/plugins/october/tester/components/ContentBlock.php @@ -0,0 +1,25 @@ + 'Content Block Dummy Component', + 'description' => 'Displays a editable content block.' + ]; + } + + public function onRender() + { + if ($output = $this->property('output')) { + return 'Custom output: '.$output; + } + + return 'Pass'; + } + +} \ No newline at end of file diff --git a/tests/fixtures/plugins/october/tester/components/MainMenu.php b/tests/fixtures/plugins/october/tester/components/MainMenu.php new file mode 100644 index 000000000..9e70d8910 --- /dev/null +++ b/tests/fixtures/plugins/october/tester/components/MainMenu.php @@ -0,0 +1,21 @@ + 'Menu Dummy Component', + 'description' => 'Displays a really cool menu.' + ]; + } + + public function menuItems() + { + return ['Home', 'Blog', 'About', 'Contact']; + } + +} \ No newline at end of file diff --git a/tests/fixtures/plugins/october/tester/components/mainmenu/default.htm b/tests/fixtures/plugins/october/tester/components/mainmenu/default.htm new file mode 100644 index 000000000..53681ebf0 --- /dev/null +++ b/tests/fixtures/plugins/october/tester/components/mainmenu/default.htm @@ -0,0 +1,4 @@ +

DEFAULT MARKUP: Menu

+ diff --git a/tests/fixtures/plugins/october/tester/components/mainmenu/items.htm b/tests/fixtures/plugins/october/tester/components/mainmenu/items.htm new file mode 100644 index 000000000..7789e4d81 --- /dev/null +++ b/tests/fixtures/plugins/october/tester/components/mainmenu/items.htm @@ -0,0 +1,3 @@ +{% for item in items %} +
  • DEFAULT: {{ item }}
  • +{% endfor %} \ No newline at end of file diff --git a/tests/fixtures/plugins/october/tester/components/post/default.htm b/tests/fixtures/plugins/october/tester/components/post/default.htm new file mode 100644 index 000000000..5c072b27c --- /dev/null +++ b/tests/fixtures/plugins/october/tester/components/post/default.htm @@ -0,0 +1 @@ +

    DEFAULT MARKUP: I am a post yay

    \ No newline at end of file diff --git a/tests/fixtures/themes/test/pages/component-custom-render.htm b/tests/fixtures/themes/test/pages/component-custom-render.htm new file mode 100644 index 000000000..057c36365 --- /dev/null +++ b/tests/fixtures/themes/test/pages/component-custom-render.htm @@ -0,0 +1,10 @@ +url = "/component-custom-render" + +[October\Tester\Components\ContentBlock theblock] +== + +{% component 'theblock' %} + +{% component 'theblock' output="Would you look over Picasso's shoulder" %} + +{% component 'theblock' output='And tell him about his brush strokes?' %} diff --git a/tests/fixtures/themes/test/pages/component-partial-nesting.htm b/tests/fixtures/themes/test/pages/component-partial-nesting.htm new file mode 100644 index 000000000..41d18f7bb --- /dev/null +++ b/tests/fixtures/themes/test/pages/component-partial-nesting.htm @@ -0,0 +1,3 @@ +url = "/component-partial-nesting" +== +{% partial 'nesting/level1' %} \ No newline at end of file diff --git a/tests/fixtures/themes/test/pages/component-partial-override.htm b/tests/fixtures/themes/test/pages/component-partial-override.htm new file mode 100644 index 000000000..4ab21d6b6 --- /dev/null +++ b/tests/fixtures/themes/test/pages/component-partial-override.htm @@ -0,0 +1,5 @@ +url = "/component-partial-override" + +[October\Tester\Components\Post override1] +== +{% component 'override1' %} \ No newline at end of file diff --git a/tests/fixtures/themes/test/pages/component-partial.htm b/tests/fixtures/themes/test/pages/component-partial.htm new file mode 100644 index 000000000..3c796d6ce --- /dev/null +++ b/tests/fixtures/themes/test/pages/component-partial.htm @@ -0,0 +1,5 @@ +url = "/component-partial" + +[October\Tester\Components\Post post] +== +{% component 'post' %} \ No newline at end of file diff --git a/tests/fixtures/themes/test/pages/no-component-class.htm b/tests/fixtures/themes/test/pages/no-component-class.htm new file mode 100644 index 000000000..d9e406a4e --- /dev/null +++ b/tests/fixtures/themes/test/pages/no-component-class.htm @@ -0,0 +1,5 @@ +url = "/no-component-class" + +[PeterPan\Nevernever\Land noComponentExist] +== +

    Hey

    diff --git a/tests/fixtures/themes/test/pages/no-component.htm b/tests/fixtures/themes/test/pages/no-component.htm new file mode 100644 index 000000000..0a7761b47 --- /dev/null +++ b/tests/fixtures/themes/test/pages/no-component.htm @@ -0,0 +1,3 @@ +url = "/no-component" +== +

    Hey

    {% component 'noComponentExist' %} \ No newline at end of file diff --git a/tests/fixtures/themes/test/pages/no-partial.htm b/tests/fixtures/themes/test/pages/no-partial.htm index 846bef1f6..7ec76ee77 100644 --- a/tests/fixtures/themes/test/pages/no-partial.htm +++ b/tests/fixtures/themes/test/pages/no-partial.htm @@ -1,5 +1,4 @@ url = "/no-partial" -layout = "caramba" ==

    Hey

    {{ partial('caramba') }} \ No newline at end of file diff --git a/tests/fixtures/themes/test/partials/nesting/level1.htm b/tests/fixtures/themes/test/partials/nesting/level1.htm new file mode 100644 index 000000000..f0ae8571e --- /dev/null +++ b/tests/fixtures/themes/test/partials/nesting/level1.htm @@ -0,0 +1,6 @@ +[October\Tester\Components\MainMenu override2] +[October\Tester\Components\Post override3] +== +

    Level 1

    +{% component 'override2' %} +{% component 'override3' %} diff --git a/tests/fixtures/themes/test/partials/nesting/level2.htm b/tests/fixtures/themes/test/partials/nesting/level2.htm new file mode 100644 index 000000000..d9df47b61 --- /dev/null +++ b/tests/fixtures/themes/test/partials/nesting/level2.htm @@ -0,0 +1,6 @@ +[October\Tester\Components\Post post] +[October\Tester\Components\Post override4] +== +

    Level 2

    +{% component 'post' %} +{% component 'override4' %} \ No newline at end of file diff --git a/tests/fixtures/themes/test/partials/nesting/level3.htm b/tests/fixtures/themes/test/partials/nesting/level3.htm new file mode 100644 index 000000000..0b1366696 --- /dev/null +++ b/tests/fixtures/themes/test/partials/nesting/level3.htm @@ -0,0 +1,4 @@ +[October\Tester\Components\MainMenu mainMenu] +== +

    Level 3

    +{% component 'mainMenu' %} diff --git a/tests/fixtures/themes/test/partials/override1/default.htm b/tests/fixtures/themes/test/partials/override1/default.htm new file mode 100644 index 000000000..ebc57e24d --- /dev/null +++ b/tests/fixtures/themes/test/partials/override1/default.htm @@ -0,0 +1 @@ +

    I am an override partial! Yay

    \ No newline at end of file diff --git a/tests/fixtures/themes/test/partials/override2/default.htm b/tests/fixtures/themes/test/partials/override2/default.htm new file mode 100644 index 000000000..7fb329768 --- /dev/null +++ b/tests/fixtures/themes/test/partials/override2/default.htm @@ -0,0 +1,7 @@ + + +{% partial 'nesting/level2' %} \ No newline at end of file diff --git a/tests/fixtures/themes/test/partials/override2/items.htm b/tests/fixtures/themes/test/partials/override2/items.htm new file mode 100644 index 000000000..0c77fb3c7 --- /dev/null +++ b/tests/fixtures/themes/test/partials/override2/items.htm @@ -0,0 +1,3 @@ +{% for item in items %} + {{ item }} +{% endfor %} \ No newline at end of file diff --git a/tests/fixtures/themes/test/partials/override3/default.htm b/tests/fixtures/themes/test/partials/override3/default.htm new file mode 100644 index 000000000..c49f68778 --- /dev/null +++ b/tests/fixtures/themes/test/partials/override3/default.htm @@ -0,0 +1 @@ +

    Insert post here

    \ No newline at end of file diff --git a/tests/fixtures/themes/test/partials/override4/default.htm b/tests/fixtures/themes/test/partials/override4/default.htm new file mode 100644 index 000000000..0b884776e --- /dev/null +++ b/tests/fixtures/themes/test/partials/override4/default.htm @@ -0,0 +1,3 @@ +

    I am another post, deep down

    + +{% partial 'nesting/level3' %} \ No newline at end of file diff --git a/tests/unit/cms/classes/ComponentManagerTest.php b/tests/unit/cms/classes/ComponentManagerTest.php index 5211a5778..99d3601d6 100644 --- a/tests/unit/cms/classes/ComponentManagerTest.php +++ b/tests/unit/cms/classes/ComponentManagerTest.php @@ -22,6 +22,8 @@ class ComponentManagerTest extends TestCase { include_once base_path() . '/tests/fixtures/plugins/october/tester/components/Archive.php'; include_once base_path() . '/tests/fixtures/plugins/october/tester/components/Post.php'; + include_once base_path() . '/tests/fixtures/plugins/october/tester/components/MainMenu.php'; + include_once base_path() . '/tests/fixtures/plugins/october/tester/components/ContentBlock.php'; $manager = ComponentManager::instance(); $components = $manager->listComponentDetails(); diff --git a/tests/unit/cms/classes/ControllerTest.php b/tests/unit/cms/classes/ControllerTest.php index 2de040214..e15220c1d 100644 --- a/tests/unit/cms/classes/ControllerTest.php +++ b/tests/unit/cms/classes/ControllerTest.php @@ -5,6 +5,31 @@ use Cms\Classes\Controller; class ControllerTest extends TestCase { + + public function testThemeUrl() + { + $theme = Theme::load('test'); + $controller = new Controller($theme); + + $url = $controller->themeUrl(); + $this->assertEquals('http://localhost/themes/test', $url); + + $url = $controller->themeUrl('foo/bar.css'); + $this->assertEquals('http://localhost/themes/test/foo/bar.css', $url); + + // + // These tests seem to bear different results + // + + // $url = $controller->themeUrl(['assets/css/style1.css', 'assets/css/style2.css']); + // $url = substr($url, 0, strpos($url, '-')); + // $this->assertEquals('/combine/88634b8fa6f4f6442ce830d38296640a', $url); + + // $url = $controller->themeUrl(['assets/js/script1.js', 'assets/js/script2.js']); + // $url = substr($url, 0, strpos($url, '-')); + // $this->assertEquals('/combine/860afc990164a60a8e90682d04da27ee', $url); + } + public function test404() { /* @@ -107,7 +132,7 @@ class ControllerTest extends TestCase } /** - * @expectedException Cms\Classes\CmsException + * @expectedException Twig_Error_Runtime * @expectedExceptionMessage is not found */ public function testPartialNotFound() @@ -341,28 +366,99 @@ ESC; $this->assertEquals('page', $content['ajax-result']); } - public function testThemeUrl() + /** + * @expectedException October\Rain\Exception\SystemException + * @expectedExceptionMessage is not registered for the component + */ + public function testComponentClassNotFound() { $theme = Theme::load('test'); $controller = new Controller($theme); + $response = $controller->run('/no-component-class')->getContent(); + } - $url = $controller->themeUrl(); - $this->assertEquals('http://localhost/themes/test', $url); - - $url = $controller->themeUrl('foo/bar.css'); - $this->assertEquals('http://localhost/themes/test/foo/bar.css', $url); - + public function testComponentNotFound() + { // - // These tests seem to bear different results + // This test should probably be throwing an exception... -sg // + $theme = Theme::load('test'); + $controller = new Controller($theme); + $response = $controller->run('/no-component')->getContent(); - // $url = $controller->themeUrl(['assets/css/style1.css', 'assets/css/style2.css']); - // $url = substr($url, 0, strpos($url, '-')); - // $this->assertEquals('/combine/88634b8fa6f4f6442ce830d38296640a', $url); + $this->assertEquals('

    Hey

    ', $response); + } - // $url = $controller->themeUrl(['assets/js/script1.js', 'assets/js/script2.js']); - // $url = substr($url, 0, strpos($url, '-')); - // $this->assertEquals('/combine/860afc990164a60a8e90682d04da27ee', $url); + 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 testComponentPartialOverride() + { + $theme = Theme::load('test'); + $controller = new Controller($theme); + $response = $controller->run('/component-partial-override')->getContent(); + + $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 = <<Level 1 + + +

    Level 2

    +

    DEFAULT MARKUP: I am a post yay

    I am another post, deep down

    + +

    Level 3

    +

    DEFAULT MARKUP: Menu

    + +

    Insert post here

    +ESC; + + $this->assertEquals($content, $response); + } + + public function testComponentWithOnRender() + { + $theme = Theme::load('test'); + $controller = new Controller($theme); + $response = $controller->run('/component-custom-render')->getContent(); + + $content = <<assertEquals($content, $response); } } diff --git a/tests/unit/cms/classes/PartialStackTest.php b/tests/unit/cms/classes/PartialStackTest.php new file mode 100644 index 000000000..58bd05d66 --- /dev/null +++ b/tests/unit/cms/classes/PartialStackTest.php @@ -0,0 +1,59 @@ +stackPartial(); + $stack->addComponent('override1', 'October\Tester\Components\MainMenu'); + $stack->addComponent('override2', 'October\Tester\Components\ContentBlock'); + + $stack->stackPartial(); + $stack->addComponent('override3', 'October\Tester\Components\Post'); + $stack->addComponent('post', 'October\Tester\Components\Post'); + + $stack->stackPartial(); + $stack->addComponent('mainMenu', 'October\Tester\Components\MainMenu'); + + /* + * Knock em down + */ + $this->assertEquals('October\Tester\Components\MainMenu', $stack->getComponent('mainMenu')); + $this->assertEquals('October\Tester\Components\MainMenu', $stack->getComponent('override1')); + + $stack->unstackPartial(); + + $this->assertNull($stack->getComponent('mainMenu')); + $this->assertEquals('October\Tester\Components\ContentBlock', $stack->getComponent('override2')); + $this->assertEquals('October\Tester\Components\Post', $stack->getComponent('override3')); + + $stack->unstackPartial(); + + $this->assertNull($stack->getComponent('mainMenu')); + $this->assertNull($stack->getComponent('post')); + $this->assertEquals('October\Tester\Components\MainMenu', $stack->getComponent('override1')); + + $stack->unstackPartial(); + + $this->assertNull($stack->getComponent('post')); + $this->assertNull($stack->getComponent('mainMenu')); + $this->assertNull($stack->getComponent('override1')); + $this->assertNull($stack->getComponent('override2')); + $this->assertNull($stack->getComponent('override3')); + } + + public function testEmptyStack() + { + $stack = new PartialStack; + $this->assertNull($stack->getComponent('xxx')); + } + +}