You are here

public function ShipmentTest::testShipment in Commerce Shipping 8.2

@covers ::getOrder @covers ::getOrderId @covers ::getPackageType @covers ::setPackageType @covers ::getShippingMethod @covers ::getShippingMethodId @covers ::setShippingMethod @covers ::getShippingService @covers ::setShippingService @covers ::getShippingProfile @covers ::setShippingProfile @covers ::getTitle @covers ::setTitle @covers ::getItems @covers ::setItems @covers ::hasItems @covers ::addItem @covers ::removeItem @covers ::getTotalQuantity @covers ::getTotalDeclaredValue @covers ::getWeight @covers ::setWeight @covers ::getOriginalAmount @covers ::setOriginalAmount @covers ::getAmount @covers ::setAmount @covers ::getAdjustments @covers ::setAdjustments @covers ::addAdjustment @covers ::removeAdjustment @covers ::getAdjustedAmount @covers ::getTrackingCode @covers ::setTrackingCode @covers ::getState @covers ::getData @covers ::setData @covers ::getCreatedTime @covers ::setCreatedTime @covers ::getShippedTime @covers ::setShippedTime @covers ::recalculateWeight

File

tests/src/Kernel/Entity/ShipmentTest.php, line 71

Class

ShipmentTest
Tests the Shipment entity.

Namespace

Drupal\Tests\commerce_shipping\Kernel\Entity

Code

