@@ -323,6 +323,146 @@ func TestTable(t *testing.T) {
323323 })
324324}
325325
326+ func TestInsert (t * testing.T ) {
327+ truncateAllTables (t )
328+
329+ ctx := t .Context ()
330+ db := initDB (DB )
331+
332+ t .Run ("Insert single" , func (t * testing.T ) {
333+ account := & Account {Name : "Insert Account" }
334+ err := db .Accounts .Insert (ctx , account )
335+ require .NoError (t , err )
336+ require .NotZero (t , account .ID , "ID should be set after insert" )
337+ require .NotZero (t , account .UpdatedAt , "UpdatedAt should be set" )
338+
339+ // Verify in DB.
340+ got , err := db .Accounts .GetByID (ctx , account .ID )
341+ require .NoError (t , err )
342+ require .Equal (t , account .Name , got .Name )
343+ })
344+
345+ t .Run ("Insert multiple" , func (t * testing.T ) {
346+ account := & Account {Name : "Insert Multiple Account" }
347+ err := db .Accounts .Insert (ctx , account )
348+ require .NoError (t , err )
349+
350+ articles := []* Article {
351+ {Author : "Author A" , AccountID : account .ID },
352+ {Author : "Author B" , AccountID : account .ID },
353+ {Author : "Author C" , AccountID : account .ID },
354+ }
355+ err = db .Articles .Insert (ctx , articles ... )
356+ require .NoError (t , err )
357+
358+ for _ , a := range articles {
359+ require .NotZero (t , a .ID , "ID should be set after bulk insert" )
360+ require .NotZero (t , a .UpdatedAt , "UpdatedAt should be set" )
361+ }
362+
363+ // Verify all in DB.
364+ for _ , a := range articles {
365+ got , err := db .Articles .GetByID (ctx , a .ID )
366+ require .NoError (t , err )
367+ require .Equal (t , a .Author , got .Author )
368+ }
369+ })
370+
371+ t .Run ("Insert nil record" , func (t * testing.T ) {
372+ err := db .Accounts .Insert (ctx , nil )
373+ require .Error (t , err )
374+ })
375+
376+ t .Run ("Insert invalid record" , func (t * testing.T ) {
377+ err := db .Accounts .Insert (ctx , & Account {Name : "" })
378+ require .Error (t , err , "should fail validation" )
379+ })
380+
381+ t .Run ("Insert zero records" , func (t * testing.T ) {
382+ err := db .Accounts .Insert (ctx )
383+ require .NoError (t , err , "inserting zero records should be a no-op" )
384+ })
385+ }
386+
387+ func TestUpdate (t * testing.T ) {
388+ truncateAllTables (t )
389+
390+ ctx := t .Context ()
391+ db := initDB (DB )
392+
393+ t .Run ("Update single" , func (t * testing.T ) {
394+ account := & Account {Name : "Before Update" }
395+ err := db .Accounts .Insert (ctx , account )
396+ require .NoError (t , err )
397+
398+ account .Name = "After Update"
399+ err = db .Accounts .Update (ctx , account )
400+ require .NoError (t , err )
401+
402+ got , err := db .Accounts .GetByID (ctx , account .ID )
403+ require .NoError (t , err )
404+ require .Equal (t , "After Update" , got .Name )
405+ })
406+
407+ t .Run ("Update multiple" , func (t * testing.T ) {
408+ account := & Account {Name : "Update Multiple Account" }
409+ err := db .Accounts .Insert (ctx , account )
410+ require .NoError (t , err )
411+
412+ articles := []* Article {
413+ {Author : "Original A" , AccountID : account .ID },
414+ {Author : "Original B" , AccountID : account .ID },
415+ }
416+ err = db .Articles .Insert (ctx , articles ... )
417+ require .NoError (t , err )
418+
419+ articles [0 ].Author = "Updated A"
420+ articles [1 ].Author = "Updated B"
421+ err = db .Articles .Update (ctx , articles ... )
422+ require .NoError (t , err )
423+
424+ for _ , a := range articles {
425+ got , err := db .Articles .GetByID (ctx , a .ID )
426+ require .NoError (t , err )
427+ require .Equal (t , a .Author , got .Author )
428+ }
429+ })
430+
431+ t .Run ("Update with zero ID fails" , func (t * testing.T ) {
432+ err := db .Accounts .Update (ctx , & Account {Name : "No ID" })
433+ require .Error (t , err , "should fail with zero ID" )
434+ })
435+
436+ t .Run ("Update multiple with zero ID fails" , func (t * testing.T ) {
437+ account := & Account {Name : "Update Zero ID Account" }
438+ err := db .Accounts .Insert (ctx , account )
439+ require .NoError (t , err )
440+
441+ err = db .Accounts .Update (ctx , account , & Account {Name : "No ID" })
442+ require .Error (t , err , "should fail when any record has zero ID" )
443+ })
444+
445+ t .Run ("Update nil record" , func (t * testing.T ) {
446+ err := db .Accounts .Update (ctx , nil )
447+ require .Error (t , err )
448+ })
449+
450+ t .Run ("Update invalid record" , func (t * testing.T ) {
451+ account := & Account {Name : "Valid" }
452+ err := db .Accounts .Insert (ctx , account )
453+ require .NoError (t , err )
454+
455+ account .Name = ""
456+ err = db .Accounts .Update (ctx , account )
457+ require .Error (t , err , "should fail validation" )
458+ })
459+
460+ t .Run ("Update zero records" , func (t * testing.T ) {
461+ err := db .Accounts .Update (ctx )
462+ require .NoError (t , err , "updating zero records should be a no-op" )
463+ })
464+ }
465+
326466func TestLockForUpdates (t * testing.T ) {
327467 truncateAllTables (t )
328468
0 commit comments