108 lines
3.3 KiB
Dart
108 lines
3.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:yumi/services/audio/rtm_manager.dart';
|
|
import 'package:yumi/shared/business_logic/models/res/sc_room_rocket_api_res.dart';
|
|
import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_dialog.dart';
|
|
import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_reward_dialog.dart';
|
|
import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_reward_dialog_loader.dart';
|
|
|
|
void main() {
|
|
group('room rocket reward popup audience', () {
|
|
test('winner ids do not block empty reward users', () {
|
|
final shouldShow = roomRocketRewardPopupTargetsCurrentUser(
|
|
payload: {
|
|
'winnerUserIds': ['user-a', 'user-b'],
|
|
},
|
|
currentUserKeys: {'user-c'},
|
|
);
|
|
|
|
expect(shouldShow, isTrue);
|
|
});
|
|
|
|
test('explicit popup ids still target popup recipients', () {
|
|
final shouldShow = roomRocketRewardPopupTargetsCurrentUser(
|
|
payload: {
|
|
'popupUserIds': ['user-a', 'user-b'],
|
|
},
|
|
currentUserKeys: {'user-c'},
|
|
);
|
|
|
|
expect(shouldShow, isFalse);
|
|
});
|
|
});
|
|
|
|
group('room rocket reward dialog loader', () {
|
|
test('deduplicates reward records by id', () {
|
|
final records = debugUniqueRoomRocketRewardRecords([
|
|
_rewardRecord(id: 'record-1', rewardAmount: 5000),
|
|
_rewardRecord(id: 'record-1', rewardAmount: 5200),
|
|
_rewardRecord(id: 'record-2', rewardAmount: 5200),
|
|
]);
|
|
|
|
expect(records, hasLength(2));
|
|
expect(records.map((item) => item.id), ['record-1', 'record-2']);
|
|
expect(records.first.rewardAmount, 5000);
|
|
});
|
|
|
|
test('deduplicates id-less reward records by reward identity', () {
|
|
final records = debugUniqueRoomRocketRewardRecords([
|
|
_rewardRecord(id: '', rewardAmount: 5000),
|
|
_rewardRecord(id: '', rewardAmount: 5000),
|
|
_rewardRecord(id: '', rewardAmount: 5200),
|
|
]);
|
|
|
|
expect(records, hasLength(2));
|
|
expect(records.map((item) => item.rewardAmount), [5000, 5200]);
|
|
});
|
|
});
|
|
|
|
group('room rocket reward dialog', () {
|
|
testWidgets('shows reward empty state when room winners exist', (
|
|
tester,
|
|
) async {
|
|
await tester.pumpWidget(
|
|
const MaterialApp(
|
|
home: Scaffold(
|
|
body: RoomRocketRewardDialog(
|
|
rewards: <RoomRocketRewardItem>[],
|
|
winners: <RoomRocketRewardWinner>[
|
|
RoomRocketRewardWinner(nickname: 'test man'),
|
|
],
|
|
loadingText: '',
|
|
useMockFallback: false,
|
|
),
|
|
),
|
|
),
|
|
);
|
|
|
|
expect(find.text('No reward'), findsOneWidget);
|
|
expect(find.text('test man'), findsOneWidget);
|
|
});
|
|
});
|
|
}
|
|
|
|
SCRoomRocketRewardRecordRes _rewardRecord({
|
|
required String id,
|
|
required int rewardAmount,
|
|
}) {
|
|
return SCRoomRocketRewardRecordRes.fromJson({
|
|
'id': id,
|
|
'launchNo': 'launch-1',
|
|
'roomId': 'room-1',
|
|
'dayKey': '2026-05-15',
|
|
'roundNo': 1,
|
|
'level': 2,
|
|
'userId': 'user-1',
|
|
'userNickname': 'User 1',
|
|
'rewardScene': 'TOP1',
|
|
'rewardType': 'GOLD',
|
|
'rewardItemId': 'gold',
|
|
'rewardName': 'Yumi',
|
|
'rewardCover': '',
|
|
'rewardAmount': rewardAmount,
|
|
'expireDays': 0,
|
|
'grantStatus': 'SUCCESS',
|
|
'popupStatus': 'UNREAD',
|
|
});
|
|
}
|