func TestTable_AddColumn(t *testing.T) { c0 := pqt.NewColumn("c0", pqt.TypeSerialBig(), pqt.WithPrimaryKey()) c1 := &pqt.Column{Name: "c1"} c2 := &pqt.Column{Name: "c2"} c3 := &pqt.Column{Name: "c3"} tbl := pqt.NewTable("test"). AddColumn(c0). AddColumn(c1). AddColumn(c2). AddColumn(c3). AddColumn(pqt.NewColumn("c4", pqt.TypeIntegerBig(), pqt.WithReference(c0))). AddRelationship(pqt.ManyToOne(pqt.SelfReference())) if len(tbl.Columns) != 6 { t.Errorf("wrong number of colums, expected %d but got %d", 6, len(tbl.Columns)) } if len(tbl.OwnedRelationships) != 2 { // Reference is not a relationship t.Errorf("wrong number of owned relationships, expected %d but got %d", 2, len(tbl.OwnedRelationships)) } for i, c := range tbl.Columns { if c.Name == "" { t.Errorf("column #%d table name is empty", i) } if c.Table == nil { t.Errorf("column #%d table nil pointer", i) } } }
func schema(sn string) *pqt.Schema { title := pqt.NewColumn("title", pqt.TypeText(), pqt.WithNotNull(), pqt.WithUnique()) lead := pqt.NewColumn("lead", pqt.TypeText()) news := pqt.NewTable("news", pqt.WithTableIfNotExists()). AddColumn(pqt.NewColumn("id", pqt.TypeSerialBig(), pqt.WithPrimaryKey())). AddColumn(title). AddColumn(lead). AddColumn(pqt.NewColumn("continue", pqt.TypeBool(), pqt.WithNotNull(), pqt.WithDefault("false"))). AddColumn(pqt.NewColumn("content", pqt.TypeText(), pqt.WithNotNull())). AddUnique(title, lead) comment := pqt.NewTable("comment", pqt.WithTableIfNotExists()). AddColumn(pqt.NewColumn("id", pqt.TypeSerialBig())). AddColumn(pqt.NewColumn("content", pqt.TypeText(), pqt.WithNotNull())). AddColumn(pqt.NewColumn( "news_title", pqt.TypeText(), pqt.WithNotNull(), pqt.WithReference(title, pqt.WithBidirectional(), pqt.WithOwnerName("comments_by_news_title"), pqt.WithInversedName("news_by_title")), )) category := pqt.NewTable("category", pqt.WithTableIfNotExists()). AddColumn(pqt.NewColumn("id", pqt.TypeSerialBig(), pqt.WithPrimaryKey())). AddColumn(pqt.NewColumn("name", pqt.TypeText(), pqt.WithNotNull())). AddColumn(pqt.NewColumn("content", pqt.TypeText(), pqt.WithNotNull())). AddRelationship( pqt.OneToMany( pqt.SelfReference(), pqt.WithBidirectional(), pqt.WithInversedName("child_category"), pqt.WithOwnerName("parent_category"), pqt.WithColumnName("parent_id"), ), ) pkg := pqt.NewTable("package", pqt.WithTableIfNotExists()). AddColumn(pqt.NewColumn("id", pqt.TypeSerialBig(), pqt.WithPrimaryKey())). AddColumn(pqt.NewColumn("break", pqt.TypeText())). AddRelationship(pqt.ManyToOne( category, pqt.WithBidirectional(), )) timestampable(news) timestampable(comment) timestampable(category) timestampable(pkg) comment.AddRelationship(pqt.ManyToOne(news, pqt.WithBidirectional(), pqt.WithInversedName("news_by_id")), pqt.WithNotNull()) pqt.ManyToMany(category, news, pqt.WithBidirectional()) return pqt.NewSchema(sn, pqt.WithSchemaIfNotExists()). AddTable(category). AddTable(pkg). AddTable(news). AddTable(comment) }
func TestNewColumn(t *testing.T) { collate := "UTF-7" check := "username = '******'" r := pqt.NewColumn("username", pqt.TypeText()) c := pqt.NewColumn( "user_username", pqt.TypeText(), pqt.WithCollate(collate), pqt.WithCheck(check), pqt.WithDefault("janusz"), pqt.WithUnique(), pqt.WithTypeMapping(pqtgo.BuiltinType(types.Byte)), pqt.WithNotNull(), pqt.WithPrimaryKey(), pqt.WithReference(r), ) if c.Type.String() != pqt.TypeText().String() { t.Errorf("wrong column type, expected %s but got %s", pqt.TypeText().String(), c.Type.String()) } if c.Collate != collate { t.Errorf("wrong column collate, expected %s but got %s", collate, c.Collate) } if c.Check != check { t.Errorf("wrong column check, expected %s but got %s", check, c.Check) } if d, ok := c.Default[pqt.EventInsert]; ok && d != "janusz" { t.Errorf("wrong column default, expected %s but got %s", "janusz", d) } if !c.Unique { t.Error("wrong column unique, expected true but got false") } if !c.NotNull { t.Error("wrong column not null, expected true but got false") } if !c.PrimaryKey { t.Error("wrong column primary key, expected true but got false") } if c.Reference != r { t.Errorf("wrong column reference, expected %p but got %p", r, c.Reference) } constraints := c.Constraints() if len(constraints) != 3 { t.Errorf("wrong number of constraints, expected 3 but got %d", len(constraints)) } var hasPK, hasFK, hasCH bool for _, constraint := range constraints { switch constraint.Type { case pqt.ConstraintTypePrimaryKey: hasPK = true case pqt.ConstraintTypeForeignKey: hasFK = true case pqt.ConstraintTypeCheck: hasCH = true } } if !hasPK { t.Errorf("mising primary key constraint") } if !hasFK { t.Errorf("mising foreign key constraint") } if !hasCH { t.Errorf("mising check constraint") } }