1+ import 'dart:convert' ;
2+
13import 'package:checks/checks.dart' ;
24import 'package:flutter/material.dart' ;
35import 'package:flutter_checks/flutter_checks.dart' ;
46import 'package:flutter_test/flutter_test.dart' ;
7+ import 'package:http/http.dart' as http;
58import 'package:zulip/api/model/model.dart' ;
69import 'package:zulip/model/store.dart' ;
710import 'package:zulip/widgets/all_channels.dart' ;
@@ -12,18 +15,21 @@ import 'package:zulip/widgets/icons.dart';
1215import 'package:zulip/widgets/page.dart' ;
1316import 'package:zulip/widgets/theme.dart' ;
1417
18+ import '../api/fake_api.dart' ;
1519import '../api/model/model_checks.dart' ;
1620import '../flutter_checks.dart' ;
1721import '../model/binding.dart' ;
1822import '../example_data.dart' as eg;
1923import '../model/test_store.dart' ;
24+ import '../stdlib_checks.dart' ;
2025import 'checks.dart' ;
2126import 'test_app.dart' ;
2227
2328void main () {
2429 TestZulipBinding .ensureInitialized ();
2530
2631 late PerAccountStore store;
32+ late FakeApiConnection connection;
2733 late TransitionDurationObserver transitionDurationObserver;
2834
2935 final groupSettingWithSelf = eg.groupSetting (members: [eg.selfUser.userId]);
@@ -40,6 +46,7 @@ void main() {
4046 );
4147 await testBinding.globalStore.add (eg.selfAccount, initialSnapshot);
4248 store = await testBinding.globalStore.perAccount (eg.selfAccount.id);
49+ connection = store.connection as FakeApiConnection ;
4350
4451 transitionDurationObserver = TransitionDurationObserver ();
4552 await tester.pumpWidget (TestZulipApp (accountId: eg.selfAccount.id,
@@ -207,4 +214,28 @@ void main() {
207214
208215 check (find.byType (BottomSheet )).findsOne ();
209216 });
217+
218+ testWidgets ('use toggle switch to subscribe/unsubscribe' , (tester) async {
219+ final channel = eg.stream ();
220+ await setupAllChannelsPage (tester, channels: [channel]);
221+
222+ await tester.tap (find.byType (Toggle ));
223+ check (connection.lastRequest).isA< http.Request > ()
224+ ..method.equals ('POST' )
225+ ..url.path.equals ('/api/v1/users/me/subscriptions' )
226+ ..bodyFields.deepEquals ({
227+ 'subscriptions' : jsonEncode ([{'name' : channel.name}]),
228+ });
229+
230+ await store.addSubscription (eg.subscription (channel));
231+ await tester.pump (); // Toggle changes state
232+
233+ await tester.tap (find.byType (Toggle ));
234+ check (connection.lastRequest).isA< http.Request > ()
235+ ..method.equals ('DELETE' )
236+ ..url.path.equals ('/api/v1/users/me/subscriptions' )
237+ ..bodyFields.deepEquals ({
238+ 'subscriptions' : jsonEncode ([channel.name]),
239+ });
240+ });
210241}
0 commit comments