diff --git a/client_test.go b/client_test.go index ff8e4f385..9b30f33a9 100644 --- a/client_test.go +++ b/client_test.go @@ -286,6 +286,53 @@ func TestClient_ImportInverseEnabled(t *testing.T) { } } +// Ensure client can bulk import value data. +func TestClient_Importalue(t *testing.T) { + hldr := test.MustOpenHolder() + defer hldr.Close() + + fld := pilosa.Field{ + Name: "fld", + Type: pilosa.FieldTypeInt, + Min: 0, + Max: 100, + } + + // Load bitmap into cache to ensure cache gets updated. + index := hldr.MustCreateIndexIfNotExists("i", pilosa.IndexOptions{}) + frame, err := index.CreateFrameIfNotExists("f", pilosa.FrameOptions{RangeEnabled: true, Fields: []*pilosa.Field{&fld}}) + if err != nil { + t.Fatal(err) + } + + s := test.NewServer() + defer s.Close() + s.Handler.Host = s.Host() + s.Handler.Cluster = test.NewCluster(1) + s.Handler.Cluster.Nodes[0].Host = s.Host() + s.Handler.Holder = hldr.Holder + + // Send import request. + c := test.MustNewClient(s.Host()) + if err := c.ImportValue(context.Background(), "i", "f", fld.Name, 0, []pilosa.FieldValue{ + {ColumnID: 1, Value: 10}, + {ColumnID: 2, Value: 20}, + {ColumnID: 3, Value: 40}, + }); err != nil { + t.Fatal(err) + } + + sum, cnt, err := frame.FieldSum(nil, fld.Name) + if err != nil { + t.Fatal(err) + } + + // Verify data. + if sum != 70 || cnt != 3 { + t.Fatalf("unexpected values: got sum=%v, count=%v; expected sum=70, cnt=3", sum, cnt) + } +} + // Ensure client backup and restore a frame. func TestClient_BackupRestore(t *testing.T) { hldr := test.MustOpenHolder() diff --git a/ctl/import_test.go b/ctl/import_test.go index 0023ad79a..c9c36d5c8 100644 --- a/ctl/import_test.go +++ b/ctl/import_test.go @@ -81,6 +81,45 @@ func TestImportCommand_Run(t *testing.T) { } } +// Ensure that the ImportValue path runs (note: we have specifed a value +// for cm.Field. Because the handler doesn't return errors (it sends them +// to the logger), we don't get an error returned at `cm.Run()` even though +// we haven't setup frame `f` to be RangeEnabled. +func TestImportCommand_RunValue(t *testing.T) { + + buf := bytes.Buffer{} + stdin, stdout, stderr := GetIO(buf) + cm := NewImportCommand(stdin, stdout, stderr) + file, err := ioutil.TempFile("", "import-value.csv") + file.Write([]byte("1,2\n3,4\n5,6")) + ctx := context.Background() + if err != nil { + t.Fatal(err) + } + + hldr := test.MustOpenHolder() + defer hldr.Close() + s := test.NewServer() + defer s.Close() + s.Handler.Host = s.Host() + s.Handler.Cluster = test.NewCluster(1) + s.Handler.Cluster.Nodes[0].Host = s.Host() + s.Handler.Holder = hldr.Holder + cm.Host = s.Host() + + http.DefaultClient.Do(MustNewHTTPRequest("POST", s.URL+"/index/i", strings.NewReader(""))) + http.DefaultClient.Do(MustNewHTTPRequest("POST", s.URL+"/index/i/frame/f", strings.NewReader(""))) + + cm.Index = "i" + cm.Frame = "f" + cm.Field = "foo" + cm.Paths = []string{file.Name()} + err = cm.Run(ctx) + if err != nil { + t.Fatalf("Import Run with values doesn't work: %s", err) + } +} + func TestImportCommand_InvalidFile(t *testing.T) { buf := bytes.Buffer{}