package orm import ( "database/sql" "encoding/json" "time" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) type CreateTableModel struct { Id int Int8 int8 Uint8 uint8 Int16 int16 Uint16 uint16 Int32 int32 Uint32 uint32 Int64 int64 Uint64 uint64 Float32 float32 Float64 float64 Decimal float64 `sql:"type:'decimal(10,10)'"` ByteSlice []byte ByteArray [32]byte String string `sql:"default:'D\\'Angelo'"` Varchar string `sql:",type:varchar(500)"` Time time.Time `sql:"default:now()"` NotNull int `sql:",notnull"` NullBool sql.NullBool NullFloat64 sql.NullFloat64 NullInt64 sql.NullInt64 NullString sql.NullString Slice []int SliceArray []int `sql:",array"` Map map[int]int MapHstore map[int]int `sql:",hstore"` Struct struct{} StructPtr *struct{} Unique int `sql:",unique"` UniqueField1 int `sql:"unique:field1_field2"` UniqueField2 int `sql:"unique:field1_field2"` JSONRawMessage json.RawMessage } type CreateTableWithoutPKModel struct { String string } type CreateTableOnDeleteOnUpdateModel struct { Id int CreateTableModelId int `sql:"on_delete:RESTRICT, on_update:CASCADE"` CreateTableModel *CreateTableModel } type CreateTableWithTablespace struct { tableName string `sql:"tablespace:ssd"` String string } var _ = Describe("CreateTable", func() { It("creates new table", func() { q := NewQuery(nil, &CreateTableModel{}) b, err := (&createTableQuery{q: q}).AppendQuery(nil) Expect(err).NotTo(HaveOccurred()) Expect(string(b)).To(Equal(`CREATE TABLE "create_table_models" ("id" bigserial, "int8" smallint, "uint8" smallint, "int16" smallint, "uint16" integer, "int32" integer, "uint32" bigint, "int64" bigint, "uint64" bigint, "float32" real, "float64" double precision, "decimal" decimal(10,10), "byte_slice" bytea, "byte_array" bytea, "string" text DEFAULT 'D''Angelo', "varchar" varchar(500), "time" timestamptz DEFAULT now(), "not_null" bigint NOT NULL, "null_bool" boolean, "null_float64" double precision, "null_int64" bigint, "null_string" text, "slice" jsonb, "slice_array" bigint[], "map" jsonb, "map_hstore" hstore, "struct" jsonb, "struct_ptr" jsonb, "unique" bigint UNIQUE, "unique_field1" bigint, "unique_field2" bigint, "json_raw_message" jsonb, PRIMARY KEY ("id"), UNIQUE ("unique_field1", "unique_field2"))`)) }) It("creates new table without primary key", func() { q := NewQuery(nil, &CreateTableWithoutPKModel{}) b, err := (&createTableQuery{q: q}).AppendQuery(nil) Expect(err).NotTo(HaveOccurred()) Expect(string(b)).To(Equal(`CREATE TABLE "create_table_without_pk_models" ("string" text)`)) }) It("creates new table with Varchar=255", func() { q := NewQuery(nil, &CreateTableWithoutPKModel{}) opt := &CreateTableOptions{Varchar: 255} b, err := (&createTableQuery{q: q, opt: opt}).AppendQuery(nil) Expect(err).NotTo(HaveOccurred()) Expect(string(b)).To(Equal(`CREATE TABLE "create_table_without_pk_models" ("string" varchar(255))`)) }) It("creates new table with on_delete and on_update options", func() { q := NewQuery(nil, &CreateTableOnDeleteOnUpdateModel{}) opt := &CreateTableOptions{FKConstraints: true} b, err := (&createTableQuery{q: q, opt: opt}).AppendQuery(nil) Expect(err).NotTo(HaveOccurred()) Expect(string(b)).To(Equal(`CREATE TABLE "create_table_on_delete_on_update_models" ("id" bigserial, "create_table_model_id" bigint, PRIMARY KEY ("id"), FOREIGN KEY ("create_table_model_id") REFERENCES "create_table_models" ("id") ON DELETE RESTRICT ON UPDATE CASCADE)`)) }) It("creates new table with tablespace options", func() { q := NewQuery(nil, &CreateTableWithTablespace{}) opt := &CreateTableOptions{} b, err := (&createTableQuery{q: q, opt: opt}).AppendQuery(nil) Expect(err).NotTo(HaveOccurred()) Expect(string(b)).To(Equal(`CREATE TABLE "create_table_with_tablespaces" ("string" text) TABLESPACE ssd`)) }) })