github.com/attic-labs/noms@v0.0.0-20210827224422-e5fa29d95e8b/samples/go/nomdex/nomdex_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  	"regexp"
     9  	"testing"
    10  
    11  	"github.com/attic-labs/noms/go/datas"
    12  	"github.com/attic-labs/noms/go/marshal"
    13  	"github.com/attic-labs/noms/go/nbs"
    14  	"github.com/attic-labs/noms/go/spec"
    15  	"github.com/attic-labs/noms/go/util/clienttest"
    16  	"github.com/stretchr/testify/assert"
    17  	"github.com/stretchr/testify/suite"
    18  )
    19  
    20  type TestObj struct {
    21  	Key    int
    22  	Fname  string
    23  	Lname  string
    24  	Gender string
    25  	Age    int
    26  }
    27  
    28  type testSuite struct {
    29  	clienttest.ClientTestSuite
    30  }
    31  
    32  func TestNomdex(t *testing.T) {
    33  	suite.Run(t, &testSuite{})
    34  }
    35  
    36  func makeTestDb(s *testSuite, dsId string) datas.Database {
    37  	db := datas.NewDatabase(nbs.NewLocalStore(s.DBDir, clienttest.DefaultMemTableSize))
    38  	l1 := []TestObj{
    39  		{1, "will", "smith", "m", 40},
    40  		{2, "lana", "turner", "f", 91},
    41  		{3, "john", "wayne", "m", 86},
    42  		{4, "johnny", "depp", "m", 50},
    43  		{5, "merrill", "streep", "f", 60},
    44  		{6, "rob", "courdry", "m", 45},
    45  		{7, "bruce", "lee", "m", 72},
    46  		{8, "bruce", "willis", "m", 36},
    47  		{9, "luis", "bunuel", "m", 100},
    48  		{10, "andy", "sandberg", "m", 32},
    49  		{11, "walter", "coggins", "m", 28},
    50  		{12, "seth", "rogan", "m", 29},
    51  	}
    52  
    53  	m1 := map[string]TestObj{
    54  		"lg": {13, "lady", "gaga", "f", 39},
    55  		"ss": {14, "sam", "smith", "m", 28},
    56  		"rp": {15, "robert", "plant", "m", 69},
    57  		"ml": {16, "meat", "loaf", "m", 65},
    58  		"gf": {17, "glenn", "frey", "m", 60},
    59  		"jr": {18, "joey", "ramone", "m", 55},
    60  		"rc": {19, "ray", "charles", "m", 72},
    61  		"bk": {20, "bb", "king", "m", 77},
    62  		"b":  {21, "beck", "", "m", 38},
    63  		"md": {22, "miles", "davis", "m", 82},
    64  		"rd": {23, "roger", "daltry", "m", 62},
    65  		"jf": {24, "john", "fogerty", "m", 60},
    66  	}
    67  
    68  	m := map[string]interface{}{"actors": l1, "musicians": m1}
    69  	v, err := marshal.Marshal(db, m)
    70  	s.NoError(err)
    71  	_, err = db.CommitValue(db.GetDataset(dsId), v)
    72  	s.NoError(err)
    73  	return db
    74  }
    75  
    76  func (s *testSuite) TestNomdex() {
    77  	dsId := "data"
    78  	db := makeTestDb(s, dsId)
    79  	s.NotNil(db)
    80  	db.Close()
    81  
    82  	fnameIdx := "fname-idx"
    83  	dataSpec := spec.CreateValueSpecString("nbs", s.DBDir, dsId)
    84  	dbSpec := spec.CreateDatabaseSpecString("nbs", s.DBDir)
    85  	stdout, stderr := s.MustRun(main, []string{"up", "--out-ds", fnameIdx, "--in-path", dataSpec, "--by", ".fname"})
    86  	s.Contains(stdout, "Indexed 24 objects")
    87  	s.Equal("", stderr)
    88  
    89  	genderIdx := "gender-idx"
    90  	stdout, stderr = s.MustRun(main, []string{"up", "--out-ds", genderIdx, "--in-path", dataSpec, "--by", ".gender"})
    91  	s.Contains(stdout, "Indexed 24 objects")
    92  	s.Equal("", stderr)
    93  
    94  	stdout, stderr = s.MustRun(main, []string{"find", "--db", dbSpec, `fname-idx = "lady"`})
    95  	s.Contains(stdout, "Found 1 objects")
    96  	s.Equal("", stderr)
    97  
    98  	stdout, stderr = s.MustRun(main, []string{"find", "--db", dbSpec, `fname-idx = "lady" and gender-idx = "f"`})
    99  	s.Contains(stdout, "Found 1 objects")
   100  	s.Equal("", stderr)
   101  
   102  	stdout, stderr = s.MustRun(main, []string{"find", "--db", dbSpec, `fname-idx != "lady" and gender-idx != "m"`})
   103  	s.Contains(stdout, "Found 2 objects")
   104  	s.Equal("", stderr)
   105  
   106  	stdout, stderr = s.MustRun(main, []string{"find", "--db", dbSpec, `fname-idx != "lady" and fname-idx != "john"`})
   107  	s.Contains(stdout, "Found 21 objects")
   108  	s.Equal("", stderr)
   109  
   110  	stdout, stderr = s.MustRun(main, []string{"find", "--db", dbSpec, `fname-idx != "lady" or gender-idx != "f"`})
   111  	s.Contains(stdout, "Found 23 objects")
   112  	s.Equal("", stderr)
   113  }
   114  
   115  func TestTransform(t *testing.T) {
   116  	assert := assert.New(t)
   117  
   118  	tcs := [][]string{
   119  		[]string{`"01/02/2003"`, "\"(\\d{2})/(\\d{2})/(\\d{4})\"", "$3/$2/$1", "2003/02/01"},
   120  	}
   121  
   122  	for _, tc := range tcs {
   123  		base, regex, replace, expected := tc[0], tc[1], tc[2], tc[3]
   124  
   125  		testRe := regexp.MustCompile(regex)
   126  		result := testRe.ReplaceAllString(base, replace)
   127  		assert.Equal(expected, result)
   128  	}
   129  
   130  	tcs = [][]string{
   131  		[]string{"343 STATE ST\nROCHESTER, NY 14650\n(43.161276, -77.619386)", "43.161276", "-77.619386"},
   132  		[]string{"TWO EMBARCADERO CENTER\nPROMENADE LEVEL SAN FRANCISCO, CA 94111\n", "", ""},
   133  	}
   134  
   135  	findLatRe := regexp.MustCompile("(?s)\\(([\\d.]+)")
   136  	findLngRe := regexp.MustCompile("(?s)(-?[\\d.]+)\\)")
   137  	for _, tc := range tcs {
   138  		base, expectedLat, expectedLng := tc[0], tc[1], tc[2]
   139  
   140  		lat := findLatRe.FindStringSubmatch(base)
   141  		assert.True(len(lat) == 0 && expectedLat == "" || (len(lat) == 2 && expectedLat == lat[1]))
   142  
   143  		lng := findLngRe.FindStringSubmatch(base)
   144  		assert.True(len(lng) == 0 && expectedLng == "" || (len(lng) == 2 && expectedLng == lng[1]))
   145  	}
   146  }