@@ -90,107 +90,118 @@ void main() {
9090 group ('Connectivity handling' , () {
9191 late MockConnectivityProvider mockConnectivity;
9292
93- setUp (() {
93+ // Initialize once with mock provider, then test state changes
94+ setUpAll (() async {
9495 mockConnectivity = MockConnectivityProvider ();
95- });
96-
97- tearDown (() {
98- mockConnectivity.dispose ();
99- });
100-
101- test ('should handle wifi connectivity' , () async {
102- // arrange
103- mockConnectivity.setConnectivity (ParseConnectivityResult .wifi);
104-
96+ // Initialize Parse once with the mock provider
10597 await Parse ().initialize (
10698 'appId' ,
10799 serverUrl,
108- debug: true ,
100+ debug: false ,
109101 fileDirectory: 'someDirectory' ,
110102 appName: 'appName' ,
111103 appPackageName: 'somePackageName' ,
112104 appVersion: 'someAppVersion' ,
113105 connectivityProvider: mockConnectivity,
114106 );
107+ });
115108
116- // act
117- final result = await mockConnectivity.checkConnectivity ();
118-
119- // assert
120- expect (result, ParseConnectivityResult .wifi);
109+ tearDownAll (() {
110+ mockConnectivity.dispose ();
121111 });
122112
123- final connectivityCases = < Map <String , dynamic >> [
113+ // Test data for parameterized connectivity state tests
114+ final connectivityTestCases = < Map <String , dynamic >> [
115+ {
116+ 'state' : ParseConnectivityResult .wifi,
117+ 'isOnline' : true ,
118+ 'description' : 'wifi should be treated as online' ,
119+ },
124120 {
125- 'desc' : 'ethernet' ,
126121 'state' : ParseConnectivityResult .ethernet,
122+ 'isOnline' : true ,
123+ 'description' : 'ethernet should be treated as online' ,
127124 },
128125 {
129- 'desc' : 'mobile' ,
130126 'state' : ParseConnectivityResult .mobile,
127+ 'isOnline' : true ,
128+ 'description' : 'mobile should be treated as online' ,
131129 },
132130 {
133- 'desc' : 'none' ,
134131 'state' : ParseConnectivityResult .none,
132+ 'isOnline' : false ,
133+ 'description' : 'none should be treated as offline' ,
135134 },
136135 ];
137136
138- for (final testCase in connectivityCases ) {
139- test ('should handle ${ testCase ['desc' ]} connectivity' , () async {
137+ for (final testCase in connectivityTestCases ) {
138+ test (testCase['description' ] , () async {
140139 // arrange
141- mockConnectivity.setConnectivity (testCase['state' ]);
142-
143- await Parse ().initialize (
144- 'appId' ,
145- serverUrl,
146- debug: true ,
147- fileDirectory: 'someDirectory' ,
148- appName: 'appName' ,
149- appPackageName: 'somePackageName' ,
150- appVersion: 'someAppVersion' ,
151- connectivityProvider: mockConnectivity,
152- );
140+ final state = testCase['state' ] as ParseConnectivityResult ;
141+ final isOnline = testCase['isOnline' ] as bool ;
153142
154143 // act
144+ mockConnectivity.setConnectivity (state);
155145 final result = await mockConnectivity.checkConnectivity ();
156146
157- // assert
158- expect (result, testCase['state' ]);
147+ // assert - verify the state is correctly identified
148+ expect (result, state);
149+ expect (result != ParseConnectivityResult .none, isOnline);
159150 });
160151 }
161- test ('should emit connectivity changes through stream' , () async {
162- // arrange
163- mockConnectivity.setConnectivity (ParseConnectivityResult .wifi);
164152
165- await Parse ().initialize (
166- 'appId' ,
167- serverUrl,
168- debug: true ,
169- fileDirectory: 'someDirectory' ,
170- appName: 'appName' ,
171- appPackageName: 'somePackageName' ,
172- appVersion: 'someAppVersion' ,
173- connectivityProvider: mockConnectivity,
174- );
175-
176- final List <ParseConnectivityResult > emittedStates = [];
153+ test ('should emit connectivity state transitions through stream' , () async {
154+ // arrange
155+ final emittedStates = < ParseConnectivityResult > [];
177156 final subscription = mockConnectivity.connectivityStream.listen ((state) {
178157 emittedStates.add (state);
179158 });
180159
181- // act
160+ // act - transition through different connectivity states
161+ mockConnectivity.setConnectivity (ParseConnectivityResult .wifi);
162+ await Future .delayed (Duration (milliseconds: 10 ));
182163 mockConnectivity.setConnectivity (ParseConnectivityResult .ethernet);
183164 await Future .delayed (Duration (milliseconds: 10 ));
184165 mockConnectivity.setConnectivity (ParseConnectivityResult .mobile);
185166 await Future .delayed (Duration (milliseconds: 10 ));
186167 mockConnectivity.setConnectivity (ParseConnectivityResult .none);
187168 await Future .delayed (Duration (milliseconds: 10 ));
188169
170+ // assert - all state changes should be emitted
171+ expect (emittedStates.length, 4 );
172+ expect (emittedStates[0 ], ParseConnectivityResult .wifi);
173+ expect (emittedStates[1 ], ParseConnectivityResult .ethernet);
174+ expect (emittedStates[2 ], ParseConnectivityResult .mobile);
175+ expect (emittedStates[3 ], ParseConnectivityResult .none);
176+
177+ // verify online states (wifi, ethernet, mobile) are not "none"
178+ expect (emittedStates[0 ], isNot (ParseConnectivityResult .none));
179+ expect (emittedStates[1 ], isNot (ParseConnectivityResult .none));
180+ expect (emittedStates[2 ], isNot (ParseConnectivityResult .none));
181+
182+ await subscription.cancel ();
183+ });
184+
185+ test ('should transition from offline to online correctly' , () async {
186+ // arrange
187+ final stateChanges = < ParseConnectivityResult > [];
188+ final subscription = mockConnectivity.connectivityStream.listen ((state) {
189+ stateChanges.add (state);
190+ });
191+
192+ // act - start offline, then go online via ethernet
193+ mockConnectivity.setConnectivity (ParseConnectivityResult .none);
194+ await Future .delayed (Duration (milliseconds: 10 ));
195+ mockConnectivity.setConnectivity (ParseConnectivityResult .ethernet);
196+ await Future .delayed (Duration (milliseconds: 10 ));
197+
189198 // assert
190- expect (emittedStates.length, 3 );
191- expect (emittedStates[0 ], ParseConnectivityResult .ethernet);
192- expect (emittedStates[1 ], ParseConnectivityResult .mobile);
193- expect (emittedStates[2 ], ParseConnectivityResult .none);
199+ expect (stateChanges.length, 2 );
200+ expect (stateChanges[0 ], ParseConnectivityResult .none);
201+ expect (stateChanges[1 ], ParseConnectivityResult .ethernet);
202+ // Verify the transition is from offline to online
203+ expect (stateChanges[0 ] == ParseConnectivityResult .none, true );
204+ expect (stateChanges[1 ] != ParseConnectivityResult .none, true );
194205
195206 await subscription.cancel ();
196207 });
0 commit comments