213 lines
6.6 KiB
Dart
213 lines
6.6 KiB
Dart
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');
|
|
});
|
|
}
|