fb802ad687
- to_many relationships are now cached on the table data structure - to_many relationships now know if any columns involved are nullable
291 lines
7.4 KiB
Go
291 lines
7.4 KiB
Go
package bdb
|
|
|
|
import "testing"
|
|
|
|
func TestToManyRelationships(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tables := []Table{
|
|
Table{Name: "users", Columns: []Column{{Name: "id"}}},
|
|
Table{Name: "contests", Columns: []Column{{Name: "id"}}},
|
|
Table{
|
|
Name: "videos",
|
|
Columns: []Column{
|
|
{Name: "id"},
|
|
{Name: "user_id"},
|
|
{Name: "contest_id"},
|
|
},
|
|
FKeys: []ForeignKey{
|
|
{Name: "videos_user_id_fk", Column: "user_id", ForeignTable: "users", ForeignColumn: "id"},
|
|
{Name: "videos_contest_id_fk", Column: "contest_id", ForeignTable: "contests", ForeignColumn: "id"},
|
|
},
|
|
},
|
|
Table{
|
|
Name: "notifications",
|
|
Columns: []Column{
|
|
{Name: "user_id"},
|
|
{Name: "source_id"},
|
|
},
|
|
FKeys: []ForeignKey{
|
|
{Name: "notifications_user_id_fk", Column: "user_id", ForeignTable: "users", ForeignColumn: "id"},
|
|
{Name: "notifications_source_id_fk", Column: "source_id", ForeignTable: "users", ForeignColumn: "id"},
|
|
},
|
|
},
|
|
Table{
|
|
Name: "users_video_tags",
|
|
IsJoinTable: true,
|
|
Columns: []Column{
|
|
{Name: "user_id"},
|
|
{Name: "video_id"},
|
|
},
|
|
FKeys: []ForeignKey{
|
|
{Name: "user_id_fk", Column: "user_id", ForeignTable: "users", ForeignColumn: "id"},
|
|
{Name: "video_id_fk", Column: "video_id", ForeignTable: "videos", ForeignColumn: "id"},
|
|
},
|
|
},
|
|
}
|
|
|
|
relationships := ToManyRelationships("users", tables)
|
|
if len(relationships) != 4 {
|
|
t.Error("wrong # of relationships:", len(relationships))
|
|
}
|
|
|
|
r := relationships[0]
|
|
if r.Column != "id" {
|
|
t.Error("wrong local column:", r.Column)
|
|
}
|
|
if r.Nullable {
|
|
t.Error("should not be nullable")
|
|
}
|
|
if r.ForeignTable != "videos" {
|
|
t.Error("wrong foreign table:", r.ForeignTable)
|
|
}
|
|
if r.ForeignColumn != "user_id" {
|
|
t.Error("wrong foreign column:", r.ForeignColumn)
|
|
}
|
|
if r.ForeignColumnNullable {
|
|
t.Error("should not be nullable")
|
|
}
|
|
if r.ToJoinTable {
|
|
t.Error("not a join table")
|
|
}
|
|
|
|
r = relationships[1]
|
|
if r.Column != "id" {
|
|
t.Error("wrong local column:", r.Column)
|
|
}
|
|
if r.Nullable {
|
|
t.Error("should not be nullable")
|
|
}
|
|
if r.ForeignTable != "notifications" {
|
|
t.Error("wrong foreign table:", r.ForeignTable)
|
|
}
|
|
if r.ForeignColumn != "user_id" {
|
|
t.Error("wrong foreign column:", r.ForeignColumn)
|
|
}
|
|
if r.ForeignColumnNullable {
|
|
t.Error("should not be nullable")
|
|
}
|
|
if r.ToJoinTable {
|
|
t.Error("not a join table")
|
|
}
|
|
|
|
r = relationships[2]
|
|
if r.Column != "id" {
|
|
t.Error("wrong local column:", r.Column)
|
|
}
|
|
if r.Nullable {
|
|
t.Error("should not be nullable")
|
|
}
|
|
if r.ForeignTable != "notifications" {
|
|
t.Error("wrong foreign table:", r.ForeignTable)
|
|
}
|
|
if r.ForeignColumn != "source_id" {
|
|
t.Error("wrong foreign column:", r.ForeignColumn)
|
|
}
|
|
if r.ForeignColumnNullable {
|
|
t.Error("should not be nullable")
|
|
}
|
|
if r.ToJoinTable {
|
|
t.Error("not a join table")
|
|
}
|
|
|
|
r = relationships[3]
|
|
if r.Column != "id" {
|
|
t.Error("wrong local column:", r.Column)
|
|
}
|
|
if r.Nullable {
|
|
t.Error("should not be nullable")
|
|
}
|
|
if r.ForeignColumn != "id" {
|
|
t.Error("wrong foreign column:", r.Column)
|
|
}
|
|
if r.ForeignColumnNullable {
|
|
t.Error("should not be nullable")
|
|
}
|
|
if r.ForeignTable != "videos" {
|
|
t.Error("wrong foreign table:", r.ForeignTable)
|
|
}
|
|
if r.JoinTable != "users_video_tags" {
|
|
t.Error("wrong join table:", r.ForeignTable)
|
|
}
|
|
if r.JoinLocalColumn != "user_id" {
|
|
t.Error("wrong local join column:", r.JoinLocalColumn)
|
|
}
|
|
if r.JoinLocalColumnNullable {
|
|
t.Error("should not be nullable")
|
|
}
|
|
if r.JoinForeignColumn != "video_id" {
|
|
t.Error("wrong foreign join column:", r.JoinForeignColumn)
|
|
}
|
|
if r.JoinForeignColumnNullable {
|
|
t.Error("should not be nullable")
|
|
}
|
|
if !r.ToJoinTable {
|
|
t.Error("expected a join table")
|
|
}
|
|
}
|
|
|
|
func TestToManyRelationshipsNull(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
tables := []Table{
|
|
Table{Name: "users", Columns: []Column{{Name: "id", Nullable: true}}},
|
|
Table{Name: "contests", Columns: []Column{{Name: "id", Nullable: true}}},
|
|
Table{
|
|
Name: "videos",
|
|
Columns: []Column{
|
|
{Name: "id", Nullable: true},
|
|
{Name: "user_id", Nullable: true},
|
|
{Name: "contest_id", Nullable: true},
|
|
},
|
|
FKeys: []ForeignKey{
|
|
{Name: "videos_user_id_fk", Column: "user_id", ForeignTable: "users", ForeignColumn: "id", Nullable: true},
|
|
{Name: "videos_contest_id_fk", Column: "contest_id", ForeignTable: "contests", ForeignColumn: "id", Nullable: true},
|
|
},
|
|
},
|
|
Table{
|
|
Name: "notifications",
|
|
Columns: []Column{
|
|
{Name: "user_id", Nullable: true},
|
|
{Name: "source_id", Nullable: true},
|
|
},
|
|
FKeys: []ForeignKey{
|
|
{Name: "notifications_user_id_fk", Column: "user_id", ForeignTable: "users", ForeignColumn: "id", Nullable: true},
|
|
{Name: "notifications_source_id_fk", Column: "source_id", ForeignTable: "users", ForeignColumn: "id", Nullable: true},
|
|
},
|
|
},
|
|
Table{
|
|
Name: "users_video_tags",
|
|
IsJoinTable: true,
|
|
Columns: []Column{
|
|
{Name: "user_id", Nullable: true},
|
|
{Name: "video_id", Nullable: true},
|
|
},
|
|
FKeys: []ForeignKey{
|
|
{Name: "user_id_fk", Column: "user_id", ForeignTable: "users", ForeignColumn: "id", Nullable: true},
|
|
{Name: "video_id_fk", Column: "video_id", ForeignTable: "videos", ForeignColumn: "id", Nullable: true},
|
|
},
|
|
},
|
|
}
|
|
|
|
relationships := ToManyRelationships("users", tables)
|
|
if len(relationships) != 4 {
|
|
t.Error("wrong # of relationships:", len(relationships))
|
|
}
|
|
|
|
r := relationships[0]
|
|
if r.Column != "id" {
|
|
t.Error("wrong local column:", r.Column)
|
|
}
|
|
if !r.Nullable {
|
|
t.Error("should be nullable")
|
|
}
|
|
if r.ForeignTable != "videos" {
|
|
t.Error("wrong foreign table:", r.ForeignTable)
|
|
}
|
|
if r.ForeignColumn != "user_id" {
|
|
t.Error("wrong foreign column:", r.ForeignColumn)
|
|
}
|
|
if !r.ForeignColumnNullable {
|
|
t.Error("should be nullable")
|
|
}
|
|
if r.ToJoinTable {
|
|
t.Error("not a join table")
|
|
}
|
|
|
|
r = relationships[1]
|
|
if r.Column != "id" {
|
|
t.Error("wrong local column:", r.Column)
|
|
}
|
|
if !r.Nullable {
|
|
t.Error("should be nullable")
|
|
}
|
|
if r.ForeignTable != "notifications" {
|
|
t.Error("wrong foreign table:", r.ForeignTable)
|
|
}
|
|
if r.ForeignColumn != "user_id" {
|
|
t.Error("wrong foreign column:", r.ForeignColumn)
|
|
}
|
|
if !r.ForeignColumnNullable {
|
|
t.Error("should be nullable")
|
|
}
|
|
if r.ToJoinTable {
|
|
t.Error("not a join table")
|
|
}
|
|
|
|
r = relationships[2]
|
|
if r.Column != "id" {
|
|
t.Error("wrong local column:", r.Column)
|
|
}
|
|
if !r.Nullable {
|
|
t.Error("should be nullable")
|
|
}
|
|
if r.ForeignTable != "notifications" {
|
|
t.Error("wrong foreign table:", r.ForeignTable)
|
|
}
|
|
if r.ForeignColumn != "source_id" {
|
|
t.Error("wrong foreign column:", r.ForeignColumn)
|
|
}
|
|
if !r.ForeignColumnNullable {
|
|
t.Error("should be nullable")
|
|
}
|
|
if r.ToJoinTable {
|
|
t.Error("not a join table")
|
|
}
|
|
|
|
r = relationships[3]
|
|
if r.Column != "id" {
|
|
t.Error("wrong local column:", r.Column)
|
|
}
|
|
if !r.Nullable {
|
|
t.Error("should be nullable")
|
|
}
|
|
if r.ForeignColumn != "id" {
|
|
t.Error("wrong foreign column:", r.Column)
|
|
}
|
|
if !r.ForeignColumnNullable {
|
|
t.Error("should be nullable")
|
|
}
|
|
if r.ForeignTable != "videos" {
|
|
t.Error("wrong foreign table:", r.ForeignTable)
|
|
}
|
|
if r.JoinTable != "users_video_tags" {
|
|
t.Error("wrong join table:", r.ForeignTable)
|
|
}
|
|
if r.JoinLocalColumn != "user_id" {
|
|
t.Error("wrong local join column:", r.JoinLocalColumn)
|
|
}
|
|
if !r.JoinLocalColumnNullable {
|
|
t.Error("should be nullable")
|
|
}
|
|
if r.JoinForeignColumn != "video_id" {
|
|
t.Error("wrong foreign join column:", r.JoinForeignColumn)
|
|
}
|
|
if !r.JoinForeignColumnNullable {
|
|
t.Error("should be nullable")
|
|
}
|
|
if !r.ToJoinTable {
|
|
t.Error("expected a join table")
|
|
}
|
|
}
|