AbstractSampleDataCommandTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\SampleData\Test\Unit\Console\Command;
  7. use Composer\Console\Application;
  8. use Composer\Console\ApplicationFactory;
  9. use Magento\Framework\App\Filesystem\DirectoryList;
  10. use Magento\Framework\Filesystem;
  11. use Magento\Framework\Filesystem\Directory\ReadInterface;
  12. use Magento\Framework\Filesystem\Directory\WriteInterface;
  13. use Magento\SampleData\Model\Dependency;
  14. use PHPUnit\Framework\TestCase;
  15. use Symfony\Component\Console\Input\ArrayInput;
  16. use Symfony\Component\Console\Input\ArrayInputFactory;
  17. /**
  18. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  19. */
  20. abstract class AbstractSampleDataCommandTest extends TestCase
  21. {
  22. /**
  23. * @var ReadInterface|\PHPUnit_Framework_MockObject_MockObject
  24. */
  25. protected $directoryReadMock;
  26. /**
  27. * @var WriteInterface|\PHPUnit_Framework_MockObject_MockObject
  28. */
  29. protected $directoryWriteMock;
  30. /**
  31. * @var Filesystem|\PHPUnit_Framework_MockObject_MockObject
  32. */
  33. protected $filesystemMock;
  34. /**
  35. * @var Dependency|\PHPUnit_Framework_MockObject_MockObject
  36. */
  37. protected $sampleDataDependencyMock;
  38. /**
  39. * @var ArrayInputFactory|\PHPUnit_Framework_MockObject_MockObject
  40. */
  41. protected $arrayInputFactoryMock;
  42. /**
  43. * @var Application|\PHPUnit_Framework_MockObject_MockObject
  44. */
  45. protected $applicationMock;
  46. /**
  47. * @var ApplicationFactory|\PHPUnit_Framework_MockObject_MockObject
  48. */
  49. protected $applicationFactoryMock;
  50. /**
  51. * @return void
  52. */
  53. protected function setUp()
  54. {
  55. $this->directoryReadMock = $this->createMock(ReadInterface::class);
  56. $this->directoryWriteMock = $this->createMock(WriteInterface::class);
  57. $this->filesystemMock = $this->createMock(Filesystem::class);
  58. $this->sampleDataDependencyMock = $this->createMock(Dependency::class);
  59. $this->arrayInputFactoryMock = $this->createMock(ArrayInputFactory::class);
  60. $this->applicationMock = $this->createMock(Application::class);
  61. $this->applicationFactoryMock = $this->createPartialMock(ApplicationFactory::class, ['create']);
  62. }
  63. /**
  64. * @param array $sampleDataPackages Array in form [package_name => version_constraint]
  65. * @param string $pathToComposerJson Fake path to composer.json
  66. * @param int $appRunResult Composer exit code
  67. * @param array $additionalComposerArgs Additional arguments that composer expects
  68. */
  69. protected function setupMocks(
  70. $sampleDataPackages,
  71. $pathToComposerJson,
  72. $appRunResult,
  73. $additionalComposerArgs = []
  74. ) {
  75. $this->directoryReadMock->expects($this->any())->method('getAbsolutePath')->willReturn($pathToComposerJson);
  76. $this->directoryReadMock->expects($this->any())->method('readFile')->with('composer.json')->willReturn(
  77. '{"version": "0.0.1"}'
  78. );
  79. $this->filesystemMock->expects($this->any())->method('getDirectoryRead')->with(DirectoryList::ROOT)->willReturn(
  80. $this->directoryReadMock
  81. );
  82. $this->sampleDataDependencyMock->expects($this->any())->method('getSampleDataPackages')->willReturn(
  83. $sampleDataPackages
  84. );
  85. $this->arrayInputFactoryMock->expects($this->never())->method('create');
  86. $this->applicationMock->expects($this->any())
  87. ->method('run')
  88. ->with(
  89. new ArrayInput(
  90. array_merge(
  91. $this->expectedComposerArguments(
  92. $sampleDataPackages,
  93. $pathToComposerJson
  94. ),
  95. $additionalComposerArgs
  96. )
  97. ),
  98. $this->anything()
  99. )
  100. ->willReturn($appRunResult);
  101. if (($appRunResult !== 0) && !empty($sampleDataPackages)) {
  102. $this->applicationMock->expects($this->once())->method('resetComposer')->willReturnSelf();
  103. }
  104. $this->applicationFactoryMock->expects($this->any())
  105. ->method('create')
  106. ->willReturn($this->applicationMock);
  107. }
  108. /**
  109. * Expected arguments for composer based on sample data packages and composer.json path
  110. *
  111. * @param array $sampleDataPackages
  112. * @param string $pathToComposerJson
  113. * @return array
  114. */
  115. abstract protected function expectedComposerArguments(
  116. array $sampleDataPackages,
  117. string $pathToComposerJson
  118. ) : array;
  119. }