Skip to content

Commit 7d12a9f

Browse files
committed
fix(tests): Only mock event channel when using AppLinks >=6.0.0
1 parent 7738403 commit 7d12a9f

File tree

2 files changed

+49
-16
lines changed

2 files changed

+49
-16
lines changed

packages/supabase_flutter/test/supabase_flutter_test.dart

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:app_links/app_links.dart';
12
import 'package:flutter/services.dart';
23
import 'package:flutter_test/flutter_test.dart';
34
import 'package:supabase_flutter/supabase_flutter.dart';
@@ -95,11 +96,32 @@ void main() {
9596
group('Deep Link with PKCE code', () {
9697
late final PkceHttpClient pkceHttpClient;
9798
late final EventChannel appLinksEventChannel;
99+
late final bool mockEventChannel;
100+
101+
/// Check if the current version of AppLinks uses an explicit call to get
102+
/// the initial link. This is only the case before version 6.0.0, where we
103+
/// can find the getInitialAppLink function.
104+
bool appLinksExposesInitialLinkInStream() {
105+
try {
106+
// before app_links 6.0.0
107+
(AppLinks() as dynamic).getInitialAppLink;
108+
return false;
109+
} on NoSuchMethodError catch (_) {
110+
return true;
111+
}
112+
}
113+
98114
setUp(() async {
99115
pkceHttpClient = PkceHttpClient();
100116

101-
// Add initial deep link with a `code` parameter
117+
// Add initial deep link with a `code` parameter, use method channel if
118+
// we are in a version of AppLinks that use the explcit method for
119+
// getting the initial link. Otherwise we want to mock the event channel
120+
// and put the initial link there.
121+
mockEventChannel = appLinksExposesInitialLinkInStream();
102122
appLinksEventChannel = mockAppLink(
123+
mockMethodChannel: !mockEventChannel,
124+
mockEventChannel: mockEventChannel,
103125
initialLink: 'com.supabase://callback/?code=my-code-verifier',
104126
);
105127
await Supabase.initialize(
@@ -121,8 +143,10 @@ void main() {
121143
'Having `code` as the query parameter triggers `getSessionFromUrl` call on initialize',
122144
() async {
123145
// Wait for the initial app link to be handled, as this is an async process
124-
final stream = appLinksEventChannel.receiveBroadcastStream();
125-
await stream.first;
146+
if (mockEventChannel) {
147+
final stream = appLinksEventChannel.receiveBroadcastStream();
148+
await stream.first;
149+
}
126150
expect(pkceHttpClient.requestCount, 1);
127151
expect(pkceHttpClient.lastRequestBody['auth_code'], 'my-code-verifier');
128152
});

packages/supabase_flutter/test/widget_test_stubs.dart

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -97,26 +97,35 @@ class MockEmptyLocalStorage extends LocalStorage {
9797
/// Registers the mock handler for app_links
9898
///
9999
/// Returns the [EventChannel] used to mock the incoming links.
100-
EventChannel mockAppLink({String? initialLink}) {
100+
EventChannel mockAppLink({
101+
bool mockMethodChannel = false,
102+
bool mockEventChannel = false,
103+
String? initialLink,
104+
}) {
101105
const channel = MethodChannel('com.llfbandit.app_links/messages');
102106
const eventChannel = EventChannel('com.llfbandit.app_links/events');
103107

104108
TestWidgetsFlutterBinding.ensureInitialized();
105109

106110
// ignore: invalid_null_aware_operator
107111
TestDefaultBinaryMessengerBinding.instance?.defaultBinaryMessenger
108-
.setMockMethodCallHandler(channel, (call) async => initialLink);
109-
110-
// ignore: invalid_null_aware_operator
111-
TestDefaultBinaryMessengerBinding.instance?.defaultBinaryMessenger
112-
.setMockStreamHandler(
113-
eventChannel,
114-
MockStreamHandler.inline(
115-
onListen: (arguments, events) {
116-
events.success(initialLink);
117-
},
118-
),
119-
);
112+
.setMockMethodCallHandler(
113+
channel, (call) async => mockMethodChannel ? initialLink : null);
114+
115+
if (mockEventChannel) {
116+
// ignore: invalid_null_aware_operator
117+
TestDefaultBinaryMessengerBinding.instance?.defaultBinaryMessenger
118+
.setMockStreamHandler(
119+
eventChannel,
120+
MockStreamHandler.inline(
121+
onListen: (arguments, events) {
122+
if (mockEventChannel) {
123+
events.success(initialLink);
124+
}
125+
},
126+
),
127+
);
128+
}
120129

121130
return eventChannel;
122131
}

0 commit comments

Comments
 (0)