diff --git a/lib/api/model/initial_snapshot.dart b/lib/api/model/initial_snapshot.dart index eeedcde14d..41a7ac169f 100644 --- a/lib/api/model/initial_snapshot.dart +++ b/lib/api/model/initial_snapshot.dart @@ -295,6 +295,7 @@ class UserSettings { TwentyFourHourTimeMode twentyFourHourTime; bool displayEmojiReactionUsers; + @JsonKey(unknownEnumValue: Emojiset.unknown) Emojiset emojiset; bool presenceEnabled; diff --git a/lib/api/model/initial_snapshot.g.dart b/lib/api/model/initial_snapshot.g.dart index 1c5505a653..1150748a1f 100644 --- a/lib/api/model/initial_snapshot.g.dart +++ b/lib/api/model/initial_snapshot.g.dart @@ -257,7 +257,11 @@ UserSettings _$UserSettingsFromJson(Map json) => UserSettings( json['twenty_four_hour_time'] as bool?, ), displayEmojiReactionUsers: json['display_emoji_reaction_users'] as bool, - emojiset: $enumDecode(_$EmojisetEnumMap, json['emojiset']), + emojiset: $enumDecode( + _$EmojisetEnumMap, + json['emojiset'], + unknownValue: Emojiset.unknown, + ), presenceEnabled: json['presence_enabled'] as bool, ); @@ -283,6 +287,7 @@ const _$EmojisetEnumMap = { Emojiset.googleBlob: 'google-blob', Emojiset.twitter: 'twitter', Emojiset.text: 'text', + Emojiset.unknown: 'unknown', }; UserTopicItem _$UserTopicItemFromJson(Map json) => diff --git a/lib/api/model/model.dart b/lib/api/model/model.dart index da12823520..920798654f 100644 --- a/lib/api/model/model.dart +++ b/lib/api/model/model.dart @@ -390,7 +390,8 @@ enum Emojiset { google, googleBlob, twitter, - text; + text, + unknown; /// Get an [Emojiset] from a raw string. Throws if the string is unrecognized. /// diff --git a/lib/api/model/model.g.dart b/lib/api/model/model.g.dart index b835c493c5..4d079f88d2 100644 --- a/lib/api/model/model.g.dart +++ b/lib/api/model/model.g.dart @@ -533,6 +533,7 @@ const _$EmojisetEnumMap = { Emojiset.googleBlob: 'google-blob', Emojiset.twitter: 'twitter', Emojiset.text: 'text', + Emojiset.unknown: 'unknown', }; const _$PresenceStatusEnumMap = { diff --git a/test/api/model/initial_snapshot_test.dart b/test/api/model/initial_snapshot_test.dart index 3228602fff..8eb4eb495c 100644 --- a/test/api/model/initial_snapshot_test.dart +++ b/test/api/model/initial_snapshot_test.dart @@ -3,6 +3,7 @@ import 'package:test/scaffolding.dart'; import 'package:zulip/api/model/initial_snapshot.dart'; import 'package:zulip/api/model/model.dart'; +import '../../example_data.dart' as eg; import '../../stdlib_checks.dart'; void main() { @@ -62,4 +63,15 @@ void main() { 'unread_message_ids': [11, 2, 3], })).throws(); }); + + test('UserSettings.emojiset handles various unknown values', () { + final unknownValues = ['apple', 'microsoft', 'facebook', '']; + for (final unknownValue in unknownValues) { + final json = eg.userSettings().toJson()..['emojiset'] = unknownValue; + final settings = UserSettings.fromJson(json); + + // Verify unknown emojiset defaults to Emojiset.unknown + check(settings.emojiset).equals(Emojiset.unknown); + } + }); } diff --git a/test/example_data.dart b/test/example_data.dart index a6e3e9655d..88b07f28cb 100644 --- a/test/example_data.dart +++ b/test/example_data.dart @@ -1304,6 +1304,22 @@ const _globalStore = globalStore; const String defaultRealmEmptyTopicDisplayName = 'test general chat'; +UserSettings userSettings({ + TwentyFourHourTimeMode? twentyFourHourTime, + bool? displayEmojiReactionUsers, + Emojiset? emojiset, + bool? presenceEnabled, +}) { + return UserSettings( + twentyFourHourTime: twentyFourHourTime ?? TwentyFourHourTimeMode.twelveHour, + displayEmojiReactionUsers: displayEmojiReactionUsers ?? true, + emojiset: emojiset ?? Emojiset.google, + presenceEnabled: presenceEnabled ?? true, + ); +} + +const _userSettings = userSettings; + InitialSnapshot initialSnapshot({ String? queueId, int? lastEventId, @@ -1387,12 +1403,7 @@ InitialSnapshot initialSnapshot({ unreadMsgs: unreadMsgs ?? _unreadMsgs(), streams: streams ?? [], // TODO add streams to default userStatuses: userStatuses ?? {}, - userSettings: userSettings ?? UserSettings( - twentyFourHourTime: TwentyFourHourTimeMode.twelveHour, - displayEmojiReactionUsers: true, - emojiset: Emojiset.google, - presenceEnabled: true, - ), + userSettings: userSettings ?? _userSettings(), userTopics: userTopics ?? [], // no default; allow `null` to simulate servers without this realmCanDeleteAnyMessageGroup: realmCanDeleteAnyMessageGroup,