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; 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; // 헤더가 1행, 유효 2행, 무효 3행 → 3 보고 expect(invalidRowIndices, contains(3)); final events = result['validEvents'] as List; 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; expect(events.length, 1); expect((events.first as Map)['description'], '설명, 콤마 포함'); }); }); }