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: [], winners: [ 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', }); }