@@ -19,12 +19,14 @@ import (
1919
2020var personSelectQ , personInsertQ , personUpdateQ , personDeleteQ string
2121var personInsertExecQ , personHardDeleteQ string
22+ var personExecQ string
2223
2324func init () {
2425 builder := qb .Must (& personModel {})
2526 personSelectQ , personInsertQ , personUpdateQ , personDeleteQ = Queries (builder )
2627 personInsertExecQ = builder .NamedInsert ()
2728 personHardDeleteQ = builder .HardDelete ()
29+ personExecQ = builder .Insert ()
2830}
2931
3032type personModel struct {
@@ -310,3 +312,117 @@ func TestDBQueries(t *testing.T) {
310312 assert .NoError (t , RowsAffected (res , 4 )) // p1 to p4, p5 is hard deleted
311313 })
312314}
315+
316+ func TestTxQueries (t * testing.T ) {
317+ db , err := New (postgresDataSource )
318+ require .NoError (t , err )
319+ t .Cleanup (func () {
320+ assert .NoError (t , db .Close ())
321+ })
322+
323+ ctx := context .Background ()
324+
325+ tx , err := db .Begin (ctx )
326+ require .NoError (t , err )
327+ defer func () {
328+ assert .NoError (t , tx .Rollback ())
329+ }()
330+
331+ p1 := & personModel {
332+ Name : "Lucky Luke" ,
333+ Email : NullString ("lucky@example.com" ),
334+ }
335+ p2 := & personModelExtra {
336+ personModel : personModel {
337+ Base : Base {
338+ ID : "d59a4685-9ab9-4323-9af9-14ca352cc65b" ,
339+ },
340+ Name : "Jolly Jumper" ,
341+ Email : NullString ("jolly@example.com" ),
342+ },
343+ }
344+
345+ t .Run ("insert" , func (t * testing.T ) {
346+ tx , err := db .Begin (ctx )
347+ require .NoError (t , err )
348+ defer func () {
349+ assert .Error (t , tx .Rollback ())
350+ }()
351+
352+ assert .NoError (t , tx .Insert (p1 ))
353+ assert .NoError (t , tx .Insert (p2 ))
354+ assert .NoError (t , tx .Commit ())
355+ })
356+
357+ t .Run ("insert error" , func (t * testing.T ) {
358+ tx , err := db .Begin (ctx )
359+ require .NoError (t , err )
360+ assert .Error (t , tx .Insert (p1 ))
361+ assert .NoError (t , tx .Rollback ())
362+ })
363+
364+ t .Run ("update" , func (t * testing.T ) {
365+ tx , err := db .Begin (ctx )
366+ require .NoError (t , err )
367+ defer func () {
368+ assert .Error (t , tx .Rollback ())
369+ }()
370+
371+ assert .NoError (t , tx .Update (p1 ))
372+ assert .NoError (t , tx .Commit ())
373+ })
374+
375+ t .Run ("update error" , func (t * testing.T ) {
376+ tx , err := db .Begin (ctx )
377+ require .NoError (t , err )
378+ pp := & personModel {
379+ Base : p1 .Base ,
380+ Name : p1 .Name ,
381+ Email : p2 .Email ,
382+ }
383+
384+ assert .Error (t , tx .Update (pp ))
385+ assert .NoError (t , tx .Rollback ())
386+ })
387+
388+ t .Run ("delete" , func (t * testing.T ) {
389+ tx , err := db .Begin (ctx )
390+ require .NoError (t , err )
391+ defer func () {
392+ assert .Error (t , tx .Rollback ())
393+ }()
394+
395+ assert .NoError (t , tx .Delete (p1 ))
396+ assert .NoError (t , tx .HardDelete (p2 ))
397+ assert .NoError (t , tx .Commit ())
398+ })
399+
400+ t .Run ("delete error" , func (t * testing.T ) {
401+ tx , err := db .Begin (ctx )
402+ require .NoError (t , err )
403+ assert .Error (t , tx .Delete (p2 ))
404+ assert .NoError (t , tx .Rollback ())
405+ })
406+
407+ t .Run ("hard delete error" , func (t * testing.T ) {
408+ tx , err := db .Begin (ctx )
409+ require .NoError (t , err )
410+ assert .Error (t , tx .HardDelete (p2 ))
411+ assert .NoError (t , tx .Rollback ())
412+ })
413+
414+ t .Run ("exec" , func (t * testing.T ) {
415+ tx , err := db .Begin (ctx )
416+ require .NoError (t , err )
417+ defer func () {
418+ assert .Error (t , tx .Rollback ())
419+ }()
420+
421+ res , err := tx .Exec (personExecQ , p2 .ID , p2 .CreatedAt , p2 .UpdatedAt , nil , p2 .Name , p2 .Email )
422+ assert .NoError (t , err )
423+ n , err := res .RowsAffected ()
424+ assert .NoError (t , err )
425+ assert .Equal (t , int64 (1 ), n )
426+ assert .NoError (t , tx .Commit ())
427+ })
428+ }
0 commit comments