diff --git a/postgresql/local_test.go b/postgresql/local_test.go new file mode 100644 index 0000000000000000000000000000000000000000..0a17bbe835e71ed50bda2db2240691c1959bfbf0 --- /dev/null +++ b/postgresql/local_test.go @@ -0,0 +1,83 @@ +package postgresql + +import ( + "database/sql" + "testing" + + "github.com/stretchr/testify/assert" + "upper.io/db.v2" +) + +func TestStringAndInt64Array(t *testing.T) { + sess := mustOpen() + driver := sess.Driver().(*sql.DB) + + defer func() { + driver.Exec(`DROP TABLE IF EXISTS array_types`) + sess.Close() + }() + + if _, err := driver.Exec(` + CREATE TABLE array_types ( + id serial primary key, + integers bigint[] DEFAULT NULL, + strings varchar(64)[] + )`); err != nil { + assert.NoError(t, err) + } + + arrayTypes := sess.Collection("array_types") + err := arrayTypes.Truncate() + assert.NoError(t, err) + + type arrayType struct { + ID int64 `db:"id,pk"` + Integers []int64 `db:"integers,int64array"` + Strings []string `db:"strings,stringarray"` + } + + tt := []arrayType{ + // Test nil arrays. + arrayType{ + ID: 1, + Integers: nil, + Strings: nil, + }, + + // Test empty arrays. + arrayType{ + ID: 2, + Integers: []int64{}, + Strings: []string{}, + }, + + // Test non-empty arrays. + arrayType{ + ID: 3, + Integers: []int64{1, 2, 3}, + Strings: []string{"1", "2", "3"}, + }, + } + + for _, item := range tt { + id, err := arrayTypes.Insert(item) + assert.NoError(t, err) + + if pk, ok := id.(int64); !ok || pk == 0 { + t.Fatalf("Expecting an ID.") + } + + var itemCheck arrayType + err = arrayTypes.Find(db.Cond{"id": id}).One(&itemCheck) + assert.NoError(t, err) + assert.Len(t, itemCheck.Integers, len(item.Integers)) + assert.Len(t, itemCheck.Strings, len(item.Strings)) + + // Check nil/zero values just to make sure that the arrays won't + // be JSON-marshalled into `null` instead of empty array `[]`. + assert.NotNil(t, itemCheck.Integers) + assert.NotNil(t, itemCheck.Strings) + assert.NotZero(t, itemCheck.Integers) + assert.NotZero(t, itemCheck.Strings) + } +}