<?php
App::uses('BemmelhorNav', 'Lib');
App::uses('BemmelhorTestCase', 'TestSuite');

class BemmelhorNavTest extends BemmelhorTestCase {

	protected static $_menus = array();

	public function setUp() {
		parent::setUp();
		self::$_menus = BemmelhorNav::items();
	}

	public function tearDown() {
		parent::tearDown();
		BemmelhorNav::items(self::$_menus);
	}

	public function testNav() {
		$saved = BemmelhorNav::items();

		// test clear
		BemmelhorNav::clear();
		$items = BemmelhorNav::items();
		$this->assertEqual($items, array());

		// test first level addition
		$defaults = BemmelhorNav::getDefaults();
		$extensions = array('title' => 'Extensions');
		BemmelhorNav::add('extensions', $extensions);
		$result = BemmelhorNav::items();
		$expected = array('extensions' => Set::merge($defaults, $extensions));
		$this->assertEqual($result, $expected);

		// tested nested insertion (1 level)
		$plugins = array('title' => 'Plugins');
		BemmelhorNav::add('extensions.children.plugins', $plugins);
		$result = BemmelhorNav::items();
		$expected['extensions']['children']['plugins'] = Set::merge($defaults, $plugins);
		$this->assertEqual($result, $expected);

		// 2 levels deep
		$example = array('title' => 'Example');
		BemmelhorNav::add('extensions.children.plugins.children.example', $example);
		$result = BemmelhorNav::items();

		$expected['extensions']['children']['plugins']['children']['example'] = Set::merge($defaults, $example);
		$this->assertEqual($result, $expected);

		BemmelhorNav::items($saved);
		$this->assertEquals($saved, BemmelhorNav::items());
	}

	public function testNavMerge() {
		$foo = array('title' => 'foo', 'access' => array('public', 'admin'));
		$bar = array('title' => 'bar', 'access' => array('admin'));
		BemmelhorNav::clear();
		BemmelhorNav::add('foo', $foo);
		BemmelhorNav::add('foo', $bar);
		$items = BemmelhorNav::items();
		$expected = array('admin', 'public');
		sort($expected);
		sort($items['foo']['access']);
		$this->assertEquals($expected, $items['foo']['access']);
	}

	public function testNavOverwrite() {
		$defaults = BemmelhorNav::getDefaults();

		$items = BemmelhorNav::items();
		$expected = Set::merge($defaults, array(
			'title' => 'Permissions',
			'url' => array(
				'admin' => true,
				'plugin' => 'acl',
				'controller' => 'acl_permissions',
				'action' => 'index',
				),
			'weight' => 30,
			));
		$this->assertEquals($expected, $items['users']['children']['permissions']);

		$item = array(
			'title' => 'Permissions',
			'url' => array(
				'admin' => true,
				'plugin' => 'acl_extras',
				'controller' => 'acl_extras_permissions',
				'action' => 'index',
				),
			'weight' => 30,
			);
		BemmelhorNav::add('users.children.permissions', $item);
		$items = BemmelhorNav::items();

		$expected = Set::merge($defaults, array(
			'title' => 'Permissions',
			'url' => array(
				'admin' => true,
				'plugin' => 'acl_extras',
				'controller' => 'acl_extras_permissions',
				'action' => 'index',
				),
			'weight' => 30,
			));

		$this->assertEquals($expected, $items['users']['children']['permissions']);
	}

}
