From cef7b3509a1bf89d0e26fbd5d35d410b6ada54f1 Mon Sep 17 00:00:00 2001 From: a631807682 <631807682@qq.com> Date: Wed, 6 Mar 2024 13:52:51 +0800 Subject: [PATCH] test: namer identifier lenght --- tests/table_test.go | 87 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/tests/table_test.go b/tests/table_test.go index fa569d320..0d44a15be 100644 --- a/tests/table_test.go +++ b/tests/table_test.go @@ -2,8 +2,10 @@ package tests_test import ( "regexp" + "sync" "testing" + "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/schema" "gorm.io/gorm/utils/tests" @@ -172,3 +174,88 @@ func TestTableWithNamer(t *testing.T) { t.Errorf("Table with namer, got %v", sql) } } + +func TestPostgresTableWithIdentifierLength(t *testing.T) { + if DB.Dialector.Name() != "postgres" { + return + } + + type LongString struct { + ThisIsAVeryVeryVeryVeryVeryVeryVeryVeryVeryLongString string `gorm:"unique"` + } + + t.Run("default", func(t *testing.T) { + db, _ := gorm.Open(postgres.Open(postgresDSN), &gorm.Config{}) + user, err := schema.Parse(&LongString{}, &sync.Map{}, db.Config.NamingStrategy) + if err != nil { + t.Fatalf("failed to parse user unique, got error %v", err) + } + + constraints := user.ParseUniqueConstraints() + if len(constraints) != 1 { + t.Fatalf("failed to find unique constraint, got %v", constraints) + } + + for key := range constraints { + if len(key) != 63 { + t.Errorf("failed to find unique constraint, got %v", constraints) + } + } + }) + + t.Run("naming strategy", func(t *testing.T) { + db, _ := gorm.Open(postgres.Open(postgresDSN), &gorm.Config{ + NamingStrategy: schema.NamingStrategy{}, + }) + + user, err := schema.Parse(&LongString{}, &sync.Map{}, db.Config.NamingStrategy) + if err != nil { + t.Fatalf("failed to parse user unique, got error %v", err) + } + + constraints := user.ParseUniqueConstraints() + if len(constraints) != 1 { + t.Fatalf("failed to find unique constraint, got %v", constraints) + } + + for key := range constraints { + if len(key) != 63 { + t.Errorf("failed to find unique constraint, got %v", constraints) + } + } + }) + + t.Run("namer", func(t *testing.T) { + uname := "custom_unique_name" + db, _ := gorm.Open(postgres.Open(postgresDSN), &gorm.Config{ + NamingStrategy: mockUniqueNamingStrategy{ + UName: uname, + }, + }) + + user, err := schema.Parse(&LongString{}, &sync.Map{}, db.Config.NamingStrategy) + if err != nil { + t.Fatalf("failed to parse user unique, got error %v", err) + } + + constraints := user.ParseUniqueConstraints() + if len(constraints) != 1 { + t.Fatalf("failed to find unique constraint, got %v", constraints) + } + + for key := range constraints { + if key != uname { + t.Errorf("failed to find unique constraint, got %v", constraints) + } + } + }) +} + +type mockUniqueNamingStrategy struct { + UName string + schema.NamingStrategy +} + +func (a mockUniqueNamingStrategy) UniqueName(table, column string) string { + return a.UName +}