MCPcopy
hub / github.com/go-gorm/gorm / TestUpsert

Function TestUpsert

tests/upsert_test.go:13–89  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

11)
12
13func 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{})

Callers

nothing calls this directly

Calls 9

AssignmentsFunction · 0.92
GetUserFunction · 0.85
ClausesMethod · 0.80
SessionMethod · 0.80
CreateMethod · 0.65
FindMethod · 0.65
NameMethod · 0.65
FirstMethod · 0.65
StringMethod · 0.45

Tested by

no test coverage detected