directoryReadMock = $this->getMockForAbstractClass(ReadInterface::class); $this->directoryWriteMock = $this->getMockForAbstractClass(WriteInterface::class); $this->filesystemMock = $this->createMock(Filesystem::class); $this->sampleDataDependencyMock = $this->createMock(Dependency::class); $this->arrayInputFactoryMock = $this->createMock(ArrayInputFactory::class); $this->applicationMock = $this->createMock(Application::class); $this->applicationFactoryMock = $this->createPartialMock(ApplicationFactory::class, ['create']); } /** * @param array $sampleDataPackages Array in form [package_name => version_constraint] * @param string $pathToComposerJson Fake path to composer.json * @param int $appRunResult Composer exit code * @param array $composerJsonContent Content of the composer.json * @param array $additionalComposerArgs Additional arguments that composer expects */ protected function setupMocks( $sampleDataPackages, $pathToComposerJson, $appRunResult, $composerJsonContent = [], $additionalComposerArgs = [] ) { $this->appRunResult = $appRunResult; $this->directoryReadMock->expects($this->any()) ->method('getAbsolutePath') ->willReturn($pathToComposerJson); $this->directoryReadMock->expects($this->any()) ->method('readFile') ->with('composer.json') ->willReturn(json_encode($composerJsonContent)); $this->filesystemMock->expects($this->any()) ->method('getDirectoryRead') ->with(DirectoryList::ROOT) ->willReturn($this->directoryReadMock); $this->sampleDataDependencyMock->expects($this->any()) ->method('getSampleDataPackages') ->willReturn($sampleDataPackages); $this->arrayInputFactoryMock->expects($this->never())->method('create'); $this->applicationMock->expects($this->any()) ->method('run') ->with( new ArrayInput( array_merge( $this->expectedComposerArgumentsSampleDataCommands( $sampleDataPackages, $pathToComposerJson ), $additionalComposerArgs ) ), $this->anything() ) ->willReturn($appRunResult); if (($appRunResult !== 0) && !empty($sampleDataPackages)) { $this->applicationMock->expects($this->any()) ->method('resetComposer') ->willReturnSelf(); } $this->applicationFactoryMock->expects($this->any()) ->method('create') ->willReturn($this->applicationMock); } /** * Expected arguments for composer based on sample data command * * @param array $sampleDataPackages * @param string $pathToComposerJson * @return array */ abstract protected function expectedComposerArgumentsSampleDataCommands( array $sampleDataPackages, string $pathToComposerJson ): array; }