@@ -13,6 +13,7 @@ import 'package:zulip/widgets/button.dart';
1313import 'package:zulip/widgets/home.dart' ;
1414import 'package:zulip/widgets/icons.dart' ;
1515import 'package:zulip/widgets/page.dart' ;
16+ import 'package:zulip/widgets/remote_settings.dart' ;
1617import 'package:zulip/widgets/theme.dart' ;
1718
1819import '../api/fake_api.dart' ;
@@ -23,6 +24,7 @@ import '../example_data.dart' as eg;
2324import '../model/test_store.dart' ;
2425import '../stdlib_checks.dart' ;
2526import 'checks.dart' ;
27+ import 'dialog_checks.dart' ;
2628import 'test_app.dart' ;
2729
2830void main () {
@@ -238,4 +240,37 @@ void main() {
238240 'subscriptions' : jsonEncode ([channel.name]),
239241 });
240242 });
243+
244+ testWidgets ('Toggle "off" to unsubscribe, but without resubscribe permission' , (tester) async {
245+ final channel = eg.stream (
246+ inviteOnly: true , canSubscribeGroup: eg.groupSetting (members: []));
247+ final subscription = eg.subscription (channel);
248+
249+ (Widget , Widget ) checkConfirmDialog () => checkSuggestedActionDialog (tester,
250+ expectedTitle: 'Unsubscribe from #${channel .name }?' ,
251+ expectedMessage: 'Once you leave this channel, you will not be able to rejoin.' ,
252+ expectDestructiveActionButton: true ,
253+ expectedActionButtonText: 'Unsubscribe' );
254+
255+ await setupAllChannelsPage (tester, channels: [subscription]);
256+
257+ await tester.tap (find.byType (Toggle ));
258+ await tester.pump ();
259+ final (_, cancelButton) = checkConfirmDialog ();
260+ await tester.tap (find.byWidget (cancelButton));
261+ await tester.pumpAndSettle ();
262+ check (connection.lastRequest).isNull ();
263+ await tester.pump (RemoteSettingBuilder .localEchoIdleTimeout);
264+
265+ await tester.tap (find.byType (Toggle ));
266+ await tester.pump ();
267+ final (unsubscribeButton, _) = checkConfirmDialog ();
268+ await tester.tap (find.byWidget (unsubscribeButton));
269+ check (connection.lastRequest).isA< http.Request > ()
270+ ..method.equals ('DELETE' )
271+ ..url.path.equals ('/api/v1/users/me/subscriptions' )
272+ ..bodyFields.deepEquals ({
273+ 'subscriptions' : jsonEncode ([channel.name]),
274+ });
275+ });
241276}
0 commit comments