Skip to content

Commit 2bcae67

Browse files
Feat: Adds faking ability to facade (#538)
* Feat: adds fake analytics class and swap ability in analytics facade. * Feat: fake analytics class intercepts user called methods and returns specified result. * Docs: Updates README to include faking usage. * Update: Refactored Fakes\Analytics to not depend on Fake interface and updated corresponding tests accordingly. * Update: Updated faker argument to mixed and set default argument to collection
1 parent 9b29d43 commit 2bcae67

File tree

6 files changed

+112
-1
lines changed

6 files changed

+112
-1
lines changed

.phpunit.cache/test-results

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +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}}
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.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}}

README.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,9 +313,62 @@ $metricFilter = new FilterExpression([
313313
]),
314314
]),
315315
]);
316+
```
316317

317318
## Testing
318319

320+
### Faking
321+
322+
To fake calls within the package in your own project you can use the `fake` method on the `Spatie\Analytics\Facades\Analytics` facade.
323+
324+
For example:
325+
326+
```php
327+
<?php
328+
329+
use Spatie\Analytics\Facades\Analytics;
330+
331+
test('feature in your project', function () {
332+
// Arrange
333+
Analytics::fake();
334+
335+
// Act
336+
$response = $this->actingAs($admin)->get('/analytics');
337+
338+
// Assert
339+
$response->assertStatus(200);
340+
});
341+
```
342+
343+
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.
344+
345+
For example:
346+
347+
```php
348+
<?php
349+
350+
use Spatie\Analytics\Facades\Analytics;
351+
352+
test('feature in your project', function () {
353+
// Arrange
354+
Analytics::fake([
355+
[
356+
'pageTitle' => 'Test Page',
357+
'activeUsers' => 10,
358+
'screenPageViews' => 20,
359+
],
360+
]);
361+
362+
// Act
363+
$response = $this->actingAs($admin)->get('/analytics');
364+
365+
// Assert
366+
$response->assertStatus(200);
367+
});
368+
```
369+
370+
### Package tests
371+
319372
Run the tests with:
320373

321374
``` bash

src/Facades/Analytics.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,21 @@
33
namespace Spatie\Analytics\Facades;
44

55
use Illuminate\Support\Facades\Facade;
6+
use Spatie\Analytics\Fakes\Analytics as AnalyticsFake;
67

78
/**
89
* @mixin \Spatie\Analytics\Analytics
910
*/
11+
1012
class Analytics extends Facade
1113
{
1214
protected static function getFacadeAccessor(): string
1315
{
1416
return 'laravel-analytics';
1517
}
18+
19+
public static function fake(mixed $result = null)
20+
{
21+
return static::swap(new AnalyticsFake($result ?? collect()));
22+
}
1623
}

src/Fakes/Analytics.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Spatie\Analytics\Fakes;
4+
5+
/**
6+
* @mixin \Spatie\Analytics\Analytics
7+
*/
8+
class Analytics
9+
{
10+
public function __construct(private mixed $result)
11+
{
12+
//
13+
}
14+
15+
public function __call($method, $args)
16+
{
17+
return $this->result;
18+
}
19+
}

tests/Facades/AnalyticsTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
use Spatie\Analytics\Facades\Analytics;
4+
use Spatie\Analytics\Fakes\Analytics as AnalyticsFake;
5+
6+
it('can fake analytics class', function () {
7+
// Act
8+
Analytics::fake();
9+
10+
// Assert
11+
expect(Analytics::getFacadeRoot())->toBeInstanceOf(AnalyticsFake::class);
12+
});

tests/Fakes/AnalyticsTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
use Illuminate\Support\Collection;
4+
use Spatie\Analytics\Fakes\Analytics;
5+
use Spatie\Analytics\Period;
6+
7+
it('can intercept method calls and return specified result', function () {
8+
// Arrange
9+
$expectedResult = Collection::make([
10+
['pageTitle' => 'Test Page', 'activeUsers' => 10, 'screenPageViews' => 20],
11+
]);
12+
13+
$instance = new Analytics($expectedResult);
14+
15+
// Act
16+
$result = $instance->fetchVisitorsAndPageViews(Period::days(7));
17+
18+
// Assert
19+
expect($result)->toEqual($expectedResult);
20+
});

0 commit comments

Comments
 (0)