이벤트 개발완료

This commit is contained in:
2025-10-23 22:04:03 +09:00
parent ce1aee67d6
commit cd0e139b5e
48 changed files with 7855 additions and 3459 deletions
@@ -0,0 +1,77 @@
import 'dart:async';
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);
});
}