From 6f02182f3a606ebe64b8855834bd21a83f2ff526 Mon Sep 17 00:00:00 2001 From: Aashish Date: Wed, 13 Sep 2023 17:18:30 +0700 Subject: [PATCH 1/6] Added OCBC digital along with image and tests. --- assets/images/ocbc-digital.png | Bin 0 -> 65018 bytes includes/class-omise-payment-factory.php | 1 + .../class-omise-payment-ocbc-digital.php | 87 ++++++++++++++++++ omise-woocommerce.php | 1 + .../gateway/class-omise-offsite-test.php | 2 - .../class-omise-payment-ocbc-digital-test.php | 51 ++++++++++ 6 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 assets/images/ocbc-digital.png create mode 100644 includes/gateway/class-omise-payment-ocbc-digital.php create mode 100644 tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php diff --git a/assets/images/ocbc-digital.png b/assets/images/ocbc-digital.png new file mode 100644 index 0000000000000000000000000000000000000000..51e00fc9114c43f16cccdb0126124f6194d8d839 GIT binary patch literal 65018 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 = 'omise_ocbc'; + $this->has_fields = false; + $this->method_title = __( 'Opn Payments OCBC Digital', 'omise' ); + $this->method_description = __( 'Accept payment through OCBC Digital via Opn Payments payment gateway.', 'omise' ); + $this->supports = [ 'products', 'refunds' ]; + + $this->init_form_fields(); + $this->init_settings(); + + $this->title = $this->get_option( 'title' ); + $this->description = $this->get_option( 'description' ); + $this->restricted_countries = [ 'SG' ]; + $this->source_type = 'mobile_banking_ocbc'; + + add_action( 'woocommerce_api_' . $this->id . '_callback', 'Omise_Callback::execute' ); + add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, [ $this, 'process_admin_options' ] ); + add_action( 'woocommerce_order_action_' . $this->id . '_sync_payment', [ $this, 'sync_payment' ] ); + } + + /** + * @see WC_Settings_API::init_form_fields() + * @see woocommerce/includes/abstracts/abstract-wc-settings-api.php + */ + public function init_form_fields() { + $this->form_fields = [ + 'enabled' => [ + 'title' => __( 'Enable/Disable', 'omise' ), + 'type' => 'checkbox', + 'label' => __( 'Enable Opn Payments OCBC digital', 'omise' ), + 'default' => 'no' + ], + + 'title' => [ + 'title' => __( 'Title', 'omise' ), + 'type' => 'text', + 'description' => __( 'This controls the title the user sees during checkout.', 'omise' ), + 'default' => __( 'OCBC Digital', 'omise' ), + ], + + 'description' => [ + 'title' => __( 'Description', 'omise' ), + 'type' => 'textarea', + 'description' => __( 'This controls the description the user sees during checkout.', 'omise' ) + ], + ]; + } + + /** + * @inheritdoc + */ + public function charge($order_id, $order) + { + $currency = $order->get_currency(); + + return OmiseCharge::create([ + 'amount' => Omise_Money::to_subunit($order->get_total(), $currency), + 'currency' => $currency, + 'description' => apply_filters('omise_charge_params_description', 'WooCommerce Order id ' . $order_id, $order), + 'source' => [ + 'type' => $this->source_type, + 'platform_type' => Omise_Util::get_platform_type( wc_get_user_agent() ) + ], + 'return_uri' => $this->getRedirectUrl("{$this->id}_callback", $order_id, $order), + 'metadata' => $this->getMetadata($order_id, $order) + ]); + } + + /** + * Get icons + * + * @see WC_Payment_Gateway::get_icon() + */ + public function get_icon() { + $icon = Omise_Image::get_image([ + 'file' => 'ocbc-digital.png', + 'alternate_text' => 'OCBC Digital', + ]); + return apply_filters( 'woocommerce_gateway_icon', $icon, $this->id ); + } +} diff --git a/omise-woocommerce.php b/omise-woocommerce.php index 919c77b9..77a33002 100644 --- a/omise-woocommerce.php +++ b/omise-woocommerce.php @@ -213,6 +213,7 @@ private function include_classes() require_once OMISE_WOOCOMMERCE_PLUGIN_PATH . '/includes/gateway/class-omise-payment-googlepay.php'; require_once OMISE_WOOCOMMERCE_PLUGIN_PATH . '/includes/gateway/class-omise-payment-grabpay.php'; require_once OMISE_WOOCOMMERCE_PLUGIN_PATH . '/includes/gateway/class-omise-payment-ocbc-pao.php'; + require_once OMISE_WOOCOMMERCE_PLUGIN_PATH . '/includes/gateway/class-omise-payment-ocbc-digital.php'; require_once OMISE_WOOCOMMERCE_PLUGIN_PATH . '/includes/gateway/class-omise-payment-boost.php'; require_once OMISE_WOOCOMMERCE_PLUGIN_PATH . '/includes/gateway/class-omise-payment-duitnow-obw.php'; require_once OMISE_WOOCOMMERCE_PLUGIN_PATH . '/includes/gateway/class-omise-payment-duitnow-qr.php'; diff --git a/tests/unit/includes/gateway/class-omise-offsite-test.php b/tests/unit/includes/gateway/class-omise-offsite-test.php index 4712b196..99b68419 100644 --- a/tests/unit/includes/gateway/class-omise-offsite-test.php +++ b/tests/unit/includes/gateway/class-omise-offsite-test.php @@ -20,8 +20,6 @@ function wp_kses() {} if (!function_exists('add_action')) { function add_action() {} } - - require_once __DIR__ . '/../../../../includes/gateway/class-omise-payment-alipayplus.php'; } /** diff --git a/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php b/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php new file mode 100644 index 00000000..3d1926d3 --- /dev/null +++ b/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php @@ -0,0 +1,51 @@ +obj = new Omise_Payment_OCBC_Digital(); + } + + public function tearDown(): void + { + // destroy object and clear memory + unset($this->obj); + } + + /** + * @test + */ + public function restrictedCountriesHasRequiredCountries() + { + $expectedCountries = ['SG']; + $this->assertEqualsCanonicalizing($expectedCountries, $this->obj->restricted_countries); + } + + /** + * @test + */ + public function sourceTypeIsCorrect() + { + $this->assertEquals('mobile_banking_ocbc', $this->obj->source_type); + } + + /** + * @test + */ + public function methodTitleIsCorrect() + { + $this->assertEquals('Opn Payments OCBC Digital', $this->obj->method_title); + } + + public function supportsIsCorrect() + { + $this->assertEqualsCanonicalizing([ 'products', 'refunds' ], $this->obj->supports); + } +} From 0d4f93a588db6f927bbb6d873c67a36dc81bbea0 Mon Sep 17 00:00:00 2001 From: Aashish Date: Mon, 18 Sep 2023 11:44:13 +0700 Subject: [PATCH 2/6] Changed the logo and added a test. --- assets/images/ocbc-digital.png | Bin 65018 -> 1868 bytes .../class-omise-payment-ocbc-digital.php | 4 ++- .../class-omise-payment-ocbc-digital-test.php | 27 ++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/assets/images/ocbc-digital.png b/assets/images/ocbc-digital.png index 51e00fc9114c43f16cccdb0126124f6194d8d839..699b34bb3afe99f172c99a46191431d624b5e2d7 100644 GIT binary patch literal 1868 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 'ocbc-digital.png', 'alternate_text' => 'OCBC Digital', + 'width' => 60, ]); return apply_filters( 'woocommerce_gateway_icon', $icon, $this->id ); } diff --git a/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php b/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php index 3d1926d3..a72dac51 100644 --- a/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php +++ b/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php @@ -10,6 +10,7 @@ public function setUp(): void { parent::setUp(); require_once __DIR__ . '/../../../../includes/gateway/class-omise-payment-ocbc-digital.php'; + require_once __DIR__ . '/../../../../includes/classes/class-omise-image.php'; $this->obj = new Omise_Payment_OCBC_Digital(); } @@ -44,8 +45,34 @@ public function methodTitleIsCorrect() $this->assertEquals('Opn Payments OCBC Digital', $this->obj->method_title); } + /** + * @test + */ public function supportsIsCorrect() { $this->assertEqualsCanonicalizing([ 'products', 'refunds' ], $this->obj->supports); } + + /** + * @test + */ + public function getIcon() + { + // mocking WP built-in functions + if (!function_exists('plugins_url')) { + function plugins_url() { + return "http://localhost"; + } + } + + if (!function_exists('apply_filters')) { + function apply_filters() { + return "http://localhost/image.png"; + } + } + + $result = $this->obj->get_icon(); + + $this->assertEquals("http://localhost/image.png", $result); + } } From f857a7172e27ffd5a4d3712477c426d62cf9cdf1 Mon Sep 17 00:00:00 2001 From: Aashish Date: Mon, 18 Sep 2023 12:15:14 +0700 Subject: [PATCH 3/6] Updated ocbc digital class to write test. --- .../class-omise-payment-ocbc-digital.php | 13 +++++-- .../gateway/class-omise-offsite-test.php | 2 ++ .../class-omise-payment-ocbc-digital-test.php | 35 ++++++++++++++++++- 3 files changed, 47 insertions(+), 3 deletions(-) diff --git a/includes/gateway/class-omise-payment-ocbc-digital.php b/includes/gateway/class-omise-payment-ocbc-digital.php index 39a58e00..2f9851f5 100644 --- a/includes/gateway/class-omise-payment-ocbc-digital.php +++ b/includes/gateway/class-omise-payment-ocbc-digital.php @@ -56,10 +56,19 @@ public function init_form_fields() { * @inheritdoc */ public function charge($order_id, $order) + { + return OmiseCharge::create($this->get_charge_request($order_id, $order)); + } + + /** + * @order_id integer + * @order object + */ + public function get_charge_request($order_id, $order) { $currency = $order->get_currency(); - return OmiseCharge::create([ + return [ 'amount' => Omise_Money::to_subunit($order->get_total(), $currency), 'currency' => $currency, 'description' => apply_filters('omise_charge_params_description', 'WooCommerce Order id ' . $order_id, $order), @@ -69,7 +78,7 @@ public function charge($order_id, $order) ], 'return_uri' => $this->getRedirectUrl("{$this->id}_callback", $order_id, $order), 'metadata' => $this->getMetadata($order_id, $order) - ]); + ]; } /** diff --git a/tests/unit/includes/gateway/class-omise-offsite-test.php b/tests/unit/includes/gateway/class-omise-offsite-test.php index 99b68419..56233409 100644 --- a/tests/unit/includes/gateway/class-omise-offsite-test.php +++ b/tests/unit/includes/gateway/class-omise-offsite-test.php @@ -11,6 +11,8 @@ public function setUp(): void $offsite->shouldReceive('init_settings'); $offsite->shouldReceive('get_option'); $offsite->shouldReceive('get_provider'); + $offsite->shouldReceive('getRedirectUrl'); + $offsite->shouldReceive('getMetadata'); // mocking WP built-in functions if (!function_exists('wp_kses')) { diff --git a/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php b/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php index a72dac51..4bdab42b 100644 --- a/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php +++ b/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php @@ -56,7 +56,7 @@ public function supportsIsCorrect() /** * @test */ - public function getIcon() + public function getIconReturnsCorrectImageLink() { // mocking WP built-in functions if (!function_exists('plugins_url')) { @@ -75,4 +75,37 @@ function apply_filters() { $this->assertEquals("http://localhost/image.png", $result); } + + /** + * @test + */ + public function getChargeRequestReturnsCorrectData() + { + $order = new class { + public function get_currency() + { + return 'thb'; + } + + public function get_total() + { + return 10000; + } + }; + + if (!function_exists('wc_get_user_agent')) { + function wc_get_user_agent() { + return "Chrome Web"; + } + } + + $expectedAmount = 1000000; + $expectedCurrency = 'thb'; + $expectedSourceType = 'mobile_banking_ocbc'; + $order_id = "123"; + $result = $this->obj->get_charge_request($order_id, $order); + $this->assertEquals($expectedAmount, $result['amount']); + $this->assertEquals($expectedCurrency, $result['currency']); + $this->assertEquals($expectedSourceType, $result['source']['type']); + } } From 0d351c85783961213af866df97da5223e6371e08 Mon Sep 17 00:00:00 2001 From: Aashish Date: Mon, 18 Sep 2023 18:13:55 +0700 Subject: [PATCH 4/6] Changed THB to SDG in test --- .../gateway/class-omise-payment-ocbc-digital-test.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php b/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php index 4bdab42b..d315e7d4 100644 --- a/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php +++ b/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php @@ -84,7 +84,7 @@ public function getChargeRequestReturnsCorrectData() $order = new class { public function get_currency() { - return 'thb'; + return 'sgd'; } public function get_total() @@ -100,7 +100,7 @@ function wc_get_user_agent() { } $expectedAmount = 1000000; - $expectedCurrency = 'thb'; + $expectedCurrency = 'sgd'; $expectedSourceType = 'mobile_banking_ocbc'; $order_id = "123"; $result = $this->obj->get_charge_request($order_id, $order); From ed9ce8b9397b0b1c846b5531ead7a59622dadb08 Mon Sep 17 00:00:00 2001 From: Aashish Date: Tue, 19 Sep 2023 09:45:22 +0700 Subject: [PATCH 5/6] Updated tests to use PHP mockery. --- .../class-omise-payment-ocbc-digital.php | 2 +- .../class-omise-payment-ocbc-digital-test.php | 23 ++++++++----------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/includes/gateway/class-omise-payment-ocbc-digital.php b/includes/gateway/class-omise-payment-ocbc-digital.php index 2f9851f5..baed7371 100644 --- a/includes/gateway/class-omise-payment-ocbc-digital.php +++ b/includes/gateway/class-omise-payment-ocbc-digital.php @@ -33,7 +33,7 @@ public function init_form_fields() { 'enabled' => [ 'title' => __( 'Enable/Disable', 'omise' ), 'type' => 'checkbox', - 'label' => __( 'Enable Opn Payments OCBC digital', 'omise' ), + 'label' => __( 'Enable Opn Payments OCBC Digital', 'omise' ), 'default' => 'no' ], diff --git a/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php b/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php index d315e7d4..b33e74a2 100644 --- a/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php +++ b/tests/unit/includes/gateway/class-omise-payment-ocbc-digital-test.php @@ -81,17 +81,16 @@ function apply_filters() { */ public function getChargeRequestReturnsCorrectData() { - $order = new class { - public function get_currency() - { - return 'sgd'; - } + // Create a mock of the $order object + $orderMock = Mockery::mock('WC_Order'); + $expectedCurrency = 'SGD'; + $expectedAmount = 1000000; // in subunits - public function get_total() - { - return 10000; - } - }; + // Define expectations for the mock + $orderMock->shouldReceive('get_currency') + ->andReturn($expectedCurrency); + $orderMock->shouldReceive('get_total') + ->andReturn($expectedAmount/100); // in units if (!function_exists('wc_get_user_agent')) { function wc_get_user_agent() { @@ -99,11 +98,9 @@ function wc_get_user_agent() { } } - $expectedAmount = 1000000; - $expectedCurrency = 'sgd'; $expectedSourceType = 'mobile_banking_ocbc'; $order_id = "123"; - $result = $this->obj->get_charge_request($order_id, $order); + $result = $this->obj->get_charge_request($order_id, $orderMock); $this->assertEquals($expectedAmount, $result['amount']); $this->assertEquals($expectedCurrency, $result['currency']); $this->assertEquals($expectedSourceType, $result['source']['type']); From f4acc1cdc715e8e664ad9cfa234df50779991aa1 Mon Sep 17 00:00:00 2001 From: Aashish Date: Thu, 21 Sep 2023 10:06:55 +0700 Subject: [PATCH 6/6] Bumped version to v5.4.0 --- CHANGELOG.md | 3 +++ omise-woocommerce.php | 4 ++-- readme.txt | 6 +++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 296749e3..935dd617 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # CHANGELOG +### [v5.4.0 _(Sep 21, 2023)_](https://github.com/omise/omise-woocommerce/releases/tag/v5.4.0) +- Added OCBC Digital for Singapore PSP. (PR [#401](https://github.com/omise/omise-woocommerce/pull/401)) + ### [v5.3.1 _(Sep 05, 2023)_](https://github.com/omise/omise-woocommerce/releases/tag/v5.3.1) - Fixed capabilities api calling on every pages. (PR [#398](https://github.com/omise/omise-woocommerce/pull/398)) diff --git a/omise-woocommerce.php b/omise-woocommerce.php index 77a33002..fd1b3df6 100644 --- a/omise-woocommerce.php +++ b/omise-woocommerce.php @@ -4,7 +4,7 @@ * Plugin Name: Opn Payments * Plugin URI: https://www.omise.co/woocommerce * Description: Opn Payments is a WordPress plugin designed specifically for WooCommerce. The plugin adds support for Opn Payments Payment Gateway's payment methods to WooCommerce. - * Version: 5.3.1 + * Version: 5.4.0 * Author: Opn Payments and contributors * Author URI: https://github.com/omise/omise-woocommerce/graphs/contributors * Text Domain: omise @@ -22,7 +22,7 @@ class Omise * * @var string */ - public $version = '5.3.1'; + public $version = '5.4.0'; /** * The Omise Instance. diff --git a/readme.txt b/readme.txt index 625c9574..1f57bf7f 100644 --- a/readme.txt +++ b/readme.txt @@ -3,7 +3,7 @@ Contributors: Opn Payments Tags: opn payments, payment, payment gateway, woocommerce plugin, omise, opn, installment, internet banking, alipay, paynow, truemoney wallet, woocommerce payment Requires at least: 4.3.1 Tested up to: 6.0.2 -Stable tag: 5.3.1 +Stable tag: 5.4.0 License: MIT License URI: https://opensource.org/licenses/MIT @@ -34,6 +34,10 @@ From there: == Changelog == += 5.4.0 = + +- Added OCBC Digital for Singapore PSP. (PR [#401](https://github.com/omise/omise-woocommerce/pull/401)) + = 5.3.1 = - Fixed capabilities api calling on every pages. (PR [#398](https://github.com/omise/omise-woocommerce/pull/398))