public function scanAvailablePackagesTraversesThePackagesDirectoryAndRegistersPackagesItFinds()
{
$expectedPackageKeys = ['Neos.Flow' . md5(uniqid(mt_rand(), true)), 'Neos.Flow.Test' . md5(uniqid(mt_rand(), true)), 'TYPO3.YetAnotherTestPackage' . md5(uniqid(mt_rand(), true)), 'RobertLemke.Flow.NothingElse' . md5(uniqid(mt_rand(), true))];
foreach ($expectedPackageKeys as $packageKey) {
$packagePath = 'vfs://Test/Packages/Application/' . $packageKey . '/';
mkdir($packagePath, 0770, true);
mkdir($packagePath . 'Classes');
file_put_contents($packagePath . 'composer.json', '{"name": "' . $packageKey . '", "type": "flow-test"}');
}
$packageManager = $this->getAccessibleMock(PackageManager::class, ['emitPackageStatesUpdated']);
$packageManager->_set('packagesBasePath', 'vfs://Test/Packages/');
$packageManager->_set('packageStatesPathAndFilename', 'vfs://Test/Configuration/PackageStates.php');
$packageFactory = new PackageFactory($packageManager);
$this->inject($packageManager, 'packageFactory', $packageFactory);
$packageManager->_set('packages', []);
$packageManager->rescanPackages();
$packageStates = (require 'vfs://Test/Configuration/PackageStates.php');
$actualPackageKeys = array_keys($packageStates['packages']);
$this->assertEquals(sort($expectedPackageKeys), sort($actualPackageKeys));
}