Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
CopierTest.php
Go to the documentation of this file.
1 <?php
7 
9 use \Magento\Catalog\Model\Product\Copier;
10 
14 class CopierTest extends \PHPUnit\Framework\TestCase
15 {
20 
24  protected $_model;
25 
30 
35 
39  protected $productMock;
40 
44  protected $metadata;
45 
46  protected function setUp()
47  {
48  $this->copyConstructorMock = $this->createMock(\Magento\Catalog\Model\Product\CopyConstructorInterface::class);
49  $this->productFactoryMock = $this->createPartialMock(
50  \Magento\Catalog\Model\ProductFactory::class,
51  ['create']
52  );
53  $this->optionRepositoryMock = $this->createMock(
54  \Magento\Catalog\Model\Product\Option\Repository::class
55  );
57  $this->productMock = $this->createMock(\Magento\Catalog\Model\Product::class);
58  $this->productMock->expects($this->any())->method('getEntityId')->willReturn(1);
59 
60  $this->metadata = $this->getMockBuilder(\Magento\Framework\EntityManager\EntityMetadata::class)
61  ->disableOriginalConstructor()
62  ->getMock();
63  $metadataPool = $this->getMockBuilder(\Magento\Framework\EntityManager\MetadataPool::class)
64  ->disableOriginalConstructor()
65  ->getMock();
66  $metadataPool->expects($this->any())->method('getMetadata')->willReturn($this->metadata);
67  $this->_model = new Copier(
68  $this->copyConstructorMock,
69  $this->productFactoryMock
70  );
71 
72  $this->setProperties($this->_model, [
73  'optionRepository' => $this->optionRepositoryMock,
74  'metadataPool' => $metadataPool,
75  ]);
76  }
77 
78  public function testCopy()
79  {
80  $stockItem = $this->getMockBuilder(\Magento\CatalogInventory\Api\Data\StockItemInterface::class)
81  ->getMock();
82  $extensionAttributes = $this->getMockBuilder(\Magento\Catalog\Api\Data\ProductExtension::class)
83  ->setMethods(['getStockItem', 'setData'])
84  ->getMock();
86  ->expects($this->once())
87  ->method('getStockItem')
88  ->willReturn($stockItem);
90  ->expects($this->once())
91  ->method('setData')
92  ->with('stock_item', null);
93 
94  $productData = [
95  'product data' => ['product data'],
97  ];
98  $this->productMock->expects($this->atLeastOnce())->method('getWebsiteIds');
99  $this->productMock->expects($this->atLeastOnce())->method('getCategoryIds');
100  $this->productMock->expects($this->any())->method('getData')->willReturnMap([
101  ['', null, $productData],
102  ['linkField', null, '1'],
103  ]);
104 
105  $resourceMock = $this->createMock(\Magento\Catalog\Model\ResourceModel\Product::class);
106  $this->productMock->expects($this->once())->method('getResource')->will($this->returnValue($resourceMock));
107 
108  $duplicateMock = $this->createPartialMock(
109  \Magento\Catalog\Model\Product::class,
110  [
111  '__wakeup',
112  'setData',
113  'setOptions',
114  'getData',
115  'setIsDuplicate',
116  'setOriginalLinkId',
117  'setStatus',
118  'setCreatedAt',
119  'setUpdatedAt',
120  'setId',
121  'setStoreId',
122  'getEntityId',
123  'save',
124  'setUrlKey',
125  'getUrlKey',
126  ]
127  );
128  $this->productFactoryMock->expects($this->once())->method('create')->will($this->returnValue($duplicateMock));
129 
130  $duplicateMock->expects($this->once())->method('setOptions')->with([]);
131  $duplicateMock->expects($this->once())->method('setIsDuplicate')->with(true);
132  $duplicateMock->expects($this->once())->method('setOriginalLinkId')->with(1);
133  $duplicateMock->expects(
134  $this->once()
135  )->method(
136  'setStatus'
137  )->with(
138  \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED
139  );
140  $duplicateMock->expects($this->once())->method('setCreatedAt')->with(null);
141  $duplicateMock->expects($this->once())->method('setUpdatedAt')->with(null);
142  $duplicateMock->expects($this->once())->method('setId')->with(null);
143  $duplicateMock->expects(
144  $this->once()
145  )->method(
146  'setStoreId'
147  )->with(
149  );
150  $duplicateMock->expects($this->once())->method('setData')->with($productData);
151  $this->copyConstructorMock->expects($this->once())->method('build')->with($this->productMock, $duplicateMock);
152  $duplicateMock->expects($this->once())->method('getUrlKey')->willReturn('urk-key-1');
153  $duplicateMock->expects($this->once())->method('setUrlKey')->with('urk-key-2');
154  $duplicateMock->expects($this->once())->method('save');
155 
156  $this->metadata->expects($this->any())->method('getLinkField')->willReturn('linkField');
157 
158  $duplicateMock->expects($this->any())->method('getData')->willReturnMap([
159  ['linkField', null, '2'],
160  ]); $this->optionRepositoryMock->expects($this->once())
161  ->method('duplicate')
162  ->with($this->productMock, $duplicateMock);
163  $resourceMock->expects($this->once())->method('duplicate')->with(1, 2);
164 
165  $this->assertEquals($duplicateMock, $this->_model->copy($this->productMock));
166  }
167 
172  private function setProperties($object, $properties = [])
173  {
174  $reflectionClass = new \ReflectionClass(get_class($object));
175  foreach ($properties as $key => $value) {
176  if ($reflectionClass->hasProperty($key)) {
177  $reflectionProperty = $reflectionClass->getProperty($key);
178  $reflectionProperty->setAccessible(true);
179  $reflectionProperty->setValue($object, $value);
180  }
181  }
182  }
183 }
$value
Definition: gender.phtml:16
$reflectionClass
Definition: categories.php:25
$productData
$properties
Definition: categories.php:26