Skip to content

Commit 9768fc6

Browse files
committed
Add unit test for Magento\SampleData\Model\Dependency
1 parent 479a443 commit 9768fc6

File tree

2 files changed

+168
-8
lines changed

2 files changed

+168
-8
lines changed

app/code/Magento/SampleData/Model/Dependency.php

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
namespace Magento\SampleData\Model;
77

8+
use Magento\Framework\App\ObjectManager;
89
use Magento\Framework\Component\ComponentRegistrar;
910
use Magento\Framework\Component\ComponentRegistrarInterface;
1011
use Magento\Framework\Composer\ComposerInformation;
@@ -37,6 +38,11 @@ class Dependency
3738
*/
3839
private $componentRegistrar;
3940

41+
/**
42+
* @var Filesystem\Directory\ReadInterfaceFactory
43+
*/
44+
private $directoryReadFactory;
45+
4046
/**
4147
* @param ComposerInformation $composerInformation
4248
* @param Filesystem $filesystem
@@ -47,11 +53,16 @@ public function __construct(
4753
ComposerInformation $composerInformation,
4854
Filesystem $filesystem,
4955
PackageFactory $packageFactory,
50-
ComponentRegistrarInterface $componentRegistrar
56+
ComponentRegistrarInterface $componentRegistrar,
57+
\Magento\Framework\Filesystem\Directory\ReadInterfaceFactory $directoryReadFactory = null
5158
) {
5259
$this->composerInformation = $composerInformation;
5360
$this->packageFactory = $packageFactory;
5461
$this->componentRegistrar = $componentRegistrar;
62+
if ($directoryReadFactory === null) {
63+
$directoryReadFactory = ObjectManager::getInstance()->get(Filesystem\Directory\ReadInterfaceFactory::class);
64+
}
65+
$this->directoryReadFactory = $directoryReadFactory;
5566
}
5667

5768
/**
@@ -81,14 +92,15 @@ protected function getSuggestsFromModules()
8192
{
8293
$suggests = [];
8394
foreach ($this->componentRegistrar->getPaths(ComponentRegistrar::MODULE) as $moduleDir) {
84-
$file = $moduleDir . '/composer.json';
85-
86-
if (!file_exists($file) || !is_readable($file)) {
95+
/** @var Filesystem\Directory\ReadInterface $directory */
96+
$directory = $this->directoryReadFactory->create(['path' => $moduleDir]);
97+
echo "path=$moduleDir\n";
98+
if (!$directory->isExist('composer.json') || !$directory->isReadable('composer.json')) {
8799
continue;
88100
}
89101

