import 'package:flutter_test/flutter_test.dart'; import 'package:yumi/shared/business_logic/models/res/sc_room_rocket_api_res.dart'; import 'package:yumi/shared/business_logic/models/res/sc_room_rocket_config_res.dart'; import 'package:yumi/shared/business_logic/models/res/sc_room_rocket_status_res.dart'; import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_api_mapper.dart'; void main() { test( 'parses level-specific reward previews and rocket kings from levels', () { final status = SCRoomRocketStatusRes.fromJson({ 'currentLevel': 1, 'levels': [ { 'level': 1, 'rewardPreview': { 'top1': [ { 'rewardScene': 'TOP1', 'rewardType': 'GOLD', 'rewardAmount': 100, }, ], }, 'rocketKings': [ {'rank': 1, 'userId': 'u1', 'userAvatar': 'avatar-1'}, ], }, { 'level': 2, 'rewardPreview': { 'ignite': [ { 'rewardScene': 'IGNITE', 'rewardType': 'GOLD', 'rewardAmount': 200, }, ], }, 'rocketKings': [ {'rank': 1, 'userId': 'u2', 'userAvatar': 'avatar-2'}, {'rank': 2, 'userId': 'u3', 'userAvatar': 'avatar-3'}, {'rank': 3, 'userId': 'u4', 'userAvatar': 'avatar-4'}, ], }, ], }); expect(status.rewardPreviewForLevel(1)?.top1.single.rewardAmount, 100); expect(status.rewardPreviewForLevel(2)?.ignite.single.rewardAmount, 200); expect(status.rocketKingsForLevel(1).single.userAvatar, 'avatar-1'); expect(status.rocketKingsForLevel(2), hasLength(3)); }, ); test('parses level-specific reward previews and rocket kings from maps', () { final status = SCRoomRocketStatusRes.fromJson({ 'currentLevel': 1, 'rewardPreview': { '1': { 'top1': [ {'rewardScene': 'TOP1', 'rewardType': 'GOLD', 'rewardAmount': 100}, ], }, '2': { 'inRoom': [ { 'rewardScene': 'IN_ROOM', 'rewardType': 'GOLD', 'rewardAmount': 300, }, ], }, }, 'rocketKings': { '1': [ {'rank': 1, 'userId': 'u1', 'userAvatar': 'avatar-1'}, ], '2': [ {'rank': 1, 'userId': 'u2', 'userAvatar': 'avatar-2'}, {'rank': 2, 'userId': 'u3', 'userAvatar': 'avatar-3'}, {'rank': 3, 'userId': 'u4', 'userAvatar': 'avatar-4'}, ], }, }); expect(status.rewardPreviewForLevel(1)?.top1.single.rewardAmount, 100); expect(status.rewardPreviewForLevel(2)?.inRoom.single.rewardAmount, 300); expect(status.rocketKingsForLevel(1).single.userAvatar, 'avatar-1'); expect(status.rocketKingsForLevel(2), hasLength(3)); }); test( 'uses top-level reward preview for the response level instead of current level', () { final status = SCRoomRocketStatusRes.fromJson({ 'currentLevel': 1, 'level': 2, 'rewardPreview': { 'top1': [ {'rewardScene': 'TOP1', 'rewardType': 'GOLD', 'rewardAmount': 200}, ], }, }); expect(status.rewardPreviewForLevel(1), isNull); expect(status.rewardPreviewForLevel(2)?.top1.single.rewardAmount, 200); }, ); test('maps enabled rocket configs into level-specific reward groups', () { final groups = RoomRocketApiMapper.rewardGroupsByLevelFromConfigs([ SCRoomRocketConfigRes.fromJson({ 'level': 1, 'rewardConfig': [ {'type': 'GOLD', 'detailType': 'GOLD', 'amount': 100, 'sort': 1}, ], }), SCRoomRocketConfigRes.fromJson({ 'level': 2, 'rewardConfig': [ {'type': 'GOLD', 'detailType': 'GOLD', 'amount': 200, 'sort': 1}, ], 'normalRewardConfig': [ { 'type': 'PROPS', 'detailType': 'AVATAR_FRAME', 'cover': 'cover-2', 'quantity': 7, 'sort': 2, }, ], }), ]); expect(groups[1]?.top1.single.amount, '100'); expect(groups[2]?.top1.single.amount, '200'); expect(groups[2]?.inRoom.single.imageUrl, 'cover-2'); expect(groups[2]?.inRoom.single.expireDays, 7); }); test('parses rocket level contents response from go api', () { final contents = SCRoomRocketLevelContentsRes.fromJson({ 'configured': true, 'sysOrigin': 'LIKEI', 'enabled': true, 'timezone': 'Asia/Riyadh', 'maxLevel': 6, 'levels': [ { 'level': 1, 'needEnergy': 100, 'rocketIconUrl': 'icon-1', 'previewRocketUrl': 'preview-1', 'rocketAnimationUrl': 'animation-1', 'rewardPreview': { 'top1': [ { 'rewardScene': 'TOP1', 'rewardType': 'GOLD', 'rewardAmount': 100, 'rewardName': 'Lv1 top1', }, ], }, }, { 'level': 2, 'needEnergy': 200, 'rocketIconUrl': 'icon-2', 'previewRocketUrl': 'preview-2', 'rocketAnimationUrl': 'animation-2', 'rewards': [ { 'rewardScene': 'IGNITE', 'rewardType': 'GOLD', 'rewardAmount': 200, 'rewardName': 'Lv2 ignite', }, { 'rewardScene': 'IN_ROOM', 'rewardType': 'NONE', 'rewardName': '轮空', }, ], }, ], }); expect(contents.enabled, isTrue); expect(contents.levels, hasLength(2)); expect(contents.levelFor(1)?.rocketIconUrl, 'icon-1'); expect(contents.rewardPreviewForLevel(1)?.top1.single.rewardAmount, 100); expect(contents.rewardPreviewForLevel(2)?.ignite.single.rewardAmount, 200); expect(contents.rewardPreviewForLevel(2)?.inRoom, isEmpty); expect(contents.levelFor(2)?.rewards, hasLength(2)); final levels = RoomRocketApiMapper.levelsFromLevelContents(contents); final allGroups = RoomRocketApiMapper.rewardGroupsByLevelFromLevelContents( contents, ); final groups = RoomRocketApiMapper.rewardGroupsFromLevelContents( contents, level: 2, ); expect(levels?.first.imageUrl, 'icon-1'); expect(allGroups[1]?.top1.single.amount, '100'); expect(allGroups[2]?.setOff.single.amount, '200'); expect(groups?.setOff.single.amount, '200'); }); }