216 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			216 lines
		
	
	
		
			5.7 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'));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |