-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinsert_conflict_test.go
More file actions
98 lines (90 loc) · 3.24 KB
/
insert_conflict_test.go
File metadata and controls
98 lines (90 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package squildx
import (
"errors"
"testing"
)
func TestInsertOnConflictDoNothing(t *testing.T) {
q := NewInsert().Into("users").Columns("id", "name").
Values(":id, :name", Params{"id": 1, "name": "Alice"}).
OnConflictDoNothing("id")
sql, _, err := q.Build()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
want := "INSERT INTO users (id, name) VALUES (:id, :name) ON CONFLICT (id) DO NOTHING"
if sql != want {
t.Errorf("SQL mismatch\n got: %s\nwant: %s", sql, want)
}
}
func TestInsertOnConflictDoNothing_MultipleColumns(t *testing.T) {
q := NewInsert().Into("users").Columns("id", "email", "name").
Values(":id, :email, :name", Params{"id": 1, "email": "a@b.com", "name": "Alice"}).
OnConflictDoNothing("id", "email")
sql, _, err := q.Build()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
want := "INSERT INTO users (id, email, name) VALUES (:id, :email, :name) ON CONFLICT (id, email) DO NOTHING"
if sql != want {
t.Errorf("SQL mismatch\n got: %s\nwant: %s", sql, want)
}
}
func TestInsertOnConflictDoUpdate(t *testing.T) {
q := NewInsert().Into("users").Columns("id", "name").
Values(":id, :name", Params{"id": 1, "name": "Alice"}).
OnConflictDoUpdate([]string{"id"}, "name = EXCLUDED.name")
sql, _, err := q.Build()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
want := "INSERT INTO users (id, name) VALUES (:id, :name) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name"
if sql != want {
t.Errorf("SQL mismatch\n got: %s\nwant: %s", sql, want)
}
}
func TestInsertOnConflictDoUpdate_WithParams(t *testing.T) {
q := NewInsert().Into("users").Columns("id", "name").
Values(":id, :name", Params{"id": 1, "name": "Alice"}).
OnConflictDoUpdate([]string{"id"}, "name = :conflict_name", Params{"conflict_name": "Bob"})
sql, params, err := q.Build()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
want := "INSERT INTO users (id, name) VALUES (:id, :name) ON CONFLICT (id) DO UPDATE SET name = :conflict_name"
if sql != want {
t.Errorf("SQL mismatch\n got: %s\nwant: %s", sql, want)
}
assertParam(t, params, "conflict_name", "Bob")
}
func TestInsertOnConflictDoUpdate_MissingParam(t *testing.T) {
q := NewInsert().Into("users").Columns("id").
Values(":id", Params{"id": 1}).
OnConflictDoUpdate([]string{"id"}, "name = :conflict_name")
_, _, err := q.Build()
if !errors.Is(err, ErrMissingParam) {
t.Errorf("expected ErrMissingParam, got: %v", err)
}
}
func TestInsertOnConflict_LastWriteWins(t *testing.T) {
q := NewInsert().Into("users").Columns("id", "name").
Values(":id, :name", Params{"id": 1, "name": "Alice"}).
OnConflictDoNothing("id").
OnConflictDoUpdate([]string{"id"}, "name = EXCLUDED.name")
sql, _, err := q.Build()
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
want := "INSERT INTO users (id, name) VALUES (:id, :name) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name"
if sql != want {
t.Errorf("SQL mismatch\n got: %s\nwant: %s", sql, want)
}
}
func TestInsertOnConflict_Immutability(t *testing.T) {
base := NewInsert().Into("users").Columns("id", "name").
Values(":id, :name", Params{"id": 1, "name": "Alice"})
_ = base.OnConflictDoNothing("id")
ib := base.(*insertBuilder)
if ib.conflict != nil {
t.Error("base should not have conflict set")
}
}