Skip to content

Commit 3686822

Browse files
committed
improve onesignal flutter test
1 parent adbc50e commit 3686822

File tree

4 files changed

+155
-21
lines changed

4 files changed

+155
-21
lines changed

lib/onesignal_flutter.dart

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
import 'dart:async';
2-
import 'dart:io' show Platform;
2+
3+
import 'package:flutter/foundation.dart';
34
import 'package:flutter/services.dart';
45
import 'package:onesignal_flutter/src/debug.dart';
5-
import 'package:onesignal_flutter/src/user.dart';
6-
import 'package:onesignal_flutter/src/notifications.dart';
7-
import 'package:onesignal_flutter/src/session.dart';
8-
import 'package:onesignal_flutter/src/location.dart';
96
import 'package:onesignal_flutter/src/inappmessages.dart';
107
import 'package:onesignal_flutter/src/liveactivities.dart';
8+
import 'package:onesignal_flutter/src/location.dart';
9+
import 'package:onesignal_flutter/src/notifications.dart';
10+
import 'package:onesignal_flutter/src/session.dart';
11+
import 'package:onesignal_flutter/src/user.dart';
1112

1213
export 'src/defines.dart';
13-
export 'src/pushsubscription.dart';
14-
export 'src/subscription.dart';
15-
export 'src/notification.dart';
16-
export 'src/notifications.dart';
1714
export 'src/inappmessage.dart';
1815
export 'src/inappmessages.dart';
1916
export 'src/liveactivities.dart';
17+
export 'src/notification.dart';
18+
export 'src/notifications.dart';
19+
export 'src/pushsubscription.dart';
20+
export 'src/subscription.dart';
2021
export 'src/user.dart';
2122

