From 1cbccf268c63935ac3913d956251fc8f7a658a91 Mon Sep 17 00:00:00 2001 From: viatoriche / Maxim Panfilov Date: Mon, 27 Jun 2022 21:06:43 +0300 Subject: [PATCH 1/5] add test: postgres: AutoMigrate: unneeded `ALTER COLUMN TYPE smallint` --- tests/migrate_test.go | 39 +++++++++++++++++++++++++++++++++++++++ tests/tracer_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 tests/tracer_test.go diff --git a/tests/migrate_test.go b/tests/migrate_test.go index 9e7caec9..226aa4d2 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -1,6 +1,7 @@ package tests_test import ( + "context" "fmt" "math/rand" "reflect" @@ -9,6 +10,7 @@ import ( "time" "gorm.io/driver/postgres" + "gorm.io/gorm" "gorm.io/gorm/schema" . "gorm.io/gorm/utils/tests" @@ -72,6 +74,43 @@ func TestMigrate(t *testing.T) { t.Fatalf("Failed to find index for many2many for %v %v", indexes[0], indexes[1]) } } + +} + +func TestAutoMigrateInt8PG(t *testing.T) { + if DB.Dialector.Name() != "postgres" { + return + } + + type MigrateInt struct { + Int8 int8 + } + + tracer := Tracer{ + Logger: DB.Config.Logger, + Test: func(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { + sql, _ := fc() + if sql == "ALTER TABLE \"migrate_ints\" ALTER COLUMN \"int8\" TYPE smallint" { + t.Fatalf("shouldn't execute ALTER COLUMN TYPE if such type is already existed in DB schema") + } + }, + } + + DB.Migrator().DropTable(&MigrateInt{}) + + // The first AutoMigrate to make table with field with correct type + if err := DB.AutoMigrate(&MigrateInt{}); err != nil { + t.Fatalf("Failed to auto migrate: error: %v", err) + } + + // make new session to set custom logger tracer + session := DB.Session(&gorm.Session{Logger: tracer}) + + // The second AutoMigrate to catch an error + if err := session.AutoMigrate(&MigrateInt{}); err != nil { + t.Fatalf("Failed to auto migrate: error: %v", err) + } + } func TestAutoMigrateSelfReferential(t *testing.T) { diff --git a/tests/tracer_test.go b/tests/tracer_test.go new file mode 100644 index 00000000..3e9a4052 --- /dev/null +++ b/tests/tracer_test.go @@ -0,0 +1,34 @@ +package tests_test + +import ( + "context" + "time" + + "gorm.io/gorm/logger" +) + +type Tracer struct { + Logger logger.Interface + Test func(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) +} + +func (S Tracer) LogMode(level logger.LogLevel) logger.Interface { + return S.Logger.LogMode(level) +} + +func (S Tracer) Info(ctx context.Context, s string, i ...interface{}) { + S.Logger.Info(ctx, s, i...) +} + +func (S Tracer) Warn(ctx context.Context, s string, i ...interface{}) { + S.Logger.Warn(ctx, s, i...) +} + +func (S Tracer) Error(ctx context.Context, s string, i ...interface{}) { + S.Logger.Error(ctx, s, i...) +} + +func (S Tracer) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { + S.Logger.Trace(ctx, begin, fc, err) + S.Test(ctx, begin, fc, err) +} From 3cba21c1dff91c3abd91b4f7a9b8e4cf534facd4 Mon Sep 17 00:00:00 2001 From: Jinzhu Date: Fri, 7 Oct 2022 18:31:46 +0800 Subject: [PATCH 2/5] Update migrate_test.go --- tests/migrate_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/migrate_test.go b/tests/migrate_test.go index 226aa4d2..0aef272b 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -10,7 +10,6 @@ import ( "time" "gorm.io/driver/postgres" - "gorm.io/gorm" "gorm.io/gorm/schema" . "gorm.io/gorm/utils/tests" From c5e6119e943fafbaff7fff649ed77a0d6cd8235a Mon Sep 17 00:00:00 2001 From: viatoriche / Maxim Panfilov Date: Mon, 27 Jun 2022 21:06:43 +0300 Subject: [PATCH 3/5] add test: postgres: AutoMigrate: unneeded `ALTER COLUMN TYPE smallint` --- tests/migrate_test.go | 39 +++++++++++++++++++++++++++++++++++++++ tests/tracer_test.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 tests/tracer_test.go diff --git a/tests/migrate_test.go b/tests/migrate_test.go index b918b4b5..8b6cc55a 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -1,6 +1,7 @@ package tests_test import ( + "context" "fmt" "math/rand" "reflect" @@ -9,6 +10,7 @@ import ( "time" "gorm.io/driver/postgres" + "gorm.io/gorm" "gorm.io/gorm/schema" . "gorm.io/gorm/utils/tests" @@ -72,6 +74,43 @@ func TestMigrate(t *testing.T) { t.Fatalf("Failed to find index for many2many for %v %v", indexes[0], indexes[1]) } } + +} + +func TestAutoMigrateInt8PG(t *testing.T) { + if DB.Dialector.Name() != "postgres" { + return + } + + type MigrateInt struct { + Int8 int8 + } + + tracer := Tracer{ + Logger: DB.Config.Logger, + Test: func(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { + sql, _ := fc() + if sql == "ALTER TABLE \"migrate_ints\" ALTER COLUMN \"int8\" TYPE smallint" { + t.Fatalf("shouldn't execute ALTER COLUMN TYPE if such type is already existed in DB schema") + } + }, + } + + DB.Migrator().DropTable(&MigrateInt{}) + + // The first AutoMigrate to make table with field with correct type + if err := DB.AutoMigrate(&MigrateInt{}); err != nil { + t.Fatalf("Failed to auto migrate: error: %v", err) + } + + // make new session to set custom logger tracer + session := DB.Session(&gorm.Session{Logger: tracer}) + + // The second AutoMigrate to catch an error + if err := session.AutoMigrate(&MigrateInt{}); err != nil { + t.Fatalf("Failed to auto migrate: error: %v", err) + } + } func TestAutoMigrateSelfReferential(t *testing.T) { diff --git a/tests/tracer_test.go b/tests/tracer_test.go new file mode 100644 index 00000000..3e9a4052 --- /dev/null +++ b/tests/tracer_test.go @@ -0,0 +1,34 @@ +package tests_test + +import ( + "context" + "time" + + "gorm.io/gorm/logger" +) + +type Tracer struct { + Logger logger.Interface + Test func(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) +} + +func (S Tracer) LogMode(level logger.LogLevel) logger.Interface { + return S.Logger.LogMode(level) +} + +func (S Tracer) Info(ctx context.Context, s string, i ...interface{}) { + S.Logger.Info(ctx, s, i...) +} + +func (S Tracer) Warn(ctx context.Context, s string, i ...interface{}) { + S.Logger.Warn(ctx, s, i...) +} + +func (S Tracer) Error(ctx context.Context, s string, i ...interface{}) { + S.Logger.Error(ctx, s, i...) +} + +func (S Tracer) Trace(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { + S.Logger.Trace(ctx, begin, fc, err) + S.Test(ctx, begin, fc, err) +} From 0f51c59f13fcea1a2686d51a9f9764e9aafdf503 Mon Sep 17 00:00:00 2001 From: viatoriche / Maxim Panfilov Date: Fri, 14 Oct 2022 11:15:29 +0300 Subject: [PATCH 4/5] add test: update: TestAutoMigrateInt8PG --- tests/migrate_test.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/migrate_test.go b/tests/migrate_test.go index 8b6cc55a..5019eab6 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -77,21 +77,23 @@ func TestMigrate(t *testing.T) { } +type Smallint int8 + func TestAutoMigrateInt8PG(t *testing.T) { if DB.Dialector.Name() != "postgres" { return } type MigrateInt struct { - Int8 int8 + Int8 Smallint } tracer := Tracer{ Logger: DB.Config.Logger, Test: func(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { sql, _ := fc() - if sql == "ALTER TABLE \"migrate_ints\" ALTER COLUMN \"int8\" TYPE smallint" { - t.Fatalf("shouldn't execute ALTER COLUMN TYPE if such type is already existed in DB schema") + if strings.HasPrefix(sql, `ALTER TABLE "migrate_ints" ALTER COLUMN "int8" TYPE smallint`) { + t.Fatalf("shouldn't execute ALTER COLUMN TYPE if such type is already existed in DB schema: sql: %s", sql) } }, } From 560912d3498b48d4c680a21c4ba7149b67ee97b8 Mon Sep 17 00:00:00 2001 From: viatoriche / Maxim Panfilov Date: Fri, 14 Oct 2022 11:25:46 +0300 Subject: [PATCH 5/5] add test: update: TestAutoMigrateInt8PG --- tests/migrate_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/migrate_test.go b/tests/migrate_test.go index 0aef272b..8b4a0722 100644 --- a/tests/migrate_test.go +++ b/tests/migrate_test.go @@ -10,6 +10,7 @@ import ( "time" "gorm.io/driver/postgres" + "gorm.io/gorm" "gorm.io/gorm/schema" . "gorm.io/gorm/utils/tests" @@ -89,8 +90,8 @@ func TestAutoMigrateInt8PG(t *testing.T) { Logger: DB.Config.Logger, Test: func(ctx context.Context, begin time.Time, fc func() (sql string, rowsAffected int64), err error) { sql, _ := fc() - if sql == "ALTER TABLE \"migrate_ints\" ALTER COLUMN \"int8\" TYPE smallint" { - t.Fatalf("shouldn't execute ALTER COLUMN TYPE if such type is already existed in DB schema") + if strings.HasPrefix(sql, "ALTER TABLE \"migrate_ints\" ALTER COLUMN \"int8\" TYPE smallint") { + t.Fatalf("shouldn't execute ALTER COLUMN TYPE if such type is already existed in DB schema: sql: %s", sql) } }, }