Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
InventoryTransferTest.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
16 use PHPUnit\Framework\TestCase;
17 
18 class InventoryTransferTest extends TestCase
19 {
23  private $bulkInventoryTransfer;
24 
28  private $searchCriteriaBuilder;
29 
33  private $sourceItemRepository;
34 
38  private $defaultSourceProvider;
39 
40  public function setUp()
41  {
42  parent::setUp();
43  $this->bulkInventoryTransfer = Bootstrap::getObjectManager()->get(BulkInventoryTransferInterface::class);
44  $this->searchCriteriaBuilder = Bootstrap::getObjectManager()->get(SearchCriteriaBuilder::class);
45  $this->sourceItemRepository = Bootstrap::getObjectManager()->get(SourceItemRepositoryInterface::class);
46  $this->defaultSourceProvider = Bootstrap::getObjectManager()->get(DefaultSourceProviderInterface::class);
47  }
48 
53  private function getSourceItemCodesBySku(string $sku): array
54  {
55  $searchCriteria = $this->searchCriteriaBuilder
56  ->addFilter(SourceItemInterface::SKU, $sku)
57  ->create();
58  $sourceItems = $this->sourceItemRepository->getList($searchCriteria)->getItems();
59 
60  $res = [];
61  foreach ($sourceItems as $sourceItem) {
62  $res[] = $sourceItem->getSourceCode();
63  }
64 
65  return $res;
66  }
67 
73  private function getSourceItem(string $sku, string $sourceCode): ?SourceItemInterface
74  {
75  $searchCriteria = $this->searchCriteriaBuilder
76  ->addFilter(SourceItemInterface::SKU, $sku)
78  ->create();
79  $sourceItems = $this->sourceItemRepository->getList($searchCriteria)->getItems();
80 
81  if (empty($sourceItems)) {
82  return null;
83  }
84 
85  return current($sourceItems);
86  }
87 
95  {
96  $skus = ['SKU-1'];
97 
99  $this->bulkInventoryTransfer->execute($skus, 'eu-1', 'eu-2', true);
100 
101  $sourceItemCodes = $this->getSourceItemCodesBySku('SKU-1');
102  self::assertNotContains(
103  'eu-1',
104  $sourceItemCodes,
105  'Products are not unassigned from origin source'
106  );
107 
108  self::assertEquals(
109  8.5,
110  $this->getSourceItem('SKU-1', 'eu-2')->getQuantity(),
111  'Items were not correctly moved to destination source'
112  );
113  }
114 
122  {
123  $skus = ['SKU-1'];
124 
125  $previousSourceStatus = $this->getSourceItem('SKU-1', 'eu-3')->getStatus();
126 
128  $this->bulkInventoryTransfer->execute($skus, 'eu-3', 'eu-1', true);
129 
130  $sourceItemCodes = $this->getSourceItemCodesBySku('SKU-1');
131  self::assertContains(
132  'eu-1',
133  $sourceItemCodes,
134  'Items with out of stock quantity are not transferred to destination'
135  );
136 
137  self::assertEquals(
138  15.5,
139  $this->getSourceItem('SKU-1', 'eu-1')->getQuantity(),
140  'Items with out of stock quantity were not correctly moved to destination source'
141  );
142  self::assertEquals(
143  $previousSourceStatus,
144  $this->getSourceItem('SKU-1', 'eu-1')->getStatus(),
145  'Stock status was not copied to existing source when origin was out of stock'
146  );
147  }
148 
156  {
157  $skus = ['SKU-1'];
158 
159  $previousSourceStatus = $this->getSourceItem('SKU-1', 'eu-1')->getStatus();
160 
162  $this->bulkInventoryTransfer->execute($skus, 'eu-1', 'us-1', false);
163 
164  $sourceItemCodes = $this->getSourceItemCodesBySku('SKU-1');
165  self::assertContains(
166  'us-1',
167  $sourceItemCodes,
168  'Products are not assigned to a new source if transferred'
169  );
170 
171  self::assertEquals(
172  0,
173  $this->getSourceItem('SKU-1', 'eu-1')->getQuantity(),
174  'Items were not removed from source during inventory transfer'
175  );
176 
177  self::assertEquals(
178  5.5,
179  $this->getSourceItem('SKU-1', 'us-1')->getQuantity(),
180  'Items were not correctly moved to destination source'
181  );
182  self::assertEquals(
183  $previousSourceStatus,
184  $this->getSourceItem('SKU-1', 'us-1')->getStatus(),
185  'Destination stock status should have the same configuration as the origin'
186  );
187  }
188 
196  {
197  $skus = ['SKU-1'];
198 
199  $previousDestinationStatus = $this->getSourceItem('SKU-1', 'eu-1')->getStatus();
200 
202  $this->bulkInventoryTransfer->execute($skus, 'us-1', 'eu-1', false);
203 
204  $sourceItemCodes = $this->getSourceItemCodesBySku('SKU-1');
205  self::assertNotContains(
206  'us-1',
207  $sourceItemCodes,
208  'Products are assigned to origin source even if they were not'
209  );
210 
211  self::assertEquals(
212  5.5,
213  $this->getSourceItem('SKU-1', 'eu-1')->getQuantity(),
214  'Destination source is changed even if origin source was not assigned'
215  );
216  self::assertEquals(
217  $previousDestinationStatus,
218  $this->getSourceItem('SKU-1', 'eu-1')->getStatus(),
219  'Stock status on destination was changed even if the source was not assigned'
220  );
221  }
222 
230  {
231  $skus = ['SKU-1'];
232 
233  $previousSourceStatus = $this->getSourceItem('SKU-1', 'eu-1')->getStatus();
234 
236  $this->bulkInventoryTransfer->execute($skus, 'eu-1', 'eu-2', false);
237 
238  $sourceItemCodes = $this->getSourceItemCodesBySku('SKU-1');
239  self::assertContains(
240  'eu-2',
241  $sourceItemCodes,
242  'Products are not assigned to destination source'
243  );
244 
245  self::assertEquals(
246  0,
247  $this->getSourceItem('SKU-1', 'eu-1')->getQuantity(),
248  'Items were not removed from source during inventory transfer'
249  );
250  self::assertEquals(
252  $this->getSourceItem('SKU-1', 'eu-1')->getStatus(),
253  'Origin source was not set to out of stock'
254  );
255 
256  self::assertNotEquals(
257  5.5,
258  $this->getSourceItem('SKU-1', 'eu-2')->getQuantity(),
259  'Item quantity on destination source is not incremented by origin source'
260  );
261  self::assertEquals(
262  8.5,
263  $this->getSourceItem('SKU-1', 'eu-2')->getQuantity(),
264  'Items were not correctly moved to destination source'
265  );
266  self::assertEquals(
267  $previousSourceStatus,
268  $this->getSourceItem('SKU-1', 'eu-2')->getStatus(),
269  'Stock status on destination should be the same as the origin'
270  );
271  }
272 }
foreach($websiteCodes as $websiteCode) $skus
$searchCriteria
$sourceItems
$sourceCode
Definition: inventory.phtml:11