diff --git a/service_a/assets/test_8.csv b/service_a/assets/test_8.csv new file mode 100644 index 0000000..8654361 --- /dev/null +++ b/service_a/assets/test_8.csv @@ -0,0 +1,2 @@ +Fecha,Ciudad,Temperatura Máxima (C),Temperatura Mínima (C),Precipitación (mm),Nubosidad (%) +2025/10/12,Madrid,11,55,6,25,0,10 diff --git a/service_a/internal/domains/meteo/file.go b/service_a/internal/domains/meteo/file.go index 1b51446..ddc3324 100644 --- a/service_a/internal/domains/meteo/file.go +++ b/service_a/internal/domains/meteo/file.go @@ -47,6 +47,10 @@ func (c *CSV) Parse(r io.Reader) ([]MeteoData, []RejectedMeteoData, error) { return nil, nil, fmt.Errorf("%w: %v", ErrReadingCSVHeader, err) } + if len(header) == 1 { + return nil, nil, fmt.Errorf("%w: invalid separator detected, expected semicolon (;)", ErrCannotParseFile) + } + var meteoDataList []MeteoData var rejectedDataList []RejectedMeteoData diff --git a/service_a/internal/domains/meteo/file_test.go b/service_a/internal/domains/meteo/file_test.go index 7f07ab6..445a693 100644 --- a/service_a/internal/domains/meteo/file_test.go +++ b/service_a/internal/domains/meteo/file_test.go @@ -15,6 +15,7 @@ func Test_CSV_ParseFile(t *testing.T) { filePath string expectedInserted int expectedRejected int + expectError bool validateInserted func(t *testing.T, inserted []meteo.MeteoData) validateRejected func(t *testing.T, rejected []meteo.RejectedMeteoData) }{ @@ -109,6 +110,7 @@ func Test_CSV_ParseFile(t *testing.T) { filePath: "./../../../assets/test_7.csv", expectedInserted: 0, expectedRejected: 1, + expectError: false, validateInserted: func(t *testing.T, inserted []meteo.MeteoData) { assert.Empty(t, inserted) }, @@ -118,6 +120,15 @@ func Test_CSV_ParseFile(t *testing.T) { assert.Equal(t, ";Madrid;11,55;6,25;0;10", rejected[0].RowValue) }, }, + { + name: "invalid separator comma instead of semicolon", + filePath: "./../../../assets/test_8.csv", + expectedInserted: 0, + expectedRejected: 0, + expectError: true, + validateInserted: nil, + validateRejected: nil, + }, } for _, tt := range tests { @@ -127,12 +138,15 @@ func Test_CSV_ParseFile(t *testing.T) { defer file.Close() csvIngest := &meteo.CSV{} - fileStats := &meteo.FileStats{} inserted, rejected, err := csvIngest.Parse(file) + if tt.expectError { + assert.Error(t, err) + assert.ErrorIs(t, err, meteo.ErrCannotParseFile) + return + } + assert.NoError(t, err) - assert.Equal(t, tt.expectedInserted, fileStats.RowsInserted) - assert.Equal(t, tt.expectedRejected, fileStats.RowsRejected) if tt.validateInserted != nil { tt.validateInserted(t, inserted)