123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- <?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'));
- }
- }
|