config = $this->createMock(Config::class); $this->metadata = $this->createMock(Metadata::class); $this->dataCache = $this->createMock(DataCache::class); $this->fileManager = $this->createMock(FileManager::class); $this->loader = $this->createMock(Loader::class); $this->pathProvider = $this->createMock(PathProvider::class); $this->initPathProvider(); $this->autoload = new Autoload( $this->config, $this->metadata, $this->dataCache, $this->fileManager, $this->loader, $this->pathProvider ); } private function initPathProvider(string $rootPath = ''): void { $this->pathProvider ->method('getCustom') ->willReturn($rootPath . 'custom/Espo/Custom/Resources/'); $this->pathProvider ->method('getCore') ->willReturn($rootPath . 'application/Espo/Resources/'); $this->pathProvider ->method('getModule') ->willReturnCallback( function (?string $moduleName) use ($rootPath): string { $path = $rootPath . 'application/Espo/Modules/{*}/Resources/'; if ($moduleName === null) { return $path; } return str_replace('{*}', $moduleName, $path); } ); } public function testMerge() { $this->metadata ->expects($this->once()) ->method('getModuleList') ->willReturn(['M1', 'M2']); $this->config ->expects($this->once()) ->method('get') ->with('useCache') ->willReturn(false); $this->fileManager ->expects($this->any()) ->method('isFile') ->will( $this->returnValueMap( [ ['application/Espo/Resources/autoload.json', false], ['application/Espo/Modules/M1/Resources/autoload.json', true], ['application/Espo/Modules/M2/Resources/autoload.json', true], ['custom/Espo/Custom/Resources/autoload.json', false], ] ) ); $data1 = [ 'autoloadFileList' => ['f1.php'], 'psr-4' => [ 't1' => 'r1', ], ]; $data2 = [ 'autoloadFileList' => ['f2.php'], 'psr-4' => [ 't2' => 'r2', ], ]; $expectedData = [ 'autoloadFileList' => ['f1.php', 'f2.php'], 'psr-4' => [ 't1' => 'r1', 't2' => 'r2', ], ]; $this->fileManager ->expects($this->any()) ->method('getContents') ->will( $this->returnValueMap( [ ['application/Espo/Modules/M1/Resources/autoload.json', json_encode($data1)], ['application/Espo/Modules/M2/Resources/autoload.json', json_encode($data2)], ] ) ); $this->loader ->expects($this->once()) ->method('register') ->with($expectedData); $this->autoload->register(); } }