featurebase/idk/kafka/putsource_test.go
Matthew Jaffee 6d4c1d9db1
Sup 294 pre sort command (#2209)
* first cut at pre-sort command that works on ndjson

* finish pre_sort command for CSV and JSON and add test

* try fixing golangci-lint

* remove some dumb lint checks

* more linter disabling

* take .golangci.yml from previous repo

* go fmt (facepalm)

* remove ioutil to fix lint
2023-01-23 12:26:38 -06:00

309 lines
6.3 KiB
Go

package kafka
import (
"reflect"
"strings"
"testing"
"github.com/featurebasedb/featurebase/v3/idk"
"github.com/go-avro/avro"
)
func TestIdkSchemaToAvroRecordSchema(t *testing.T) {
tests := []struct {
name string
field idk.Field
fields []idk.Field
schemaField []*avro.SchemaField
expRecordSchema string
expErr string
}{
{
name: "string field ttl",
fields: []idk.Field{
idk.StringField{
NameVal: "a",
DestNameVal: "a",
Quantum: "YMD",
TTL: "11s",
},
},
schemaField: []*avro.SchemaField{
{
Name: "a",
Type: &avro.UnionSchema{
Types: []avro.Schema{
&avro.NullSchema{},
&avro.StringSchema{
Properties: map[string]interface{}{
"cacheSize": "0",
"cacheType": "",
"mutex": false,
"quantum": "YMD",
"ttl": "11s",
},
},
},
},
},
},
expErr: "",
},
{
name: "string field bad ttl",
fields: []idk.Field{
idk.StringField{
NameVal: "b",
DestNameVal: "b",
Quantum: "YMD",
TTL: "bad-ttl",
},
},
expRecordSchema: "bad-ttl-no-recordSchema",
expErr: "unable to parse TTL",
},
{
name: "string field ttl without quantum",
fields: []idk.Field{
idk.StringField{
NameVal: "c",
DestNameVal: "c",
TTL: "12s",
},
},
schemaField: []*avro.SchemaField{
{
Name: "c",
Type: &avro.UnionSchema{
Types: []avro.Schema{
&avro.NullSchema{},
&avro.StringSchema{
Properties: map[string]interface{}{
"cacheSize": "50000",
"cacheType": "ranked",
"mutex": false,
"quantum": "",
"ttl": "0s",
},
},
},
},
},
},
expErr: "",
},
{
name: "id field ttl",
fields: []idk.Field{
idk.IDField{
NameVal: "d",
DestNameVal: "d",
Quantum: "YMD",
TTL: "13s",
},
},
schemaField: []*avro.SchemaField{
{
Name: "d",
Type: &avro.UnionSchema{
Types: []avro.Schema{
&avro.NullSchema{},
&avro.LongSchema{
Properties: map[string]interface{}{
"cacheSize": "0",
"cacheType": "",
"mutex": false,
"quantum": "YMD",
"ttl": "13s",
"fieldType": "id",
},
},
},
},
},
},
expErr: "",
},
{
name: "id field ttl without quantum",
fields: []idk.Field{
idk.IDField{
NameVal: "e",
DestNameVal: "e",
TTL: "14s",
},
},
schemaField: []*avro.SchemaField{
{
Name: "e",
Type: &avro.UnionSchema{
Types: []avro.Schema{
&avro.NullSchema{},
&avro.LongSchema{
Properties: map[string]interface{}{
"cacheSize": "50000",
"cacheType": "ranked",
"mutex": false,
"quantum": "",
"ttl": "0s",
"fieldType": "id",
},
},
},
},
},
},
expErr: "",
},
{
name: "string array field ttl",
fields: []idk.Field{
idk.StringArrayField{
NameVal: "f",
DestNameVal: "f",
Quantum: "YMD",
TTL: "15s",
},
},
schemaField: []*avro.SchemaField{
{
Name: "f",
Type: &avro.UnionSchema{
Types: []avro.Schema{
&avro.NullSchema{},
&avro.ArraySchema{
Items: &avro.StringSchema{
Properties: map[string]interface{}{
"cacheSize": "0",
"cacheType": "",
"quantum": "YMD",
"ttl": "15s",
},
},
},
},
},
},
},
expErr: "",
},
{
name: "string array field ttl without quantum",
fields: []idk.Field{
idk.StringArrayField{
NameVal: "g",
DestNameVal: "g",
TTL: "16s",
},
},
schemaField: []*avro.SchemaField{
{
Name: "g",
Type: &avro.UnionSchema{
Types: []avro.Schema{
&avro.NullSchema{},
&avro.ArraySchema{
Items: &avro.StringSchema{
Properties: map[string]interface{}{
"cacheSize": "50000",
"cacheType": "ranked",
"quantum": "",
"ttl": "0s",
},
},
},
},
},
},
},
expErr: "",
},
{
name: "id array field ttl",
fields: []idk.Field{
idk.IDArrayField{
NameVal: "h",
DestNameVal: "h",
Quantum: "YMD",
TTL: "17s",
},
},
schemaField: []*avro.SchemaField{
{
Name: "h",
Type: &avro.UnionSchema{
Types: []avro.Schema{
&avro.NullSchema{},
&avro.ArraySchema{
Items: &avro.LongSchema{
Properties: map[string]interface{}{
"cacheSize": "0",
"cacheType": "",
"quantum": "YMD",
"ttl": "17s",
},
},
},
},
},
},
},
expErr: "",
},
{
name: "id array field ttl without quantum",
fields: []idk.Field{
idk.IDArrayField{
NameVal: "i",
DestNameVal: "i",
TTL: "18s",
},
},
schemaField: []*avro.SchemaField{
{
Name: "i",
Type: &avro.UnionSchema{
Types: []avro.Schema{
&avro.NullSchema{},
&avro.ArraySchema{
Items: &avro.LongSchema{
Properties: map[string]interface{}{
"cacheSize": "50000",
"cacheType": "ranked",
"quantum": "",
"ttl": "0s",
},
},
},
},
},
},
},
expErr: "",
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
testRecordSchema := &avro.RecordSchema{
Name: "idk_datagen",
Namespace: "idk.datagen",
Doc: "idk-datagen",
}
if test.expRecordSchema == "bad-ttl-no-recordSchema" {
testRecordSchema = nil
} else {
testRecordSchema.Fields = test.schemaField
}
field, err := idkSchemaToAvroRecordSchema(test.fields)
if !reflect.DeepEqual(field, testRecordSchema) {
t.Errorf("expected field: '%v', got: '%v'", testRecordSchema, field)
}
if err != nil && !strings.Contains(err.Error(), test.expErr) {
t.Errorf("expected error: '%s', got: '%s'", test.expErr, err.Error())
}
})
}
}