Skip to content

Commit f304ec4

Browse files
rajveermalviyachrisbobbe
authored andcommitted
msglist test: Add test for messagesCloseInTime, and update a related test
Fixes: #1825
1 parent 65922be commit f304ec4

File tree

1 file changed

+64
-15
lines changed

1 file changed

+64
-15
lines changed

test/model/message_list_test.dart

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2946,11 +2946,16 @@ void main() {
29462946
// whether the sender should be shown, but the difference between
29472947
// fetchInitial and handleMessageEvent etc. doesn't matter.
29482948

2949-
// TODO(#1825) test that messagesCloseInTime gets used
2949+
// Elapse test's clock to a specific time, to avoid any flaky-ness
2950+
// that may be caused by a specific local time of the day.
2951+
final initialTime = DateTime(2035, 8, 21);
2952+
async.elapse(initialTime.difference(clock.now()));
29502953

29512954
final now = clock.now();
29522955
final t1 = eg.utcTimestamp(now.subtract(Duration(days: 1)));
2953-
final t2 = eg.utcTimestamp(now);
2956+
final t2 = t1 + Duration(minutes: 1).inSeconds;
2957+
final t3 = t2 + Duration(minutes: 10, seconds: 1).inSeconds;
2958+
final t4 = eg.utcTimestamp(now);
29542959
final stream = eg.stream(streamId: eg.defaultStreamMessageStreamId);
29552960
Message streamMessage(int timestamp, User sender) =>
29562961
eg.streamMessage(sender: sender,
@@ -2966,15 +2971,17 @@ void main() {
29662971
streamMessage(t1, eg.selfUser), // first message, so show sender
29672972
streamMessage(t1, eg.selfUser), // hide sender
29682973
streamMessage(t1, eg.otherUser), // no recipient header, but new sender
2969-
dmMessage( t1, eg.otherUser), // same sender, but new recipient
2970-
dmMessage( t2, eg.otherUser), // same sender/recipient, but new day
2974+
streamMessage(t2, eg.otherUser), // same sender, and within 10 mins of last message
2975+
streamMessage(t3, eg.otherUser), // same sender, but after 10 mins from last message
2976+
dmMessage( t3, eg.otherUser), // same sender, but new recipient
2977+
dmMessage( t4, eg.otherUser), // same sender/recipient, but new day
29712978
]);
29722979
await prepareOutboxMessagesTo([
29732980
dmDestination([eg.selfUser, eg.otherUser]), // same day, but new sender
29742981
dmDestination([eg.selfUser, eg.otherUser]), // hide sender
29752982
]);
29762983
assert(
2977-
store.outboxMessages.values.every((message) => message.timestamp == t2));
2984+
store.outboxMessages.values.every((message) => message.timestamp == t4));
29782985
async.elapse(kLocalEchoDebounceDuration);
29792986

29802987
// We check showSender has the right values in [checkInvariants],
@@ -2984,6 +2991,8 @@ void main() {
29842991
(it) => it.isA<MessageListMessageItem>().showSender.isTrue(),
29852992
(it) => it.isA<MessageListMessageItem>().showSender.isFalse(),
29862993
(it) => it.isA<MessageListMessageItem>().showSender.isTrue(),
2994+
(it) => it.isA<MessageListMessageItem>().showSender.isFalse(),
2995+
(it) => it.isA<MessageListMessageItem>().showSender.isTrue(),
29872996
(it) => it.isA<MessageListRecipientHeaderItem>(),
29882997
(it) => it.isA<MessageListMessageItem>().showSender.isTrue(),
29892998
(it) => it.isA<MessageListDateSeparatorItem>(),
@@ -3074,14 +3083,14 @@ void main() {
30743083
});
30753084
});
30763085

