Merge branch 'master' into distinguish_unique

# Conflicts:
#	tests/go.mod
This commit is contained in:
black 2023-06-17 19:31:05 +08:00
commit 45125bbea7
9 changed files with 91 additions and 18 deletions

View File

@ -41,7 +41,7 @@ jobs:
mysql: mysql:
strategy: strategy:
matrix: matrix:
dbversion: ['mysql:latest', 'mysql:5.7', 'mariadb:latest'] dbversion: ['mysql:latest', 'mysql:5.7']
go: ['1.19', '1.18'] go: ['1.19', '1.18']
platform: [ubuntu-latest] platform: [ubuntu-latest]
runs-on: ${{ matrix.platform }} runs-on: ${{ matrix.platform }}
@ -72,6 +72,48 @@ jobs:
- name: Check out code into the Go module directory - name: Check out code into the Go module directory
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: go mod package cache
uses: actions/cache@v3
with:
path: ~/go/pkg/mod
key: ${{ runner.os }}-go-${{ matrix.go }}-${{ hashFiles('tests/go.mod') }}
- name: Tests
run: GITHUB_ACTION=true GORM_DIALECT=mysql GORM_DSN="gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True" ./tests/tests_all.sh
mariadb:
strategy:
matrix:
dbversion: [ 'mariadb:latest' ]
go: [ '1.19', '1.18' ]
platform: [ ubuntu-latest ]
runs-on: ${{ matrix.platform }}
services:
mysql:
image: ${{ matrix.dbversion }}
env:
MYSQL_DATABASE: gorm
MYSQL_USER: gorm
MYSQL_PASSWORD: gorm
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
ports:
- 9910:3306
options: >-
--health-cmd "mariadb-admin ping -ugorm -pgorm"
--health-interval 10s
--health-start-period 10s
--health-timeout 5s
--health-retries 10
steps:
- name: Set up Go 1.x
uses: actions/setup-go@v4
with:
go-version: ${{ matrix.go }}
- name: Check out code into the Go module directory
uses: actions/checkout@v3
- name: go mod package cache - name: go mod package cache
uses: actions/cache@v3 uses: actions/cache@v3

View File

@ -358,7 +358,7 @@ func TestDuplicateMany2ManyAssociation(t *testing.T) {
} }
func TestConcurrentMany2ManyAssociation(t *testing.T) { func TestConcurrentMany2ManyAssociation(t *testing.T) {
db, err := OpenTestConnection() db, err := OpenTestConnection(&gorm.Config{})
if err != nil { if err != nil {
t.Fatalf("open test connection failed, err: %+v", err) t.Fatalf("open test connection failed, err: %+v", err)
} }

View File

@ -27,3 +27,34 @@ func TestDialectorWithErrorTranslatorSupport(t *testing.T) {
t.Fatalf("expected err: %v got err: %v", translatedErr, err) t.Fatalf("expected err: %v got err: %v", translatedErr, err)
} }
} }
func TestSupportedDialectorWithErrDuplicatedKey(t *testing.T) {
type City struct {
gorm.Model
Name string `gorm:"unique"`
}
db, err := OpenTestConnection(&gorm.Config{TranslateError: true})
if err != nil {
t.Fatalf("failed to connect database, got error %v", err)
}
dialectors := map[string]bool{"sqlite": true, "postgres": true, "mysql": true, "sqlserver": true}
if supported, found := dialectors[db.Dialector.Name()]; !(found && supported) {
return
}
if err = db.AutoMigrate(&City{}); err != nil {
t.Fatalf("failed to migrate cities table, got error: %v", err)
}
err = db.Create(&City{Name: "Kabul"}).Error
if err != nil {
t.Fatalf("failed to create record: %v", err)
}
err = db.Create(&City{Name: "Kabul"}).Error
if !errors.Is(err, gorm.ErrDuplicatedKey) {
t.Fatalf("expected err: %v got err: %v", gorm.ErrDuplicatedKey, err)
}
}

View File

@ -13,8 +13,8 @@ require (
gorm.io/driver/mysql v1.5.0 gorm.io/driver/mysql v1.5.0
gorm.io/driver/postgres v1.5.0 gorm.io/driver/postgres v1.5.0
gorm.io/driver/sqlite v1.5.0 gorm.io/driver/sqlite v1.5.0
gorm.io/driver/sqlserver v1.4.3 gorm.io/driver/sqlserver v1.5.1
gorm.io/gorm v1.25.0 gorm.io/gorm v1.25.1
) )
replace gorm.io/gorm => ../ replace gorm.io/gorm => ../

View File

@ -92,7 +92,7 @@ func TestPreparedStmtFromTransaction(t *testing.T) {
} }
func TestPreparedStmtDeadlock(t *testing.T) { func TestPreparedStmtDeadlock(t *testing.T) {
tx, err := OpenTestConnection() tx, err := OpenTestConnection(&gorm.Config{})
AssertEqual(t, err, nil) AssertEqual(t, err, nil)
sqlDB, _ := tx.DB() sqlDB, _ := tx.DB()
@ -127,7 +127,7 @@ func TestPreparedStmtDeadlock(t *testing.T) {
} }
func TestPreparedStmtError(t *testing.T) { func TestPreparedStmtError(t *testing.T) {
tx, err := OpenTestConnection() tx, err := OpenTestConnection(&gorm.Config{})
AssertEqual(t, err, nil) AssertEqual(t, err, nil)
sqlDB, _ := tx.DB() sqlDB, _ := tx.DB()

View File

@ -170,10 +170,10 @@ func (data *EncryptedData) Scan(value interface{}) error {
return errors.New("Too short") return errors.New("Too short")
} }
*data = b[3:] *data = append((*data)[0:], b[3:]...)
return nil return nil
} else if s, ok := value.(string); ok { } else if s, ok := value.(string); ok {
*data = []byte(s)[3:] *data = []byte(s[3:])
return nil return nil
} }

View File

@ -26,7 +26,7 @@ var (
func init() { func init() {
var err error var err error
if DB, err = OpenTestConnection(); err != nil { if DB, err = OpenTestConnection(&gorm.Config{}); err != nil {
log.Printf("failed to connect database, got error %v", err) log.Printf("failed to connect database, got error %v", err)
os.Exit(1) os.Exit(1)
} else { } else {
@ -49,7 +49,7 @@ func init() {
} }
} }
func OpenTestConnection() (db *gorm.DB, err error) { func OpenTestConnection(cfg *gorm.Config) (db *gorm.DB, err error) {
dbDSN := os.Getenv("GORM_DSN") dbDSN := os.Getenv("GORM_DSN")
switch os.Getenv("GORM_DIALECT") { switch os.Getenv("GORM_DIALECT") {
case "mysql": case "mysql":
@ -57,7 +57,7 @@ func OpenTestConnection() (db *gorm.DB, err error) {
if dbDSN == "" { if dbDSN == "" {
dbDSN = mysqlDSN dbDSN = mysqlDSN
} }
db, err = gorm.Open(mysql.Open(dbDSN), &gorm.Config{}) db, err = gorm.Open(mysql.Open(dbDSN), cfg)
case "postgres": case "postgres":
log.Println("testing postgres...") log.Println("testing postgres...")
if dbDSN == "" { if dbDSN == "" {
@ -66,7 +66,7 @@ func OpenTestConnection() (db *gorm.DB, err error) {
db, err = gorm.Open(postgres.New(postgres.Config{ db, err = gorm.Open(postgres.New(postgres.Config{
DSN: dbDSN, DSN: dbDSN,
PreferSimpleProtocol: true, PreferSimpleProtocol: true,
}), &gorm.Config{}) }), cfg)
case "sqlserver": case "sqlserver":
// go install github.com/microsoft/go-sqlcmd/cmd/sqlcmd@latest // go install github.com/microsoft/go-sqlcmd/cmd/sqlcmd@latest
// SQLCMDPASSWORD=LoremIpsum86 sqlcmd -U sa -S localhost:9930 // SQLCMDPASSWORD=LoremIpsum86 sqlcmd -U sa -S localhost:9930
@ -80,16 +80,16 @@ func OpenTestConnection() (db *gorm.DB, err error) {
if dbDSN == "" { if dbDSN == "" {
dbDSN = sqlserverDSN dbDSN = sqlserverDSN
} }
db, err = gorm.Open(sqlserver.Open(dbDSN), &gorm.Config{}) db, err = gorm.Open(sqlserver.Open(dbDSN), cfg)
case "tidb": case "tidb":
log.Println("testing tidb...") log.Println("testing tidb...")
if dbDSN == "" { if dbDSN == "" {
dbDSN = tidbDSN dbDSN = tidbDSN
} }
db, err = gorm.Open(mysql.Open(dbDSN), &gorm.Config{}) db, err = gorm.Open(mysql.Open(dbDSN), cfg)
default: default:
log.Println("testing sqlite3...") log.Println("testing sqlite3...")
db, err = gorm.Open(sqlite.Open(filepath.Join(os.TempDir(), "gorm.db")), &gorm.Config{}) db, err = gorm.Open(sqlite.Open(filepath.Join(os.TempDir(), "gorm.db")), cfg)
} }
if err != nil { if err != nil {

View File

@ -361,7 +361,7 @@ func TestDisabledNestedTransaction(t *testing.T) {
} }
func TestTransactionOnClosedConn(t *testing.T) { func TestTransactionOnClosedConn(t *testing.T) {
DB, err := OpenTestConnection() DB, err := OpenTestConnection(&gorm.Config{})
if err != nil { if err != nil {
t.Fatalf("failed to connect database, got error %v", err) t.Fatalf("failed to connect database, got error %v", err)
} }

View File

@ -11,7 +11,7 @@ import (
// He works in a Company (belongs to), he has a Manager (belongs to - single-table), and also managed a Team (has many - single-table) // He works in a Company (belongs to), he has a Manager (belongs to - single-table), and also managed a Team (has many - single-table)
// He speaks many languages (many to many) and has many friends (many to many - single-table) // He speaks many languages (many to many) and has many friends (many to many - single-table)
// His pet also has one Toy (has one - polymorphic) // His pet also has one Toy (has one - polymorphic)
// NamedPet is a reference to a Named `Pets` (has many) // NamedPet is a reference to a named `Pet` (has one)
type User struct { type User struct {
gorm.Model gorm.Model
Name string Name string