package query import ( "dim/types" "testing" ) func TestFieldListToSelect(t *testing.T) { tests := []struct { table string names types.FieldList mapping map[string]string out string }{ {"foo", types.NewFieldList("name"), map[string]string{"name": "name"}, "name as name"}, { "foo", types.NewFieldList("foo", "bar", "baz"), map[string]string{"foo": "c.foo", "bar": "b.bar"}, "b.bar as bar,foo.attributes->'baz' as baz,c.foo as foo", }, { "foo", types.NewFieldList("subnets", "vlan", "name"), map[string]string{"subnets": "s.subnets", "vlan": "vlan.vlan_id", "name": "p.name"}, "p.name as name,s.subnets as subnets,vlan.vlan_id as vlan", }, } for _, test := range tests { out := FieldListToSelect(test.table, test.names, test.mapping) if out != test.out { t.Errorf("expected `%s`, got `%s`", test.out, out) } } } func TestNameToAttrPath(t *testing.T) { tests := []struct { table string in string out string }{ {"zoo", "foo", `zoo.attributes->'foo'`}, {"zoo", "foo.bar", `zoo.attributes->'foo'->'bar'`}, {"zoo", "", `zoo.attributes`}, } for _, test := range tests { out := nameToAttrPath(test.table, test.in) if test.out != out { t.Errorf("expected `%s`, got `%s`", test.out, out) } } } func TestFieldMapToUpdate(t *testing.T) { tests := []struct { table string vals types.FieldMap mapping map[string]string set string // expected set clause args []interface{} // expected arguments }{ { // check for normal field mapping "zoo", types.NewFieldMap(map[string]interface{}{"key": "value"}), map[string]string{"key": "field"}, "zoo.field = $1", []interface{}{"value"}, }, { // generate attributes field "zoo", types.NewFieldMap(map[string]interface{}{"key2": "value"}), map[string]string{"key": "field"}, "zoo.attributes->'key2' = $1", []interface{}{"value"}, }, { // mixed mapped and unmapped field "zoo", types.NewFieldMap(map[string]interface{}{"key2": "value", "key": "value"}), map[string]string{"key": "field"}, "zoo.attributes->'key2' = $1,zoo.field = $2", []interface{}{"value", "value"}, }, } for _, test := range tests { set, args := FieldMapToUpdate(test.table, test.vals, test.mapping) if set != test.set { t.Errorf("expected set clause `%s`, got `%s`", test.set, set) } for i, arg := range args { if arg != test.args[i] { t.Errorf("expected argument at pos %d to be %#v, but was %#v", i, test.args[i], arg) } } } }