Skip to content

Commit

Permalink
Add test coverage for available audience sorting.
Browse files Browse the repository at this point in the history
  • Loading branch information
techanvil committed Sep 11, 2024
1 parent afb6fea commit 0f4f5cc
Showing 1 changed file with 173 additions and 43 deletions.
216 changes: 173 additions & 43 deletions tests/phpunit/integration/Modules/Analytics_4Test.php
Original file line number Diff line number Diff line change
Expand Up @@ -2967,12 +2967,13 @@ function () use ( $dimensions ) {
* Creates a fake HTTP handler with call tracking.
*
* @param string $property_id The GA4 property ID to use.
* @param Closure $local_request_handler [optional] A handler to use for local requests.
* @return Closure The fake HTTP client.
*/
protected function create_fake_http_handler( $property_id ) {
protected function create_fake_http_handler( $property_id, $local_request_handler = null ) {
$this->request_handler_calls = array();

return function ( Request $request ) use ( $property_id ) {
return function ( Request $request ) use ( $property_id, $local_request_handler ) {
$url = parse_url( $request->getUri() );
$params = json_decode( (string) $request->getBody(), true );

Expand All @@ -2991,6 +2992,10 @@ protected function create_fake_http_handler( $property_id ) {
return new Response( 200 );
}

if ( is_callable( $local_request_handler ) ) {
return $local_request_handler( $request );
}

switch ( $url['path'] ) {
case "/v1beta/properties/$property_id:runReport":
// Return a mock report.
Expand Down Expand Up @@ -4078,7 +4083,150 @@ public function get_audience() {
/**
* @dataProvider data_access_token
*/
public function test_sync_audiences( $access_token ) {
public function data_available_audiences( $access_token ) {
$raw_audiences = json_decode(
file_get_contents( GOOGLESITEKIT_PLUGIN_DIR_PATH . 'assets/js/modules/analytics-4/datastore/__fixtures__/audiences.json' ),
true
);

$available_audiences = json_decode(
file_get_contents( GOOGLESITEKIT_PLUGIN_DIR_PATH . 'assets/js/modules/analytics-4/datastore/__fixtures__/available-audiences.json' ),
true
);

$raw_audience_default_all_users = $raw_audiences[0];
$raw_audience_default_purchasers = $raw_audiences[1];
$raw_audience_site_kit_new_visitors = $raw_audiences[2];
$raw_audience_site_kit_returning_visitors = $raw_audiences[3];
$raw_audience_user_test = $raw_audiences[4];

$available_audience_default_all_users = $available_audiences[0];
$available_audience_default_purchasers = $available_audiences[1];
$available_audience_site_kit_new_visitors = $available_audiences[2];
$available_audience_site_kit_returning_visitors = $available_audiences[3];
$available_audience_user_test = $available_audiences[4];

return array(
'Site Kit audiences in correct order' => array(
$access_token,
array(
'raw_audiences' => array(
$raw_audience_site_kit_new_visitors,
$raw_audience_site_kit_returning_visitors,
),
'expected_available_audiences' => array(
$available_audience_site_kit_new_visitors,
$available_audience_site_kit_returning_visitors,
),
),
),
'Site Kit audiences in incorrect order' => array(
$access_token,
array(
'raw_audiences' => array(
$raw_audience_site_kit_returning_visitors,
$raw_audience_site_kit_new_visitors,
),
'expected_available_audiences' => array(
$available_audience_site_kit_new_visitors,
$available_audience_site_kit_returning_visitors,
),
),
),
'default audiences, case 1' => array(
$access_token,
array(
'raw_audiences' => array(
$raw_audience_default_all_users,
$raw_audience_default_purchasers,
),
// As the audiences are of the same type, and not Site Kit-created audiences, they should be returned in the order returned by the API.
'expected_available_audiences' => array(
$available_audience_default_all_users,
$available_audience_default_purchasers,
),
),
),
'default audiences, case 2' => array(
$access_token,
array(
'raw_audiences' => array(
$raw_audience_default_purchasers,
$raw_audience_default_all_users,
),
'expected_available_audiences' => array(
$available_audience_default_purchasers,
$available_audience_default_all_users,
),
),
),
'all audiences, case 1' => array(
$access_token,
array(
'raw_audiences' => array(
$raw_audience_user_test,
$raw_audience_site_kit_new_visitors,
$raw_audience_site_kit_returning_visitors,
$raw_audience_default_all_users,
$raw_audience_default_purchasers,
),
'expected_available_audiences' => array(
$available_audience_user_test,
$available_audience_site_kit_new_visitors,
$available_audience_site_kit_returning_visitors,
$available_audience_default_all_users,
$available_audience_default_purchasers,
),
),
),
'all audiences, case 2' => array(
$access_token,
array(
'raw_audiences' => array(
$raw_audience_site_kit_returning_visitors,
$raw_audience_user_test,
$raw_audience_default_purchasers,
$raw_audience_site_kit_new_visitors,
$raw_audience_default_all_users,
),
'expected_available_audiences' => array(
$available_audience_user_test,
$available_audience_site_kit_new_visitors,
$available_audience_site_kit_returning_visitors,
$available_audience_default_purchasers,
$available_audience_default_all_users,
),
),
),
'all audiences, case 3' => array(
$access_token,
array(
'raw_audiences' => array(
$raw_audience_default_purchasers,
$raw_audience_default_all_users,
$raw_audience_site_kit_returning_visitors,
$raw_audience_site_kit_new_visitors,
$raw_audience_user_test,
),
'expected_available_audiences' => array(
$available_audience_user_test,
$available_audience_site_kit_new_visitors,
$available_audience_site_kit_returning_visitors,
$available_audience_default_purchasers,
$available_audience_default_all_users,
),
),
),
);
}

/**
* @dataProvider data_available_audiences
*/
public function test_sync_audiences( $access_token, $available_audiences ) {
$raw_audiences = $available_audiences['raw_audiences'];
$expected_available_audiences = $available_audiences['expected_available_audiences'];

$this->enable_feature( 'audienceSegmentation' );

$this->setup_user_authentication( $access_token );
Expand All @@ -4096,7 +4244,25 @@ public function test_sync_audiences( $access_token ) {
$this->analytics->get_scopes()
);

$this->fake_handler_and_invoke_register_method( $property_id );
$this->fake_handler_and_invoke_register_method(
$property_id,
function ( Request $request ) use ( $raw_audiences, $property_id ) {
$url = parse_url( $request->getUri() );

if ( "/v1alpha/properties/$property_id/audiences" === $url['path'] ) {
$audiences = new GoogleAnalyticsAdminV1alphaListAudiencesResponse();
$audiences->setAudiences( $raw_audiences );

return new Response(
200,
array(),
json_encode( $audiences )
);
}

return new Response( 200 );
}
);

// Verify that the module setting is not set yet.
$this->assertEquals(
Expand Down Expand Up @@ -4130,43 +4296,7 @@ public function test_sync_audiences( $access_token ) {
// including various audience types and slugs.
$this->assertEquals(
$this->analytics->get_settings()->get()['availableAudiences'],
array(
array(
'name' => 'properties/12345/audiences/5',
'displayName' => 'Test Audience',
'description' => 'Description',
'audienceType' => 'USER_AUDIENCE',
'audienceSlug' => '',
),
array(
'name' => 'properties/12345/audiences/3',
'displayName' => 'New visitors',
'description' => 'People who visited the site for the first time',
'audienceType' => 'SITE_KIT_AUDIENCE',
'audienceSlug' => 'new-visitors',
),
array(
'name' => 'properties/12345/audiences/4',
'displayName' => 'Returning visitors',
'description' => 'People who have visited your site at least once before',
'audienceType' => 'SITE_KIT_AUDIENCE',
'audienceSlug' => 'returning-visitors',
),
array(
'name' => 'properties/12345/audiences/1',
'displayName' => 'All visitors',
'description' => 'All users',
'audienceType' => 'DEFAULT_AUDIENCE',
'audienceSlug' => 'all-users',
),
array(
'name' => 'properties/12345/audiences/2',
'displayName' => 'Purchasers',
'description' => 'Users who have made a purchase',
'audienceType' => 'DEFAULT_AUDIENCE',
'audienceSlug' => 'purchasers',
),
)
$expected_available_audiences
);

// Verify that a sync timestamp has been set.
Expand Down Expand Up @@ -4422,10 +4552,10 @@ public function block_on_consent_provider_amp() {
);
}

public function fake_handler_and_invoke_register_method( $property_id ) {
public function fake_handler_and_invoke_register_method( $property_id, $local_request_handler = null ) {
FakeHttp::fake_google_http_handler(
$this->analytics->get_client(),
$this->create_fake_http_handler( $property_id )
$this->create_fake_http_handler( $property_id, $local_request_handler )
);
$this->analytics->register();
}
Expand Down

0 comments on commit 0f4f5cc

Please sign in to comment.