90102
/** @var Package $package */
91-
$package = $this->getModuleComposerPackage($file);
103+
$package = $this->getModuleComposerPackage($directory);
92104
$suggest = json_decode(json_encode($package->get('suggest')), true);
93105
if (!empty($suggest)) {
94106
$suggests += $suggest;
@@ -100,11 +112,12 @@ protected function getSuggestsFromModules()
100112
/**
101113
* Load package
102114
*
103-
* @param string $file
115+
* @param Filesystem\Directory\ReadInterface $directory
104116
* @return Package
117+
* @throws \Magento\Framework\Exception\FileSystemException
105118
*/
106-
protected function getModuleComposerPackage($file)
119+
protected function getModuleComposerPackage(Filesystem\Directory\ReadInterface $directory)
107120
{
108-
return $this->packageFactory->create(['json' => json_decode(file_get_contents($file))]);
121+
return $this->packageFactory->create(['json' => json_decode($directory->readFile('composer.json'))]);
109122
}
110123
}
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\SampleData\Test\Unit\Model;
7+
8+
use Magento\Framework\Component\ComponentRegistrar;
9+
use Magento\Framework\Component\ComponentRegistrarInterface;
10+
use Magento\Framework\Composer\ComposerInformation;
11+
use Magento\Framework\Config\Composer\Package;
12+
use Magento\Framework\Config\Composer\PackageFactory;
13+
use Magento\Framework\Exception\FileSystemException;
14+
use Magento\Framework\Filesystem;
15+
use Magento\Framework\Phrase;
16+
use Magento\SampleData\Model\Dependency;
17+
18+
class DependencyTest extends \PHPUnit_Framework_TestCase
19+
{
20+
/**
21+
* @dataProvider dataPackagesFromComposerSuggest
22+
* @param string[] $moduleDirectories
23+
* @param callable $composerJsonGenerator
24+
* @param string[] $suggestionsFromLockFile
25+
* @param string[] $expectedPackages
26+
*/
27+
public function testPackagesFromComposerSuggest($moduleDirectories, callable $composerJsonGenerator, $suggestionsFromLockFile, $expectedPackages)
28+
{
29+
/** @var ComposerInformation|\PHPUnit_Framework_MockObject_MockObject $composerInformation */
30+
$composerInformation = $this->getMockBuilder(ComposerInformation::class)
31+
->disableOriginalConstructor()
32+
->getMock();
33+
$composerInformation->method('getSuggestedPackages')
34+
->willReturn($suggestionsFromLockFile);
35+
36+
/** @var Filesystem|\PHPUnit_Framework_MockObject_MockObject $filesystem */
37+
$filesystem = $this->getMockBuilder(Filesystem::class)->disableOriginalConstructor()->getMock();
38+
39+
/** @var PackageFactory|\PHPUnit_Framework_MockObject_MockObject $packageFactory */
40+
$packageFactory = $this->getMockBuilder(PackageFactory::class)
41+
->disableOriginalConstructor()
42+
->setMethods(['create'])
43+
->getMock();
44+
$packageFactory->method('create')
45+
->willReturnCallback(function($args) {
46+
return new Package($args['json']);
47+
});
48+
49+
/** @var ComponentRegistrarInterface|\PHPUnit_Framework_MockObject_MockObject $componentRegistrar */
50+
$componentRegistrar = $this->getMockBuilder(ComponentRegistrarInterface::class)
51+
->getMockForAbstractClass();
52+
$componentRegistrar->method('getPaths')
53+
->with(ComponentRegistrar::MODULE)
54+
->willReturn(
55+
$moduleDirectories
56+
);
57+
58+
$directoryReadFactory = $this->getMockBuilder(Filesystem\Directory\ReadInterfaceFactory::class)
59+
->disableOriginalConstructor()
60+
->setMethods(['create'])
61+
->getMock();
62+
$directoryReadFactory->method('create')
63+
->willReturnMap($composerJsonGenerator($this));
64+
65+
$dependency = new Dependency(
66+
$composerInformation,
67+
$filesystem,
68+
$packageFactory,
69+
$componentRegistrar,
70+
$directoryReadFactory
71+
);
72+
$this->assertEquals($expectedPackages, $dependency->getSampleDataPackages());
73+
}
74+
public static function dataPackagesFromComposerSuggest()
75+
{
76+
return [
77+
[
78+
'moduleDirectories' => [
79+
'app/code/LocalModule',
80+
'app/code/LocalModuleWithoutComposerJson',
81+
'vendor/company/module',
82+
],
83+
'composerJsonGenerator' => function(DependencyTest $test) {
84+
return [
85+
[
86+
['path' => 'app/code/LocalModule'],
87+
$test->stubComposerJsonReader(
88+
['name' => 'local/module', 'suggest' => ['local/module-sample-data' => Dependency::SAMPLE_DATA_SUGGEST . '0.1.0']]
89+
)
90+
],
91+
[
92+
['path' => 'app/code/LocalModuleWithoutComposerJson'],
93+
$test->stubFileNotFoundReader()
94+
],
95+
[
96+
['path' => 'vendor/company/module'],
97+
$test->stubComposerJsonReader(
98+
['name' => 'company/module', 'suggest' => ['company/module-sample-data' => Dependency::SAMPLE_DATA_SUGGEST . '1.0.0-beta']]
99+
)
100+
],
101+
];
102+
},
103+
'suggestions' => [
104+
'magento/foo-sample-data' => Dependency::SAMPLE_DATA_SUGGEST . '100.0.0',
105+
'thirdparty/bar-sample-data' => Dependency::SAMPLE_DATA_SUGGEST . '1.2.3',
106+
'thirdparty/something-else' => 'Just a suggested package',
107+
],
108+
'expectedPackages' => [
109+
'magento/foo-sample-data' => '100.0.0',
110+
'thirdparty/bar-sample-data' => '1.2.3',
111+
'local/module-sample-data' => '0.1.0',
112+
'company/module-sample-data' => '1.0.0-beta',
113+
]
114+
]
115+
];
116+
}
117+
118+
public function stubComposerJsonReader(array $composerJsonContent)
119+
{
120+
$stub = $this->getMockBuilder(Filesystem\Directory\ReadInterface::class)
121+
->getMockForAbstractClass();
122+
$stub->method('isExist')
123+
->with('composer.json')
124+
->willReturn(true);
125+
$stub->method('isReadable')
126+
->with('composer.json')
127+
->willReturn(true);
128+
$stub->method('readFile')
129+
->with('composer.json')
130+
->willReturn(json_encode($composerJsonContent));
131+
return $stub;
132+
}
133+
134+
public function stubFileNotFoundReader()
135+
{
136+
$stub = $this->getMockBuilder(Filesystem\Directory\ReadInterface::class)
137+
->getMockForAbstractClass();
138+
$stub->method('isExist')
139+
->with('composer.json')
140+
->willReturn(false);
141+
$stub->method('readFile')
142+
->with('composer.json')
143+
->willThrowException(new FileSystemException(new Phrase('File not found')));
144+
return $stub;
145+
}
146+
}
147+

0 commit comments

Comments
 (0)