Skip to content

Commit

Permalink
fix test
Browse files Browse the repository at this point in the history
  • Loading branch information
marandaneto committed Apr 2, 2024
1 parent 092c8cd commit 91ceae7
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 8 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## Next

- Allow tracking non `PageRoute` screens using the `PosthogObserver` ([#95](https://github.com/PostHog/posthog-flutter/pull/95))
- Allow overriding the route filtering usint a ctor param `routeFilter` ([#95](https://github.com/PostHog/posthog-flutter/pull/95))

## 4.3.0

Expand Down
28 changes: 26 additions & 2 deletions lib/src/posthog_observer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,26 @@ import 'posthog.dart';

typedef ScreenNameExtractor = String? Function(RouteSettings settings);

/// [PostHogRouteFilter] allows to filter out routes that should not be tracked.
///
/// By default, only [PageRoute]s are tracked.
typedef PostHogRouteFilter = bool Function(Route<dynamic>? route);

String? defaultNameExtractor(RouteSettings settings) => settings.name;

bool defaultPostHogRouteFilter(Route<dynamic>? route) => route is PageRoute;

class PosthogObserver extends RouteObserver<PageRoute<dynamic>> {
PosthogObserver({ScreenNameExtractor nameExtractor = defaultNameExtractor})
: _nameExtractor = nameExtractor;
PosthogObserver(
{ScreenNameExtractor nameExtractor = defaultNameExtractor,
PostHogRouteFilter routeFilter = defaultPostHogRouteFilter})
: _nameExtractor = nameExtractor,
_routeFilter = routeFilter;

final ScreenNameExtractor _nameExtractor;

final PostHogRouteFilter _routeFilter;

bool _isTrackeableRoute(String? name) {
return name != null && name.trim().isNotEmpty;
}
Expand All @@ -36,20 +48,32 @@ class PosthogObserver extends RouteObserver<PageRoute<dynamic>> {
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
super.didPush(route, previousRoute);

if (!_routeFilter(route)) {
return;
}

_sendScreenView(route);
}

@override
void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
super.didReplace(newRoute: newRoute, oldRoute: oldRoute);

if (!_routeFilter(newRoute)) {
return;
}

_sendScreenView(newRoute);
}

@override
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
super.didPop(route, previousRoute);

if (!_routeFilter(previousRoute)) {
return;
}

_sendScreenView(previousRoute);
}
}
44 changes: 39 additions & 5 deletions test/posthog_observer_test.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import 'dart:math';

import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:posthog_flutter/src/posthog.dart';
import 'package:posthog_flutter/src/posthog_flutter_io.dart';
import 'package:posthog_flutter/src/posthog_flutter_platform_interface.dart';
import 'package:posthog_flutter/src/posthog_observer.dart';
Expand All @@ -28,8 +25,10 @@ void main() {
});

PosthogObserver getSut(
{ScreenNameExtractor nameExtractor = defaultNameExtractor}) {
return PosthogObserver(nameExtractor: nameExtractor);
{ScreenNameExtractor nameExtractor = defaultNameExtractor,
PostHogRouteFilter routeFilter = defaultPostHogRouteFilter}) {
return PosthogObserver(
nameExtractor: nameExtractor, routeFilter: routeFilter);
}

test('returns current route name', () {
Expand Down Expand Up @@ -78,4 +77,39 @@ void main() {

expect(fake.screenName, null);
});

test('does not capture filtered routes', () {
// CustomOverlawRoute isn't a PageRoute
final overlayRoute = CustomOverlawRoute(
settings: const RouteSettings(name: 'Overlay Route'),
);

final sut = getSut();
sut.didPush(overlayRoute, null);

expect(fake.screenName, null);
});

test('allows overriding the route filter', () {
final overlayRoute = CustomOverlawRoute(
settings: const RouteSettings(name: 'Overlay Route'),
);

bool defaultPostHogRouteFilter(Route<dynamic>? route) =>
route is PageRoute || route is OverlayRoute;

final sut = getSut(routeFilter: defaultPostHogRouteFilter);
sut.didPush(overlayRoute, null);

expect(fake.screenName, 'Overlay Route');
});
}

class CustomOverlawRoute extends OverlayRoute {
CustomOverlawRoute({super.settings});

@override
Iterable<OverlayEntry> createOverlayEntries() {
return [];
}
}

0 comments on commit 91ceae7

Please sign in to comment.