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  }