이벤트 가져오기 위젯 테스트 추가 및 테스트 훅 도입

This commit is contained in:
2025-09-12 06:33:44 +09:00
parent 107abc963f
commit a5f2544d11
121 changed files with 39277 additions and 3911 deletions
@@ -0,0 +1,78 @@
import 'dart:convert';
import 'package:flutter_test/flutter_test.dart';
import 'package:lanebow/utils/event_csv_parser.dart';
void main() {
group('EventCsvParser.parseCsvBytes', () {
test('정상 CSV: 두 행 모두 유효', () {
const headers = 'title,startDate,endDate,description,location,status,type,maxParticipants';
const row1 = '볼링 대회,2025-10-01,2025-10-01,가을 정기 대회,서울볼링장,활성,개인전,32';
const row2 = '연습 모임,2025-10-12,,월간 연습 모임,우리동네볼링장,대기,연습,';
final csv = [headers, row1, row2].join('\n');
final bytes = utf8.encode(csv);
final result = EventCsvParser.parseCsvBytes(bytes);
expect(result['error'], isNull);
expect(result['processedRows'], 2);
expect(result['invalidRows'], 0);
final events = result['validEvents'] as List<dynamic>;
expect(events.length, 2);
expect((events[0] as Map)['title'], '볼링 대회');
expect((events[1] as Map)['title'], '연습 모임');
});
test('일부 무효 행 포함: 한 행은 필수 누락으로 invalid', () {
const headers = 'title,startDate,endDate,description,location,status,type,maxParticipants';
const row1 = '볼링 대회,2025-10-01,2025-10-01,가을 정기 대회,서울볼링장,활성,개인전,32';
const rowInvalid = ',,,,위치만,활성,개인전,10'; // title/startDate 누락
final csv = [headers, row1, rowInvalid].join('\n');
final bytes = utf8.encode(csv);
final result = EventCsvParser.parseCsvBytes(bytes);
expect(result['processedRows'], 2);
expect(result['invalidRows'], 1);
final invalidRowIndices = result['invalidRowIndices'] as List<dynamic>;
// 헤더가 1행, 유효 2행, 무효 3행 → 3 보고
expect(invalidRowIndices, contains(3));
final events = result['validEvents'] as List<dynamic>;
expect(events.length, 1);
});
test('헤더 누락: 오류 반환', () {
const csv = 'wrong,columns\nvalue1,value2';
final bytes = utf8.encode(csv);
final result = EventCsvParser.parseCsvBytes(bytes);
expect(result['processedRows'], 0);
expect(result['invalidRows'], 0);
expect(result['validEvents'], isEmpty);
expect(result['error'], contains('필수 필드'));
});
test('빈 파일: 오류 반환', () {
final bytes = utf8.encode('');
final result = EventCsvParser.parseCsvBytes(bytes);
expect(result['processedRows'], 0);
expect(result['invalidRows'], 0);
expect(result['validEvents'], isEmpty);
expect(result['error'], contains('CSV 파일에 데이터'));
});
test('따옴표 포함 필드 파싱: 콤마 포함 설명', () {
const headers = 'title,startDate,description';
const row1 = '대회명,2025-10-01,"설명, 콤마 포함"';
final csv = [headers, row1].join('\n');
final bytes = utf8.encode(csv);
final result = EventCsvParser.parseCsvBytes(bytes);
expect(result['error'], isNull);
final events = result['validEvents'] as List<dynamic>;
expect(events.length, 1);
expect((events.first as Map)['description'], '설명, 콤마 포함');
});
});
}