import 'package:flutter_test/flutter_test.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); }); }