Skip to content

Commit 945066c

Browse files
committed
emoji test: Add tests for emojiDisplayFor
Now that this logic has been pulled out to model code, we can more easily write tests for it.
1 parent d0d9fb8 commit 945066c

File tree

1 file changed

+89
-0
lines changed

1 file changed

+89
-0
lines changed

test/model/emoji_test.dart

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import 'package:checks/checks.dart';
2+
import 'package:test/scaffolding.dart';
3+
import 'package:zulip/api/model/model.dart';
4+
import 'package:zulip/model/emoji.dart';
5+
6+
import '../example_data.dart' as eg;
7+
8+
void main() {
9+
group('emojiDisplayFor', () {
10+
test('Unicode emoji', () {
11+
check(eg.store().emojiDisplayFor(emojiType: ReactionType.unicodeEmoji,
12+
emojiCode: '1f642', emojiName: 'smile')
13+
).isA<UnicodeEmojiDisplay>()
14+
..emojiName.equals('smile')
15+
..emojiUnicode.equals('🙂');
16+
});
17+
18+
test('invalid Unicode emoji -> no crash', () {
19+
check(eg.store().emojiDisplayFor(emojiType: ReactionType.unicodeEmoji,
20+
emojiCode: 'asdf', emojiName: 'invalid')
21+
).isA<TextEmojiDisplay>()
22+
.emojiName.equals('invalid');
23+
});
24+
25+
test('realm emoji', () {
26+
final store = eg.store(initialSnapshot: eg.initialSnapshot(realmEmoji: {
27+
'100': eg.realmEmojiItem(emojiCode: '100', emojiName: 'logo',
28+
sourceUrl: '/emoji/100.png'),
29+
'123': eg.realmEmojiItem(emojiCode: '123', emojiName: '100',
30+
sourceUrl: '/emoji/123.png'),
31+
'200': eg.realmEmojiItem(emojiCode: '200', emojiName: 'dancing',
32+
sourceUrl: '/emoji/200.png', stillUrl: '/emoji/200-still.png'),
33+
}));
34+
35+
Subject<EmojiDisplay> checkDisplay({
36+
required String emojiCode, required String emojiName}) {
37+
return check(store.emojiDisplayFor(emojiType: ReactionType.realmEmoji,
38+
emojiCode: emojiCode, emojiName: emojiName)
39+
)..emojiName.equals(emojiName);
40+
}
41+
42+
checkDisplay(emojiCode: '100', emojiName: 'logo').isA<ImageEmojiDisplay>()
43+
..resolvedUrl.equals(eg.realmUrl.resolve('/emoji/100.png'))
44+
..resolvedStillUrl.isNull();
45+
46+
// Emoji code matches against emoji code, not against emoji name.
47+
checkDisplay(emojiCode: '123', emojiName: '100').isA<ImageEmojiDisplay>()
48+
..resolvedUrl.equals(eg.realmUrl.resolve('/emoji/123.png'))
49+
..resolvedStillUrl.isNull();
50+
51+
// Unexpected name is accepted.
52+
checkDisplay(emojiCode: '100', emojiName: 'other').isA<ImageEmojiDisplay>()
53+
..resolvedUrl.equals(eg.realmUrl.resolve('/emoji/100.png'))
54+
..resolvedStillUrl.isNull();
55+
56+
// Unexpected code falls back to text.
57+
checkDisplay(emojiCode: '99', emojiName: 'another')
58+
.isA<TextEmojiDisplay>();
59+
60+
checkDisplay(emojiCode: '200', emojiName: 'dancing').isA<ImageEmojiDisplay>()
61+
..resolvedUrl.equals(eg.realmUrl.resolve('/emoji/200.png'))
62+
..resolvedStillUrl.equals(eg.realmUrl.resolve('/emoji/200-still.png'));
63+
64+
// TODO test URLs not parsing
65+
});
66+
67+
test(':zulip:', () {
68+
check(eg.store().emojiDisplayFor(emojiType: ReactionType.zulipExtraEmoji,
69+
emojiCode: 'zulip', emojiName: 'zulip')
70+
).isA<ImageEmojiDisplay>()
71+
..emojiName.equals('zulip')
72+
..resolvedUrl.equals(eg.realmUrl.resolve(EmojiStoreImpl.kZulipEmojiUrl))
73+
..resolvedStillUrl.isNull();
74+
});
75+
});
76+
}
77+
78+
extension EmojiDisplayChecks on Subject<EmojiDisplay> {
79+
Subject<String> get emojiName => has((x) => x.emojiName, 'emojiName');
80+
}
81+
82+
extension UnicodeEmojiDisplayChecks on Subject<UnicodeEmojiDisplay> {
83+
Subject<String> get emojiUnicode => has((x) => x.emojiUnicode, 'emojiUnicode');
84+
}
85+
86+
extension ImageEmojiDisplayChecks on Subject<ImageEmojiDisplay> {
87+
Subject<Uri> get resolvedUrl => has((x) => x.resolvedUrl, 'resolvedUrl');
88+
Subject<Uri?> get resolvedStillUrl => has((x) => x.resolvedStillUrl, 'resolvedStillUrl');
89+
}

0 commit comments

Comments
 (0)