github.com/attic-labs/noms@v0.0.0-20210827224422-e5fa29d95e8b/samples/go/csv/csv-export/exporter_test.go (about) 1 // Copyright 2016 Attic Labs, Inc. All rights reserved. 2 // Licensed under the Apache License, version 2.0: 3 // http://www.apache.org/licenses/LICENSE-2.0 4 5 package main 6 7 import ( 8 "encoding/csv" 9 "io" 10 "strings" 11 "testing" 12 13 "github.com/attic-labs/noms/go/d" 14 "github.com/attic-labs/noms/go/datas" 15 "github.com/attic-labs/noms/go/nbs" 16 "github.com/attic-labs/noms/go/spec" 17 "github.com/attic-labs/noms/go/types" 18 "github.com/attic-labs/noms/go/util/clienttest" 19 "github.com/stretchr/testify/suite" 20 ) 21 22 func TestCSVExporter(t *testing.T) { 23 suite.Run(t, &testSuite{}) 24 } 25 26 type testSuite struct { 27 clienttest.ClientTestSuite 28 header []string 29 payload [][]string 30 } 31 32 func (s *testSuite) createTestData(buildAsMap bool) []types.Value { 33 s.header = []string{"a", "b", "c"} 34 structName := "SomeStruct" 35 s.payload = [][]string{ 36 {"4", "10", "255"}, 37 {"5", "7", "100"}, 38 {"512", "12", "55"}, 39 } 40 41 sliceLen := len(s.payload) 42 if buildAsMap { 43 sliceLen *= 2 44 } 45 46 structs := make([]types.Value, sliceLen) 47 for i, row := range s.payload { 48 fields := make(types.ValueSlice, len(s.header)) 49 for j, v := range row { 50 fields[j] = types.String(v) 51 } 52 if buildAsMap { 53 structs[i*2] = fields[0] 54 structs[i*2+1] = types.NewStruct(structName, types.StructData{ 55 "a": fields[0], 56 "b": fields[1], 57 "c": fields[2], 58 }) 59 } else { 60 structs[i] = types.NewStruct(structName, types.StructData{ 61 "a": fields[0], 62 "b": fields[1], 63 "c": fields[2], 64 }) 65 } 66 } 67 return structs 68 } 69 70 func verifyOutput(s *testSuite, stdout string) { 71 csvReader := csv.NewReader(strings.NewReader(stdout)) 72 73 row, err := csvReader.Read() 74 d.Chk.NoError(err) 75 s.Equal(s.header, row) 76 77 for i := 0; i < len(s.payload); i++ { 78 row, err := csvReader.Read() 79 d.Chk.NoError(err) 80 s.Equal(s.payload[i], row) 81 } 82 83 _, err = csvReader.Read() 84 s.Equal(io.EOF, err) 85 } 86 87 // FIXME: run with pipe 88 func (s *testSuite) TestCSVExportFromList() { 89 setName := "csvlist" 90 91 // Setup data store 92 db := datas.NewDatabase(nbs.NewLocalStore(s.DBDir, clienttest.DefaultMemTableSize)) 93 ds := db.GetDataset(setName) 94 95 // Build data rows 96 structs := s.createTestData(false) 97 db.CommitValue(ds, types.NewList(db, structs...)) 98 db.Close() 99 100 // Run exporter 101 dataspec := spec.CreateValueSpecString("nbs", s.DBDir, setName) 102 stdout, stderr := s.MustRun(main, []string{dataspec}) 103 s.Equal("", stderr) 104 105 verifyOutput(s, stdout) 106 } 107 108 func (s *testSuite) TestCSVExportFromMap() { 109 setName := "csvmap" 110 111 // Setup data store 112 db := datas.NewDatabase(nbs.NewLocalStore(s.DBDir, clienttest.DefaultMemTableSize)) 113 ds := db.GetDataset(setName) 114 115 // Build data rows 116 structs := s.createTestData(true) 117 db.CommitValue(ds, types.NewMap(db, structs...)) 118 db.Close() 119 120 // Run exporter 121 dataspec := spec.CreateValueSpecString("nbs", s.DBDir, setName) 122 stdout, stderr := s.MustRun(main, []string{dataspec}) 123 s.Equal("", stderr) 124 125 verifyOutput(s, stdout) 126 }