public function testShipment() {
  $user = $this
    ->createUser([
    'mail' => $this
      ->randomString() . '@example.com',
  ]);

  /** @var \Drupal\commerce_order\Entity\OrderInterface $order */
  $order = Order::create([
    'type' => 'default',
    'state' => 'completed',
    'mail' => $user
      ->getEmail(),
    'uid' => $user
      ->id(),
    'store_id' => $this->store
      ->id(),
  ]);
  $order
    ->save();
  $order = $this
    ->reloadEntity($order);

  /** @var \Drupal\commerce_shipping\Entity\ShippingMethodInterface $shipping_method */
  $shipping_method = ShippingMethod::create([
    'name' => $this
      ->randomString(),
    'status' => 1,
  ]);
  $shipping_method
    ->save();
  $shipping_method = $this
    ->reloadEntity($shipping_method);

  /** @var \Drupal\profile\Entity\ProfileInterface $profile */
  $profile = Profile::create([
    'type' => 'customer',
  ]);
  $profile
    ->save();
  $profile = $this
    ->reloadEntity($profile);
  $shipment = Shipment::create([
    'type' => 'default',
    'state' => 'ready',
    'order_id' => $order
      ->id(),
    'title' => 'Shipment',
    'amount' => new Price('12.00', 'USD'),
  ]);
  $this
    ->assertEquals($order, $shipment
    ->getOrder());
  $this
    ->assertEquals($order
    ->id(), $shipment
    ->getOrderId());
  $package_type_manager = $this->container
    ->get('plugin.manager.commerce_package_type');
  $package_type = $package_type_manager
    ->createInstance('custom_box');
  $shipment
    ->setPackageType($package_type);
  $this
    ->assertEquals($package_type, $shipment
    ->getPackageType());
  $shipment
    ->setShippingMethod($shipping_method);
  $this
    ->assertEquals($shipping_method, $shipment
    ->getShippingMethod());
  $this
    ->assertEquals($shipping_method
    ->id(), $shipment
    ->getShippingMethodId());
  $shipping_service = $this
    ->randomString();
  $shipment
    ->setShippingService($shipping_service);
  $this
    ->assertEquals($shipping_service, $shipment
    ->getShippingService());
  $shipment
    ->setShippingProfile($profile);
  $this
    ->assertEquals($profile, $shipment
    ->getShippingProfile());
  $shipment
    ->setTitle('Shipment #1');
  $this
    ->assertEquals('Shipment #1', $shipment
    ->getTitle());
  $items = [];
  $items[] = new ShipmentItem([
    'order_item_id' => 10,
    'title' => 'T-shirt (red, large)',
    'quantity' => 2,
    'weight' => new Weight('40', 'kg'),
    'declared_value' => new Price('30', 'USD'),
  ]);
  $items[] = new ShipmentItem([
    'order_item_id' => 10,
    'title' => 'T-shirt (blue, large)',
    'quantity' => 2,
    'weight' => new Weight('30', 'kg'),
    'declared_value' => new Price('30', 'USD'),
  ]);
  $shipment
    ->addItem($items[0]);
  $shipment
    ->addItem($items[1]);
  $this
    ->assertTrue($shipment
    ->hasItems());
  $this
    ->assertEquals($items, $shipment
    ->getItems());
  $shipment
    ->removeItem($items[0]);
  $this
    ->assertEquals([
    $items[1],
  ], $shipment
    ->getItems());
  $shipment
    ->setItems($items);
  $this
    ->assertEquals($items, $shipment
    ->getItems());
  $this
    ->assertEquals('4.00', $shipment
    ->getTotalQuantity());
  $this
    ->assertEquals(new Price('60', 'USD'), $shipment
    ->getTotalDeclaredValue());
  $calculated_weight = new Weight('70', 'kg');
  $this
    ->assertEquals($calculated_weight, $shipment
    ->getWeight()
    ->convert('kg'));
  $new_weight = new Weight('4', 'kg');
  $shipment
    ->setWeight($new_weight);
  $this
    ->assertEquals($new_weight, $shipment
    ->getWeight());
  $original_amount = new Price('15.00', 'USD');
  $shipment
    ->setOriginalAmount($original_amount);
  $this
    ->assertEquals($original_amount, $shipment
    ->getOriginalAmount());
  $amount = new Price('10.00', 'USD');
  $shipment
    ->setAmount($amount);
  $this
    ->assertEquals($amount, $shipment
    ->getAmount());
  $adjustments = [];
  $adjustments[] = new Adjustment([
    'type' => 'custom',
    'label' => '10% off',
    'amount' => new Price('-1.00', 'USD'),
    'locked' => FALSE,
  ]);
  $adjustments[] = new Adjustment([
    'type' => 'fee',
    'label' => 'Random fee',
    'amount' => new Price('2.00', 'USD'),
  ]);
  $shipment
    ->addAdjustment($adjustments[0]);
  $shipment
    ->addAdjustment($adjustments[1]);
  $this
    ->assertEquals($adjustments, $shipment
    ->getAdjustments());
  $shipment
    ->removeAdjustment($adjustments[0]);
  $this
    ->assertEquals([
    $adjustments[1],
  ], $shipment
    ->getAdjustments());
  $shipment
    ->setAdjustments($adjustments);
  $this
    ->assertEquals($adjustments, $shipment
    ->getAdjustments());
  $this
    ->assertEquals(new Price('11.00', 'USD'), $shipment
    ->getAdjustedAmount());
  $this
    ->assertEquals(new Price('9.00', 'USD'), $shipment
    ->getAdjustedAmount([
    'custom',
  ]));
  $this
    ->assertEquals(new Price('12.00', 'USD'), $shipment
    ->getAdjustedAmount([
    'fee',
  ]));
  $tracking_code = $this
    ->randomString();
  $shipment
    ->setTrackingCode($tracking_code);
  $this
    ->assertEquals($tracking_code, $shipment
    ->getTrackingCode());
  $this
    ->assertEquals('ready', $shipment
    ->getState()->value);
  $this
    ->assertEquals('default', $shipment
    ->getData('test', 'default'));
  $shipment
    ->setData('test', 'value');
  $this
    ->assertEquals('value', $shipment
    ->getData('test', 'default'));
  $shipment
    ->setCreatedTime(635879700);
  $this
    ->assertEquals(635879700, $shipment
    ->getCreatedTime());
  $shipment
    ->setShippedTime(635879800);
  $this
    ->assertEquals(635879800, $shipment
    ->getShippedTime());
  $shipment
    ->save();
  $order
    ->set('shipments', [
    $shipment,
  ]);
  $order
    ->addAdjustment(new Adjustment([
    'type' => 'shipping',
    'label' => t('Shipping'),
    'amount' => $shipment
      ->getAmount(),
    'source_id' => $shipment
      ->id(),
  ]));

  // Transfer the shipment adjustments to the order, to ensure they're
  // cleared on destruct() after deleting the shipment.
  foreach ($shipment
    ->getAdjustments() as $adjustment) {
    $order
      ->addAdjustment($adjustment);
  }

  // Add a random adjustment that isn't related to a shipment, to ensure it's
  // kept after the shipments are cleared.
  $order
    ->addAdjustment(new Adjustment([
    'type' => 'custom',
    'label' => t('Custom'),
    'amount' => new Price('12', 'USD'),
    'locked' => FALSE,
  ]));
  $order
    ->save();
  $order = $this
    ->reloadEntity($order);
  $this
    ->assertCount(4, $order
    ->getAdjustments());
  $this
    ->assertCount(1, $order
    ->get('shipments')
    ->referencedEntities());
  $shipment
    ->delete();

  // The order shipments are cleared on destruct by the shipment subscriber.
  $this->container
    ->get('commerce_shipping.shipment_subscriber')
    ->destruct();
  $order = $this
    ->reloadEntity($order);
  $adjustments = $order
    ->getAdjustments();
  $this
    ->assertCount(1, $adjustments);
  $this
    ->assertEquals(new Adjustment([
    'type' => 'custom',
    'label' => t('Custom'),
    'amount' => new Price('12', 'USD'),
    'locked' => FALSE,
  ]), reset($adjustments));
  $this
    ->assertCount(0, $order
    ->get('shipments')
    ->referencedEntities());
}