Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .phpunit.cache/test-results
Original file line number Diff line number Diff line change
@@ -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}}
{"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}}
53 changes: 53 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
<?php

use Spatie\Analytics\Facades\Analytics;

test('feature in your project', function () {
// Arrange
Analytics::fake();

// Act
$response = $this->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
<?php

use Spatie\Analytics\Facades\Analytics;

test('feature in your project', function () {
// Arrange
Analytics::fake([
[
'pageTitle' => 'Test Page',
'activeUsers' => 10,
'screenPageViews' => 20,
],
]);

// Act
$response = $this->actingAs($admin)->get('/analytics');

// Assert
$response->assertStatus(200);
});
```

### Package tests

Run the tests with:

``` bash
Expand Down
7 changes: 7 additions & 0 deletions src/Facades/Analytics.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()));
}
}
19 changes: 19 additions & 0 deletions src/Fakes/Analytics.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Spatie\Analytics\Fakes;

/**
* @mixin \Spatie\Analytics\Analytics
*/
class Analytics
{
public function __construct(private mixed $result)
{
//
}

public function __call($method, $args)
{
return $this->result;
}
}
12 changes: 12 additions & 0 deletions tests/Facades/AnalyticsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

use Spatie\Analytics\Facades\Analytics;
use Spatie\Analytics\Fakes\Analytics as AnalyticsFake;

it('can fake analytics class', function () {
// Act
Analytics::fake();

// Assert
expect(Analytics::getFacadeRoot())->toBeInstanceOf(AnalyticsFake::class);
});
20 changes: 20 additions & 0 deletions tests/Fakes/AnalyticsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

use Illuminate\Support\Collection;
use Spatie\Analytics\Fakes\Analytics;
use Spatie\Analytics\Period;

it('can intercept method calls and return specified result', function () {
// Arrange
$expectedResult = Collection::make([
['pageTitle' => 'Test Page', 'activeUsers' => 10, 'screenPageViews' => 20],
]);

$instance = new Analytics($expectedResult);

// Act
$result = $instance->fetchVisitorsAndPageViews(Period::days(7));

// Assert
expect($result)->toEqual($expectedResult);
});