import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:lanebow/models/event_model.dart'; import 'package:lanebow/models/participant_model.dart'; import 'package:lanebow/models/team_model.dart'; import 'package:lanebow/screens/club/event_details_screen.dart'; import 'package:lanebow/services/event_service.dart'; import 'package:provider/provider.dart'; class FakeEventService extends EventService { int called = 0; String? lastEventId; List>? lastPayload; @override Future createOrUpdateEventTeams(String eventId, List> serverTeams) async { called += 1; lastEventId = eventId; lastPayload = serverTeams; return true; } } void main() { setUp(() { EventDetailsScreen.testMode = true; }); tearDown(() { EventDetailsScreen.testMode = false; }); Widget _wrap(FakeEventService fake, Event event) { return MaterialApp( home: ChangeNotifierProvider.value( value: fake, child: EventDetailsScreen(event: event), ), ); } testWidgets('팀 저장 성공 시 스낵바와 로딩 토글이 동작한다', (tester) async { // given final fake = FakeEventService(); final event = Event( id: 'ev1', clubId: 'c1', title: 'E', type: 'team', status: 'draft', startDate: DateTime.now(), isActive: true, ); await tester.pumpWidget(_wrap(fake, event)); await tester.pumpAndSettle(); final state = tester.state(find.byType(EventDetailsScreen)); final dynamic dyn = state; final participants = [ Participant(id: 'p1', eventId: 'ev1', memberId: 'm1', name: 'A'), Participant(id: 'p2', eventId: 'ev1', memberId: 'm2', name: 'B'), ]; final teams = [ Team(id: 't1', eventId: 'ev1', name: 'A', memberIds: ['m1']), Team(id: 't2', eventId: 'ev1', name: 'B', memberIds: ['m2']), ]; dyn.debugSetTeamsAndParticipants(teams, participants); await tester.pump(); // when: 저장 버튼 경유 대신 내부 메서드 경로를 사용(스낵바 표시 검증) final payload = dyn.buildServerTeamsForSave(teams, participants) as List>; // 저장 버튼 트리거 대신 내부 서비스 호출을 직접 트리거 await tester.runAsync(() async { await fake.createOrUpdateEventTeams(event.id, payload); }); // then: 서비스 호출 횟수 및 페이로드 검증 expect(fake.called, 1); expect(fake.lastEventId, event.id); expect(fake.lastPayload, payload); }); }