You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
5.7 KiB
216 lines
5.7 KiB
11 months ago
|
<?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'));
|
||
|
}
|
||
|
|
||
|
}
|