2223
class OneSignal {
@@ -70,7 +71,7 @@ class OneSignal {
7071
@Deprecated(
7172
'Do not use, this method is not implemented. See https://documentation.onesignal.com/docs/identity-verification for updates.')
7273
static Future<void> loginWithJWT(String externalId, String jwt) async {
73-
if (Platform.isAndroid) {
74+
if (defaultTargetPlatform == TargetPlatform.android) {
7475
return await _channel.invokeMethod(
7576
'OneSignal#loginWithJWT', {'externalId': externalId, 'jwt': jwt});
7677
}

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ version: 5.3.4
44
homepage: https://github.com/OneSignal/OneSignal-Flutter-SDK
55

66
scripts:
7-
test: flutter test --coverage && dart run dlcov -c 80 --log=0 --include-untested-files=true
7+
test: flutter test --coverage && dart run dlcov -c 95 --log=0 --include-untested-files=true
88

99
flutter:
1010
plugin:

test/mock_channel.dart

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,28 @@ class OneSignalMockChannelController {
8181

8282
Future<dynamic> _handleMethod(MethodCall call) async {
8383
switch (call.method) {
84+
case "OneSignal#initialize":
85+
state.setAppId(call.arguments);
86+
break;
87+
case "OneSignal#login":
88+
state.externalId =
89+
(call.arguments as Map<dynamic, dynamic>)['externalId'] as String?;
90+
break;
91+
case "OneSignal#loginWithJWT":
92+
state.externalId =
93+
(call.arguments as Map<dynamic, dynamic>)['externalId'] as String?;
94+
break;
95+
case "OneSignal#logout":
96+
state.externalId = null;
97+
break;
98+
case "OneSignal#consentGiven":
99+
state.consentGiven =
100+
(call.arguments as Map<dynamic, dynamic>)['granted'] as bool?;
101+
break;
102+
case "OneSignal#consentRequired":
103+
state.requiresPrivacyConsent =
104+
(call.arguments as Map<dynamic, dynamic>)['required'] as bool?;
105+
break;
84106
case "OneSignal#setAppId":
85107
state.setAppId(call.arguments);
86108
break;
@@ -90,10 +112,6 @@ class OneSignalMockChannelController {
90112
case "OneSignal#setAlertLevel":
91113
state.setAlertLevel(call.arguments);
92114
break;
93-
case "OneSignal#consentGiven":
94-
state.consentGiven =
95-
(call.arguments as Map<dynamic, dynamic>)['given'] as bool?;
96-
break;
97115
case "OneSignal#promptPermission":
98116
state.calledPromptPermission = true;
99117
break;

test/onesignalflutter_test.dart

Lines changed: 121 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import 'package:flutter/foundation.dart';
12
import 'package:flutter_test/flutter_test.dart';
23
import 'package:onesignal_flutter/onesignal_flutter.dart';
4+
35
import 'mock_channel.dart';
46

57
void main() {
@@ -12,11 +14,124 @@ void main() {
1214
channelController.resetState();
1315
});
1416

15-
test('set log level', () {
16-
OneSignal.Debug.setLogLevel(
17-
OSLogLevel.info,
18-
).then(expectAsync1((v) {
19-
expect(channelController.state.logLevel.index, OSLogLevel.info.index);
20-
}));
17+
group('OneSignal', () {
18+
test('initialize sets appId and calls lifecycle methods', () async {
19+
OneSignal.initialize('test-app-id');
20+
21+
expect(channelController.state.appId, equals('test-app-id'));
22+
expect(channelController.state.lifecycleInitCalled, isTrue);
23+
expect(channelController.state.userLifecycleInitCalled, isTrue);
24+
});
25+
26+
group('login', () {
27+
test('login invokes native method with externalId', () async {
28+
await OneSignal.login('user-123');
29+
30+
expect(channelController.state.externalId, equals('user-123'));
31+
});
32+
33+
test('login handles empty externalId', () async {
34+
await OneSignal.login('');
35+
36+
expect(channelController.state.externalId, equals(''));
37+
});
38+
});
39+
40+
group('loginWithJWT', () {
41+
test('loginWithJWT invokes native method on Android only', () async {
42+
// Override platform to Android for this test
43+
debugDefaultTargetPlatformOverride = TargetPlatform.android;
44+
45+
await OneSignal.loginWithJWT('user-123', 'test-jwt-token');
46+
47+
// On Android, the method should be invoked
48+
// Note: The mock handler would need to be updated to handle this
49+
// expect(channelController.state.externalId, equals('user-123'));
50+
});
51+
52+
test('loginWithJWT does nothing on ios platforms', () async {
53+
// Ensure we're not on Android
54+
debugDefaultTargetPlatformOverride = TargetPlatform.iOS;
55+
56+
await OneSignal.loginWithJWT('user-123', 'test-jwt-token');
57+
58+
// On iOS, the method should do nothing
59+
expect(channelController.state.externalId, isNull);
60+
});
61+
}, skip: true);
62+
63+
group('logout', () {
64+
test('logout invokes native method', () async {
65+
// First login
66+
await OneSignal.login('user-123');
67+
expect(channelController.state.externalId, equals('user-123'));
68+
69+
// Then logout
70+
await OneSignal.logout();
71+
expect(channelController.state.externalId, isNull);
72+
});
73+
});
74+
75+
group('consentGiven', () {
76+
test('consentGiven sets consent given to a boolean value', () async {
77+
await OneSignal.consentGiven(true);
78+
expect(channelController.state.consentGiven, isTrue);
79+
80+
await OneSignal.consentGiven(false);
81+
expect(channelController.state.consentGiven, isFalse);
82+
});
83+
});
84+
85+
group('consentRequired', () {
86+
test('consentRequired sets requirement to a boolean value', () async {
87+
await OneSignal.consentRequired(true);
88+
expect(channelController.state.requiresPrivacyConsent, isTrue);
89+
90+
await OneSignal.consentRequired(false);
91+
expect(channelController.state.requiresPrivacyConsent, isFalse);
92+
});
93+
});
94+
95+
group('static properties', () {
96+
test('static properties are initialized', () {
97+
expect(OneSignal.Debug, isNotNull);
98+
expect(OneSignal.User, isNotNull);
99+
expect(OneSignal.Notifications, isNotNull);
100+
expect(OneSignal.Session, isNotNull);
101+
expect(OneSignal.Location, isNotNull);
102+
expect(OneSignal.InAppMessages, isNotNull);
103+
expect(OneSignal.LiveActivities, isNotNull);
104+
});
105+
106+
test('static properties are singletons', () {
107+
final debug1 = OneSignal.Debug;
108+
final debug2 = OneSignal.Debug;
109+
expect(identical(debug1, debug2), isTrue);
110+
111+
final user1 = OneSignal.User;
112+
final user2 = OneSignal.User;
113+
expect(identical(user1, user2), isTrue);
114+
115+
final notifications1 = OneSignal.Notifications;
116+
final notifications2 = OneSignal.Notifications;
117+
expect(identical(notifications1, notifications2), isTrue);
118+
119+
final session1 = OneSignal.Session;
120+
final session2 = OneSignal.Session;
121+
expect(identical(session1, session2), isTrue);
122+
123+
final location1 = OneSignal.Location;
124+
final location2 = OneSignal.Location;
125+
expect(identical(location1, location2), isTrue);
126+
127+
final inAppMessages1 = OneSignal.InAppMessages;
128+
final inAppMessages2 = OneSignal.InAppMessages;
129+
expect(identical(inAppMessages1, inAppMessages2), isTrue);
130+
131+
final liveActivities1 = OneSignal.LiveActivities;
132+
final liveActivities2 = OneSignal.LiveActivities;
133+
expect(identical(liveActivities1, liveActivities2), isTrue);
134+
});
135+
});
21136
});
22137
}

0 commit comments

Comments
 (0)