package decoder import ( "bytes" "encoding/csv" "encoding/json" "errors" "fmt" "io" "testing" "github.com/stretchr/testify/require" ) func makeReadSeeker(c string) io.ReadSeeker { bb := []byte(c) return bytes.NewReader(bb) } const ( testCSV string = "f1,f2,ID\nr1v1,r1v2,1\n" testJSONL string = "{ \"f1\": \"nr1v1\", \"f2\": \"r1v2\", \"ID\": \"1\" }\n" ) func TestEntryCount(t *testing.T) { t.Run("Flat reader", func(t *testing.T) { rs := makeReadSeeker(testCSV) fr := NewFlatReader(csv.NewReader(rs), rs) c, err := fr.EntryCount() require.True(t, c == 1, fmt.Sprintf("Invalid number of entries determines; found %d, expected %d", c, 1), ) require.True(t, err == nil, "Returned with error", ) }) t.Run("Structured decoder", func(t *testing.T) { rs := makeReadSeeker(testJSONL) sd := NewStructuredDecoder(json.NewDecoder(rs), rs) c, err := sd.EntryCount() require.True(t, c == 1, fmt.Sprintf("Invalid number of entries determines; found %d, expected %d", c, 1), ) require.True(t, err == nil, "Returned with error", ) }) } func TestGet(t *testing.T) { t.Run("Flat reader", func(t *testing.T) { rs := makeReadSeeker(testCSV) fr := NewFlatReader(csv.NewReader(rs), rs) // dump first line fr.get(func(f []string) error { return nil }) err := fr.get(func(f []string) error { return errors.New("called") }) require.True(t, err != nil, "Error should be returned to indicate that get did read", ) err = fr.get(func(f []string) error { return errors.New("called") }) require.True(t, err == nil, "Error should NOT be returned to indicate that get didn't read", ) }) t.Run("Structured decoder", func(t *testing.T) { rs := makeReadSeeker(testJSONL) sd := NewStructuredDecoder(json.NewDecoder(rs), rs) err := sd.get(func(f map[string]interface{}) error { return errors.New("called") }) require.True(t, err != nil, "Error should be returned to indicate that get did read", ) err = sd.get(func(f map[string]interface{}) error { return errors.New("called") }) require.True(t, err == nil, "Error should NOT be returned to indicate that get didn't read", ) }) } func TestWalk(t *testing.T) { t.Run("Flat reader", func(t *testing.T) { rs := makeReadSeeker(testCSV) fr := NewFlatReader(csv.NewReader(rs), rs) i := 0 err := fr.walk(func(f []string) error { i++ return nil }) require.True(t, i == 2, "Invalid number of reads", ) require.True(t, err == nil, "Returned with error", ) }) t.Run("Structured decoder", func(t *testing.T) { rs := makeReadSeeker(testJSONL) sd := NewStructuredDecoder(json.NewDecoder(rs), rs) i := 0 err := sd.walk(func(f map[string]interface{}) error { i++ return nil }) require.True(t, i == 1, "Invalid number of reads", ) require.True(t, err == nil, "Returned with error", ) }) } func TestHeader(t *testing.T) { t.Run("Flat reader", func(t *testing.T) { rs := makeReadSeeker(testCSV) fr := NewFlatReader(csv.NewReader(rs), rs) h := fr.Header() require.True(t, len(h) == 3, "Invalid number of header fields", ) expect := [...]string{"f1", "f2", "ID"} for i, h := range h { require.True(t, h == expect[i], "Invalid header value", ) } }) t.Run("Structured decoder", func(t *testing.T) { rs := makeReadSeeker(testJSONL) sd := NewStructuredDecoder(json.NewDecoder(rs), rs) h := sd.Header() require.True(t, len(h) == 3, "Invalid number of header fields", ) }) }