From 787ac79566219178f550a224c781bc005ae23b9e Mon Sep 17 00:00:00 2001 From: Chikondi Kamwendo Date: Tue, 22 Apr 2025 18:47:32 +0200 Subject: [PATCH 1/5] Feat: adds fake analytics class and swap ability in analytics facade. --- .phpunit.cache/test-results | 2 +- src/Facades/Analytics.php | 6 ++++++ src/Fakes/Analytics.php | 10 ++++++++++ tests/Facades/AnalyticsTest.php | 14 ++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/Fakes/Analytics.php create mode 100644 tests/Facades/AnalyticsTest.php diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index d0088a1..ad4862c 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":"pest_3.7.4","defects":{"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_file":8,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_to_be_array":8},"times":{"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_property_id_is_not_set":0.019,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_file":0.028,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_credentials_json_does_not_exist":0,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_to_be_array":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views":0.002,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views_by_date":0.013,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_total_visitor_and_page_views":0,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_most_visited_pages":0,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_referrers":0,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_browsers":0,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_countries":0,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_operating_systems":0,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_dimensions":0,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_metrics":0,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_days":0.005,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_months":0,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_years":0,"P\\Tests\\PeriodTest::__pest_evaluable_it_provides_a_create_method":0,"P\\Tests\\PeriodTest::__pest_evaluable_it_accepts_datetime_immutable_instances":0,"P\\Tests\\PeriodTest::__pest_evaluable_it_will_throw_an_exception_if_the_start_date_comes_after_the_end_date":0,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_a_date_to_a_Carbon_object":0,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_integers":0,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_return_a_string_as_a_default":0}} \ No newline at end of file +{"version":"pest_3.8.2","defects":{"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":7},"times":{"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_property_id_is_not_set":0.025,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_file":0.049,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_credentials_json_does_not_exist":0.001,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_to_be_array":0.002,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views":0.005,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views_by_date":0.027,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_total_visitor_and_page_views":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_most_visited_pages":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_referrers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_browsers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_countries":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_operating_systems":0.001,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_dimensions":0.001,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_metrics":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_days":0.013,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_months":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_years":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_provides_a_create_method":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_accepts_datetime_immutable_instances":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_will_throw_an_exception_if_the_start_date_comes_after_the_end_date":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_a_date_to_a_Carbon_object":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_integers":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_return_a_string_as_a_default":0.001,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":0.028,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":0.034,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":0.026}} \ No newline at end of file diff --git a/src/Facades/Analytics.php b/src/Facades/Analytics.php index 4ba7347..0cd194e 100644 --- a/src/Facades/Analytics.php +++ b/src/Facades/Analytics.php @@ -3,6 +3,7 @@ namespace Spatie\Analytics\Facades; use Illuminate\Support\Facades\Facade; +use Spatie\Analytics\Fakes\Analytics as AnalyticsFake; /** * @mixin \Spatie\Analytics\Analytics @@ -13,4 +14,9 @@ protected static function getFacadeAccessor(): string { return 'laravel-analytics'; } + + public static function fake() + { + return static::swap(new AnalyticsFake()); + } } diff --git a/src/Fakes/Analytics.php b/src/Fakes/Analytics.php new file mode 100644 index 0000000..8f7ebf8 --- /dev/null +++ b/src/Fakes/Analytics.php @@ -0,0 +1,10 @@ +only(); + +it('can fake analytics class', function () { + // Act + Analytics::fake(); + + // Assert + expect(Analytics::isFake())->toBeTrue(); +}); \ No newline at end of file From 8dcfaa88205d049b58cf559680cf48fdeb1b48b0 Mon Sep 17 00:00:00 2001 From: Chikondi Kamwendo Date: Tue, 22 Apr 2025 19:10:04 +0200 Subject: [PATCH 2/5] Feat: fake analytics class intercepts user called methods and returns specified result. --- .phpunit.cache/test-results | 2 +- src/Facades/Analytics.php | 9 +++++++-- src/Fakes/Analytics.php | 17 ++++++++++++++++- tests/Facades/AnalyticsTest.php | 3 --- tests/Fakes/AnalyticsTest.php | 20 ++++++++++++++++++++ 5 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 tests/Fakes/AnalyticsTest.php diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index ad4862c..a70235a 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":"pest_3.8.2","defects":{"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":7},"times":{"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_property_id_is_not_set":0.025,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_file":0.049,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_credentials_json_does_not_exist":0.001,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_to_be_array":0.002,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views":0.005,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views_by_date":0.027,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_total_visitor_and_page_views":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_most_visited_pages":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_referrers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_browsers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_countries":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_operating_systems":0.001,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_dimensions":0.001,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_metrics":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_days":0.013,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_months":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_years":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_provides_a_create_method":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_accepts_datetime_immutable_instances":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_will_throw_an_exception_if_the_start_date_comes_after_the_end_date":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_a_date_to_a_Carbon_object":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_integers":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_return_a_string_as_a_default":0.001,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":0.028,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":0.034,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":0.026}} \ No newline at end of file +{"version":"pest_3.8.2","defects":{"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":7,"P\\Tests\\Fakes\\AnalyticsTest::__pest_evaluable_it_can_intercept_method_calls_and_return_specified_result":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":8},"times":{"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_property_id_is_not_set":0.03,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_file":0.059,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_credentials_json_does_not_exist":0.001,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_to_be_array":0.002,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views":0.008,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views_by_date":0.029,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_total_visitor_and_page_views":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_most_visited_pages":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_referrers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_browsers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_countries":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_operating_systems":0.001,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_dimensions":0,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_metrics":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_days":0.014,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_months":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_years":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_provides_a_create_method":0,"P\\Tests\\PeriodTest::__pest_evaluable_it_accepts_datetime_immutable_instances":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_will_throw_an_exception_if_the_start_date_comes_after_the_end_date":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_a_date_to_a_Carbon_object":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_integers":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_return_a_string_as_a_default":0,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":0.028,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":0.034,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":0.002,"P\\Tests\\Fakes\\AnalyticsTest::__pest_evaluable_it_can_intercept_method_calls_and_return_specified_result":0.002}} \ No newline at end of file diff --git a/src/Facades/Analytics.php b/src/Facades/Analytics.php index 0cd194e..8e48792 100644 --- a/src/Facades/Analytics.php +++ b/src/Facades/Analytics.php @@ -2,12 +2,14 @@ namespace Spatie\Analytics\Facades; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Facade; use Spatie\Analytics\Fakes\Analytics as AnalyticsFake; /** * @mixin \Spatie\Analytics\Analytics */ + class Analytics extends Facade { protected static function getFacadeAccessor(): string @@ -15,8 +17,11 @@ protected static function getFacadeAccessor(): string return 'laravel-analytics'; } - public static function fake() + /** + * @param array|Collection $result + */ + public static function fake($result = []) { - return static::swap(new AnalyticsFake()); + return static::swap(new AnalyticsFake($result)); } } diff --git a/src/Fakes/Analytics.php b/src/Fakes/Analytics.php index 8f7ebf8..a2e5566 100644 --- a/src/Fakes/Analytics.php +++ b/src/Fakes/Analytics.php @@ -2,9 +2,24 @@ namespace Spatie\Analytics\Fakes; +use Illuminate\Support\Collection; use Illuminate\Support\Testing\Fakes\Fake; +/** + * @mixin \Spatie\Analytics\Analytics + */ class Analytics implements Fake { - // + /** + * @param array|Collection $result + */ + public function __construct(private $result) + { + // + } + + public function __call($method, $args) + { + return $this->result; + } } \ No newline at end of file diff --git a/tests/Facades/AnalyticsTest.php b/tests/Facades/AnalyticsTest.php index 237cd15..7006eb4 100644 --- a/tests/Facades/AnalyticsTest.php +++ b/tests/Facades/AnalyticsTest.php @@ -1,9 +1,6 @@ only(); it('can fake analytics class', function () { // Act diff --git a/tests/Fakes/AnalyticsTest.php b/tests/Fakes/AnalyticsTest.php new file mode 100644 index 0000000..a17003c --- /dev/null +++ b/tests/Fakes/AnalyticsTest.php @@ -0,0 +1,20 @@ + 'Test Page', 'activeUsers' => 10, 'screenPageViews' => 20], + ]); + + $instance = new Analytics($expectedResult); + + // Act + $result = $instance->fetchVisitorsAndPageViews(Period::days(7)); + + // Assert + expect($result)->toEqual($expectedResult); +}); \ No newline at end of file From 06384315e5aee3f0a3d686e4b57431c4d730191b Mon Sep 17 00:00:00 2001 From: Chikondi Kamwendo Date: Tue, 22 Apr 2025 20:02:30 +0200 Subject: [PATCH 3/5] Docs: Updates README to include faking usage. --- README.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/README.md b/README.md index ca60cff..f13ab34 100644 --- a/README.md +++ b/README.md @@ -313,9 +313,62 @@ $metricFilter = new FilterExpression([ ]), ]), ]); +``` ## Testing +### Faking + +To fake calls within the package in your own project you can use the `fake` method on the `Spatie\Analytics\Facades\Analytics` facade. + +For example: + +```php +actingAs($admin)->get('/analytics'); + + // Assert + $response->assertStatus(200); +}); +``` + +You can also specify the expected result either as an array or `Illuminate\Support\Collection` to be returned when a method is called on the facade. + +For example: + +```php + 'Test Page', + 'activeUsers' => 10, + 'screenPageViews' => 20, + ], + ]); + + // Act + $response = $this->actingAs($admin)->get('/analytics'); + + // Assert + $response->assertStatus(200); +}); +``` + +### Package tests + Run the tests with: ``` bash From af5124ff9a641f51e9d70d489c0d24595807fe03 Mon Sep 17 00:00:00 2001 From: Chikondi Kamwendo Date: Fri, 25 Apr 2025 19:02:33 +0200 Subject: [PATCH 4/5] Update: Refactored Fakes\Analytics to not depend on Fake interface and updated corresponding tests accordingly. --- .phpunit.cache/test-results | 2 +- src/Fakes/Analytics.php | 3 +-- tests/Facades/AnalyticsTest.php | 3 ++- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index a70235a..8366e0e 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":"pest_3.8.2","defects":{"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":7,"P\\Tests\\Fakes\\AnalyticsTest::__pest_evaluable_it_can_intercept_method_calls_and_return_specified_result":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":8},"times":{"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_property_id_is_not_set":0.03,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_file":0.059,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_credentials_json_does_not_exist":0.001,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_to_be_array":0.002,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views":0.008,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views_by_date":0.029,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_total_visitor_and_page_views":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_most_visited_pages":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_referrers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_browsers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_countries":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_operating_systems":0.001,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_dimensions":0,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_metrics":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_days":0.014,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_months":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_years":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_provides_a_create_method":0,"P\\Tests\\PeriodTest::__pest_evaluable_it_accepts_datetime_immutable_instances":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_will_throw_an_exception_if_the_start_date_comes_after_the_end_date":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_a_date_to_a_Carbon_object":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_integers":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_return_a_string_as_a_default":0,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":0.028,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":0.034,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":0.002,"P\\Tests\\Fakes\\AnalyticsTest::__pest_evaluable_it_can_intercept_method_calls_and_return_specified_result":0.002}} \ No newline at end of file +{"version":"pest_3.8.2","defects":{"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":7,"P\\Tests\\Fakes\\AnalyticsTest::__pest_evaluable_it_can_intercept_method_calls_and_return_specified_result":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":7},"times":{"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_property_id_is_not_set":0.049,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_file":0.094,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_credentials_json_does_not_exist":0.001,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_to_be_array":0.003,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views":0.009,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views_by_date":0.044,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_total_visitor_and_page_views":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_most_visited_pages":0.002,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_referrers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_browsers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_countries":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_operating_systems":0.001,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_dimensions":0.001,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_metrics":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_days":0.021,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_months":0.002,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_years":0.002,"P\\Tests\\PeriodTest::__pest_evaluable_it_provides_a_create_method":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_accepts_datetime_immutable_instances":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_will_throw_an_exception_if_the_start_date_comes_after_the_end_date":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_a_date_to_a_Carbon_object":0.002,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_integers":0.002,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_return_a_string_as_a_default":0.001,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":0.028,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":0.034,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":0.002,"P\\Tests\\Fakes\\AnalyticsTest::__pest_evaluable_it_can_intercept_method_calls_and_return_specified_result":0.002}} \ No newline at end of file diff --git a/src/Fakes/Analytics.php b/src/Fakes/Analytics.php index a2e5566..10b54ee 100644 --- a/src/Fakes/Analytics.php +++ b/src/Fakes/Analytics.php @@ -3,12 +3,11 @@ namespace Spatie\Analytics\Fakes; use Illuminate\Support\Collection; -use Illuminate\Support\Testing\Fakes\Fake; /** * @mixin \Spatie\Analytics\Analytics */ -class Analytics implements Fake +class Analytics { /** * @param array|Collection $result diff --git a/tests/Facades/AnalyticsTest.php b/tests/Facades/AnalyticsTest.php index 7006eb4..cf30340 100644 --- a/tests/Facades/AnalyticsTest.php +++ b/tests/Facades/AnalyticsTest.php @@ -1,11 +1,12 @@ toBeTrue(); + expect(Analytics::getFacadeRoot())->toBeInstanceOf(AnalyticsFake::class); }); \ No newline at end of file From 14118a78ff22b96335c56edf95c29d0522b0d2d8 Mon Sep 17 00:00:00 2001 From: Chikondi Kamwendo Date: Fri, 25 Apr 2025 19:17:18 +0200 Subject: [PATCH 5/5] Update: Updated faker argument to mixed and set default argument to collection --- .phpunit.cache/test-results | 2 +- src/Facades/Analytics.php | 8 ++------ src/Fakes/Analytics.php | 7 +------ 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index 8366e0e..dca3da6 100644 --- a/.phpunit.cache/test-results +++ b/.phpunit.cache/test-results @@ -1 +1 @@ -{"version":"pest_3.8.2","defects":{"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":7,"P\\Tests\\Fakes\\AnalyticsTest::__pest_evaluable_it_can_intercept_method_calls_and_return_specified_result":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":7},"times":{"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_property_id_is_not_set":0.049,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_file":0.094,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_credentials_json_does_not_exist":0.001,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_to_be_array":0.003,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views":0.009,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views_by_date":0.044,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_total_visitor_and_page_views":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_most_visited_pages":0.002,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_referrers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_browsers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_countries":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_operating_systems":0.001,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_dimensions":0.001,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_metrics":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_days":0.021,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_months":0.002,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_years":0.002,"P\\Tests\\PeriodTest::__pest_evaluable_it_provides_a_create_method":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_accepts_datetime_immutable_instances":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_will_throw_an_exception_if_the_start_date_comes_after_the_end_date":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_a_date_to_a_Carbon_object":0.002,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_integers":0.002,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_return_a_string_as_a_default":0.001,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":0.028,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":0.034,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":0.002,"P\\Tests\\Fakes\\AnalyticsTest::__pest_evaluable_it_can_intercept_method_calls_and_return_specified_result":0.002}} \ No newline at end of file +{"version":"pest_3.8.2","defects":{"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":7,"P\\Tests\\Fakes\\AnalyticsTest::__pest_evaluable_it_can_intercept_method_calls_and_return_specified_result":8,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":7},"times":{"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_property_id_is_not_set":0.041,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_file":0.075,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_will_throw_an_exception_if_the_credentials_json_does_not_exist":0.001,"P\\Tests\\AnalyticsServiceProviderTest::__pest_evaluable_it_allows_credentials_json_to_be_array":0.003,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views":0.009,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_visitor_and_page_views_by_date":0.043,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_total_visitor_and_page_views":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_most_visited_pages":0.002,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_referrers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_browsers":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_countries":0.001,"P\\Tests\\AnalyticsTest::__pest_evaluable_it_can_fetch_the_top_operating_systems":0.001,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_dimensions":0.003,"P\\Tests\\OrderByTest::__pest_evaluable_it_should_create_GoogleOrderBy_objects_for_metrics":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_days":0.032,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_months":0.002,"P\\Tests\\PeriodTest::__pest_evaluable_it_can_create_a_period_for_a_given_amount_of_years":0.002,"P\\Tests\\PeriodTest::__pest_evaluable_it_provides_a_create_method":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_accepts_datetime_immutable_instances":0.001,"P\\Tests\\PeriodTest::__pest_evaluable_it_will_throw_an_exception_if_the_start_date_comes_after_the_end_date":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_a_date_to_a_Carbon_object":0.001,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_cast_integers":0.002,"P\\Tests\\TypeCasterTest::__pest_evaluable_it_should_return_a_string_as_a_default":0.001,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics":0.028,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_to_be_removed":0.034,"P\\Tests\\Facades\\AnalyticsTest::__pest_evaluable_it_can_fake_analytics_class":0.002,"P\\Tests\\Fakes\\AnalyticsTest::__pest_evaluable_it_can_intercept_method_calls_and_return_specified_result":0.002}} \ No newline at end of file diff --git a/src/Facades/Analytics.php b/src/Facades/Analytics.php index 8e48792..da43185 100644 --- a/src/Facades/Analytics.php +++ b/src/Facades/Analytics.php @@ -2,7 +2,6 @@ namespace Spatie\Analytics\Facades; -use Illuminate\Support\Collection; use Illuminate\Support\Facades\Facade; use Spatie\Analytics\Fakes\Analytics as AnalyticsFake; @@ -17,11 +16,8 @@ protected static function getFacadeAccessor(): string return 'laravel-analytics'; } - /** - * @param array|Collection $result - */ - public static function fake($result = []) + public static function fake(mixed $result = null) { - return static::swap(new AnalyticsFake($result)); + return static::swap(new AnalyticsFake($result ?? collect())); } } diff --git a/src/Fakes/Analytics.php b/src/Fakes/Analytics.php index 10b54ee..79e0c92 100644 --- a/src/Fakes/Analytics.php +++ b/src/Fakes/Analytics.php @@ -2,17 +2,12 @@ namespace Spatie\Analytics\Fakes; -use Illuminate\Support\Collection; - /** * @mixin \Spatie\Analytics\Analytics */ class Analytics { - /** - * @param array|Collection $result - */ - public function __construct(private $result) + public function __construct(private mixed $result) { // }