'class', ]; public function register() { } public function boot() { } } /** * @property array initializers */ class AppTest extends TestCase { /** @var App */ protected $app; protected function setUp() { $this->app = new App(); } protected function tearDown(): void { m::close(); } public function testService() { $this->app->register(stdClass::class); $this->assertInstanceOf(stdClass::class, $this->app->getService(stdClass::class)); $service = m::mock(SomeService::class); $service->shouldReceive('register')->once(); $this->app->register($service); $this->assertEquals($service, $this->app->getService(SomeService::class)); $service2 = m::mock(SomeService::class); $service2->shouldReceive('register')->once(); $this->app->register($service2); $this->assertEquals($service, $this->app->getService(SomeService::class)); $this->app->register($service2, true); $this->assertEquals($service2, $this->app->getService(SomeService::class)); $service->shouldReceive('boot')->once(); $service2->shouldReceive('boot')->once(); $this->app->boot(); } public function testDebug() { $this->app->debug(false); $this->assertFalse($this->app->isDebug()); $this->app->debug(true); $this->assertTrue($this->app->isDebug()); } public function testNamespace() { $namespace = 'test'; $this->app->setNamespace($namespace); $this->assertEquals($namespace, $this->app->getNamespace()); } public function testVersion() { $this->assertEquals(App::VERSION, $this->app->version()); } public function testPath() { $rootPath = __DIR__ . DIRECTORY_SEPARATOR; $app = new App($rootPath); $this->assertEquals($rootPath, $app->getRootPath()); $this->assertEquals(dirname(__DIR__) . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR, $app->getThinkPath()); $this->assertEquals($rootPath . 'app' . DIRECTORY_SEPARATOR, $app->getAppPath()); $appPath = $rootPath . 'app' . DIRECTORY_SEPARATOR . 'admin' . DIRECTORY_SEPARATOR; $app->setAppPath($appPath); $this->assertEquals($appPath, $app->getAppPath()); $this->assertEquals($rootPath . 'app' . DIRECTORY_SEPARATOR, $app->getBasePath()); $this->assertEquals($rootPath . 'config' . DIRECTORY_SEPARATOR, $app->getConfigPath()); $this->assertEquals($rootPath . 'runtime' . DIRECTORY_SEPARATOR, $app->getRuntimePath()); $runtimePath = $rootPath . 'runtime' . DIRECTORY_SEPARATOR . 'admin' . DIRECTORY_SEPARATOR; $app->setRuntimePath($runtimePath); $this->assertEquals($runtimePath, $app->getRuntimePath()); } /** * @param vfsStreamDirectory $root * @param bool $debug * @return App */ protected function prepareAppForInitialize(vfsStreamDirectory $root, $debug = true) { $rootPath = $root->url() . DIRECTORY_SEPARATOR; $app = new App($rootPath); $initializer = m::mock(); $initializer->shouldReceive('init')->once()->with($app); $app->instance($initializer->mockery_getName(), $initializer); (function () use ($initializer) { $this->initializers = [$initializer->mockery_getName()]; })->call($app); $env = m::mock(Env::class); $env->shouldReceive('load')->once()->with($rootPath . '.env'); $env->shouldReceive('get')->once()->with('config_ext', '.php')->andReturn('.php'); $env->shouldReceive('get')->once()->with('app_debug')->andReturn($debug); $event = m::mock(Event::class); $event->shouldReceive('trigger')->once()->with(AppInit::class); $event->shouldReceive('bind')->once()->with([]); $event->shouldReceive('listenEvents')->once()->with([]); $event->shouldReceive('subscribe')->once()->with([]); $app->instance('env', $env); $app->instance('event', $event); return $app; } public function testInitialize() { $root = vfsStream::setup('rootDir', null, [ '.env' => '', 'app' => [ 'common.php' => '', 'event.php' => '[],"listen"=>[],"subscribe"=>[]];', 'provider.php' => ' [ 'app.php' => 'prepareAppForInitialize($root, true); $app->debug(false); $app->initialize(); $this->assertIsInt($app->getBeginMem()); $this->assertIsFloat($app->getBeginTime()); $this->assertTrue($app->initialized()); } public function testFactory() { $this->assertInstanceOf(stdClass::class, App::factory(stdClass::class)); $this->expectException(ClassNotFoundException::class); App::factory('SomeClass'); } public function testParseClass() { $this->assertEquals('app\\controller\\SomeClass', $this->app->parseClass('controller', 'some_class')); $this->app->setNamespace('app2'); $this->assertEquals('app2\\controller\\SomeClass', $this->app->parseClass('controller', 'some_class')); } }