1package norm
2
3import (
4 _ "github.com/mattn/go-sqlite3"
5 "testing"
6)
7
8func TestDeleteCompileSuccess(t *testing.T) {
9 tests := []struct {
10 name string
11 stmt Compiler
12 expectedSql string
13 expectedArgs []any
14 }{
15 {
16 name: "Delete all users",
17 stmt: Delete().From("users"),
18 expectedSql: "DELETE FROM users",
19 },
20 {
21 name: "Delete active users only",
22 stmt: Delete().
23 From("users").
24 Where(Eq("active", true)),
25 expectedSql: "DELETE FROM users WHERE (active) = (?)",
26 expectedArgs: []any{true},
27 },
28 {
29 name: "Delete users in Engineering",
30 stmt: Delete().
31 From("users").
32 Where(Eq("department", "Engineering")),
33 expectedSql: "DELETE FROM users WHERE (department) = (?)",
34 expectedArgs: []any{"Engineering"},
35 },
36 {
37 name: "Delete users with age > 30",
38 stmt: Delete().
39 From("users").
40 Where(Gt("age", 30)),
41 expectedSql: "DELETE FROM users WHERE (age) > (?)",
42 expectedArgs: []any{30},
43 },
44 }
45
46 for _, test := range tests {
47 t.Run(test.name, func(t *testing.T) {
48 sql, args := test.stmt.MustCompile()
49
50 if sql != test.expectedSql {
51 t.Errorf("Expected '%s', got '%s'", test.expectedSql, sql)
52 }
53
54 if len(args) != len(test.expectedArgs) {
55 t.Errorf("Expected '%d' args, got '%d' args", len(test.expectedArgs), len(args))
56 }
57
58 for i := range len(args) {
59 if args[i] != test.expectedArgs[i] {
60 t.Errorf("Expected '%s', got '%s' at index %d", test.expectedArgs[i], args[i], i)
61 }
62 }
63 })
64 }
65}
66
67func TestDeleteCompileFail(t *testing.T) {
68 tests := []struct {
69 name string
70 stmt Compiler
71 expectedError string
72 }{
73 {
74 name: "No from clause",
75 stmt: Delete(),
76 expectedError: "FROM clause is required",
77 },
78 }
79
80 for _, test := range tests {
81 t.Run(test.name, func(t *testing.T) {
82 sql, args, err := test.stmt.Compile()
83 if err == nil {
84 t.Error("Expected error, got nil")
85 }
86
87 if err.Error() != test.expectedError {
88 t.Errorf("Expected error '%s', got '%s'", test.expectedError, err.Error())
89 }
90
91 if sql != "" {
92 t.Errorf("Expected empty SQL on error, got '%s'", sql)
93 }
94
95 if args != nil {
96 t.Errorf("Expected empty args on error, got '%q'", args)
97 }
98 })
99 }
100}
101
102func TestDeleteIntegration(t *testing.T) {
103 tests := []struct {
104 name string
105 stmt Execer
106 expectedRows int64
107 }{
108 {
109 name: "Delete all users",
110 stmt: Delete().From("users"),
111 expectedRows: 6,
112 },
113 {
114 name: "Delete active users only",
115 stmt: Delete().
116 From("users").
117 Where(Eq("active", true)),
118 expectedRows: 4,
119 },
120 {
121 name: "Select users in Engineering",
122 stmt: Delete().
123 From("users").
124 Where(Eq("department", "Engineering")),
125 expectedRows: 3,
126 },
127 {
128 name: "Delete users with age > 30",
129 stmt: Delete().
130 From("users").
131 Where(Gt("age", 30)),
132 expectedRows: 2,
133 },
134 {
135 name: "Delete users with salary between 70000 and 80000",
136 stmt: Delete().
137 From("users").
138 Where(Gte("salary", 70000.0).And(Lte("salary", 80000.0))),
139 expectedRows: 3,
140 },
141 }
142
143 for _, test := range tests {
144 t.Run(test.name, func(t *testing.T) {
145 db := setupTestDB(t)
146 defer db.Close()
147
148 res, err := test.stmt.Exec(db)
149 if err != nil {
150 t.Fatalf("Failed to execute query: %v", err)
151 }
152
153 count, err := res.RowsAffected()
154 if err != nil {
155 t.Fatalf("Failed to execute query: %v", err)
156 }
157
158 if count != test.expectedRows {
159 t.Errorf("Expected %d rows, got %d", test.expectedRows, count)
160 }
161 })
162 }
163}