mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-09-05 08:59:14 +08:00
Merge remote-tracking branch 'origin/trunk' into PCP-581-capture-virtual-only-orders-problem-for-subscriptions
# Conflicts: # modules/ppcp-subscription/src/RenewalHandler.php
This commit is contained in:
commit
642398d682
43 changed files with 614 additions and 357 deletions
|
@ -952,7 +952,7 @@ class OrderEndpointTest extends TestCase
|
|||
->expects('email_address')
|
||||
->andReturn('');
|
||||
|
||||
$result = $testee->create([$purchaseUnit], $payer);
|
||||
$result = $testee->create([$purchaseUnit], ApplicationContext::SHIPPING_PREFERENCE_NO_SHIPPING, $payer);
|
||||
$this->assertEquals($expectedOrder, $result);
|
||||
}
|
||||
|
||||
|
@ -1049,7 +1049,7 @@ class OrderEndpointTest extends TestCase
|
|||
$payerName = Mockery::mock(PayerName::class);
|
||||
$payer->expects('name')->andReturn($payerName);
|
||||
$payer->expects('to_array')->andReturn(['payer']);
|
||||
$result = $testee->create([$purchaseUnit], $payer);
|
||||
$result = $testee->create([$purchaseUnit], ApplicationContext::SHIPPING_PREFERENCE_GET_FROM_FILE, $payer);
|
||||
$this->assertEquals($expectedOrder, $result);
|
||||
}
|
||||
|
||||
|
@ -1141,7 +1141,7 @@ class OrderEndpointTest extends TestCase
|
|||
$payerName = Mockery::mock(PayerName::class);
|
||||
$payer->expects('name')->andReturn($payerName);
|
||||
$payer->expects('to_array')->andReturn(['payer']);
|
||||
$testee->create([$purchaseUnit], $payer);
|
||||
$testee->create([$purchaseUnit], ApplicationContext::SHIPPING_PREFERENCE_NO_SHIPPING, $payer);
|
||||
}
|
||||
|
||||
public function testCreateForPurchaseUnitsIsNot201()
|
||||
|
@ -1232,6 +1232,6 @@ class OrderEndpointTest extends TestCase
|
|||
$payerName = Mockery::mock(PayerName::class);
|
||||
$payer->expects('name')->andReturn($payerName);
|
||||
$payer->expects('to_array')->andReturn(['payer']);
|
||||
$testee->create([$purchaseUnit], $payer);
|
||||
$testee->create([$purchaseUnit], ApplicationContext::SHIPPING_PREFERENCE_GET_FROM_FILE, $payer);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,9 +22,7 @@ class AmountTest extends TestCase
|
|||
|
||||
public function testBreakdownIsNull()
|
||||
{
|
||||
$money = Mockery::mock(Money::class);
|
||||
$money->shouldReceive('currency_code')->andReturn('currencyCode');
|
||||
$money->shouldReceive('value')->andReturn(1.10);
|
||||
$money = new Money(1.10, 'currencyCode');
|
||||
$testee = new Amount($money);
|
||||
|
||||
$this->assertNull($testee->breakdown());
|
||||
|
@ -38,9 +36,7 @@ class AmountTest extends TestCase
|
|||
|
||||
public function testBreakdown()
|
||||
{
|
||||
$money = Mockery::mock(Money::class);
|
||||
$money->shouldReceive('currency_code')->andReturn('currencyCode');
|
||||
$money->shouldReceive('value')->andReturn(1.10);
|
||||
$money = new Money(1.10, 'currencyCode');
|
||||
$breakdown = Mockery::mock(AmountBreakdown::class);
|
||||
$breakdown->shouldReceive('to_array')->andReturn([1]);
|
||||
$testee = new Amount($money, $breakdown);
|
||||
|
|
|
@ -412,10 +412,8 @@ class PurchaseUnitTest extends TestCase
|
|||
foreach ($data as $testKey => $test) {
|
||||
$items = [];
|
||||
foreach ($test['items'] as $key => $item) {
|
||||
$unitAmount = Mockery::mock(Money::class);
|
||||
$unitAmount->shouldReceive('value')->andReturn($item['value']);
|
||||
$tax = Mockery::mock(Money::class);
|
||||
$tax->shouldReceive('value')->andReturn($item['tax']);
|
||||
$unitAmount = new Money($item['value'], 'EUR');
|
||||
$tax = new Money($item['tax'], 'EUR');
|
||||
$items[$key] = Mockery::mock(
|
||||
Item::class,
|
||||
[
|
||||
|
@ -436,15 +434,14 @@ class PurchaseUnitTest extends TestCase
|
|||
return null;
|
||||
}
|
||||
|
||||
$money = Mockery::mock(Money::class);
|
||||
$money->shouldReceive('value')->andReturn($value);
|
||||
$money = new Money($value, 'EUR');
|
||||
return $money;
|
||||
});
|
||||
}
|
||||
}
|
||||
$amount = Mockery::mock(Amount::class);
|
||||
$amount->shouldReceive('to_array')->andReturn(['value' => number_format( $test['amount'], 2, '.', '' ), 'breakdown' => []]);
|
||||
$amount->shouldReceive('value')->andReturn($test['amount']);
|
||||
$amount->shouldReceive('value_str')->andReturn(number_format( $test['amount'], 2, '.', '' ));
|
||||
$amount->shouldReceive('currency_code')->andReturn('EUR');
|
||||
$amount->shouldReceive('breakdown')->andReturn($breakdown);
|
||||
|
||||
|
|
|
@ -0,0 +1,118 @@
|
|||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace WooCommerce\PayPalCommerce\ApiClient\Factory;
|
||||
|
||||
use Mockery;
|
||||
use WC_Cart;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\ApplicationContext;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\Shipping;
|
||||
use WooCommerce\PayPalCommerce\TestCase;
|
||||
|
||||
class ShippingPreferenceFactoryTest extends TestCase
|
||||
{
|
||||
private $testee;
|
||||
|
||||
public function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->testee = new ShippingPreferenceFactory();
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider forStateData
|
||||
*/
|
||||
public function testFromState(
|
||||
PurchaseUnit $purchase_unit,
|
||||
string $context,
|
||||
?WC_Cart $cart,
|
||||
string $funding_source,
|
||||
string $expected_result
|
||||
) {
|
||||
$result = $this->testee->from_state($purchase_unit, $context, $cart, $funding_source);
|
||||
|
||||
self::assertEquals($expected_result, $result);
|
||||
}
|
||||
|
||||
public function forStateData()
|
||||
{
|
||||
yield [
|
||||
$this->createPurchaseUnit(true, Mockery::mock(Shipping::class)),
|
||||
'checkout',
|
||||
$this->createCart(true),
|
||||
'',
|
||||
ApplicationContext::SHIPPING_PREFERENCE_SET_PROVIDED_ADDRESS,
|
||||
];
|
||||
yield [
|
||||
$this->createPurchaseUnit(false, Mockery::mock(Shipping::class)),
|
||||
'checkout',
|
||||
$this->createCart(false),
|
||||
'',
|
||||
ApplicationContext::SHIPPING_PREFERENCE_NO_SHIPPING,
|
||||
];
|
||||
yield [
|
||||
$this->createPurchaseUnit(true, null),
|
||||
'checkout',
|
||||
$this->createCart(true),
|
||||
'',
|
||||
ApplicationContext::SHIPPING_PREFERENCE_NO_SHIPPING,
|
||||
];
|
||||
yield [
|
||||
$this->createPurchaseUnit(true, Mockery::mock(Shipping::class)),
|
||||
'checkout',
|
||||
$this->createCart(true),
|
||||
'card',
|
||||
ApplicationContext::SHIPPING_PREFERENCE_SET_PROVIDED_ADDRESS,
|
||||
];
|
||||
yield [
|
||||
$this->createPurchaseUnit(true, null),
|
||||
'product',
|
||||
null,
|
||||
'',
|
||||
ApplicationContext::SHIPPING_PREFERENCE_GET_FROM_FILE,
|
||||
];
|
||||
yield [
|
||||
$this->createPurchaseUnit(true, null),
|
||||
'pay-now',
|
||||
null,
|
||||
'venmo',
|
||||
ApplicationContext::SHIPPING_PREFERENCE_GET_FROM_FILE,
|
||||
];
|
||||
yield [
|
||||
$this->createPurchaseUnit(true, Mockery::mock(Shipping::class)),
|
||||
'pay-now',
|
||||
null,
|
||||
'venmo',
|
||||
ApplicationContext::SHIPPING_PREFERENCE_GET_FROM_FILE,
|
||||
];
|
||||
yield [
|
||||
$this->createPurchaseUnit(true, Mockery::mock(Shipping::class)),
|
||||
'pay-now',
|
||||
null,
|
||||
'card',
|
||||
ApplicationContext::SHIPPING_PREFERENCE_SET_PROVIDED_ADDRESS,
|
||||
];
|
||||
yield [
|
||||
$this->createPurchaseUnit(true, null),
|
||||
'pay-now',
|
||||
null,
|
||||
'card',
|
||||
ApplicationContext::SHIPPING_PREFERENCE_NO_SHIPPING,
|
||||
];
|
||||
}
|
||||
|
||||
private function createPurchaseUnit(bool $containsPhysicalGoods, ?Shipping $shipping): PurchaseUnit {
|
||||
$pu = Mockery::mock(PurchaseUnit::class);
|
||||
$pu->shouldReceive('contains_physical_goods')->andReturn($containsPhysicalGoods);
|
||||
$pu->shouldReceive('shipping')->andReturn($shipping);
|
||||
return $pu;
|
||||
}
|
||||
|
||||
private function createCart(bool $needsShipping): WC_Cart {
|
||||
$cart = Mockery::mock(WC_Cart::class);
|
||||
$cart->shouldReceive('needs_shipping')->andReturn($needsShipping);
|
||||
return $cart;
|
||||
}
|
||||
}
|
|
@ -5,7 +5,7 @@ namespace WooCommerce\PayPalCommerce\Button\Endpoint;
|
|||
|
||||
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
|
||||
use WooCommerce\PayPalCommerce\TestCase;
|
||||
use Mockery;
|
||||
use WooCommerce\WooCommerce\Logging\Logger\NullLogger;
|
||||
|
@ -17,7 +17,7 @@ class ChangeCartEndpointTest extends TestCase
|
|||
/**
|
||||
* @dataProvider dataForTestProducts
|
||||
*/
|
||||
public function testProducts($data, $products, $lineItems, $responseExpectation) {
|
||||
public function testProducts($data, $products, $responseExpectation) {
|
||||
|
||||
$dataStore = Mockery::mock(\WC_Data_Store::class);
|
||||
$cart = Mockery::mock(\WC_Cart::class);
|
||||
|
@ -59,16 +59,21 @@ class ChangeCartEndpointTest extends TestCase
|
|||
->expects('read_request')
|
||||
->with(ChangeCartEndpoint::nonce())
|
||||
->andReturn($data);
|
||||
$cartRepository = Mockery::mock(CartRepository::class);
|
||||
$cartRepository
|
||||
->expects('all')
|
||||
->andReturn($lineItems);
|
||||
|
||||
$pu = Mockery::mock(PurchaseUnit::class);
|
||||
$pu
|
||||
->shouldReceive('to_array')
|
||||
->andReturn($responseExpectation[0]);
|
||||
$purchase_unit_factory = Mockery::mock(PurchaseUnitFactory::class);
|
||||
$purchase_unit_factory
|
||||
->expects('from_wc_cart')
|
||||
->andReturn($pu);
|
||||
|
||||
$testee = new ChangeCartEndpoint(
|
||||
$cart,
|
||||
$shipping,
|
||||
$requestData,
|
||||
$cartRepository,
|
||||
$purchase_unit_factory,
|
||||
$dataStore,
|
||||
new NullLogger()
|
||||
);
|
||||
|
@ -97,15 +102,6 @@ class ChangeCartEndpointTest extends TestCase
|
|||
->with('variable')
|
||||
->andReturn(true);
|
||||
|
||||
$defaultLineItem = Mockery::mock(PurchaseUnit::class);
|
||||
$defaultLineItem
|
||||
->shouldReceive('to_array')
|
||||
->andReturn([1]);
|
||||
$variationLineItem = Mockery::mock(PurchaseUnit::class);
|
||||
$variationLineItem
|
||||
->shouldReceive('to_array')
|
||||
->andReturn([2]);
|
||||
|
||||
$testData = [
|
||||
'default' => [
|
||||
[
|
||||
|
@ -120,9 +116,6 @@ class ChangeCartEndpointTest extends TestCase
|
|||
[
|
||||
$defaultProduct,
|
||||
],
|
||||
[
|
||||
$defaultLineItem,
|
||||
],
|
||||
[
|
||||
[1],
|
||||
]
|
||||
|
@ -162,11 +155,7 @@ class ChangeCartEndpointTest extends TestCase
|
|||
$variationProduct,
|
||||
],
|
||||
[
|
||||
$defaultLineItem,
|
||||
$variationLineItem,
|
||||
],
|
||||
[
|
||||
[1],[2]
|
||||
[1, 2]
|
||||
]
|
||||
]
|
||||
];
|
||||
|
|
|
@ -10,7 +10,7 @@ use ReflectionClass;
|
|||
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\OrderEndpoint;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Repository\CartRepository;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingPreferenceFactory;
|
||||
use WooCommerce\PayPalCommerce\Button\Helper\EarlyOrderHandler;
|
||||
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
||||
use WooCommerce\PayPalCommerce\TestCase;
|
||||
|
@ -145,7 +145,7 @@ class CreateOrderEndpointTest extends TestCase
|
|||
protected function mockTestee()
|
||||
{
|
||||
$request_data = Mockery::mock(RequestData::class);
|
||||
$cart_repository = Mockery::mock(CartRepository::class);
|
||||
$shippingPreferenceFactory = Mockery::mock(ShippingPreferenceFactory::class);
|
||||
$purchase_unit_factory = Mockery::mock(PurchaseUnitFactory::class);
|
||||
$order_endpoint = Mockery::mock(OrderEndpoint::class);
|
||||
$payer_factory = Mockery::mock(PayerFactory::class);
|
||||
|
@ -155,8 +155,8 @@ class CreateOrderEndpointTest extends TestCase
|
|||
|
||||
$testee = new CreateOrderEndpoint(
|
||||
$request_data,
|
||||
$cart_repository,
|
||||
$purchase_unit_factory,
|
||||
$shippingPreferenceFactory,
|
||||
$order_endpoint,
|
||||
$payer_factory,
|
||||
$session_handler,
|
||||
|
|
|
@ -16,6 +16,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentToken;
|
|||
use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingPreferenceFactory;
|
||||
use WooCommerce\PayPalCommerce\Onboarding\Environment;
|
||||
use WooCommerce\PayPalCommerce\TestCase;
|
||||
use Mockery;
|
||||
|
@ -33,6 +34,7 @@ class RenewalHandlerTest extends TestCase
|
|||
private $repository;
|
||||
private $orderEndpoint;
|
||||
private $purchaseUnitFactory;
|
||||
private $shippingPreferenceFactory;
|
||||
private $payerFactory;
|
||||
private $environment;
|
||||
private $sut;
|
||||
|
@ -45,6 +47,7 @@ class RenewalHandlerTest extends TestCase
|
|||
$this->repository = Mockery::mock(PaymentTokenRepository::class);
|
||||
$this->orderEndpoint = Mockery::mock(OrderEndpoint::class);
|
||||
$this->purchaseUnitFactory = Mockery::mock(PurchaseUnitFactory::class);
|
||||
$this->shippingPreferenceFactory = Mockery::mock(ShippingPreferenceFactory::class);
|
||||
$this->payerFactory = Mockery::mock(PayerFactory::class);
|
||||
$this->environment = new Environment(new Dictionary([]));
|
||||
$authorizedPaymentProcessor = Mockery::mock(AuthorizedPaymentsProcessor::class);
|
||||
|
@ -63,6 +66,7 @@ class RenewalHandlerTest extends TestCase
|
|||
$this->repository,
|
||||
$this->orderEndpoint,
|
||||
$this->purchaseUnitFactory,
|
||||
$this->shippingPreferenceFactory,
|
||||
$this->payerFactory,
|
||||
$this->environment,
|
||||
$settings,
|
||||
|
@ -142,8 +146,12 @@ class RenewalHandlerTest extends TestCase
|
|||
$this->payerFactory->shouldReceive('from_customer')
|
||||
->andReturn($payer);
|
||||
|
||||
$this->shippingPreferenceFactory->shouldReceive('from_state')
|
||||
->with($purchaseUnit, 'renewal')
|
||||
->andReturn('no_shipping');
|
||||
|
||||
$this->orderEndpoint->shouldReceive('create')
|
||||
->with([$purchaseUnit], $payer, $token)
|
||||
->with([$purchaseUnit], 'no_shipping', $payer, $token)
|
||||
->andReturn($order);
|
||||
|
||||
$wcOrder->shouldReceive('update_status');
|
||||
|
|
|
@ -10,6 +10,7 @@ use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PaymentsEndpoint;
|
|||
use Psr\Log\NullLogger;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\Capture;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\CaptureStatus;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingPreferenceFactory;
|
||||
use WooCommerce\PayPalCommerce\Onboarding\Environment;
|
||||
use WooCommerce\PayPalCommerce\Onboarding\State;
|
||||
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
||||
|
@ -44,6 +45,7 @@ class WcGatewayTest extends TestCase
|
|||
private $subscriptionHelper;
|
||||
private $environment;
|
||||
private $paymentTokenRepository;
|
||||
private $shipping_preference_factory;
|
||||
private $logger;
|
||||
private $paymentsEndpoint;
|
||||
private $orderEndpoint;
|
||||
|
@ -67,6 +69,7 @@ class WcGatewayTest extends TestCase
|
|||
$this->subscriptionHelper = Mockery::mock(SubscriptionHelper::class);
|
||||
$this->environment = Mockery::mock(Environment::class);
|
||||
$this->paymentTokenRepository = Mockery::mock(PaymentTokenRepository::class);
|
||||
$this->shipping_preference_factory = Mockery::mock(ShippingPreferenceFactory::class);
|
||||
$this->logger = Mockery::mock(LoggerInterface::class);
|
||||
$this->paymentsEndpoint = Mockery::mock(PaymentsEndpoint::class);
|
||||
$this->orderEndpoint = Mockery::mock(OrderEndpoint::class);
|
||||
|
@ -102,6 +105,7 @@ class WcGatewayTest extends TestCase
|
|||
PayPalGateway::ID,
|
||||
$this->environment,
|
||||
$this->paymentTokenRepository,
|
||||
$this->shipping_preference_factory,
|
||||
$this->logger,
|
||||
$this->paymentsEndpoint,
|
||||
$this->orderEndpoint,
|
||||
|
|
|
@ -68,8 +68,6 @@ class PurchaseUnitTest extends TestCase
|
|||
$pu = $this->puFactory->from_wc_order($wcOrder);
|
||||
$puData = $pu->to_array();
|
||||
|
||||
self::assertTrue(isset($puData['amount']['breakdown']));
|
||||
|
||||
self::assertEquals($expectedAmount, $puData['amount']);
|
||||
}
|
||||
|
||||
|
@ -83,8 +81,6 @@ class PurchaseUnitTest extends TestCase
|
|||
$pu = $this->puFactory->from_wc_cart($this->cart);
|
||||
$puData = $pu->to_array();
|
||||
|
||||
self::assertTrue(isset($puData['amount']['breakdown']));
|
||||
|
||||
self::assertEquals($expectedAmount, $puData['amount']);
|
||||
}
|
||||
|
||||
|
@ -334,6 +330,37 @@ class PurchaseUnitTest extends TestCase
|
|||
],
|
||||
]),
|
||||
];
|
||||
|
||||
yield 'no decimals currency' => [
|
||||
[
|
||||
'currency' => 'JPY',
|
||||
'items' => [
|
||||
['price' => 18.0, 'quantity' => 2],
|
||||
],
|
||||
'shipping' => ['total' => 5.0],
|
||||
'billing' => ['city' => 'city2'],
|
||||
],
|
||||
self::adaptAmountFormat([
|
||||
'value' => 66,
|
||||
'breakdown' => [
|
||||
'item_total' => 36,
|
||||
'tax_total' => 25, // 24.60
|
||||
'shipping' => 5,
|
||||
],
|
||||
], 'JPY'),
|
||||
];
|
||||
|
||||
yield [
|
||||
[
|
||||
'items' => [
|
||||
['price' => 5.345, 'quantity' => 2],
|
||||
],
|
||||
'billing' => ['city' => 'city0'],
|
||||
],
|
||||
self::adaptAmountFormat([
|
||||
'value' => 10.69,
|
||||
]),
|
||||
];
|
||||
}
|
||||
|
||||
public function cartData() {
|
||||
|
@ -390,6 +417,18 @@ class PurchaseUnitTest extends TestCase
|
|||
],
|
||||
], get_woocommerce_currency()),
|
||||
];
|
||||
|
||||
yield [
|
||||
[
|
||||
'products' => [
|
||||
['price' => 5.345, 'quantity' => 2],
|
||||
],
|
||||
'billing' => ['city' => 'city0'],
|
||||
],
|
||||
self::adaptAmountFormat([
|
||||
'value' => 10.69,
|
||||
], get_woocommerce_currency()),
|
||||
];
|
||||
}
|
||||
|
||||
private static function adaptAmountFormat(array $data, string $currency = null): array {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue