Merge branch 'master' into distinguish_unique
# Conflicts: # tests/go.mod
This commit is contained in:
commit
45125bbea7
44
.github/workflows/tests.yml
vendored
44
.github/workflows/tests.yml
vendored
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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 => ../
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user