Enhance/34244 update data source poller for i18n (#34247)
* Update data source poller for i18n * Update unit test * Remove unnecessary change_locale hook * Fix payment-gateway-suggestions unit test
This commit is contained in:
parent
cd5ffed61b
commit
64e14ebe7d
|
@ -0,0 +1,4 @@
|
||||||
|
Significance: patch
|
||||||
|
Type: enhancement
|
||||||
|
|
||||||
|
Add i18n support for data source poller
|
|
@ -104,14 +104,17 @@ abstract class DataSourcePoller {
|
||||||
* @return array list of specs.
|
* @return array list of specs.
|
||||||
*/
|
*/
|
||||||
public function get_specs_from_data_sources() {
|
public function get_specs_from_data_sources() {
|
||||||
$specs = get_transient( $this->args['transient_name'] );
|
$locale = get_user_locale();
|
||||||
|
$specs_group = get_transient( $this->args['transient_name'] ) ?? array();
|
||||||
|
$specs = isset( $specs_group[ $locale ] ) ? $specs_group[ $locale ] : array();
|
||||||
|
|
||||||
if ( false === $specs || ! is_array( $specs ) || 0 === count( $specs ) ) {
|
if ( ! is_array( $specs ) || empty( $specs ) ) {
|
||||||
$this->read_specs_from_data_sources();
|
$this->read_specs_from_data_sources();
|
||||||
$specs = get_transient( $this->args['transient_name'] );
|
$specs_group = get_transient( $this->args['transient_name'] );
|
||||||
|
$specs = isset( $specs_group[ $locale ] ) ? $specs_group[ $locale ] : array();
|
||||||
}
|
}
|
||||||
$specs = apply_filters( self::FILTER_NAME_SPECS, $specs, $this->id );
|
$specs = apply_filters( self::FILTER_NAME_SPECS, $specs, $this->id );
|
||||||
return false !== $specs ? $specs : array();
|
return $specs !== false ? $specs : array();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -130,14 +133,16 @@ abstract class DataSourcePoller {
|
||||||
$this->merge_specs( $specs_from_data_source, $specs, $url );
|
$this->merge_specs( $specs_from_data_source, $specs, $url );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$specs_group = get_transient( $this->args['transient_name'] ) ?? array();
|
||||||
|
$locale = get_user_locale();
|
||||||
|
$specs_group[ $locale ] = $specs;
|
||||||
// Persist the specs as a transient.
|
// Persist the specs as a transient.
|
||||||
set_transient(
|
set_transient(
|
||||||
$this->args['transient_name'],
|
$this->args['transient_name'],
|
||||||
$specs,
|
$specs_group,
|
||||||
$this->args['transient_expiry']
|
$this->args['transient_expiry']
|
||||||
);
|
);
|
||||||
|
return count( $specs ) !== 0;
|
||||||
return 0 !== count( $specs );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -161,7 +166,7 @@ abstract class DataSourcePoller {
|
||||||
$logger = self::get_logger();
|
$logger = self::get_logger();
|
||||||
$response = wp_remote_get(
|
$response = wp_remote_get(
|
||||||
add_query_arg(
|
add_query_arg(
|
||||||
'_locale',
|
'locale',
|
||||||
get_user_locale(),
|
get_user_locale(),
|
||||||
$url
|
$url
|
||||||
)
|
)
|
||||||
|
@ -181,7 +186,7 @@ abstract class DataSourcePoller {
|
||||||
$body = $response['body'];
|
$body = $response['body'];
|
||||||
$specs = json_decode( $body );
|
$specs = json_decode( $body );
|
||||||
|
|
||||||
if ( null === $specs ) {
|
if ( $specs === null ) {
|
||||||
$logger->error(
|
$logger->error(
|
||||||
'Empty response in data feed',
|
'Empty response in data feed',
|
||||||
$logger_context
|
$logger_context
|
||||||
|
|
|
@ -7,7 +7,6 @@ namespace Automattic\WooCommerce\Admin\Features\PaymentGatewaySuggestions;
|
||||||
|
|
||||||
defined( 'ABSPATH' ) || exit;
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
use Automattic\WooCommerce\Admin\RemoteInboxNotifications\SpecRunner;
|
|
||||||
use Automattic\WooCommerce\Admin\Features\PaymentGatewaySuggestions\DefaultPaymentGateways;
|
use Automattic\WooCommerce\Admin\Features\PaymentGatewaySuggestions\DefaultPaymentGateways;
|
||||||
use Automattic\WooCommerce\Admin\Features\PaymentGatewaySuggestions\PaymentGatewaysController;
|
use Automattic\WooCommerce\Admin\Features\PaymentGatewaySuggestions\PaymentGatewaysController;
|
||||||
|
|
||||||
|
@ -25,7 +24,6 @@ class Init {
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*/
|
*/
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
add_action( 'change_locale', array( __CLASS__, 'delete_specs_transient' ) );
|
|
||||||
PaymentGatewaysController::init();
|
PaymentGatewaysController::init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,6 @@ class Init {
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*/
|
*/
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
add_action( 'change_locale', array( __CLASS__, 'delete_specs_transient' ) );
|
|
||||||
add_action( 'woocommerce_updated', array( __CLASS__, 'delete_specs_transient' ) );
|
add_action( 'woocommerce_updated', array( __CLASS__, 'delete_specs_transient' ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,6 @@ class Init {
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
include_once __DIR__ . '/WCPaymentGatewayPreInstallWCPayPromotion.php';
|
include_once __DIR__ . '/WCPaymentGatewayPreInstallWCPayPromotion.php';
|
||||||
|
|
||||||
add_action( 'change_locale', array( __CLASS__, 'delete_specs_transient' ) );
|
|
||||||
|
|
||||||
$is_payments_page = isset( $_GET['page'] ) && 'wc-settings' === $_GET['page'] && isset( $_GET['tab'] ) && 'checkout' === $_GET['tab']; // phpcs:ignore WordPress.Security.NonceVerification
|
$is_payments_page = isset( $_GET['page'] ) && 'wc-settings' === $_GET['page'] && isset( $_GET['tab'] ) && 'checkout' === $_GET['tab']; // phpcs:ignore WordPress.Security.NonceVerification
|
||||||
if ( ! wp_is_json_request() && ! $is_payments_page ) {
|
if ( ! wp_is_json_request() && ! $is_payments_page ) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -5,7 +5,6 @@
|
||||||
* @package WooCommerce\Admin\Tests\PaymentGatewaySuggestions
|
* @package WooCommerce\Admin\Tests\PaymentGatewaySuggestions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Automattic\WooCommerce\Admin\Features\PaymentGatewaySuggestions\Init as PaymentGatewaySuggestions;
|
|
||||||
use Automattic\WooCommerce\Admin\DataSourcePoller;
|
use Automattic\WooCommerce\Admin\DataSourcePoller;
|
||||||
use Automattic\WooCommerce\Admin\Features\PaymentGatewaySuggestions\PaymentGatewaySuggestionsDataSourcePoller;
|
use Automattic\WooCommerce\Admin\Features\PaymentGatewaySuggestions\PaymentGatewaySuggestionsDataSourcePoller;
|
||||||
|
|
||||||
|
@ -33,7 +32,7 @@ class WC_Admin_Tests_PaymentGatewaySuggestions_DataSourcePoller extends WC_Unit_
|
||||||
function( $pre, $parsed_args, $url ) {
|
function( $pre, $parsed_args, $url ) {
|
||||||
$locale = get_locale();
|
$locale = get_locale();
|
||||||
|
|
||||||
if ( 'payment-gateway-suggestions-data-source.json?_locale=' . $locale === $url ) {
|
if ( $url === 'payment-gateway-suggestions-data-source.json?locale=' . $locale ) {
|
||||||
return array(
|
return array(
|
||||||
'body' => wp_json_encode(
|
'body' => wp_json_encode(
|
||||||
array(
|
array(
|
||||||
|
@ -51,7 +50,7 @@ class WC_Admin_Tests_PaymentGatewaySuggestions_DataSourcePoller extends WC_Unit_
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( 'payment-gateway-suggestions-data-source2.json?_locale=' . $locale === $url ) {
|
if ( $url === 'payment-gateway-suggestions-data-source2.json?locale=' . $locale ) {
|
||||||
return array(
|
return array(
|
||||||
'body' => wp_json_encode(
|
'body' => wp_json_encode(
|
||||||
array(
|
array(
|
||||||
|
@ -161,7 +160,12 @@ class WC_Admin_Tests_PaymentGatewaySuggestions_DataSourcePoller extends WC_Unit_
|
||||||
$data = $data_source_poller->get_specs_from_data_sources();
|
$data = $data_source_poller->get_specs_from_data_sources();
|
||||||
$this->assertCount( 2, $data );
|
$this->assertCount( 2, $data );
|
||||||
|
|
||||||
$data = get_transient( 'woocommerce_admin_' . PaymentGatewaySuggestionsDataSourcePoller::ID . '_specs' );
|
$data = get_transient( 'woocommerce_admin_' . PaymentGatewaySuggestionsDataSourcePoller::ID . '_specs' );
|
||||||
|
$locale = get_locale();
|
||||||
|
$this->assertArrayHasKey( $locale, $data );
|
||||||
|
|
||||||
|
$data = $data[ $locale ];
|
||||||
$this->assertCount( 2, $data );
|
$this->assertCount( 2, $data );
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,12 +52,14 @@ class WC_Admin_Tests_PaymentGatewaySuggestions_Init extends WC_Unit_Test_Case {
|
||||||
*/
|
*/
|
||||||
public function get_mock_specs() {
|
public function get_mock_specs() {
|
||||||
return array(
|
return array(
|
||||||
array(
|
'en_US' => array(
|
||||||
'id' => 'mock-gateway',
|
array(
|
||||||
'is_visible' => (object) array(
|
'id' => 'mock-gateway',
|
||||||
'type' => 'base_location_country',
|
'is_visible' => (object) array(
|
||||||
'value' => 'ZA',
|
'type' => 'base_location_country',
|
||||||
'operation' => '=',
|
'value' => 'ZA',
|
||||||
|
'operation' => '=',
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -87,11 +89,13 @@ class WC_Admin_Tests_PaymentGatewaySuggestions_Init extends WC_Unit_Test_Case {
|
||||||
set_transient(
|
set_transient(
|
||||||
'woocommerce_admin_' . PaymentGatewaySuggestionsDataSourcePoller::ID . '_specs',
|
'woocommerce_admin_' . PaymentGatewaySuggestionsDataSourcePoller::ID . '_specs',
|
||||||
array(
|
array(
|
||||||
array(
|
'en_US' => array(
|
||||||
'id' => 'mock-gateway1',
|
array(
|
||||||
),
|
'id' => 'mock-gateway1',
|
||||||
array(
|
),
|
||||||
'id' => 'mock-gateway2',
|
array(
|
||||||
|
'id' => 'mock-gateway2',
|
||||||
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@ -126,33 +130,33 @@ class WC_Admin_Tests_PaymentGatewaySuggestions_Init extends WC_Unit_Test_Case {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test that the transient is deleted on locale change.
|
* Test that matched locale specs are read from cache.
|
||||||
*/
|
*/
|
||||||
public function test_delete_transient_on_locale_change() {
|
public function test_specs_locale_transient() {
|
||||||
set_transient(
|
set_transient(
|
||||||
'woocommerce_admin_' . PaymentGatewaySuggestionsDataSourcePoller::ID . '_specs',
|
'woocommerce_admin_' . PaymentGatewaySuggestionsDataSourcePoller::ID . '_specs',
|
||||||
array(
|
array(
|
||||||
array(
|
'en_US' => array(
|
||||||
'id' => 'mock-gateway',
|
array(
|
||||||
|
'id' => 'mock-gateway',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'zh_TW' => array(
|
||||||
|
array(
|
||||||
|
'id' => 'default-gateway',
|
||||||
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
add_filter(
|
add_filter(
|
||||||
'get_available_languages',
|
'locale',
|
||||||
function( $languages ) {
|
function( $_locale ) {
|
||||||
$languages[] = 'zh_TW';
|
return 'zh_TW';
|
||||||
return $languages;
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
$wp_locale_switcher = new WP_Locale_switcher();
|
|
||||||
$wp_locale_switcher->switch_to_locale( 'zh_TW' );
|
|
||||||
|
|
||||||
$suggestions = PaymentGatewaySuggestions::get_suggestions();
|
$suggestions = PaymentGatewaySuggestions::get_suggestions();
|
||||||
|
|
||||||
$wp_locale_switcher->switch_to_locale( 'en_US' );
|
|
||||||
|
|
||||||
$this->assertEquals( 'default-gateway', $suggestions[0]->id );
|
$this->assertEquals( 'default-gateway', $suggestions[0]->id );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue