From 48f1c4662aa55ab30b23d19a6cbc12ea2edab478 Mon Sep 17 00:00:00 2001 From: Matthew Batchelder Date: Mon, 30 Oct 2023 14:01:37 -0400 Subject: [PATCH 1/4] Add opt_in_user to the data we are sending to telemetry This adds the logic for injecting the opted in user when present and adds a test. --- src/Telemetry/Telemetry/Telemetry.php | 18 +++-- tests/wpunit/Telemetry_Test.php | 102 ++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 5 deletions(-) diff --git a/src/Telemetry/Telemetry/Telemetry.php b/src/Telemetry/Telemetry/Telemetry.php index 2cf2105..072a9db 100644 --- a/src/Telemetry/Telemetry/Telemetry.php +++ b/src/Telemetry/Telemetry/Telemetry.php @@ -394,13 +394,21 @@ protected function get_option() { * @return array */ protected function get_send_data_args() { + $opt_in_user = get_option( Status::OPTION_NAME_USER_INFO, [] ); + + $args = [ + 'token' => $this->get_token(), + 'telemetry' => wp_json_encode( $this->provider->get_data() ), + 'stellar_slugs' => wp_json_encode( $this->opt_in_status->get_opted_in_plugins() ), + ]; + + if ( ! empty( $opt_in_user ) ) { + $args['opt_in_user'] = wp_json_encode( $opt_in_user ); + } + return apply_filters( 'stellarwp/telemetry/' . Config::get_hook_prefix() . 'send_data_args', - [ - 'token' => $this->get_token(), - 'telemetry' => wp_json_encode( $this->provider->get_data() ), - 'stellar_slugs' => wp_json_encode( $this->opt_in_status->get_opted_in_plugins() ), - ] + $args ); } diff --git a/tests/wpunit/Telemetry_Test.php b/tests/wpunit/Telemetry_Test.php index 8b9e604..c723646 100644 --- a/tests/wpunit/Telemetry_Test.php +++ b/tests/wpunit/Telemetry_Test.php @@ -243,4 +243,106 @@ public function should_not_send_data_without_authorization(): void { $this->assertFalse( $sent ); } + + /** + * It should include the opt-in user when sending data. + * + * @test + */ + public function should_send_data_with_optin_user(): void { + set_current_user( 1 ); + + $mock_response = [ + 'headers' => [], + 'body' => json_encode( // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode + [ + 'status' => 'success', + 'token' => '1234567890', + ] + ), + 'response' => [ + 'code' => false, + 'message' => false, + ], + 'cookies' => [], + 'http_response' => null, + ]; + $call_url = null; + $call_args = null; + $this->set_fn_return( + 'wp_remote_post', + static function ( string $url, array $args ) use ( $mock_response, &$call_url, &$call_args ) { + $call_url = $url; + $call_args = $args; + + return $mock_response; + }, + true + ); + + $opt_in_status = new Status(); + $telemetry = new Telemetry( new Null_Data_Provider(), $opt_in_status ); + + $opt_in_status->set_status( true ); + + $telemetry->register_user(); + $telemetry->save_token( '2389' ); + $sent = $telemetry->send_data(); + + $this->assertEquals( Config::get_server_url() . '/telemetry', $call_url ); + $this->assertArrayHasKey( 'opt_in_user', $call_args['body'] ); + $this->assertTrue( $sent ); + } + /** + * It should include the opt-in user when sending data. + * + * @test + */ + public function should_send_data_without_optin_user_if_missing(): void { + set_current_user( 1 ); + + $mock_response = [ + 'headers' => [], + 'body' => json_encode( // phpcs:ignore WordPress.WP.AlternativeFunctions.json_encode_json_encode + [ + 'status' => 'success', + 'token' => '1234567890', + ] + ), + 'response' => [ + 'code' => false, + 'message' => false, + ], + 'cookies' => [], + 'http_response' => null, + ]; + $call_url = null; + $call_args = null; + $this->set_fn_return( + 'wp_remote_post', + static function ( string $url, array $args ) use ( $mock_response, &$call_url, &$call_args ) { + $call_url = $url; + $call_args = $args; + + return $mock_response; + }, + true + ); + + $opt_in_status = new Status(); + $telemetry = new Telemetry( new Null_Data_Provider(), $opt_in_status ); + + $opt_in_status->set_status( true ); + + $telemetry->register_user(); + $telemetry->save_token( '2389' ); + + delete_option( Status::OPTION_NAME_USER_INFO ); + + $sent = $telemetry->send_data(); + + $this->assertEquals( Config::get_server_url() . '/telemetry', $call_url ); + $this->assertArrayNotHasKey( 'opt_in_user', $call_args['body'] ); + $this->assertTrue( $sent ); + } } From 8dd799a986dedcfe91d5c9e6e6e6c32b72bef96d Mon Sep 17 00:00:00 2001 From: Matthew Batchelder Date: Mon, 30 Oct 2023 14:12:10 -0400 Subject: [PATCH 2/4] Use wp_set_current_user --- tests/wpunit/Telemetry_Test.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/wpunit/Telemetry_Test.php b/tests/wpunit/Telemetry_Test.php index 7276b2d..bbb1ad8 100644 --- a/tests/wpunit/Telemetry_Test.php +++ b/tests/wpunit/Telemetry_Test.php @@ -249,7 +249,7 @@ public function should_not_send_data_without_authorization(): void { * @test */ public function should_send_data_with_optin_user(): void { - set_current_user( 1 ); + wp_set_current_user( 1 ); $mock_response = [ 'headers' => [], @@ -298,7 +298,7 @@ static function ( string $url, array $args ) use ( $mock_response, &$call_url, & * @test */ public function should_send_data_without_optin_user_if_missing(): void { - set_current_user( 1 ); + wp_set_current_user( 1 ); $mock_response = [ 'headers' => [], From 41c5407d5536a4f9f0464c2f20858e25f590e518 Mon Sep 17 00:00:00 2001 From: Tanner Record Date: Mon, 30 Oct 2023 14:35:43 -0400 Subject: [PATCH 3/4] Update to include opt-in user in telemetry json --- src/Telemetry/Telemetry/Telemetry.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Telemetry/Telemetry/Telemetry.php b/src/Telemetry/Telemetry/Telemetry.php index 072a9db..0f9b45b 100644 --- a/src/Telemetry/Telemetry/Telemetry.php +++ b/src/Telemetry/Telemetry/Telemetry.php @@ -390,22 +390,24 @@ protected function get_option() { * Gets the args for sending data to the telemetry server. * * @since 1.0.0 + * @since TBD - Updated to include the opted in user with the telemetry json. * * @return array */ protected function get_send_data_args() { $opt_in_user = get_option( Status::OPTION_NAME_USER_INFO, [] ); + $telemetry = $this->provider->get_data(); + + if ( count( $opt_in_user ) > 0 ) { + $telemetry['opt_in_user'] = $opt_in_user; + } $args = [ 'token' => $this->get_token(), - 'telemetry' => wp_json_encode( $this->provider->get_data() ), + 'telemetry' => wp_json_encode( $telemetry ), 'stellar_slugs' => wp_json_encode( $this->opt_in_status->get_opted_in_plugins() ), ]; - if ( ! empty( $opt_in_user ) ) { - $args['opt_in_user'] = wp_json_encode( $opt_in_user ); - } - return apply_filters( 'stellarwp/telemetry/' . Config::get_hook_prefix() . 'send_data_args', $args From d65fc1dbab17a9d68c21f3f272cee9aaed6ae261 Mon Sep 17 00:00:00 2001 From: Tanner Record Date: Mon, 30 Oct 2023 15:14:35 -0400 Subject: [PATCH 4/4] Update tests --- tests/wpunit/Telemetry_Test.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/wpunit/Telemetry_Test.php b/tests/wpunit/Telemetry_Test.php index bbb1ad8..fe7ac87 100644 --- a/tests/wpunit/Telemetry_Test.php +++ b/tests/wpunit/Telemetry_Test.php @@ -289,9 +289,10 @@ static function ( string $url, array $args ) use ( $mock_response, &$call_url, & $sent = $telemetry->send_data(); $this->assertEquals( Config::get_server_url() . '/telemetry', $call_url ); - $this->assertArrayHasKey( 'opt_in_user', $call_args['body'] ); + $this->assertArrayHasKey( 'opt_in_user', json_decode( $call_args['body']['telemetry'], true ) ); $this->assertTrue( $sent ); } + /** * It should include the opt-in user when sending data. * @@ -341,7 +342,7 @@ static function ( string $url, array $args ) use ( $mock_response, &$call_url, & $sent = $telemetry->send_data(); $this->assertEquals( Config::get_server_url() . '/telemetry', $call_url ); - $this->assertArrayNotHasKey( 'opt_in_user', $call_args['body'] ); + $this->assertArrayNotHasKey( 'opt_in_user', json_decode( $call_args['body']['telemetry'], true ) ); $this->assertTrue( $sent ); } }