Current File : /home/jvzmxxx/wiki1/extensions/MobileFrontend/tests/phpunit/MenuBuilderTest.php
<?php

namespace Tests\MobileFrontend;

use MobileFrontend\MenuBuilder;

/**
 * @group MobileFrontend
 */
class MenuTest extends \PHPUnit_Framework_TestCase {
	private $homeComponent = [
		'text' => 'Home',
		'href' => '/Main_page',
		'class' => 'mw-ui-icon mw-ui-icon-before mw-ui-icon-home',
		'data-event-name' => 'home',
	];

	private $nearbyComponent = [
		'text' => 'Nearby',
		'href' => '/wiki/Special:Nearby',
		'class' => 'mw-ui-icon mw-ui-icon-before mw-ui-icon-nearby',
	];

	/**
	 * @covers \MobileFrontend\MenuBuilder::getEntries
	 */
	public function test_it_shouldnt_have_entries_by_default() {
		$menu = new MenuBuilder();

		$this->assertEmpty( $menu->getEntries() );
	}

	/**
	 * @covers \MobileFrontend\MenuBuilder::insert
	 * @covers \MobileFrontend\MenuEntry::addComponent
	 * @covers \MobileFrontend\MenuBuilder::getEntries
	 */
	public function test_inserting_an_entry() {
		$menu = new MenuBuilder();
		$menu->insert( 'home' )
			->addComponent(
				$this->homeComponent['text'],
				$this->homeComponent['href'],
				$this->homeComponent['class'],
				[
					'data-event-name' => $this->homeComponent['data-event-name']
				]
			);

		$expectedEntries = [
			[
				'name' => 'home',
				'components' => [ $this->homeComponent ],
			],
		];

		$this->assertEquals( $expectedEntries, $menu->getEntries() );
	}

	/**
	 * @covers \MobileFrontend\MenuBuilder::insert
	 * @covers \MobileFrontend\MenuEntry::addComponent
	 * @covers \MobileFrontend\MenuBuilder::getEntries
	 */
	public function test_inserting_an_entry_after_another() {
		$menu = new MenuBuilder();
		$menu->insert( 'home' )
			->addComponent(
				$this->homeComponent['text'],
				$this->homeComponent['href'],
				$this->homeComponent['class'],
				[
					'data-event-name' => $this->homeComponent['data-event-name']
				]
			);
		$menu->insert( 'another_home' )
			->addComponent(
				$this->homeComponent['text'],
				$this->homeComponent['href'],
				$this->homeComponent['class'],
				[
					'data-event-name' => $this->homeComponent['data-event-name']
				]
			);
		$menu->insertAfter( 'home', 'nearby' )
			->addComponent(
				$this->nearbyComponent['text'],
				$this->nearbyComponent['href'],
				$this->nearbyComponent['class']
			);

		$expectedEntries = [
			[
				'name' => 'home',
				'components' => [ $this->homeComponent ],
			],
			[
				'name' => 'nearby',
				'components' => [ $this->nearbyComponent ],
			],
			[
				'name' => 'another_home',
				'components' => [ $this->homeComponent ],
			],
		];

		$this->assertEquals( $expectedEntries, $menu->getEntries() );
	}

	/**
	 * @expectedException \DomainException
	 * @expectedExceptionMessage The "home" entry doesn't exist.
	 * @covers \MobileFrontend\MenuBuilder::insertAfter
	 * @covers \MobileFrontend\MenuEntry::addComponent
	 */
	public function test_inserting_an_entry_after_that_doesnt_exist() {
		$menu = new MenuBuilder();
		$menu->insertAfter( 'home', 'nearby' )
			->addComponent(
				$this->nearbyComponent['text'],
				$this->nearbyComponent['href'],
				$this->nearbyComponent['class']
			);
	}

	/**
	 * @expectedException \DomainException
	 * @expectedExceptionMessage The "home" entry already exists.
	 * @covers \MobileFrontend\MenuBuilder::insert
	 */
	public function test_inserting_an_entry_with_an_existing_name() {
		$menu = new MenuBuilder();
		$menu->insert( 'home' );
		$menu->insert( 'home' );
	}

	/**
	 * @expectedException \DomainException
	 * @expectedExceptionMessage The "home" entry already exists.
	 * @covers \MobileFrontend\MenuBuilder::insert
	 */
	public function test_inserting_an_entry_with_an_existing_name_after() {
		$menu = new MenuBuilder();
		$menu->insert( 'home' );
		$menu->insertAfter( 'home', 'home' );
	}

	/**
	 * @covers \MobileFrontend\MenuBuilder::insert
	 * @covers \MobileFrontend\MenuEntry::addComponent
	 * @covers \MobileFrontend\MenuBuilder::getEntries
	 */
	public function test_inserting_an_entry_with_multiple_components() {
		$authLoginComponent = [
			'text' => 'Phuedx (WMF)',
			'href' => '/wiki/User:Phuedx_(WMF)',
			'class' =>
				'mw-ui-icon mw-ui-icon-before mw-ui-icon-profile truncated-text primary-action',
		];
		$authLogoutComponent = [
			'text' => 'Logout',
			'href' => '/wiki/Special:UserLogout',
			'class' =>
				'mw-ui-icon mw-ui-icon-element secondary-logout secondary-action truncated-text',
		];

		$menu = new MenuBuilder();
		$menu->insert( 'auth' )
			->addComponent(
				$authLoginComponent['text'],
				$authLoginComponent['href'],
				$authLoginComponent['class']
			)
			->addComponent(
				$authLogoutComponent['text'],
				$authLogoutComponent['href'],
				$authLogoutComponent['class']
			);

		$expectedEntries = [
			[
				'name' => 'auth',
				'components' => [
					$authLoginComponent,
					$authLogoutComponent
				],
			],
		];

		$this->assertEquals( $expectedEntries, $menu->getEntries() );
	}

	/**
	 * @covers \MobileFrontend\MenuBuilder::insert
	 * @covers \MobileFrontend\MenuEntry::addComponent
	 * @covers \MobileFrontend\MenuBuilder::getEntries
	 */
	public function test_inserting_a_javascript_only_entry() {
		$menu = new MenuBuilder();
		$menu->insert( 'nearby', $isJSOnly = true )
			->addComponent(
				$this->nearbyComponent['text'],
				$this->nearbyComponent['href'],
				$this->nearbyComponent['class']
			);

		$expectedEntries = [
			[
				'name' => 'nearby',
				'components' => [ $this->nearbyComponent ],
				'class' => 'jsonly'
			],
		];

		$this->assertEquals( $expectedEntries, $menu->getEntries() );
	}
}