@@ -7,13 +7,15 @@ import 'package:flutter/material.dart';
7
7
import 'package:flutter_gen/gen_l10n/zulip_localizations.dart' ;
8
8
import 'package:flutter_test/flutter_test.dart' ;
9
9
import 'package:image_picker/image_picker.dart' ;
10
+ import 'package:zulip/api/model/events.dart' ;
10
11
import 'package:zulip/api/model/model.dart' ;
11
12
import 'package:zulip/api/route/messages.dart' ;
12
13
import 'package:zulip/model/localizations.dart' ;
13
14
import 'package:zulip/model/narrow.dart' ;
14
15
import 'package:zulip/model/store.dart' ;
15
16
import 'package:zulip/widgets/compose_box.dart' ;
16
17
import 'package:zulip/widgets/store.dart' ;
18
+ import 'package:zulip/widgets/theme.dart' ;
17
19
18
20
import '../api/fake_api.dart' ;
19
21
import '../example_data.dart' as eg;
@@ -40,14 +42,15 @@ void main() {
40
42
connection = store.connection as FakeApiConnection ;
41
43
42
44
final controllerKey = GlobalKey <ComposeBoxController >();
43
- await tester.pumpWidget (
45
+ await tester.pumpWidget (Builder (builder : (context) =>
44
46
MaterialApp (
47
+ theme: zulipThemeData (context),
45
48
localizationsDelegates: ZulipLocalizations .localizationsDelegates,
46
49
supportedLocales: ZulipLocalizations .supportedLocales,
47
50
home: GlobalStoreWidget (
48
51
child: PerAccountStoreWidget (
49
52
accountId: eg.selfAccount.id,
50
- child: ComposeBox (controllerKey: controllerKey, narrow: narrow)))));
53
+ child: ComposeBox (controllerKey: controllerKey, narrow: narrow)))))) ;
51
54
await tester.pumpAndSettle ();
52
55
53
56
return controllerKey;
@@ -373,4 +376,112 @@ void main() {
373
376
// TODO test what happens when capturing/uploading fails
374
377
});
375
378
});
379
+
380
+ group ('compose box in DMs with deactivated users' , () {
381
+ Finder contentFieldFinder () => find.descendant (
382
+ of: find.byType (ComposeBox ),
383
+ matching: find.byType (TextField ));
384
+
385
+ Finder attachButtonFinder (IconData icon) => find.descendant (
386
+ of: find.byType (ComposeBox ),
387
+ matching: find.widgetWithIcon (IconButton , icon));
388
+
389
+ void checkComposeBoxParts ({required bool areShown}) {
390
+ check (contentFieldFinder ().evaluate ().length).equals (areShown ? 1 : 0 );
391
+ check (attachButtonFinder (Icons .attach_file).evaluate ().length).equals (areShown ? 1 : 0 );
392
+ check (attachButtonFinder (Icons .image).evaluate ().length).equals (areShown ? 1 : 0 );
393
+ check (attachButtonFinder (Icons .camera_alt).evaluate ().length).equals (areShown ? 1 : 0 );
394
+ }
395
+
396
+ void checkBanner ({required bool isShown}) {
397
+ final bannerTextFinder = find.text (GlobalLocalizations .zulipLocalizations
398
+ .errorBannerDeactivatedDmLabel);
399
+ check (bannerTextFinder.evaluate ().length).equals (isShown ? 1 : 0 );
400
+ }
401
+
402
+ void checkComposeBox ({required bool isShown}) {
403
+ checkComposeBoxParts (areShown: isShown);
404
+ checkBanner (isShown: ! isShown);
405
+ }
406
+
407
+ Future <void > changeUserStatus (WidgetTester tester,
408
+ {required User user, required bool isActive}) async {
409
+ await store.handleEvent (RealmUserUpdateEvent (id: 1 ,
410
+ userId: user.userId, isActive: isActive));
411
+ await tester.pump ();
412
+ }
413
+
414
+ final selfUser = eg.selfUser;
415
+
416
+ DmNarrow dmNarrowWith (User otherUser) => DmNarrow .withUser (otherUser.userId,
417
+ selfUserId: selfUser.userId);
418
+
419
+ DmNarrow groupDmNarrowWith (List <User > otherUsers) => DmNarrow .withOtherUsers (
420
+ otherUsers.map ((u) => u.userId), selfUserId: selfUser.userId);
421
+
422
+ group ('1:1 DMs' , () {
423
+ testWidgets ('compose box replaced with a banner' , (tester) async {
424
+ final deactivatedUser = eg.user (isActive: false );
425
+ await prepareComposeBox (tester, narrow: dmNarrowWith (deactivatedUser),
426
+ users: [deactivatedUser]);
427
+ checkComposeBox (isShown: false );
428
+ });
429
+
430
+ testWidgets ('active user becomes deactivated -> '
431
+ 'compose box is replaced with a banner' , (tester) async {
432
+ final activeUser = eg.user (isActive: true );
433
+ await prepareComposeBox (tester, narrow: dmNarrowWith (activeUser),
434
+ users: [activeUser]);
435
+ checkComposeBox (isShown: true );
436
+
437
+ await changeUserStatus (tester, user: activeUser, isActive: false );
438
+ checkComposeBox (isShown: false );
439
+ });
440
+
441
+ testWidgets ('deactivated user becomes active -> '
442
+ 'banner is replaced with the compose box' , (tester) async {
443
+ final deactivatedUser = eg.user (isActive: false );
444
+ await prepareComposeBox (tester, narrow: dmNarrowWith (deactivatedUser),
445
+ users: [deactivatedUser]);
446
+ checkComposeBox (isShown: false );
447
+
448
+ await changeUserStatus (tester, user: deactivatedUser, isActive: true );
449
+ checkComposeBox (isShown: true );
450
+ });
451
+ });
452
+
453
+ group ('group DMs' , () {
454
+ testWidgets ('compose box replaced with a banner' , (tester) async {
455
+ final deactivatedUsers = [eg.user (isActive: false ), eg.user (isActive: false )];
456
+ await prepareComposeBox (tester, narrow: groupDmNarrowWith (deactivatedUsers),
457
+ users: deactivatedUsers);
458
+ checkComposeBox (isShown: false );
459
+ });
460
+
461
+ testWidgets ('at least one user becomes deactivated -> '
462
+ 'compose box is replaced with a banner' , (tester) async {
463
+ final activeUsers = [eg.user (isActive: true ), eg.user (isActive: true )];
464
+ await prepareComposeBox (tester, narrow: groupDmNarrowWith (activeUsers),
465
+ users: activeUsers);
466
+ checkComposeBox (isShown: true );
467
+
468
+ await changeUserStatus (tester, user: activeUsers[0 ], isActive: false );
469
+ checkComposeBox (isShown: false );
470
+ });
471
+
472
+ testWidgets ('all deactivated users become active -> '
473
+ 'banner is replaced with the compose box' , (tester) async {
474
+ final deactivatedUsers = [eg.user (isActive: false ), eg.user (isActive: false )];
475
+ await prepareComposeBox (tester, narrow: groupDmNarrowWith (deactivatedUsers),
476
+ users: deactivatedUsers);
477
+ checkComposeBox (isShown: false );
478
+
479
+ await changeUserStatus (tester, user: deactivatedUsers[0 ], isActive: true );
480
+ checkComposeBox (isShown: false );
481
+
482
+ await changeUserStatus (tester, user: deactivatedUsers[1 ], isActive: true );
483
+ checkComposeBox (isShown: true );
484
+ });
485
+ });
486
+ });
376
487
}
0 commit comments