diff --git a/.phpunit.cache/test-results b/.phpunit.cache/test-results index d0088a1..dca3da6 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,"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/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 diff --git a/src/Facades/Analytics.php b/src/Facades/Analytics.php index 4ba7347..da43185 100644 --- a/src/Facades/Analytics.php +++ b/src/Facades/Analytics.php @@ -3,14 +3,21 @@ namespace Spatie\Analytics\Facades; 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 { return 'laravel-analytics'; } + + public static function fake(mixed $result = null) + { + return static::swap(new AnalyticsFake($result ?? collect())); + } } diff --git a/src/Fakes/Analytics.php b/src/Fakes/Analytics.php new file mode 100644 index 0000000..79e0c92 --- /dev/null +++ b/src/Fakes/Analytics.php @@ -0,0 +1,19 @@ +result; + } +} \ No newline at end of file diff --git a/tests/Facades/AnalyticsTest.php b/tests/Facades/AnalyticsTest.php new file mode 100644 index 0000000..cf30340 --- /dev/null +++ b/tests/Facades/AnalyticsTest.php @@ -0,0 +1,12 @@ +toBeInstanceOf(AnalyticsFake::class); +}); \ No newline at end of file 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