Skip to content

Commit

Permalink
Merge pull request #2012 from woocommerce/tweak/1725-site-verificatio…
Browse files Browse the repository at this point in the history
…n-error-messages

Provide more detailed error reasons when unable to complete site verification
  • Loading branch information
eason9487 authored Jul 13, 2023
2 parents 38b94ec + 2cab1cd commit 86bb562
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 32 deletions.
30 changes: 22 additions & 8 deletions src/API/Google/SiteVerification.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

namespace Automattic\WooCommerce\GoogleListingsAndAds\API\Google;

use Automattic\WooCommerce\GoogleListingsAndAds\Exception\ExceptionWithResponseData;
use Automattic\WooCommerce\GoogleListingsAndAds\Internal\ContainerAwareTrait;
use Automattic\WooCommerce\GoogleListingsAndAds\Internal\Interfaces\ContainerAwareInterface;
use Automattic\WooCommerce\GoogleListingsAndAds\Options\OptionsAwareInterface;
Expand All @@ -27,6 +28,7 @@
class SiteVerification implements ContainerAwareInterface, OptionsAwareInterface {

use ContainerAwareTrait;
use ExceptionTrait;
use OptionsAwareTrait;
use PluginHelper;

Expand Down Expand Up @@ -94,7 +96,7 @@ public function verify_site( string $site_url ) {
* @param string $identifier The URL of the site to verify (including protocol).
*
* @return string The meta tag to be used for verification.
* @throws Exception When unable to retrieve meta token.
* @throws ExceptionWithResponseData When unable to retrieve meta token.
*/
protected function get_token( string $identifier ): string {
/** @var SiteVerificationService $service */
Expand All @@ -116,9 +118,15 @@ protected function get_token( string $identifier ): string {
$response = $service->webResource->getToken( $post_body );
} catch ( GoogleServiceException $e ) {
do_action( 'woocommerce_gla_sv_client_exception', $e, __METHOD__ );
throw new Exception(
__( 'Unable to retrieve site verification token.', 'google-listings-and-ads' ),
$e->getCode()

$errors = $this->get_exception_errors( $e );

throw new ExceptionWithResponseData(
/* translators: %s Error message */
sprintf( __( 'Unable to retrieve site verification token: %s', 'google-listings-and-ads' ), reset( $errors ) ),
$e->getCode(),
null,
[ 'errors' => $errors ]
);
}

Expand All @@ -131,7 +139,7 @@ protected function get_token( string $identifier ): string {
*
* @param string $identifier The URL of the site to verify (including protocol).
*
* @throws Exception When unable to verify token.
* @throws ExceptionWithResponseData When unable to verify token.
*/
protected function insert( string $identifier ) {
/** @var SiteVerificationService $service */
Expand All @@ -152,9 +160,15 @@ protected function insert( string $identifier ) {
$service->webResource->insert( self::VERIFICATION_METHOD, $post_body );
} catch ( GoogleServiceException $e ) {
do_action( 'woocommerce_gla_sv_client_exception', $e, __METHOD__ );
throw new Exception(
__( 'Unable to insert site verification.', 'google-listings-and-ads' ),
$e->getCode()

$errors = $this->get_exception_errors( $e );

throw new ExceptionWithResponseData(
/* translators: %s Error message */
sprintf( __( 'Unable to insert site verification: %s', 'google-listings-and-ads' ), reset( $errors ) ),
$e->getCode(),
null,
[ 'errors' => $errors ]
);
}
}
Expand Down
46 changes: 22 additions & 24 deletions tests/Unit/API/Google/SiteVerificationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
namespace Automattic\WooCommerce\GoogleListingsAndAds\Tests\Unit\API\Google;

use Automattic\WooCommerce\GoogleListingsAndAds\API\Google\SiteVerification;
use Automattic\WooCommerce\GoogleListingsAndAds\Exception\ExceptionWithResponseData;
use Automattic\WooCommerce\GoogleListingsAndAds\Options\OptionsInterface;
use Automattic\WooCommerce\GoogleListingsAndAds\Tests\Framework\UnitTest;
use Automattic\WooCommerce\GoogleListingsAndAds\Tests\Tools\HelperTrait\MerchantTrait;
use Automattic\WooCommerce\GoogleListingsAndAds\Vendor\League\Container\Container;
use Automattic\WooCommerce\GoogleListingsAndAds\Vendor\Google\Service\Exception as GoogleServiceException;
use Automattic\WooCommerce\GoogleListingsAndAds\Vendor\Google\Service\SiteVerification as SiteVerificationService;
Expand All @@ -23,6 +25,8 @@
*/
class SiteVerificationTest extends UnitTest {

use MerchantTrait;

/** @var MockObject|OptionsInterface $options */
protected $options;

Expand Down Expand Up @@ -71,37 +75,31 @@ public function test_verify_site_invalid_url() {
public function test_verify_site_token_exception() {
$this->verification_service->webResource
->method( 'getToken' )
->willThrowException( new GoogleServiceException( 'error', 400 ) );

try {
$this->verification->verify_site( $this->site_url );
} catch ( Exception $e ) {
$this->assertEquals( 1, did_action( 'woocommerce_gla_site_verify_failure' ) );
$this->assertEquals( 400, $e->getCode() );
$this->assertEquals(
'Unable to retrieve site verification token.',
$e->getMessage()
);
}
->willThrowException( $this->get_google_service_exception( 400, 'No available tokens' ) );

$this->expectException( ExceptionWithResponseData::class );
$this->expectExceptionCode( 400 );
$this->expectExceptionMessage( 'Unable to retrieve site verification token: No available tokens' );

$this->verification->verify_site( $this->site_url );

$this->assertEquals( 1, did_action( 'woocommerce_gla_site_verify_failure' ) );
}

public function test_verify_site_insert_exception() {
$this->mock_service_get_token();

$this->verification_service->webResource
->method( 'insert' )
->willThrowException( new GoogleServiceException( 'error', 400 ) );

try {
$this->verification->verify_site( $this->site_url );
} catch ( Exception $e ) {
$this->assertEquals( 1, did_action( 'woocommerce_gla_site_verify_failure' ) );
$this->assertEquals( 400, $e->getCode() );
$this->assertEquals(
'Unable to insert site verification.',
$e->getMessage()
);
}
->willThrowException( $this->get_google_service_exception( 400, 'No necessary verification token.' ) );

$this->expectException( ExceptionWithResponseData::class );
$this->expectExceptionCode( 400 );
$this->expectExceptionMessage( 'Unable to insert site verification: No necessary verification token.' );

$this->verification->verify_site( $this->site_url );

$this->assertEquals( 1, did_action( 'woocommerce_gla_site_verify_failure' ) );
}

public function test_verify_site() {
Expand Down

0 comments on commit 86bb562

Please sign in to comment.