257 lines
8.9 KiB
PHP
Executable File
257 lines
8.9 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\Sales\Model\Order;
|
|
|
|
use Magento\Framework\Api\SearchCriteriaBuilder;
|
|
use Magento\Payment\Helper\Data;
|
|
use Magento\Sales\Api\Data\CommentInterface;
|
|
use Magento\Sales\Api\Data\OrderInterface;
|
|
use Magento\Sales\Api\Data\ShipmentInterface;
|
|
use Magento\Sales\Api\Data\ShipmentItemInterface;
|
|
use Magento\Sales\Api\Data\ShipmentTrackInterface;
|
|
use Magento\Sales\Api\OrderRepositoryInterface;
|
|
use Magento\Sales\Api\ShipmentRepositoryInterface;
|
|
use Magento\TestFramework\Helper\Bootstrap;
|
|
use Magento\TestFramework\ObjectManager;
|
|
|
|
/**
|
|
* @magentoAppIsolation enabled
|
|
* @magentoDataFixture Magento/Sales/_files/order.php
|
|
*/
|
|
class ShipmentTest extends \PHPUnit\Framework\TestCase
|
|
{
|
|
/**
|
|
* @var ObjectManager
|
|
*/
|
|
private $objectManager;
|
|
|
|
/**
|
|
* @var ShipmentRepositoryInterface
|
|
*/
|
|
private $shipmentRepository;
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
protected function setUp(): void
|
|
{
|
|
$this->objectManager = Bootstrap::getObjectManager();
|
|
$this->shipmentRepository = $this->objectManager->get(ShipmentRepositoryInterface::class);
|
|
}
|
|
|
|
/**
|
|
* Check the correctness and stability of set/get packages of shipment
|
|
*
|
|
* @magentoAppArea frontend
|
|
*/
|
|
public function testPackages()
|
|
{
|
|
$order = $this->getOrder('100000001');
|
|
|
|
$payment = $order->getPayment();
|
|
$paymentInfoBlock = $this->objectManager->get(Data::class)
|
|
->getInfoBlock($payment);
|
|
$payment->setBlockMock($paymentInfoBlock);
|
|
|
|
$items = [];
|
|
foreach ($order->getItems() as $item) {
|
|
$items[$item->getId()] = $item->getQtyOrdered();
|
|
}
|
|
/** @var \Magento\Sales\Model\Order\Shipment $shipment */
|
|
$shipment = $this->objectManager->get(ShipmentFactory::class)->create($order, $items);
|
|
|
|
$packages = [['1'], ['2']];
|
|
|
|
$shipment->setPackages($packages);
|
|
$saved = $this->shipmentRepository->save($shipment);
|
|
self::assertEquals($packages, $saved->getPackages());
|
|
}
|
|
|
|
/**
|
|
* Check that getTracksCollection() always return collection instance.
|
|
*/
|
|
public function testAddTrack()
|
|
{
|
|
$order = $this->getOrder('100000001');
|
|
|
|
/** @var ShipmentTrackInterface $track */
|
|
$track = $this->objectManager->create(ShipmentTrackInterface::class);
|
|
$track->setNumber('Test Number')
|
|
->setTitle('Test Title')
|
|
->setCarrierCode('Test CODE');
|
|
|
|
$items = [];
|
|
foreach ($order->getItems() as $item) {
|
|
$items[$item->getId()] = $item->getQtyOrdered();
|
|
}
|
|
/** @var \Magento\Sales\Model\Order\Shipment $shipment */
|
|
$shipment = $this->objectManager->get(ShipmentFactory::class)
|
|
->create($order, $items);
|
|
$shipment->addTrack($track);
|
|
$this->shipmentRepository->save($shipment);
|
|
$saved = $this->shipmentRepository->get((int)$shipment->getEntityId());
|
|
self::assertNotEmpty($saved->getTracks());
|
|
}
|
|
|
|
/**
|
|
* Checks adding comment to the shipment entity.
|
|
*/
|
|
public function testAddComment()
|
|
{
|
|
$message1 = 'Test Comment 1';
|
|
$message2 = 'Test Comment 2';
|
|
$order = $this->getOrder('100000001');
|
|
|
|
/** @var ShipmentInterface $shipment */
|
|
$shipment = $this->objectManager->create(ShipmentInterface::class);
|
|
$shipment->setOrder($order)
|
|
->addItem($this->objectManager->create(ShipmentItemInterface::class))
|
|
->addComment($message1)
|
|
->addComment($message2);
|
|
|
|
$saved = $this->shipmentRepository->save($shipment);
|
|
|
|
$comments = $saved->getComments();
|
|
$actual = array_map(
|
|
function (CommentInterface $comment) {
|
|
return $comment->getComment();
|
|
},
|
|
$comments
|
|
);
|
|
self::assertCount(2, $actual);
|
|
self::assertEquals([$message1, $message2], $actual);
|
|
}
|
|
|
|
/**
|
|
* Gets order entity by increment id.
|
|
*
|
|
* @param string $incrementId
|
|
* @return OrderInterface
|
|
*/
|
|
private function getOrder(string $incrementId): OrderInterface
|
|
{
|
|
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
|
|
$searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
|
|
$searchCriteria = $searchCriteriaBuilder->addFilter('increment_id', $incrementId)
|
|
->create();
|
|
|
|
/** @var OrderRepositoryInterface $repository */
|
|
$repository = $this->objectManager->get(OrderRepositoryInterface::class);
|
|
$items = $repository->getList($searchCriteria)
|
|
->getItems();
|
|
|
|
return array_pop($items);
|
|
}
|
|
|
|
/**
|
|
* Check that getTracksCollection() returns only order related tracks.
|
|
*
|
|
* @magentoDataFixture Magento/Sales/_files/two_orders_with_order_items.php
|
|
*/
|
|
public function testGetTracksCollection()
|
|
{
|
|
$order = $this->getOrder('100000001');
|
|
$items = [];
|
|
foreach ($order->getItems() as $item) {
|
|
$items[$item->getId()] = $item->getQtyOrdered();
|
|
}
|
|
/** @var \Magento\Sales\Model\Order\Shipment $shipment */
|
|
$shipment = $this->objectManager->get(ShipmentFactory::class)
|
|
->create($order, $items);
|
|
|
|
$tracks = $shipment->getTracksCollection();
|
|
self::assertEmpty($tracks->getItems());
|
|
|
|
/** @var ShipmentTrackInterface $track */
|
|
$track = $this->objectManager->create(ShipmentTrackInterface::class);
|
|
$track->setNumber('Test Number')
|
|
->setTitle('Test Title')
|
|
->setCarrierCode('Test CODE');
|
|
|
|
$shipment->addTrack($track);
|
|
$this->shipmentRepository->save($shipment);
|
|
$shipmentTracksCollection = $shipment->getTracksCollection();
|
|
|
|
$secondOrder = $this->getOrder('100000002');
|
|
$secondOrderItems = [];
|
|
foreach ($secondOrder->getItems() as $item) {
|
|
$secondOrderItems[$item->getId()] = $item->getQtyOrdered();
|
|
}
|
|
/** @var \Magento\Sales\Model\Order\Shipment $secondOrderShipment */
|
|
$secondOrderShipment = $this->objectManager->get(ShipmentFactory::class)
|
|
->create($secondOrder, $secondOrderItems);
|
|
|
|
/** @var ShipmentTrackInterface $secondShipmentTrack */
|
|
$secondShipmentTrack = $this->objectManager->create(ShipmentTrackInterface::class);
|
|
$secondShipmentTrack->setNumber('Test Number2')
|
|
->setTitle('Test Title2')
|
|
->setCarrierCode('Test CODE2');
|
|
|
|
$secondOrderShipment->addTrack($secondShipmentTrack);
|
|
$this->shipmentRepository->save($secondOrderShipment);
|
|
$secondShipmentTrackCollection = $secondOrderShipment->getTracksCollection();
|
|
|
|
self::assertEquals($shipmentTracksCollection->getColumnValues('id'), [$track->getEntityId()]);
|
|
self::assertEquals(
|
|
$secondShipmentTrackCollection->getColumnValues('id'),
|
|
[$secondShipmentTrack->getEntityId()]
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Check that getTracksCollection() returns only shipment related tracks.
|
|
*
|
|
* For the Block and Template responsible for sending email notification, when multiple items order
|
|
* has multiple shipments and every shipment has a separate tracking, shipment should contain
|
|
* only tracking info related to given shipment.
|
|
*
|
|
* @magentoDataFixture Magento/Sales/_files/order_with_two_order_items_with_simple_product.php
|
|
*/
|
|
public function testBlock()
|
|
{
|
|
$order = $this->getOrder('100000001');
|
|
|
|
$shipments = [];
|
|
foreach ($order->getItems() as $item) {
|
|
$items[$item->getId()] = $item->getQtyOrdered();
|
|
/** @var ShipmentTrackInterface $track */
|
|
$track = $this->objectManager->create(ShipmentTrackInterface::class);
|
|
$track->setNumber('Test Number')
|
|
->setTitle('Test Title')
|
|
->setCarrierCode('Test CODE');
|
|
/** @var \Magento\Sales\Model\Order\Shipment $shipment */
|
|
$shipment = $this->objectManager->get(ShipmentFactory::class)
|
|
->create($order, $items);
|
|
$shipment->addTrack($track);
|
|
$this->shipmentRepository->save($shipment);
|
|
$shipments[] = $shipment;
|
|
}
|
|
|
|
// we extract only the latest shipment
|
|
$shipment = array_pop($shipments);
|
|
|
|
$block = $this->objectManager->create(
|
|
\Magento\Sales\Block\Order\Email\Shipment\Items::class,
|
|
[
|
|
'data' => [
|
|
'order' => $order,
|
|
'shipment' => $shipment,
|
|
]
|
|
]
|
|
);
|
|
|
|
$tracks = $block->getShipment()->getTracksCollection()->getItems();
|
|
$this->assertEquals(1, count($tracks),
|
|
'There should be only one Tracking item in collection');
|
|
|
|
$track = array_pop($tracks);
|
|
$this->assertEquals($shipment->getId(), $track->getParentId(),
|
|
'Check that the Tracking belongs to the Shipment');
|
|
}
|
|
}
|