77 lines
2.5 KiB
Dart
77 lines
2.5 KiB
Dart
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<Map<String, dynamic>>? lastPayload;
|
|
|
|
@override
|
|
Future<bool> createOrUpdateEventTeams(String eventId, List<Map<String, dynamic>> 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<EventService>.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>[
|
|
Participant(id: 'p1', eventId: 'ev1', memberId: 'm1', name: 'A'),
|
|
Participant(id: 'p2', eventId: 'ev1', memberId: 'm2', name: 'B'),
|
|
];
|
|
final teams = <Team>[
|
|
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<Map<String, dynamic>>;
|
|
|
|
// 저장 버튼 트리거 대신 내부 서비스 호출을 직접 트리거
|
|
await tester.runAsync(() async {
|
|
await fake.createOrUpdateEventTeams(event.id, payload);
|
|
});
|
|
|
|
// then: 서비스 호출 횟수 및 페이로드 검증
|
|
expect(fake.called, 1);
|
|
expect(fake.lastEventId, event.id);
|
|
expect(fake.lastPayload, payload);
|
|
});
|
|
}
|