Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
PackagesDataTest.php
Go to the documentation of this file.
1 <?php
8 
9 use Composer\Package\RootPackage;
12 use PHPUnit_Framework_MockObject_MockObject as MockObject;
13 
18 class PackagesDataTest extends \PHPUnit\Framework\TestCase
19 {
23  private $packagesData;
24 
28  private $composerInformation;
29 
33  private $timeZoneProvider;
34 
38  private $packagesAuth;
39 
43  private $filesystem;
44 
48  private $objectManagerProvider;
49 
53  private $typeMapper;
54 
55  public function setUp()
56  {
57  $this->composerInformation = $this->getComposerInformation();
58  $this->timeZoneProvider = $this->getMockBuilder(\Magento\Setup\Model\DateTime\TimeZoneProvider::class)
59  ->disableOriginalConstructor()
60  ->getMock();
61  $timeZone = $this->createMock(\Magento\Framework\Stdlib\DateTime\Timezone::class);
62  $this->timeZoneProvider->expects($this->any())->method('get')->willReturn($timeZone);
63  $this->packagesAuth = $this->createMock(\Magento\Setup\Model\PackagesAuth::class);
64  $this->filesystem = $this->createMock(\Magento\Framework\Filesystem::class);
65  $this->objectManagerProvider = $this->getMockBuilder(\Magento\Setup\Model\ObjectManagerProvider::class)
66  ->disableOriginalConstructor()
67  ->getMock();
68  $objectManager = $this->getMockForAbstractClass(\Magento\Framework\ObjectManagerInterface::class);
69  $appFactory = $this->getMockBuilder(\Magento\Framework\Composer\MagentoComposerApplicationFactory::class)
70  ->disableOriginalConstructor()
71  ->getMock();
72  $application = $this->createMock(\Magento\Composer\MagentoComposerApplication::class);
73  $application->expects($this->any())
74  ->method('runComposerCommand')
75  ->willReturnMap([
76  [
77  [
79  PackagesData::PARAM_PACKAGE => 'magento/package-1',
81  ],
82  null,
83  'versions: 2.0.1'
84  ],
85  [
86  [
88  PackagesData::PARAM_PACKAGE => 'magento/package-2',
90  ],
91  null,
92  'versions: 2.0.1'
93  ],
94  [
95  [
97  PackagesData::PARAM_PACKAGE => 'partner/package-3',
99  ],
100  null,
101  'versions: 3.0.1'
102  ],
103  ]);
104  $appFactory->expects($this->any())->method('create')->willReturn($application);
105  $objectManager->expects($this->any())
106  ->method('get')
107  ->with(\Magento\Framework\Composer\MagentoComposerApplicationFactory::class)
108  ->willReturn($appFactory);
109  $this->objectManagerProvider->expects($this->any())->method('get')->willReturn($objectManager);
110 
111  $directoryWrite = $this->getMockForAbstractClass(\Magento\Framework\Filesystem\Directory\WriteInterface::class);
112  $directoryRead = $this->getMockForAbstractClass(\Magento\Framework\Filesystem\Directory\ReadInterface::class);
113  $this->filesystem->expects($this->any())->method('getDirectoryRead')->will($this->returnValue($directoryRead));
114  $this->filesystem->expects($this->any())
115  ->method('getDirectoryWrite')
116  ->will($this->returnValue($directoryWrite));
117  $directoryWrite->expects($this->any())->method('isExist')->willReturn(true);
118  $directoryWrite->expects($this->any())->method('isReadable')->willReturn(true);
119  $directoryWrite->expects($this->any())->method('delete')->willReturn(true);
120  $directoryRead->expects($this->any())->method('isExist')->willReturn(true);
121  $directoryRead->expects($this->any())->method('isReadable')->willReturn(true);
122  $directoryRead->expects($this->any())->method('stat')->willReturn(['mtime' => '1462460216076']);
123  $directoryRead->expects($this->any())
124  ->method('readFile')
125  ->willReturn(
126  '{"packages":{"magento\/package-1":{'
127  . '"1.0.0":{"name":"magento\/package-1","version":"1.0.0","vendor":"test","type":"metapackage",'
128  . '"require":{"magento\/package-3":"1.0.0"}},'
129  . '"1.0.1":{"name":"magento\/package-1","version":"1.0.1","vendor":"test","type":"magento2-module"},'
130  . '"1.0.2":{"name":"magento\/package-1","version":"1.0.2","vendor":"test","type":"magento2-module"}'
131  . '}, "magento\/package-2":{'
132  . '"1.0.0":{"name":"magento\/package-2","version":"1.0.0","vendor":"test","type":"magento2-module"},'
133  . '"1.0.1":{"name":"magento\/package-2","version":"1.0.1","vendor":"test","type":"magento2-module"}'
134  . '}, "magento\/package-3":{'
135  . '"1.0.0":{"name":"magento\/package-3","version":"1.0.0","vendor":"test","type":"magento2-module"},'
136  . '"1.0.1":{"name":"magento\/package-3","version":"1.0.1","vendor":"test","type":"magento2-module"},'
137  . '"1.0.2":{"name":"magento\/package-3","version":"1.0.2","vendor":"test","type":"magento2-module",'
138  . '"extra":{"x-magento-ext-title":"Package 3 title", "x-magento-ext-type":"Extension"}}'
139  . '}}}'
140  );
141 
142  $this->typeMapper = $this->getMockBuilder(\Magento\Setup\Model\Grid\TypeMapper::class)
143  ->disableOriginalConstructor()
144  ->getMock();
145  $this->typeMapper->expects(static::any())
146  ->method('map')
147  ->willReturnMap([
148  [ComposerInformation::MODULE_PACKAGE_TYPE, \Magento\Setup\Model\Grid\TypeMapper::MODULE_PACKAGE_TYPE],
149  ]);
150 
151  $this->createPackagesData();
152  }
153 
154  private function createPackagesData()
155  {
156  $this->packagesData = new PackagesData(
157  $this->composerInformation,
158  $this->timeZoneProvider,
159  $this->packagesAuth,
160  $this->filesystem,
161  $this->objectManagerProvider,
162  $this->typeMapper
163  );
164  }
165 
172  private function getComposerInformation($requiredPackages = [], $installedPackages = [], $repo = [])
173  {
174  $composerInformation = $this->createMock(ComposerInformation::class);
175  $composerInformation->expects($this->any())->method('getInstalledMagentoPackages')->willReturn(
176  $installedPackages ?:
177  [
178  'magento/package-1' => [
179  'name' => 'magento/package-1',
180  'type' => 'magento2-module',
181  'version'=> '1.0.0'
182  ],
183  'magento/package-2' => [
184  'name' => 'magento/package-2',
185  'type' => 'magento2-module',
186  'version'=> '1.0.1'
187  ],
188  'partner/package-3' => [
189  'name' => 'partner/package-3',
190  'type' => 'magento2-module',
191  'version'=> '3.0.0'
192  ],
193  ]
194  );
195 
196  $composerInformation->expects($this->any())->method('getRootRepositories')
197  ->willReturn($repo ?: ['repo1', 'repo2']);
198  $composerInformation->expects($this->any())->method('getPackagesTypes')
199  ->willReturn(['magento2-module']);
200  $rootPackage = $this->getMockBuilder(RootPackage::class)
201  ->setConstructorArgs(['magento/project', '2.1.0', '2'])
202  ->getMock();
203  $rootPackage->expects($this->any())
204  ->method('getRequires')
205  ->willReturn(
206  $requiredPackages ?:
207  [
208  'magento/package-1' => '1.0.0',
209  'magento/package-2' => '1.0.1',
210  'partner/package-3' => '3.0.0',
211  ]
212  );
213  $composerInformation->expects($this->any())
214  ->method('getRootPackage')
215  ->willReturn($rootPackage);
216 
217  return $composerInformation;
218  }
219 
220  public function testSyncPackagesData()
221  {
222  $latestData = $this->packagesData->syncPackagesData();
223  $this->assertArrayHasKey('lastSyncDate', $latestData);
224  $this->assertArrayHasKey('date', $latestData['lastSyncDate']);
225  $this->assertArrayHasKey('time', $latestData['lastSyncDate']);
226  $this->assertArrayHasKey('packages', $latestData);
227  $this->assertSame(3, count($latestData['packages']));
228  $this->assertSame(3, $latestData['countOfUpdate']);
229  $this->assertArrayHasKey('installPackages', $latestData);
230  $this->assertSame(1, count($latestData['installPackages']));
231  $this->assertSame(1, $latestData['countOfInstall']);
232  }
233 
239  {
240  $requiredPackages = [
241  'partner/package-4' => '4.0.4',
242  ];
243  $installedPackages = [
244  'partner/package-4' => [
245  'name' => 'partner/package-4',
246  'type' => 'magento2-module',
247  'version'=> '4.0.4'
248  ],
249  ];
250  $this->composerInformation = $this->getComposerInformation($requiredPackages, $installedPackages);
251  $this->createPackagesData();
252  $this->packagesData->getPackagesForUpdate();
253  }
254 
256  {
257  $this->composerInformation = $this->getComposerInformation([], [], ['https://repo1']);
258  $this->packagesAuth->expects($this->atLeastOnce())
259  ->method('getCredentialBaseUrl')
260  ->willReturn('repo1');
261  $this->createPackagesData();
262  $packages = $this->packagesData->getPackagesForUpdate();
263  $this->assertEquals(2, count($packages));
264  $this->assertArrayHasKey('magento/package-1', $packages);
265  $this->assertArrayHasKey('partner/package-3', $packages);
266  $firstPackage = array_values($packages)[0];
267  $this->assertArrayHasKey('latestVersion', $firstPackage);
268  $this->assertArrayHasKey('versions', $firstPackage);
269  }
270 
271  public function testGetPackagesForUpdate()
272  {
273  $packages = $this->packagesData->getPackagesForUpdate();
274  $this->assertEquals(3, count($packages));
275  $this->assertArrayHasKey('magento/package-1', $packages);
276  $this->assertArrayHasKey('magento/package-2', $packages);
277  $this->assertArrayHasKey('partner/package-3', $packages);
278  $firstPackage = array_values($packages)[0];
279  $this->assertArrayHasKey('latestVersion', $firstPackage);
280  $this->assertArrayHasKey('versions', $firstPackage);
281  }
282 
283  public function testGetInstalledPackages()
284  {
285  $installedPackages = $this->packagesData->getInstalledPackages();
286  $this->assertEquals(3, count($installedPackages));
287  $this->assertArrayHasKey('magento/package-1', $installedPackages);
288  $this->assertArrayHasKey('magento/package-2', $installedPackages);
289  $this->assertArrayHasKey('partner/package-3', $installedPackages);
290  }
291 
292  public function testGetMetaPackagesMap()
293  {
294  static::assertEquals(
295  ['magento/package-3' => 'magento/package-1'],
296  $this->packagesData->getMetaPackagesMap()
297  );
298  }
299 
300  public function testAddPackageExtraInfo()
301  {
302  static::assertEquals(
303  [
304  'package_title' => 'Package 3 title',
305  'package_type' => 'Extension',
306  'name' => 'magento/package-3',
307  'version' => '1.0.2',
308  'package_link' => ''
309  ],
310  $this->packagesData->addPackageExtraInfo(['name' => 'magento/package-3', 'version' => '1.0.2'])
311  );
312  }
313 }
$objectManager
Definition: bootstrap.php:17
$application
Definition: bootstrap.php:58