| 11 | ) |
| 12 | |
| 13 | func TestUpsert(t *testing.T) { |
| 14 | lang := Language{Code: "upsert", Name: "Upsert"} |
| 15 | if err := DB.Clauses(clause.OnConflict{DoNothing: true}).Create(&lang).Error; err != nil { |
| 16 | t.Fatalf("failed to upsert, got %v", err) |
| 17 | } |
| 18 | |
| 19 | lang2 := Language{Code: "upsert", Name: "Upsert"} |
| 20 | if err := DB.Clauses(clause.OnConflict{DoNothing: true}).Create(&lang2).Error; err != nil { |
| 21 | t.Fatalf("failed to upsert, got %v", err) |
| 22 | } |
| 23 | |
| 24 | var langs []Language |
| 25 | if err := DB.Find(&langs, "code = ?", lang.Code).Error; err != nil { |
| 26 | t.Errorf("no error should happen when find languages with code, but got %v", err) |
| 27 | } else if len(langs) != 1 { |
| 28 | t.Errorf("should only find only 1 languages, but got %+v", langs) |
| 29 | } |
| 30 | |
| 31 | lang3 := Language{Code: "upsert", Name: "Upsert"} |
| 32 | if err := DB.Clauses(clause.OnConflict{ |
| 33 | Columns: []clause.Column{{Name: "code"}}, |
| 34 | DoUpdates: clause.Assignments(map[string]interface{}{"name": "upsert-new"}), |
| 35 | }).Create(&lang3).Error; err != nil { |
| 36 | t.Fatalf("failed to upsert, got %v", err) |
| 37 | } |
| 38 | |
| 39 | if err := DB.Find(&langs, "code = ?", lang.Code).Error; err != nil { |
| 40 | t.Errorf("no error should happen when find languages with code, but got %v", err) |
| 41 | } else if len(langs) != 1 { |
| 42 | t.Errorf("should only find only 1 languages, but got %+v", langs) |
| 43 | } else if langs[0].Name != "upsert-new" { |
| 44 | t.Errorf("should update name on conflict, but got name %+v", langs[0].Name) |
| 45 | } |
| 46 | |
| 47 | lang = Language{Code: "upsert", Name: "Upsert-Newname"} |
| 48 | if err := DB.Clauses(clause.OnConflict{UpdateAll: true}).Create(&lang).Error; err != nil { |
| 49 | t.Fatalf("failed to upsert, got %v", err) |
| 50 | } |
| 51 | |
| 52 | var result Language |
| 53 | if err := DB.Find(&result, "code = ?", lang.Code).Error; err != nil || result.Name != lang.Name { |
| 54 | t.Fatalf("failed to upsert, got name %v", result.Name) |
| 55 | } |
| 56 | |
| 57 | if name := DB.Dialector.Name(); name != "sqlserver" { |
| 58 | type RestrictedLanguage struct { |
| 59 | Code string `gorm:"primarykey"` |
| 60 | Name string |
| 61 | Lang string `gorm:"<-:create"` |
| 62 | } |
| 63 | |
| 64 | r := DB.Session(&gorm.Session{DryRun: true}).Clauses(clause.OnConflict{UpdateAll: true}).Create(&RestrictedLanguage{Code: "upsert_code", Name: "upsert_name", Lang: "upsert_lang"}) |
| 65 | if !regexp.MustCompile(`INTO .restricted_languages. .*\(.code.,.name.,.lang.\) .* (SET|UPDATE) .name.=.*.name.\W*$`).MatchString(r.Statement.SQL.String()) { |
| 66 | t.Errorf("Table with escape character, got %v", r.Statement.SQL.String()) |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | user := *GetUser("upsert_on_conflict", Config{}) |