controllers = new Controllers(); $this->controllers->addComponentPath(dirname(__DIR__) . DS . 'controllers'); } /** * Remove all listeners before the next test starts. */ public function tearDown(): void { // Clear all events created by tests Events::$listeners = array(); // Reset all config files Factory::getInstance()->config->discardConfigFiles(); } /** * @covers ::get * @covers ::loadController */ public function testGetControllerFromClass() { // Create mock controller $mockController = $this->getMockBuilder(Controller::class)->getMock(); $mockControllerClass = get_class($mockController); class_alias($mockControllerClass, $mockControllerClass . 'Controller'); // Try and fetch this controller from the Controllers class $this->assertInstanceOf($mockControllerClass, $this->controllers->get($mockControllerClass, [], '\\')); } /** * @depends testGetControllerFromClass * @covers ::get * @covers ::loadController */ public function testGetControllerFromClassInvalidInstance() { // Create invalid mock $mockFakeController = $this->getMockBuilder(stdClass::class)->getMock(); $mockFakeControllerClass = get_class($mockFakeController); class_alias($mockFakeControllerClass, $mockFakeControllerClass . 'Controller'); // Try and fetch $this->expectException(ControllerException::class); $this->controllers->get($mockFakeControllerClass, [], '\\'); } /** * @depends testGetControllerFromClass * @covers ::get * @covers ::loadController */ public function testGetControllerFromClassDefaultNamespace() { // Create mock controller $mockController = $this->getMockBuilder(Controller::class)->getMock(); $mockControllerClass = get_class($mockController); class_alias($mockControllerClass, '\Application\Controller\DefaultNamespaceController'); // Try and fetch $this->assertInstanceOf('\Application\Controller\DefaultNamespaceController', $this->controllers->get('DefaultNamespace')); } /** * @depends testGetControllerFromClass * @covers ::get * @covers ::loadController * @todo Implement. Mock constructor arguments doesn't work yet */ public function testGetControllerWithArguments() { // Can't be tested right now $this->assertTrue(true); } /** * @covers ::get */ public function testGetControllerInvalidName() { $this->expectException(ControllerException::class); $this->controllers->get('', [], '\\'); } /** * @depends testGetControllerFromClass * @covers ::get * @covers ::loadController */ public function testGetControllerFromFile() { $this->assertInstanceOf('\Application\Controller\TestGetControllerController', $this->controllers->get('TestGetController')); } /** * @depends testGetControllerFromFile * @covers ::get * @covers ::loadController */ public function testGetControllerFromFileInvalidInstance() { $this->expectException(ControllerException::class); $this->controllers->get('ControllerInvalidInstance'); } /** * @depends testGetControllerFromFile * @covers ::get * @covers ::loadController */ public function testDifferentComponentPathPriority() { // Add the directories for this test $this->controllers->addComponentPath(dirname(__DIR__) . DS . 'controllers'.DS.'TestDifferentComponentPathPriority'.DS.'Lowest', Priority::LOWEST); $this->controllers->addComponentPath(dirname(__DIR__) . DS . 'controllers'.DS.'TestDifferentComponentPathPriority'.DS.'Highest', Priority::HIGHEST); // Load the controller and assert it is the correct type $controller = $this->controllers->get('TestDifferentComponentPathPriority'); $this->assertInstanceOf('\Application\Controller\TestDifferentComponentPathPriorityController', $controller); $this->assertEquals('highest', $controller->type); // Clean up the test $this->controllers->setDirectories([]); } /** * @depends testGetControllerFromFile * @covers ::get * @covers ::loadController */ public function testGetSubdirectory() { $this->assertInstanceOf('\Application\Controller\TestGetSubdirectoryController', $this->controllers->get('TestGetSubdirectory')); } /** * @depends testGetControllerFromFile * @covers ::get * @covers ::loadController */ public function testControllerNotFound() { $this->expectException(NotFoundException::class); $this->controllers->get('NotFound'); } /** * @depends testGetControllerFromClass * @covers ::get * @covers \FuzeWorks\Event\ControllerGetEvent::init */ public function testControllerGetEvent() { // Register listener Events::addListener(function($event){ /** @var ControllerGetEvent $event */ $this->assertInstanceOf('\FuzeWorks\Event\ControllerGetEvent', $event); $this->assertEquals('SomeControllerName', $event->controllerName); $this->assertEquals([3 => ['some_path']], $event->controllerPaths); $this->assertEquals('SomeNamespace', $event->namespace); $this->assertEquals(['Some Argument'], $event->arguments); $event->setCancelled(true); }, 'controllerGetEvent', Priority::NORMAL); $this->expectException(ControllerException::class); $this->controllers->get('SomeControllerName', ['some_path'], 'SomeNamespace', 'Some Argument'); } /** * @depends testControllerGetEvent * @covers ::get */ public function testCancelGetController() { // Register listener Events::addListener(function($event){ $event->setCancelled(true); }, 'controllerGetEvent', Priority::NORMAL); $this->expectException(ControllerException::class); $this->controllers->get('SomeController', [], '\\'); } /** * @depends testControllerGetEvent * @covers ::get * @covers ::loadController */ public function testControllerGetEventIntervene() { // Register listener Events::addListener(function($event){ /** @var ControllerGetEvent $event */ $event->controllerName = 'TestControllerGetEventIntervene'; $event->namespace = '\Some\Other\\'; }, 'controllerGetEvent', Priority::NORMAL); $this->assertInstanceOf('\Some\Other\TestControllerGetEventInterveneController', $this->controllers->get('Something_Useless')); } }