diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e945a3..13f85e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add `shouldTrackEvents` property + ## [1.0.1] - 2024-04-26 ### Changed diff --git a/src/Trackers/MixpanelTracker.php b/src/Trackers/MixpanelTracker.php index cb9feb3..2a237e1 100644 --- a/src/Trackers/MixpanelTracker.php +++ b/src/Trackers/MixpanelTracker.php @@ -2,6 +2,7 @@ namespace Placetopay\AnalyticsTracker\Trackers; +use Closure; use Mixpanel; use Placetopay\AnalyticsTracker\Contracts\AnalyticsTracker; @@ -9,6 +10,7 @@ class MixpanelTracker implements AnalyticsTracker { private ?Mixpanel $mixpanel = null; private array $defaultPayload = []; + private ?Closure $shouldTrackEvents = null; public function __construct() { @@ -26,7 +28,16 @@ public function __construct() public function track(string $label, array $payload = []): void { - $this->mixpanel?->track($label, array_merge($this->defaultPayload, $payload)); + if ($this->shouldTrack($label, $payload)) { + $this->mixpanel?->track($label, array_merge($this->defaultPayload, $payload)); + } + } + + private function shouldTrack(string $label, array $payload = []) + { + return is_callable($this->shouldTrackEvents) + ? ($this->shouldTrackEvents)($label, $payload) + : true; } public function setDefaultPayload(array $payload): self @@ -35,6 +46,12 @@ public function setDefaultPayload(array $payload): self return $this; } + public function shouldTrackEvents(callable $shouldTrackEvents): self + { + $this->shouldTrackEvents = Closure::fromCallable($shouldTrackEvents); + return $this; + } + private function enabled(): bool { return config('analytics-tracker.mixpanel.enabled'); diff --git a/tests/Unit/Trackers/MixpanelTrackerTest.php b/tests/Unit/Trackers/MixpanelTrackerTest.php index aea864f..290093c 100644 --- a/tests/Unit/Trackers/MixpanelTrackerTest.php +++ b/tests/Unit/Trackers/MixpanelTrackerTest.php @@ -101,6 +101,69 @@ public function it_does_not_track_when_disabled(): void $mixpanelTracker->track($label); } + /** + * @test + */ + public function it_decides_to_track_events_with_function(): void + { + $mixpanelMock = $this->createMock(Mixpanel::class); + $mixpanelMock->expects($this->once()) + ->method('track') + ->with('EventTracked', ['prop1' => 'value1']); + + $this->app->offsetSet(Mixpanel::class, $mixpanelMock); + + $shouldTrackEvent = function (string $label, array $payload) { + $this->assertArrayHasKey('prop1', $payload); + + return $label === 'EventTracked'; + }; + + $mixpanelTracker = (new MixpanelTracker())->shouldTrackEvents($shouldTrackEvent); + $mixpanelTracker->track('EventDropped', ['prop1' => 'value1']); + $mixpanelTracker->track('EventTracked', ['prop1' => 'value1']); + } + + /** + * @test + */ + public function it_decides_to_track_events_with_an_invokable(): void + { + $mixpanelMock = $this->createMock(Mixpanel::class); + $mixpanelMock->expects($this->once()) + ->method('track') + ->with('EventTracked', ['prop1' => 'value1']); + + $this->app->offsetSet(Mixpanel::class, $mixpanelMock); + + $shouldTrackEvent = new class { + public function __invoke(string $label, array $payload) + { + return $label === 'EventTracked'; + } + }; + + $mixpanelTracker = (new MixpanelTracker())->shouldTrackEvents($shouldTrackEvent); + $mixpanelTracker->track('EventDropped', ['prop1' => 'value1']); + $mixpanelTracker->track('EventTracked', ['prop1' => 'value1']); + } + + /** + * @test + */ + public function it_does_not_track_when_should_not_track_events(): void + { + $mixpanelMock = $this->createMock(Mixpanel::class); + $mixpanelMock->expects($this->never()) + ->method('track') + ->with('EventDropped', ['prop1' => 'value1']); + + $this->app->offsetSet(Mixpanel::class, $mixpanelMock); + + $mixpanelTracker = (new MixpanelTracker())->shouldTrackEvents(fn () => false); + $mixpanelTracker->track('EventDropped', ['prop1' => 'value1']); + } + /** * @test */