Do not fail if no WC_Product in order item

It is possible for an order item to not have product, such as if created by a plugin.
This commit is contained in:
Alex P 2022-06-13 18:21:40 +03:00
parent 77230fefa8
commit 4f91e78591
2 changed files with 13 additions and 18 deletions

View file

@ -124,11 +124,6 @@ class ItemFactory {
* @return Item * @return Item
*/ */
private function from_wc_order_line_item( \WC_Order_Item_Product $item, \WC_Order $order ): Item { private function from_wc_order_line_item( \WC_Order_Item_Product $item, \WC_Order $order ): Item {
/**
* The WooCommerce product.
*
* @var WC_Product $product
*/
$product = $item->get_product(); $product = $item->get_product();
$currency = $order->get_currency(); $currency = $order->get_currency();
$quantity = (int) $item->get_quantity(); $quantity = (int) $item->get_quantity();
@ -139,13 +134,13 @@ class ItemFactory {
$tax = new Money( $tax, $currency ); $tax = new Money( $tax, $currency );
return new Item( return new Item(
mb_substr( $product->get_name(), 0, 127 ), mb_substr( $item->get_name(), 0, 127 ),
new Money( $price_without_tax_rounded, $currency ), new Money( $price_without_tax_rounded, $currency ),
$quantity, $quantity,
substr( wp_strip_all_tags( $product->get_description() ), 0, 127 ) ?: '', substr( wp_strip_all_tags( $product instanceof WC_Product ? $product->get_description() : '' ), 0, 127 ) ?: '',
$tax, $tax,
$product->get_sku(), $product instanceof WC_Product ? $product->get_sku() : '',
( $product->is_virtual() ) ? Item::DIGITAL_GOODS : Item::PHYSICAL_GOODS ( $product instanceof WC_Product && $product->is_virtual() ) ? Item::DIGITAL_GOODS : Item::PHYSICAL_GOODS
); );
} }

View file

@ -130,9 +130,6 @@ class ItemFactoryTest extends TestCase
$testee = new ItemFactory($this->currency); $testee = new ItemFactory($this->currency);
$product = Mockery::mock(\WC_Product::class); $product = Mockery::mock(\WC_Product::class);
$product
->expects('get_name')
->andReturn('name');
$product $product
->expects('get_description') ->expects('get_description')
->andReturn('description'); ->andReturn('description');
@ -150,6 +147,9 @@ class ItemFactoryTest extends TestCase
$item $item
->expects('get_product') ->expects('get_product')
->andReturn($product); ->andReturn($product);
$item
->expects('get_name')
->andReturn('name');
$item $item
->expects('get_quantity') ->expects('get_quantity')
->andReturn(1); ->andReturn(1);
@ -193,9 +193,6 @@ class ItemFactoryTest extends TestCase
$testee = new ItemFactory($this->currency); $testee = new ItemFactory($this->currency);
$product = Mockery::mock(\WC_Product::class); $product = Mockery::mock(\WC_Product::class);
$product
->expects('get_name')
->andReturn('name');
$product $product
->expects('get_description') ->expects('get_description')
->andReturn('description'); ->andReturn('description');
@ -213,6 +210,9 @@ class ItemFactoryTest extends TestCase
$item $item
->expects('get_product') ->expects('get_product')
->andReturn($product); ->andReturn($product);
$item
->expects('get_name')
->andReturn('name');
$item $item
->expects('get_quantity') ->expects('get_quantity')
->andReturn(1); ->andReturn(1);
@ -251,9 +251,6 @@ class ItemFactoryTest extends TestCase
$testee = new ItemFactory($this->currency); $testee = new ItemFactory($this->currency);
$product = Mockery::mock(\WC_Product::class); $product = Mockery::mock(\WC_Product::class);
$product
->expects('get_name')
->andReturn($name);
$product $product
->expects('get_description') ->expects('get_description')
->andReturn($description); ->andReturn($description);
@ -271,6 +268,9 @@ class ItemFactoryTest extends TestCase
$item $item
->expects('get_product') ->expects('get_product')
->andReturn($product); ->andReturn($product);
$item
->expects('get_name')
->andReturn($name);
$item $item
->expects('get_quantity') ->expects('get_quantity')
->andReturn(1); ->andReturn(1);