Completed
Push — master ( feca77...694826 )
by Ingo
11:47
created

CMSMenuTest_CustomTitle::menu_title()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 7
rs 9.4285
cc 2
eloc 5
nc 2
nop 2
1
<?php
2
/**
3
 * @package framework
4
 * @subpackage tests
5
 */
6
class CMSMenuTest extends SapphireTest implements TestOnly {
7
8
	public function testBasicMenuHandling() {
9
10
		// Clear existing menu
11
		CMSMenu::clear_menu();
12
		$menuItems = CMSMenu::get_menu_items();
13
		$this->assertTrue((empty($menuItems)), 'Menu can be cleared');
14
15
		// Add a controller to the menu and check it is as expected
16
		CMSMenu::add_controller('CMSMenuTest_LeftAndMainController');
17
		$menuItems = CMSMenu::get_menu_items();
18
		$menuItem = $menuItems['CMSMenuTest_LeftAndMainController'];
19
		$this->assertInstanceOf('CMSMenuItem', $menuItem, 'Controller menu item is of class CMSMenuItem');
20
		$this->assertContains($menuItem->url, singleton('CMSMenuTest_LeftAndMainController')->Link(),
21
			'Controller menu item has the correct link');
22
		$this->assertEquals($menuItem->controller, 'CMSMenuTest_LeftAndMainController',
23
			'Controller menu item has the correct controller class');
24
		$this->assertEquals($menuItem->priority, singleton('CMSMenuTest_LeftAndMainController')->stat('menu_priority'),
25
			'Controller menu item has the correct priority');
26
		CMSMenu::clear_menu();
27
28
		// Add another controller
29
		CMSMenu::add_controller('CMSMenuTest_CustomTitle');
30
		$menuItems = CMSMenu::get_menu_items();
31
		$menuItem = $menuItems['CMSMenuTest_CustomTitle'];
32
		$this->assertInstanceOf('CMSMenuItem', $menuItem, 'Controller menu item is of class CMSMenuItem');
33
		$this->assertEquals('CMSMenuTest_CustomTitle (localised)', $menuItem->title);
34
		CMSMenu::clear_menu();
35
36
		// Add a link to the menu
37
		CMSMenu::add_link('LinkCode', 'link title', 'http://www.example.com');
38
		$menuItems = CMSMenu::get_menu_items();
39
		$menuItem = $menuItems['LinkCode'];
40
		$this->assertInstanceOf('CMSMenuItem', $menuItem, 'Link menu item is of class CMSMenuItem');
41
		$this->assertEquals($menuItem->title, 'link title', 'Link menu item has the correct title');
42
		$this->assertEquals($menuItem->url,'http://www.example.com', 'Link menu item has the correct link');
43
		$this->assertNull($menuItem->controller, 'Link menu item has no controller class');
44
		$this->assertEquals($menuItem->priority, -1, 'Link menu item has the correct priority');
45
		CMSMenu::clear_menu();
46
	}
47
48
	public function testLinkWithExternalAttributes() {
49
		CMSMenu::clear_menu();
50
51
		CMSMenu::add_link('LinkCode', 'link title', 'http://www.example.com', -2, array(
52
			'target' => '_blank'
53
		));
54
55
		$menuItems = CMSMenu::get_menu_items();
56
		$menuItem = $menuItems['LinkCode'];
57
58
		$this->assertEquals('target="_blank"', $menuItem->getAttributesHTML());
59
60
		CMSMenu::clear_menu();
61
	}
62
63
	public function testCmsClassDetection() {
64
65
		// Get CMS classes and check that:
66
		//	1.) SecurityAdmin is included
67
		//	2.) LeftAndMain & ModelAdmin are excluded
68
		$cmsClasses = CMSMenu::get_cms_classes();
69
		$this->assertContains('SecurityAdmin', $cmsClasses, 'SecurityAdmin included in valid CMS Classes');
70
		$this->assertNotContains('LeftAndMain', $cmsClasses, 'LeftAndMain not included in valid CMS Classes');
71
		$this->assertNotContains('ModelAdmin', $cmsClasses, 'LeftAndMain not included in valid CMS Classes');
72
73
	}
74
75
	public function testAdvancedMenuHandling() {
76
77
		// Populate from CMS Classes, check for existance of SecurityAdmin
78
		CMSMenu::clear_menu();
79
		CMSMenu::populate_menu();
80
		$menuItem = CMSMenu::get_menu_item('SecurityAdmin');
81
		$this->assertInstanceOf('CMSMenuItem', $menuItem, 'SecurityAdmin menu item exists');
82
		$this->assertContains($menuItem->url, singleton('SecurityAdmin')->Link(), 'Menu item has the correct link');
83
		$this->assertEquals($menuItem->controller, 'SecurityAdmin', 'Menu item has the correct controller class');
84
		$this->assertEquals(
85
			$menuItem->priority,
86
			singleton('SecurityAdmin')->stat('menu_priority'),
87
			'Menu item has the correct priority'
88
		);
89
90
		// Check that menu order is correct by priority
91
		// Note this will break if populate_menu includes normal links (ie, as not controller)
92
		$menuItems = CMSMenu::get_menu_items();
93
		$priority = 9999; // ok, *could* be set larger, but shouldn't need to be!
94
		foreach($menuItems as $menuItem) {
95
			$this->assertEquals(
96
				$menuItem->priority,
97
				singleton($menuItem->controller)->stat('menu_priority'),
98
				"Menu item $menuItem->title has the correct priority"
99
			);
100
			$this->assertLessThanOrEqual($priority, $menuItem->priority, 'Menu item is of lower or equal priority');
101
		}
102
	}
103
104
}
105
106
/**
107
 * @package framework
108
 * @subpackage tests
109
 */
110
class CMSMenuTest_LeftAndMainController extends LeftAndMain implements TestOnly {
111
112
	private static $url_segment = 'CMSMenuTest_LeftAndMainController';
113
114
	private static $menu_title = 'CMSMenuTest_LeftAndMainController';
115
116
	private static $menu_priority = 50;
117
}
118
119
class CMSMenuTest_CustomTitle extends LeftAndMain implements TestOnly {
120
121
	private static $url_segment = 'CMSMenuTest_CustomTitle';
122
123
	private static $menu_priority = 50;
124
125
	public static function menu_title($class = null, $localised = false) {
126
		if($localised) {
127
			return __CLASS__ . ' (localised)';
128
		} else {
129
			return __CLASS__ . ' (unlocalised)';
130
		}
131
	}
132
}
133