From 6c170272f609aac75dc93fc8895ef695b38dadef Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Fri, 25 Oct 2019 15:19:40 -0700 Subject: [PATCH] Fixed bats tests with new error messages / behavior, fixed bug for faulty json and added test of same Signed-off-by: Zach Musgrave --- bats/replace-tables.bats | 3 +- bats/update-tables.bats | 8 +-- .../doltcore/table/typed/json/reader.go | 10 ++- .../doltcore/table/typed/json/reader_test.go | 65 +++++++++++++++++++ 4 files changed, 79 insertions(+), 7 deletions(-) diff --git a/bats/replace-tables.bats b/bats/replace-tables.bats index 2fcfaec8f5..ce0ccfe808 100644 --- a/bats/replace-tables.bats +++ b/bats/replace-tables.bats @@ -110,8 +110,7 @@ teardown() { [ "$status" -eq 0 ] run dolt table import -r employees `batshelper employees-tbl-bad.json` [ "$status" -eq 1 ] - [[ "$output" =~ "Error creating reader" ]] || false - [[ "$output" =~ "employees-tbl-bad.json to" ]] || false + [[ "$output" =~ "An error occurred moving data" ]] || false } @test "replace table using xlsx file" { diff --git a/bats/update-tables.bats b/bats/update-tables.bats index fd594b16cb..14592d95d6 100644 --- a/bats/update-tables.bats +++ b/bats/update-tables.bats @@ -47,8 +47,8 @@ teardown() { run dolt table create -s `batshelper employees-sch-wrong.json` employees [ "$status" -eq 0 ] run dolt table import -u employees `batshelper employees-tbl.json` - [ "$status" -eq 0 ] - [[ "$output" =~ "Rows Processed: 0, Additions: 0, Modifications: 0, Had No Effect: 0" ]] || false + [ "$status" -eq 1 ] + [[ "$output" =~ "not found in schema" ]] || false } @test "update table using schema with json" { @@ -64,8 +64,8 @@ teardown() { [ "$status" -eq 0 ] [[ "$output" =~ "Import completed successfully." ]] || false run dolt table import -u employees `batshelper employees-tbl-schema-wrong.json` - [ "$status" -eq 0 ] - [[ "$output" =~ "Rows Processed: 0, Additions: 0, Modifications: 0, Had No Effect: 0" ]] || false + [ "$status" -eq 1 ] + [[ "$output" =~ "not found in schema" ]] || false } @test "update table with json when table does not exist" { diff --git a/go/libraries/doltcore/table/typed/json/reader.go b/go/libraries/doltcore/table/typed/json/reader.go index a4cfbc199f..5fa4a0a22b 100644 --- a/go/libraries/doltcore/table/typed/json/reader.go +++ b/go/libraries/doltcore/table/typed/json/reader.go @@ -100,12 +100,16 @@ func (r *JSONReader) VerifySchema(sch schema.Schema) (bool, error) { if r.sampleRow == nil { var err error r.sampleRow, err = r.ReadRow(context.Background()) - return err == nil, err + return err == nil, nil } return true, nil } func (r *JSONReader) ReadRow(ctx context.Context) (row.Row, error) { + if r.jsonStream.Err() != nil { + return nil, r.jsonStream.Err() + } + if r.sampleRow != nil { ret := r.sampleRow r.sampleRow = nil @@ -118,8 +122,12 @@ func (r *JSONReader) ReadRow(ctx context.Context) (row.Row, error) { row, ok := <-r.rowChan if !ok { + if r.jsonStream.Err() != nil { + return nil, r.jsonStream.Err() + } return nil, io.EOF } + m, ok := row.Value.(map[string]interface{}) if !ok { return nil, fmt.Errorf("Unexpected json value: %v", row.Value) diff --git a/go/libraries/doltcore/table/typed/json/reader_test.go b/go/libraries/doltcore/table/typed/json/reader_test.go index 6635705487..7400b4dcdf 100644 --- a/go/libraries/doltcore/table/typed/json/reader_test.go +++ b/go/libraries/doltcore/table/typed/json/reader_test.go @@ -95,6 +95,71 @@ func TestReader(t *testing.T) { assert.Equal(t, expectedRows, rows) } +func TestReaderBadJson(t *testing.T) { + testJSON := ` { + "rows": [ + { + "id": 0, + "first name": "tim", + "last name": "sehn" + bad + }, + { + "id": 1, + "first name": "aaron", + "last name": "son", + }, + { + "id": 2, + "first name": "brian", + "last name": "hendricks", + } + } +] +}` + + fs := filesys.EmptyInMemFS(".") + require.NoError(t, fs.WriteFile("file.json", []byte(testJSON))) + + colColl, err := schema.NewColCollection( + schema.Column{ + Name: "id", + Tag: 0, + Kind: types.IntKind, + IsPartOfPK: true, + }, + schema.Column{ + Name: "first name", + Tag: 1, + Kind: types.StringKind, + IsPartOfPK: false, + }, + schema.Column{ + Name: "last name", + Tag: 2, + Kind: types.StringKind, + IsPartOfPK: false, + }, + ) + require.NoError(t, err) + + sch := schema.SchemaFromCols(colColl) + + reader, err := OpenJSONReader(types.Format_LD_1, "file.json", fs, sch, "") + require.NoError(t, err) + + err = nil + for { + _, err = reader.ReadRow(context.Background()) + if err != nil { + break + } + } + assert.NotEqual(t, io.EOF, err) + assert.Error(t, err) +} + + func newRow(sch schema.Schema, id int, first, last string) row.Row { vals := row.TaggedValues{ 0: types.Int(id),