Separate composer.lock load method and add test mocking it

This commit is contained in:
Robbie Averill 2017-07-11 12:21:53 +12:00
parent ee4d8b4d4e
commit 48d9088ab4
2 changed files with 67 additions and 19 deletions

View File

@ -57,28 +57,47 @@ class SilverStripeVersionProvider
public function getModuleVersionFromComposer($modules = array())
{
$versions = array();
$composerLockPath = BASE_PATH . '/composer.lock';
if (file_exists($composerLockPath)) {
$cache = SS_Cache::factory('SilverStripeVersionProvider_composerlock');
$cacheKey = filemtime($composerLockPath);
$versions = $cache->load($cacheKey);
if ($versions) {
$versions = json_decode($versions, true);
} else {
$versions = array();
}
if (!$versions && $jsonData = file_get_contents($composerLockPath)) {
$lockData = json_decode($jsonData);
if ($lockData && isset($lockData->packages)) {
foreach ($lockData->packages as $package) {
if (in_array($package->name, $modules) && isset($package->version)) {
$versions[$package->name] = $package->version;
}
}
$cache->save(json_encode($versions), $cacheKey);
$lockData = $this->getComposerLock();
if ($lockData && !empty($lockData['packages'])) {
foreach ($lockData['packages'] as $package) {
if (in_array($package['name'], $modules) && isset($package['version'])) {
$versions[$package['name']] = $package['version'];
}
}
}
return $versions;
}
/**
* Load composer.lock's contents and return it
*
* @param bool $cache
* @return array
*/
protected function getComposerLock($cache = true)
{
$composerLockPath = BASE_PATH . '/composer.lock';
if (!file_exists($composerLockPath)) {
return array();
}
$lockData = array();
if ($cache) {
$cache = SS_Cache::factory('SilverStripeVersionProvider_composerlock');
$cacheKey = filemtime($composerLockPath);
if ($versions = $cache->load($cacheKey)) {
$lockData = json_decode($versions, true);
}
}
if (empty($lockData) && $jsonData = file_get_contents($composerLockPath)) {
$lockData = json_decode($jsonData, true);
if ($cache) {
$cache->save(json_encode($lockData), $cacheKey);
}
}
return $lockData;
}
}

View File

@ -52,4 +52,33 @@ class SilverStripeVersionProviderTest extends SapphireTest
$this->assertContains('Framework: ', $result);
$this->assertContains(', ', $result);
}
public function testGetModulesFromComposerLock()
{
$mock = $this->getMockBuilder('SilverStripeVersionProvider')
->setMethods(array('getComposerLock'))
->getMock();
$mock->expects($this->once())
->method('getComposerLock')
->will($this->returnValue(array(
'packages' => array(
array(
'name' => 'silverstripe/somepackage',
'version' => '1.2.3'
),
array(
'name' => 'silverstripe/another',
'version' => '2.3.4'
)
)
)));
Config::inst()->update('SilverStripeVersionProvider', 'modules', array(
'silverstripe/somepackage' => 'Some Package'
));
$result = $mock->getVersion();
$this->assertContains('Some Package: 1.2.3', $result);
}
}