add separator checking and return error

This commit is contained in:
Pedro Pérez 2025-10-23 16:54:36 +02:00
parent ab4af962c7
commit ae891a58f4
3 changed files with 23 additions and 3 deletions

View File

@ -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
1 Fecha,Ciudad,Temperatura Máxima (C),Temperatura Mínima (C),Precipitación (mm),Nubosidad (%)
2 2025/10/12,Madrid,11,55,6,25,0,10

View File

@ -47,6 +47,10 @@ func (c *CSV) Parse(r io.Reader) ([]MeteoData, []RejectedMeteoData, error) {
return nil, nil, fmt.Errorf("%w: %v", ErrReadingCSVHeader, err) 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 meteoDataList []MeteoData
var rejectedDataList []RejectedMeteoData var rejectedDataList []RejectedMeteoData

View File

@ -15,6 +15,7 @@ func Test_CSV_ParseFile(t *testing.T) {
filePath string filePath string
expectedInserted int expectedInserted int
expectedRejected int expectedRejected int
expectError bool
validateInserted func(t *testing.T, inserted []meteo.MeteoData) validateInserted func(t *testing.T, inserted []meteo.MeteoData)
validateRejected func(t *testing.T, rejected []meteo.RejectedMeteoData) validateRejected func(t *testing.T, rejected []meteo.RejectedMeteoData)
}{ }{
@ -109,6 +110,7 @@ func Test_CSV_ParseFile(t *testing.T) {
filePath: "./../../../assets/test_7.csv", filePath: "./../../../assets/test_7.csv",
expectedInserted: 0, expectedInserted: 0,
expectedRejected: 1, expectedRejected: 1,
expectError: false,
validateInserted: func(t *testing.T, inserted []meteo.MeteoData) { validateInserted: func(t *testing.T, inserted []meteo.MeteoData) {
assert.Empty(t, inserted) 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) 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 { for _, tt := range tests {
@ -127,12 +138,15 @@ func Test_CSV_ParseFile(t *testing.T) {
defer file.Close() defer file.Close()
csvIngest := &meteo.CSV{} csvIngest := &meteo.CSV{}
fileStats := &meteo.FileStats{}
inserted, rejected, err := csvIngest.Parse(file) 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.NoError(t, err)
assert.Equal(t, tt.expectedInserted, fileStats.RowsInserted)
assert.Equal(t, tt.expectedRejected, fileStats.RowsRejected)
if tt.validateInserted != nil { if tt.validateInserted != nil {
tt.validateInserted(t, inserted) tt.validateInserted(t, inserted)