an ORM-free SQL experience
at main 3.6 kB view raw
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}