216 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| 
 | |
| namespace think\tests;
 | |
| 
 | |
| use Mockery as m;
 | |
| use org\bovigo\vfs\vfsStream;
 | |
| use org\bovigo\vfs\vfsStreamDirectory;
 | |
| use PHPUnit\Framework\TestCase;
 | |
| use stdClass;
 | |
| use think\App;
 | |
| use think\Env;
 | |
| use think\Event;
 | |
| use think\event\AppInit;
 | |
| use think\exception\ClassNotFoundException;
 | |
| use think\Service;
 | |
| 
 | |
| class SomeService extends Service
 | |
| {
 | |
|     public $bind = [
 | |
|         'some' => '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'    => '<?php return ["bind"=>[],"listen"=>[],"subscribe"=>[]];',
 | |
|                 'provider.php' => '<?php return [];',
 | |
|             ],
 | |
|             'config' => [
 | |
|                 'app.php' => '<?php return [];',
 | |
|             ],
 | |
|         ]);
 | |
| 
 | |
|         $app = $this->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'));
 | |
|     }
 | |
| 
 | |
| }
 |