Completed
Push — master ( a9d66b...f95d57 )
by Hamish
26s
created

CMSMenuTest   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 111
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 111
rs 10
wmc 6
lcom 1
cbo 2

5 Methods

Rating   Name   Duplication   Size   Complexity  
B testBasicMenuHandling() 0 39 1
A testRemove() 0 11 1
A testLinkWithExternalAttributes() 0 14 1
A testCmsClassDetection() 0 11 1
B testAdvancedMenuHandling() 0 28 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 testRemove() {
49
		CMSMenu::clear_menu();
50
		CMSMenu::add_menu_item('custom', 'Custom Title', 'custom');
51
		CMSMenu::add_menu_item('other', 'Other Section', 'other', 'CMSMenuTest_LeftAndMainController');
52
		$this->assertNotEmpty(CMSMenu::get_menu_items());
53
54
		CMSMenu::remove_menu_class('CMSMenuTest_LeftAndMainController');
55
		CMSMenu::remove_menu_item('custom');
56
57
		$this->assertEmpty(CMSMenu::get_menu_items());
58
	}
59
60
	public function testLinkWithExternalAttributes() {
61
		CMSMenu::clear_menu();
62
63
		CMSMenu::add_link('LinkCode', 'link title', 'http://www.example.com', -2, array(
64
			'target' => '_blank'
65
		));
66
67
		$menuItems = CMSMenu::get_menu_items();
68
		$menuItem = $menuItems['LinkCode'];
69
70
		$this->assertEquals('target="_blank"', $menuItem->getAttributesHTML());
71
72
		CMSMenu::clear_menu();
73
	}
74
75
	public function testCmsClassDetection() {
76
77
		// Get CMS classes and check that:
78
		//	1.) SecurityAdmin is included
79
		//	2.) LeftAndMain & ModelAdmin are excluded
80
		$cmsClasses = CMSMenu::get_cms_classes();
81
		$this->assertContains('SecurityAdmin', $cmsClasses, 'SecurityAdmin included in valid CMS Classes');
82
		$this->assertNotContains('LeftAndMain', $cmsClasses, 'LeftAndMain not included in valid CMS Classes');
83
		$this->assertNotContains('ModelAdmin', $cmsClasses, 'LeftAndMain not included in valid CMS Classes');
84
85
	}
86
87
	public function testAdvancedMenuHandling() {
88
89
		// Populate from CMS Classes, check for existance of SecurityAdmin
90
		CMSMenu::clear_menu();
91
		CMSMenu::populate_menu();
92
		$menuItem = CMSMenu::get_menu_item('SecurityAdmin');
93
		$this->assertInstanceOf('CMSMenuItem', $menuItem, 'SecurityAdmin menu item exists');
94
		$this->assertContains($menuItem->url, singleton('SecurityAdmin')->Link(), 'Menu item has the correct link');
95
		$this->assertEquals($menuItem->controller, 'SecurityAdmin', 'Menu item has the correct controller class');
96
		$this->assertEquals(
97
			$menuItem->priority,
98
			singleton('SecurityAdmin')->stat('menu_priority'),
99
			'Menu item has the correct priority'
100
		);
101
102
		// Check that menu order is correct by priority
103
		// Note this will break if populate_menu includes normal links (ie, as not controller)
104
		$menuItems = CMSMenu::get_menu_items();
105
		$priority = 9999; // ok, *could* be set larger, but shouldn't need to be!
106
		foreach($menuItems as $menuItem) {
107
			$this->assertEquals(
108
				$menuItem->priority,
109
				singleton($menuItem->controller)->stat('menu_priority'),
110
				"Menu item $menuItem->title has the correct priority"
111
			);
112
			$this->assertLessThanOrEqual($priority, $menuItem->priority, 'Menu item is of lower or equal priority');
113
		}
114
	}
115
116
}
117
118
/**
119
 * @package framework
120
 * @subpackage tests
121
 */
122
class CMSMenuTest_LeftAndMainController extends LeftAndMain implements TestOnly {
123
124
	private static $url_segment = 'CMSMenuTest_LeftAndMainController';
125
126
	private static $menu_title = 'CMSMenuTest_LeftAndMainController';
127
128
	private static $menu_priority = 50;
129
}
130
131
class CMSMenuTest_CustomTitle extends LeftAndMain implements TestOnly {
132
133
	private static $url_segment = 'CMSMenuTest_CustomTitle';
134
135
	private static $menu_priority = 50;
136
137
	public static function menu_title($class = null, $localised = false) {
138
		if($localised) {
139
			return __CLASS__ . ' (localised)';
140
		} else {
141
			return __CLASS__ . ' (unlocalised)';
142
		}
143
	}
144
}
145