@@ -236,3 +236,105 @@ func TestModelQuery_Delete(t *testing.T) {
236236 var a int
237237 assert .NotNil (t , db .Model (& a ).Delete ())
238238}
239+
240+ func TestModelQuery_Upsert (t * testing.T ) {
241+ db := getPreparedDB ()
242+ defer db .Close ()
243+
244+ id := 2
245+ name := "test"
246+ 247+ {
248+ // updating normally
249+ customer := Customer {
250+ ID : id ,
251+ Name : name ,
252+ Email : email ,
253+ }
254+ err := db .Model (& customer ).Upsert ()
255+ if assert .Nil (t , err ) {
256+ var c Customer
257+ db .Select ().From ("customer" ).Where (HashExp {"ID" : id }).One (& c )
258+ assert .Equal (t , name , c .Name )
259+ assert .Equal (t , email , c .Email )
260+ assert .Equal (t , 0 , c .Status )
261+ }
262+ }
263+
264+ {
265+ // updating without primary keys
266+ item2 := Item {
267+ Name : name ,
268+ }
269+ err := db .Model (& item2 ).Upsert ()
270+ assert .Equal (t , MissingPKError , err )
271+ }
272+
273+ {
274+ // updating all fields
275+ customer := CustomerPtr {
276+ ID : & id ,
277+ Name : name ,
278+ Email : & email ,
279+ }
280+ err := db .Model (& customer ).Upsert ()
281+ if assert .Nil (t , err ) {
282+ assert .Equal (t , id , * customer .ID )
283+ var c CustomerPtr
284+ db .Select ().From ("customer" ).Where (HashExp {"ID" : id }).One (& c )
285+ assert .Equal (t , name , c .Name )
286+ if assert .NotNil (t , c .Email ) {
287+ assert .Equal (t , email , * c .Email )
288+ }
289+ assert .Nil (t , c .Status )
290+ }
291+ }
292+
293+ {
294+ // updating selected fields only
295+ id = 3
296+ customer := CustomerPtr {
297+ ID : & id ,
298+ Name : name ,
299+ Email : & email ,
300+ }
301+ err := db .Model (& customer ).Upsert ("Name" , "Email" )
302+ if assert .Nil (t , err ) {
303+ assert .Equal (t , id , * customer .ID )
304+ var c CustomerPtr
305+ db .Select ().From ("customer" ).Where (HashExp {"ID" : id }).One (& c )
306+ assert .Equal (t , name , c .Name )
307+ if assert .NotNil (t , c .Email ) {
308+ assert .Equal (t , email , * c .Email )
309+ }
310+ if assert .NotNil (t , c .Status ) {
311+ assert .Equal (t , 2 , * c .Status )
312+ }
313+ }
314+ }
315+
316+ {
317+ // inserting normally
318+ customer := Customer {
319+ ID : 5 ,
320+ Name : name ,
321+ Email : email ,
322+ }
323+ err := db .Model (& customer ).Upsert ()
324+ if assert .Nil (t , err ) {
325+ assert .Equal (t , 5 , customer .ID )
326+ var c Customer
327+ db .Select ().From ("customer" ).Where (HashExp {"ID" : 5 }).One (& c )
328+ assert .Equal (t , name , c .Name )
329+ assert .Equal (t , email , c .Email )
330+ assert .Equal (t , 0 , c .Status )
331+ assert .False (t , c .Address .Valid )
332+ }
333+ }
334+
335+ {
336+ // updating non-struct
337+ var a int
338+ assert .NotNil (t , db .Model (& a ).Upsert ())
339+ }
340+ }
0 commit comments