mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
139 lines
3.7 KiB
Go
139 lines
3.7 KiB
Go
package api
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
pilosaclient "github.com/featurebasedb/featurebase/v3/client"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestApplyToPilosa(t *testing.T) {
|
|
client, err := pilosaclient.NewClient("pilosa:10101")
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
t.Cleanup(func() {
|
|
err := client.Close()
|
|
assert.NoError(t, err)
|
|
})
|
|
|
|
schema, err := client.Schema()
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
if schema.HasIndex("apitestingest_unkeyed") {
|
|
err := client.DeleteIndexByName("apitestingest_unkeyed")
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
}
|
|
|
|
schema, err = client.Schema()
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
|
|
unkeyedIdx := schema.Index("apitestingest_unkeyed", pilosaclient.OptIndexTrackExistence(true))
|
|
|
|
err = client.SyncSchema(schema)
|
|
if !assert.NoError(t, err) {
|
|
return
|
|
}
|
|
t.Cleanup(func() {
|
|
err := client.DeleteIndex(unkeyedIdx)
|
|
assert.NoError(t, err)
|
|
})
|
|
|
|
type FieldOpt struct { //nolint:unused
|
|
TimeQuantum string `json:"time-quantum,omitempty"`
|
|
CacheSize int `json:"cache-size,omitempty"`
|
|
CacheType string `json:"cache-type,omitempty"`
|
|
EnforceMutualExclusion bool `json:"enforce-mutual-exclusion,omitempty"`
|
|
Scale int `json:"scale,omitempty"`
|
|
Epoch string `json:"epoch,omitempty"`
|
|
Unit string `json:"unit,omitempty"`
|
|
TTL string `json:"ttl,omitempty"`
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
schemaField schemaField
|
|
expErr string
|
|
expOption string
|
|
}{
|
|
{
|
|
name: "id_ttl",
|
|
schemaField: schemaField{
|
|
FieldName: "id_ttl",
|
|
FieldType: "id",
|
|
FieldOptions: FieldOpt{"YMD", 0, "", false, 0, "", "", "11s"},
|
|
},
|
|
expErr: "",
|
|
expOption: `"{"options":{"noStandardView":false,"timeQuantum":"YMD","ttl":"11s","type":"time"}}"}`,
|
|
},
|
|
{
|
|
name: "id_bad_ttl",
|
|
schemaField: schemaField{
|
|
FieldName: "id_bad_ttl",
|
|
FieldType: "id",
|
|
FieldOptions: FieldOpt{"YMD", 0, "", false, 0, "", "", "bad-ttl"},
|
|
},
|
|
expErr: "unable to parse TTL",
|
|
expOption: `"{"options":{"type":"set"}}"}`,
|
|
},
|
|
{
|
|
name: "id_ttl_without_time_quantum",
|
|
schemaField: schemaField{
|
|
FieldName: "id_ttl_without_time_quantum",
|
|
FieldType: "id",
|
|
FieldOptions: FieldOpt{"", 0, "", false, 0, "", "", "12s"},
|
|
},
|
|
expErr: "",
|
|
expOption: `options: "{"options":{"type":"set"}}"}`,
|
|
},
|
|
{
|
|
name: "string_ttl",
|
|
schemaField: schemaField{
|
|
FieldName: "string_ttl",
|
|
FieldType: "string",
|
|
FieldOptions: FieldOpt{"YMD", 0, "", false, 0, "", "", "13s"},
|
|
},
|
|
expErr: "",
|
|
expOption: `"{"options":{"noStandardView":false,"timeQuantum":"YMD","ttl":"13s","type":"time"}}"}`,
|
|
},
|
|
{
|
|
name: "string_bad_ttl",
|
|
schemaField: schemaField{
|
|
FieldName: "string_bad_ttl",
|
|
FieldType: "string",
|
|
FieldOptions: FieldOpt{"YMD", 0, "", false, 0, "", "", "bad-ttl"},
|
|
},
|
|
expErr: "unable to parse TTL",
|
|
expOption: `"{"options":{"type":"set"}}"}`,
|
|
},
|
|
{
|
|
name: "string_ttl_without_time_quantum",
|
|
schemaField: schemaField{
|
|
FieldName: "string_ttl_without_time_quantum",
|
|
FieldType: "string",
|
|
FieldOptions: FieldOpt{"", 0, "", false, 0, "", "", "14s"},
|
|
},
|
|
expErr: "",
|
|
expOption: `options: "{"options":{"type":"set"}}"}`,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
err := (test.schemaField).applyToPilosa(unkeyedIdx)
|
|
if err != nil && !strings.Contains(err.Error(), test.expErr) {
|
|
t.Errorf("expected error: '%s', got: '%s'", test.expErr, err.Error())
|
|
}
|
|
|
|
if !strings.Contains(unkeyedIdx.String(), test.expOption) {
|
|
t.Errorf("expected option: '%v', got: '%v'", test.expOption, unkeyedIdx.String())
|
|
}
|
|
})
|
|
}
|
|
}
|