@@ -491,6 +491,82 @@ void main() {
491
491
});
492
492
});
493
493
494
+ group ('ranking across signals' , () {
495
+ void checkPrecedes (Narrow narrow, User userA, Iterable <User > usersB) {
496
+ final view = MentionAutocompleteView .init (store: store, narrow: narrow);
497
+ for (final userB in usersB) {
498
+ check (view.debugCompareUsers (userA, userB)).isLessThan (0 );
499
+ check (view.debugCompareUsers (userB, userA)).isGreaterThan (0 );
500
+ }
501
+ }
502
+
503
+ void checkRankEqual (Narrow narrow, List <User > users) {
504
+ final view = MentionAutocompleteView .init (store: store, narrow: narrow);
505
+ for (int i = 0 ; i < users.length; i++ ) {
506
+ for (int j = i + 1 ; j < users.length; j++ ) {
507
+ check (view.debugCompareUsers (users[i], users[j])).equals (0 );
508
+ check (view.debugCompareUsers (users[j], users[i])).equals (0 );
509
+ }
510
+ }
511
+ }
512
+
513
+ test ('TopicNarrow: topic recency > stream recency > DM recency' , () async {
514
+ final users = List .generate (5 , (i) => eg.user ());
515
+ final stream = eg.stream ();
516
+ final narrow = TopicNarrow (stream.streamId, 'this' );
517
+ await prepare (users: users, messages: [
518
+ eg.streamMessage (sender: users[1 ], stream: stream, topic: 'this' ),
519
+ eg.streamMessage (sender: users[0 ], stream: stream, topic: 'this' ),
520
+ eg.streamMessage (sender: users[2 ], stream: stream, topic: 'other' ),
521
+ eg.streamMessage (sender: users[1 ], stream: stream, topic: 'other' ),
522
+ eg.dmMessage (from: users[3 ], to: [users[4 ], eg.selfUser]),
523
+ eg.dmMessage (from: users[2 ], to: [eg.selfUser]),
524
+ ]);
525
+ checkPrecedes (narrow, users[0 ], users.skip (1 ));
526
+ checkPrecedes (narrow, users[1 ], users.skip (2 ));
527
+ checkPrecedes (narrow, users[2 ], users.skip (3 ));
528
+ checkRankEqual (narrow, [users[3 ], users[4 ]]);
529
+ });
530
+
531
+ test ('StreamNarrow: stream recency > DM recency' , () async {
532
+ final users = List .generate (4 , (i) => eg.user ());
533
+ final stream = eg.stream ();
534
+ final narrow = StreamNarrow (stream.streamId);
535
+ await prepare (users: users, messages: [
536
+ eg.streamMessage (sender: users[1 ], stream: stream),
537
+ eg.streamMessage (sender: users[0 ], stream: stream),
538
+ eg.dmMessage (from: users[2 ], to: [users[3 ], eg.selfUser]),
539
+ eg.dmMessage (from: users[1 ], to: [eg.selfUser]),
540
+ ]);
541
+ checkPrecedes (narrow, users[0 ], users.skip (1 ));
542
+ checkPrecedes (narrow, users[1 ], users.skip (2 ));
543
+ checkRankEqual (narrow, [users[2 ], users[3 ]]);
544
+ });
545
+
546
+ test ('DmNarrow: DM recency > this-conversation recency or stream recency' , () async {
547
+ final users = List .generate (4 , (i) => eg.user ());
548
+ await prepare (users: users, messages: [
549
+ eg.dmMessage (from: users[3 ], to: [eg.selfUser]),
550
+ eg.dmMessage (from: users[1 ], to: [users[2 ], eg.selfUser]),
551
+ eg.dmMessage (from: users[0 ], to: [eg.selfUser]),
552
+ eg.streamMessage (sender: users[1 ]),
553
+ eg.streamMessage (sender: users[2 ]),
554
+ eg.streamMessage (sender: users[3 ]),
555
+ ]);
556
+ for (final narrow in [
557
+ DmNarrow .withUser (users[3 ].userId, selfUserId: eg.selfUser.userId),
558
+ DmNarrow .withOtherUsers ([users[1 ].userId, users[2 ].userId],
559
+ selfUserId: eg.selfUser.userId),
560
+ DmNarrow .withUser (users[1 ].userId, selfUserId: eg.selfUser.userId),
561
+ ]) {
562
+ checkPrecedes (narrow, users[0 ], users.skip (1 ));
563
+ checkRankEqual (narrow, [users[1 ], users[2 ]]);
564
+ checkPrecedes (narrow, users[1 ], users.skip (3 ));
565
+ checkPrecedes (narrow, users[2 ], users.skip (3 ));
566
+ }
567
+ });
568
+ });
569
+
494
570
group ('autocomplete suggests relevant users in the intended order' , () {
495
571
// The order should be:
496
572
// 1. Users most recent in the current topic/stream.
0 commit comments