add separator checking and return error
This commit is contained in:
parent
ab4af962c7
commit
ae891a58f4
2
service_a/assets/test_8.csv
Normal file
2
service_a/assets/test_8.csv
Normal 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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user