3077-
test('messagesSameDay', () {
3078-
// These timestamps will differ depending on the timezone of the
3079-
// environment where the tests are run, in order to give the same results
3080-
// in the code under test which is also based on the ambient timezone.
3081-
// TODO(dart): It'd be great if tests could control the ambient timezone,
3082-
// so as to exercise cases like where local time falls back across midnight.
3083-
int timestampFromLocalTime(String date) => DateTime.parse(date).millisecondsSinceEpoch ~/ 1000;
3086+
// These timestamps will differ depending on the timezone of the
3087+
// environment where the tests are run, in order to give the same results
3088+
// in the code under test which is also based on the ambient timezone.
3089+
// TODO(dart): It'd be great if tests could control the ambient timezone,
3090+
// so as to exercise cases like where local time falls back across midnight.
3091+
int timestampFromLocalTime(String date) => DateTime.parse(date).millisecondsSinceEpoch ~/ 1000;
30843092

3093+
test('messagesSameDay', () {
30853094
const t111a = '2021-01-01 00:00:00';
30863095
const t111b = '2021-01-01 12:00:00';
30873096
const t111c = '2021-01-01 23:59:58';
@@ -3121,7 +3130,46 @@ void main() {
31213130
}
31223131
});
31233132

3124-
// TODO(#1825) test messagesCloseInTime
3133+
group('messagesCloseInTime', () {
3134+
final stream = eg.stream();
3135+
void doTest(String time0, String time1, bool expected) {
3136+
test('$time0 vs $time1 -> $expected', () {
3137+
check(messagesCloseInTime(
3138+
eg.streamMessage(stream: stream, topic: 'foo', timestamp: timestampFromLocalTime(time0)),
3139+
eg.streamMessage(stream: stream, topic: 'foo', timestamp: timestampFromLocalTime(time1)),
3140+
)).equals(expected);
3141+
check(messagesCloseInTime(
3142+
eg.dmMessage(from: eg.selfUser, to: [], timestamp: timestampFromLocalTime(time0)),
3143+
eg.dmMessage(from: eg.selfUser, to: [], timestamp: timestampFromLocalTime(time1)),
3144+
)).equals(expected);
3145+
check(messagesCloseInTime(
3146+
eg.streamOutboxMessage(timestamp: timestampFromLocalTime(time0)),
3147+
eg.streamOutboxMessage(timestamp: timestampFromLocalTime(time1)),
3148+
)).equals(expected);
3149+
check(messagesCloseInTime(
3150+
eg.dmOutboxMessage(from: eg.selfUser, to: [], timestamp: timestampFromLocalTime(time0)),
3151+
eg.dmOutboxMessage(from: eg.selfUser, to: [], timestamp: timestampFromLocalTime(time1)),
3152+
)).equals(expected);
3153+
});
3154+
}
3155+
3156+
const time = '2021-01-01 00:30:00';
3157+
3158+
doTest('2021-01-01 00:19:59', time, false);
3159+
doTest('2021-01-01 00:20:00', time, true);
3160+
doTest('2021-01-01 00:29:59', time, true);
3161+
doTest('2021-01-01 00:30:00', time, true);
3162+
3163+
doTest(time, '2021-01-01 00:30:01', true);
3164+
doTest(time, '2021-01-01 00:39:59', true);
3165+
doTest(time, '2021-01-01 00:40:00', true);
3166+
doTest(time, '2021-01-01 00:40:01', false);
3167+
3168+
doTest(time, '2022-01-01 00:30:00', false);
3169+
doTest(time, '2021-02-01 00:30:00', false);
3170+
doTest(time, '2021-01-02 00:30:00', false);
3171+
doTest(time, '2021-01-01 01:30:00', false);
3172+
});
31253173
}
31263174

31273175
MessageListView? _lastModel;
@@ -3238,9 +3286,10 @@ void checkInvariants(MessageListView model) {
32383286
check(model.items[i++]).isA<MessageListDateSeparatorItem>()
32393287
.message.identicalTo(allMessages[j]);
32403288
showSender = true;
3289+
} else if (allMessages[j-1].senderId == allMessages[j].senderId) {
3290+
showSender = !messagesCloseInTime(allMessages[j-1], allMessages[j]);
32413291
} else {
3242-
// TODO(#1825) adjust to reflect messagesCloseInTime
3243-
showSender = allMessages[j].senderId != allMessages[j-1].senderId;
3292+
showSender = true;
32443293
}
32453294
if (j < model.messages.length) {
32463295
check(model.items[i]).isA<MessageListMessageItem>()

0 commit comments

Comments
 (0)