featurebase/idk/api/schema_test.go
2022-09-06 09:39:22 -07:00

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())
}
})
}
}