2020-04-29 08:58:16 +03:00
|
|
|
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
2020-09-14 07:51:45 +03:00
|
|
|
namespace WooCommerce\PayPalCommerce\WcGateway\Gateway;
|
2020-04-29 08:58:16 +03:00
|
|
|
|
|
|
|
|
2020-09-14 07:51:45 +03:00
|
|
|
use WooCommerce\PayPalCommerce\Onboarding\Render\OnboardingRenderer;
|
2020-09-28 11:47:24 +03:00
|
|
|
use WooCommerce\PayPalCommerce\Onboarding\State;
|
2020-09-14 07:51:45 +03:00
|
|
|
use WooCommerce\PayPalCommerce\Session\SessionHandler;
|
|
|
|
use WooCommerce\PayPalCommerce\TestCase;
|
|
|
|
use WooCommerce\PayPalCommerce\WcGateway\Notice\AuthorizeOrderActionNotice;
|
|
|
|
use WooCommerce\PayPalCommerce\WcGateway\Processor\AuthorizedPaymentsProcessor;
|
|
|
|
use WooCommerce\PayPalCommerce\WcGateway\Processor\OrderProcessor;
|
2020-09-28 11:47:24 +03:00
|
|
|
use WooCommerce\PayPalCommerce\WcGateway\Processor\RefundProcessor;
|
2020-09-14 07:51:45 +03:00
|
|
|
use WooCommerce\PayPalCommerce\WcGateway\Settings\Settings;
|
|
|
|
use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsFields;
|
|
|
|
use WooCommerce\PayPalCommerce\WcGateway\Settings\SettingsRenderer;
|
2020-04-29 08:58:16 +03:00
|
|
|
use Mockery;
|
|
|
|
use function Brain\Monkey\Functions\expect;
|
|
|
|
|
|
|
|
class WcGatewayTest extends TestCase
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
public function testProcessPaymentSuccess() {
|
2020-09-02 13:54:53 +03:00
|
|
|
expect('is_admin')->andReturn(false);
|
2020-04-29 08:58:16 +03:00
|
|
|
|
|
|
|
$orderId = 1;
|
|
|
|
$wcOrder = Mockery::mock(\WC_Order::class);
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer = Mockery::mock(SettingsRenderer::class);
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor = Mockery::mock(OrderProcessor::class);
|
|
|
|
$orderProcessor
|
|
|
|
->expects('process')
|
|
|
|
->andReturnUsing(
|
|
|
|
function(\WC_Order $order, $woocommerce) use ($wcOrder) : bool {
|
|
|
|
return $order === $wcOrder;
|
|
|
|
}
|
|
|
|
);
|
|
|
|
$authorizedPaymentsProcessor = Mockery::mock(AuthorizedPaymentsProcessor::class);
|
|
|
|
$authorizedOrderActionNotice = Mockery::mock(AuthorizeOrderActionNotice::class);
|
2020-07-02 14:40:17 +03:00
|
|
|
$settings = Mockery::mock(Settings::class);
|
2020-08-26 09:59:07 +03:00
|
|
|
$sessionHandler = Mockery::mock(SessionHandler::class);
|
2020-09-02 08:43:41 +03:00
|
|
|
$sessionHandler
|
|
|
|
->shouldReceive('destroy_session_data');
|
2020-07-02 14:40:17 +03:00
|
|
|
$settings
|
|
|
|
->shouldReceive('has')->andReturnFalse();
|
2020-09-28 11:47:24 +03:00
|
|
|
$refundProcessor = Mockery::mock(RefundProcessor::class);
|
|
|
|
$state = Mockery::mock(State::class);
|
|
|
|
$state
|
|
|
|
->shouldReceive('current_state')->andReturn(State::STATE_ONBOARDED);
|
2020-08-18 08:46:18 +03:00
|
|
|
$testee = new PayPalGateway(
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer,
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor,
|
|
|
|
$authorizedPaymentsProcessor,
|
2020-06-29 13:45:03 +03:00
|
|
|
$authorizedOrderActionNotice,
|
2020-08-26 09:59:07 +03:00
|
|
|
$settings,
|
2020-09-28 11:47:24 +03:00
|
|
|
$sessionHandler,
|
|
|
|
$refundProcessor,
|
|
|
|
$state
|
2020-04-29 08:58:16 +03:00
|
|
|
);
|
|
|
|
|
|
|
|
expect('wc_get_order')
|
|
|
|
->with($orderId)
|
|
|
|
->andReturn($wcOrder);
|
|
|
|
|
2020-07-02 13:17:52 +03:00
|
|
|
global $woocommerce;
|
|
|
|
$woocommerce = Mockery::mock(\WooCommerce::class);
|
2020-04-29 08:58:16 +03:00
|
|
|
$result = $testee->process_payment($orderId);
|
2020-07-02 13:17:52 +03:00
|
|
|
unset($woocommerce);
|
2020-04-29 08:58:16 +03:00
|
|
|
$this->assertIsArray($result);
|
|
|
|
$this->assertEquals('success', $result['result']);
|
|
|
|
$this->assertEquals($result['redirect'], $wcOrder);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testProcessPaymentOrderNotFound() {
|
2020-09-02 13:54:53 +03:00
|
|
|
expect('is_admin')->andReturn(false);
|
2020-04-29 08:58:16 +03:00
|
|
|
|
|
|
|
$orderId = 1;
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer = Mockery::mock(SettingsRenderer::class);
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor = Mockery::mock(OrderProcessor::class);
|
|
|
|
$authorizedPaymentsProcessor = Mockery::mock(AuthorizedPaymentsProcessor::class);
|
|
|
|
$authorizedOrderActionNotice = Mockery::mock(AuthorizeOrderActionNotice::class);
|
2020-07-02 14:40:17 +03:00
|
|
|
$settings = Mockery::mock(Settings::class);
|
|
|
|
$settings
|
|
|
|
->shouldReceive('has')->andReturnFalse();
|
2020-08-26 09:59:07 +03:00
|
|
|
$sessionHandler = Mockery::mock(SessionHandler::class);
|
2020-09-28 11:47:24 +03:00
|
|
|
$refundProcessor = Mockery::mock(RefundProcessor::class);
|
|
|
|
$state = Mockery::mock(State::class);
|
|
|
|
$state
|
|
|
|
->shouldReceive('current_state')->andReturn(State::STATE_ONBOARDED);
|
2020-08-18 08:46:18 +03:00
|
|
|
$testee = new PayPalGateway(
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer,
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor,
|
|
|
|
$authorizedPaymentsProcessor,
|
2020-06-29 13:45:03 +03:00
|
|
|
$authorizedOrderActionNotice,
|
2020-08-26 09:59:07 +03:00
|
|
|
$settings,
|
2020-09-28 11:47:24 +03:00
|
|
|
$sessionHandler,
|
|
|
|
$refundProcessor,
|
|
|
|
$state
|
2020-04-29 08:58:16 +03:00
|
|
|
);
|
|
|
|
|
|
|
|
expect('wc_get_order')
|
|
|
|
->with($orderId)
|
|
|
|
->andReturn(false);
|
|
|
|
|
2020-07-02 13:17:52 +03:00
|
|
|
global $woocommerce;
|
|
|
|
$woocommerce = Mockery::mock(\WooCommerce::class);
|
2020-04-29 08:58:16 +03:00
|
|
|
$this->assertNull($testee->process_payment($orderId));
|
2020-07-02 13:17:52 +03:00
|
|
|
unset($woocommerce);
|
2020-04-29 08:58:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public function testProcessPaymentFails() {
|
2020-09-02 13:54:53 +03:00
|
|
|
expect('is_admin')->andReturn(false);
|
2020-04-29 08:58:16 +03:00
|
|
|
|
|
|
|
$orderId = 1;
|
|
|
|
$wcOrder = Mockery::mock(\WC_Order::class);
|
|
|
|
$lastError = 'some-error';
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer = Mockery::mock(SettingsRenderer::class);
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor = Mockery::mock(OrderProcessor::class);
|
|
|
|
$orderProcessor
|
|
|
|
->expects('process')
|
|
|
|
->andReturnFalse();
|
|
|
|
$orderProcessor
|
2020-08-31 13:03:16 +03:00
|
|
|
->expects('last_error')
|
2020-04-29 08:58:16 +03:00
|
|
|
->andReturn($lastError);
|
|
|
|
$authorizedPaymentsProcessor = Mockery::mock(AuthorizedPaymentsProcessor::class);
|
|
|
|
$authorizedOrderActionNotice = Mockery::mock(AuthorizeOrderActionNotice::class);
|
2020-07-02 14:40:17 +03:00
|
|
|
$settings = Mockery::mock(Settings::class);
|
|
|
|
$settings
|
|
|
|
->shouldReceive('has')->andReturnFalse();
|
2020-08-26 09:59:07 +03:00
|
|
|
$sessionHandler = Mockery::mock(SessionHandler::class);
|
2020-09-28 11:47:24 +03:00
|
|
|
$refundProcessor = Mockery::mock(RefundProcessor::class);
|
|
|
|
$state = Mockery::mock(State::class);
|
|
|
|
$state
|
|
|
|
->shouldReceive('current_state')->andReturn(State::STATE_ONBOARDED);
|
2020-08-18 08:46:18 +03:00
|
|
|
$testee = new PayPalGateway(
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer,
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor,
|
|
|
|
$authorizedPaymentsProcessor,
|
2020-06-29 13:45:03 +03:00
|
|
|
$authorizedOrderActionNotice,
|
2020-08-26 09:59:07 +03:00
|
|
|
$settings,
|
2020-09-28 11:47:24 +03:00
|
|
|
$sessionHandler,
|
|
|
|
$refundProcessor,
|
|
|
|
$state
|
2020-04-29 08:58:16 +03:00
|
|
|
);
|
|
|
|
|
|
|
|
expect('wc_get_order')
|
|
|
|
->with($orderId)
|
|
|
|
->andReturn($wcOrder);
|
|
|
|
expect('wc_add_notice')
|
2020-08-31 13:03:16 +03:00
|
|
|
->with($lastError, 'error');
|
2020-04-29 08:58:16 +03:00
|
|
|
|
2020-07-02 13:17:52 +03:00
|
|
|
global $woocommerce;
|
|
|
|
$woocommerce = Mockery::mock(\WooCommerce::class);
|
2020-04-29 08:58:16 +03:00
|
|
|
$result = $testee->process_payment($orderId);
|
2020-07-02 13:17:52 +03:00
|
|
|
unset($woocommerce);
|
2020-04-29 08:58:16 +03:00
|
|
|
$this->assertNull($result);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testCaptureAuthorizedPayment() {
|
2020-09-02 13:54:53 +03:00
|
|
|
expect('is_admin')->andReturn(false);
|
2020-04-29 08:58:16 +03:00
|
|
|
|
|
|
|
$wcOrder = Mockery::mock(\WC_Order::class);
|
|
|
|
$wcOrder
|
|
|
|
->expects('add_order_note');
|
|
|
|
$wcOrder
|
|
|
|
->expects('set_status')
|
|
|
|
->with('processing');
|
|
|
|
$wcOrder
|
|
|
|
->expects('update_meta_data')
|
2020-08-18 08:46:18 +03:00
|
|
|
->with(PayPalGateway::CAPTURED_META_KEY, 'true');
|
2020-04-29 08:58:16 +03:00
|
|
|
$wcOrder
|
|
|
|
->expects('save');
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer = Mockery::mock(SettingsRenderer::class);
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor = Mockery::mock(OrderProcessor::class);
|
|
|
|
$authorizedPaymentsProcessor = Mockery::mock(AuthorizedPaymentsProcessor::class);
|
|
|
|
$authorizedPaymentsProcessor
|
|
|
|
->expects('process')
|
|
|
|
->with($wcOrder)
|
|
|
|
->andReturnTrue();
|
|
|
|
$authorizedPaymentsProcessor
|
2020-08-31 13:03:16 +03:00
|
|
|
->expects('last_status')
|
2020-04-29 08:58:16 +03:00
|
|
|
->andReturn(AuthorizedPaymentsProcessor::SUCCESSFUL);
|
|
|
|
$authorizedOrderActionNotice = Mockery::mock(AuthorizeOrderActionNotice::class);
|
|
|
|
$authorizedOrderActionNotice
|
2020-08-31 13:03:16 +03:00
|
|
|
->expects('display_message')
|
2020-04-29 08:58:16 +03:00
|
|
|
->with(AuthorizeOrderActionNotice::SUCCESS);
|
2020-06-29 13:45:03 +03:00
|
|
|
|
2020-07-02 14:40:17 +03:00
|
|
|
$settings = Mockery::mock(Settings::class);
|
|
|
|
$settings
|
|
|
|
->shouldReceive('has')->andReturnFalse();
|
2020-08-26 09:59:07 +03:00
|
|
|
$sessionHandler = Mockery::mock(SessionHandler::class);
|
2020-09-28 11:47:24 +03:00
|
|
|
$refundProcessor = Mockery::mock(RefundProcessor::class);
|
|
|
|
$state = Mockery::mock(State::class);
|
|
|
|
$state
|
|
|
|
->shouldReceive('current_state')->andReturn(State::STATE_ONBOARDED);
|
2020-08-18 08:46:18 +03:00
|
|
|
$testee = new PayPalGateway(
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer,
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor,
|
|
|
|
$authorizedPaymentsProcessor,
|
2020-06-29 13:45:03 +03:00
|
|
|
$authorizedOrderActionNotice,
|
2020-08-26 09:59:07 +03:00
|
|
|
$settings,
|
2020-09-28 11:47:24 +03:00
|
|
|
$sessionHandler,
|
|
|
|
$refundProcessor,
|
|
|
|
$state
|
2020-04-29 08:58:16 +03:00
|
|
|
);
|
|
|
|
|
2020-08-28 08:13:45 +03:00
|
|
|
$this->assertTrue($testee->capture_authorized_payment($wcOrder));
|
2020-04-29 08:58:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
public function testCaptureAuthorizedPaymentHasAlreadyBeenCaptured() {
|
|
|
|
|
2020-09-02 13:54:53 +03:00
|
|
|
expect('is_admin')->andReturn(false);
|
2020-04-29 08:58:16 +03:00
|
|
|
$wcOrder = Mockery::mock(\WC_Order::class);
|
|
|
|
$wcOrder
|
|
|
|
->expects('get_status')
|
|
|
|
->andReturn('on-hold');
|
|
|
|
$wcOrder
|
|
|
|
->expects('add_order_note');
|
|
|
|
$wcOrder
|
|
|
|
->expects('set_status')
|
|
|
|
->with('processing');
|
|
|
|
$wcOrder
|
|
|
|
->expects('update_meta_data')
|
2020-08-18 08:46:18 +03:00
|
|
|
->with(PayPalGateway::CAPTURED_META_KEY, 'true');
|
2020-04-29 08:58:16 +03:00
|
|
|
$wcOrder
|
|
|
|
->expects('save');
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer = Mockery::mock(SettingsRenderer::class);
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor = Mockery::mock(OrderProcessor::class);
|
|
|
|
$authorizedPaymentsProcessor = Mockery::mock(AuthorizedPaymentsProcessor::class);
|
|
|
|
$authorizedPaymentsProcessor
|
|
|
|
->expects('process')
|
|
|
|
->with($wcOrder)
|
|
|
|
->andReturnFalse();
|
|
|
|
$authorizedPaymentsProcessor
|
2020-08-31 13:03:16 +03:00
|
|
|
->shouldReceive('last_status')
|
2020-04-29 08:58:16 +03:00
|
|
|
->andReturn(AuthorizedPaymentsProcessor::ALREADY_CAPTURED);
|
|
|
|
$authorizedOrderActionNotice = Mockery::mock(AuthorizeOrderActionNotice::class);
|
|
|
|
$authorizedOrderActionNotice
|
2020-08-31 13:03:16 +03:00
|
|
|
->expects('display_message')
|
2020-04-29 08:58:16 +03:00
|
|
|
->with(AuthorizeOrderActionNotice::ALREADY_CAPTURED);
|
2020-07-02 14:40:17 +03:00
|
|
|
$settings = Mockery::mock(Settings::class);
|
|
|
|
$settings
|
|
|
|
->shouldReceive('has')->andReturnFalse();
|
2020-08-26 09:59:07 +03:00
|
|
|
$sessionHandler = Mockery::mock(SessionHandler::class);
|
2020-09-28 11:47:24 +03:00
|
|
|
$refundProcessor = Mockery::mock(RefundProcessor::class);
|
|
|
|
$state = Mockery::mock(State::class);
|
|
|
|
$state
|
|
|
|
->shouldReceive('current_state')->andReturn(State::STATE_ONBOARDED);
|
2020-08-18 08:46:18 +03:00
|
|
|
$testee = new PayPalGateway(
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer,
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor,
|
|
|
|
$authorizedPaymentsProcessor,
|
2020-06-29 13:45:03 +03:00
|
|
|
$authorizedOrderActionNotice,
|
2020-08-26 09:59:07 +03:00
|
|
|
$settings,
|
2020-09-28 11:47:24 +03:00
|
|
|
$sessionHandler,
|
|
|
|
$refundProcessor,
|
|
|
|
$state
|
2020-04-29 08:58:16 +03:00
|
|
|
);
|
|
|
|
|
2020-08-28 08:13:45 +03:00
|
|
|
$this->assertTrue($testee->capture_authorized_payment($wcOrder));
|
2020-04-29 08:58:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider dataForTestCaptureAuthorizedPaymentNoActionableFailures
|
|
|
|
*
|
|
|
|
* @param string $lastStatus
|
|
|
|
* @param int $expectedMessage
|
|
|
|
*/
|
|
|
|
public function testCaptureAuthorizedPaymentNoActionableFailures($lastStatus, $expectedMessage) {
|
|
|
|
|
2020-09-02 13:54:53 +03:00
|
|
|
expect('is_admin')->andReturn(false);
|
2020-04-29 08:58:16 +03:00
|
|
|
$wcOrder = Mockery::mock(\WC_Order::class);
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer = Mockery::mock(SettingsRenderer::class);
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor = Mockery::mock(OrderProcessor::class);
|
|
|
|
$authorizedPaymentsProcessor = Mockery::mock(AuthorizedPaymentsProcessor::class);
|
|
|
|
$authorizedPaymentsProcessor
|
|
|
|
->expects('process')
|
|
|
|
->with($wcOrder)
|
|
|
|
->andReturnFalse();
|
|
|
|
$authorizedPaymentsProcessor
|
2020-08-31 13:03:16 +03:00
|
|
|
->shouldReceive('last_status')
|
2020-04-29 08:58:16 +03:00
|
|
|
->andReturn($lastStatus);
|
|
|
|
$authorizedOrderActionNotice = Mockery::mock(AuthorizeOrderActionNotice::class);
|
|
|
|
$authorizedOrderActionNotice
|
2020-08-31 13:03:16 +03:00
|
|
|
->expects('display_message')
|
2020-04-29 08:58:16 +03:00
|
|
|
->with($expectedMessage);
|
2020-07-02 14:40:17 +03:00
|
|
|
$settings = Mockery::mock(Settings::class);
|
|
|
|
$settings
|
|
|
|
->shouldReceive('has')->andReturnFalse();
|
2020-08-26 09:59:07 +03:00
|
|
|
$sessionHandler = Mockery::mock(SessionHandler::class);
|
2020-09-28 11:47:24 +03:00
|
|
|
$refundProcessor = Mockery::mock(RefundProcessor::class);
|
|
|
|
$state = Mockery::mock(State::class);
|
|
|
|
$state
|
|
|
|
->shouldReceive('current_state')->andReturn(State::STATE_ONBOARDED);
|
2020-08-18 08:46:18 +03:00
|
|
|
$testee = new PayPalGateway(
|
2020-07-02 10:20:13 +03:00
|
|
|
$settingsRenderer,
|
2020-04-29 08:58:16 +03:00
|
|
|
$orderProcessor,
|
|
|
|
$authorizedPaymentsProcessor,
|
2020-06-29 13:45:03 +03:00
|
|
|
$authorizedOrderActionNotice,
|
2020-08-26 09:59:07 +03:00
|
|
|
$settings,
|
2020-09-28 11:47:24 +03:00
|
|
|
$sessionHandler,
|
|
|
|
$refundProcessor,
|
|
|
|
$state
|
2020-04-29 08:58:16 +03:00
|
|
|
);
|
|
|
|
|
2020-08-28 08:13:45 +03:00
|
|
|
$this->assertFalse($testee->capture_authorized_payment($wcOrder));
|
2020-04-29 08:58:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
public function dataForTestCaptureAuthorizedPaymentNoActionableFailures() : array
|
|
|
|
{
|
|
|
|
return [
|
|
|
|
'inaccessible' => [
|
|
|
|
AuthorizedPaymentsProcessor::INACCESSIBLE,
|
|
|
|
AuthorizeOrderActionNotice::NO_INFO,
|
|
|
|
],
|
|
|
|
'not_found' => [
|
|
|
|
AuthorizedPaymentsProcessor::NOT_FOUND,
|
|
|
|
AuthorizeOrderActionNotice::NOT_FOUND,
|
|
|
|
],
|
|
|
|
'not_mapped' => [
|
|
|
|
'some-other-failure',
|
|
|
|
AuthorizeOrderActionNotice::FAILED,
|
|
|
|
],
|
|
|
|
];
|
|
|
|
}
|
|
|
|
}
|