@@ -312,6 +312,144 @@ func (suite *TaskDbTestSuite) TestTaskDb_DeleteAll() {
312312 }
313313}
314314
315+ func (suite * TaskDbTestSuite ) TestTaskDb_GetByID () {
316+ taskID := uuid .New ()
317+ operatorID := dbmodel .OperatorRecordCounter
318+ nextNonce , _ := uuid .NewV7 ()
319+
320+ task := & dbmodel.Task {
321+ ID : taskID ,
322+ Name : "test-get-by-id-task" ,
323+ OperatorID : operatorID ,
324+ InputCollectionID : "input_col_id" ,
325+ OutputCollectionName : "output_col_name" ,
326+ OperatorParams : "{}" ,
327+ TenantID : "tenant1" ,
328+ DatabaseID : "db1" ,
329+ MinRecordsForTask : 100 ,
330+ NextNonce : nextNonce ,
331+ }
332+
333+ err := suite .Db .Insert (task )
334+ suite .Require ().NoError (err )
335+
336+ retrieved , err := suite .Db .GetByID (taskID )
337+ suite .Require ().NoError (err )
338+ suite .Require ().NotNil (retrieved )
339+ suite .Require ().Equal (task .ID , retrieved .ID )
340+ suite .Require ().Equal (task .Name , retrieved .Name )
341+ suite .Require ().Equal (task .OperatorID , retrieved .OperatorID )
342+
343+ suite .db .Unscoped ().Delete (& dbmodel.Task {}, "task_id = ?" , task .ID )
344+ }
345+
346+ func (suite * TaskDbTestSuite ) TestTaskDb_GetByID_NotFound () {
347+ retrieved , err := suite .Db .GetByID (uuid .New ())
348+ suite .Require ().NoError (err )
349+ suite .Require ().Nil (retrieved )
350+ }
351+
352+ func (suite * TaskDbTestSuite ) TestTaskDb_GetByID_IgnoresDeleted () {
353+ taskID := uuid .New ()
354+ operatorID := dbmodel .OperatorRecordCounter
355+ nextNonce , _ := uuid .NewV7 ()
356+
357+ task := & dbmodel.Task {
358+ ID : taskID ,
359+ Name : "test-get-by-id-deleted" ,
360+ OperatorID : operatorID ,
361+ InputCollectionID : "input1" ,
362+ OutputCollectionName : "output1" ,
363+ OperatorParams : "{}" ,
364+ TenantID : "tenant1" ,
365+ DatabaseID : "db1" ,
366+ MinRecordsForTask : 100 ,
367+ NextNonce : nextNonce ,
368+ }
369+
370+ err := suite .Db .Insert (task )
371+ suite .Require ().NoError (err )
372+
373+ err = suite .Db .SoftDelete ("input1" , "test-get-by-id-deleted" )
374+ suite .Require ().NoError (err )
375+
376+ retrieved , err := suite .Db .GetByID (taskID )
377+ suite .Require ().NoError (err )
378+ suite .Require ().Nil (retrieved )
379+
380+ suite .db .Unscoped ().Delete (& dbmodel.Task {}, "task_id = ?" , task .ID )
381+ }
382+
383+ func (suite * TaskDbTestSuite ) TestTaskDb_DoneTask () {
384+ taskID := uuid .New ()
385+ operatorID := dbmodel .OperatorRecordCounter
386+ originalNonce , _ := uuid .NewV7 ()
387+
388+ task := & dbmodel.Task {
389+ ID : taskID ,
390+ Name : "test-done-task" ,
391+ OperatorID : operatorID ,
392+ InputCollectionID : "input_col_id" ,
393+ OutputCollectionName : "output_col_name" ,
394+ OperatorParams : "{}" ,
395+ TenantID : "tenant1" ,
396+ DatabaseID : "db1" ,
397+ MinRecordsForTask : 100 ,
398+ NextNonce : originalNonce ,
399+ CurrentAttempts : 3 ,
400+ }
401+
402+ err := suite .Db .Insert (task )
403+ suite .Require ().NoError (err )
404+
405+ err = suite .Db .DoneTask (taskID , originalNonce )
406+ suite .Require ().NoError (err )
407+
408+ retrieved , err := suite .Db .GetByID (taskID )
409+ suite .Require ().NoError (err )
410+ suite .Require ().NotNil (retrieved )
411+ suite .Require ().NotEqual (originalNonce , retrieved .NextNonce )
412+ suite .Require ().NotNil (retrieved .LastRun )
413+ suite .Require ().Equal (int32 (0 ), retrieved .CurrentAttempts )
414+
415+ suite .db .Unscoped ().Delete (& dbmodel.Task {}, "task_id = ?" , task .ID )
416+ }
417+
418+ func (suite * TaskDbTestSuite ) TestTaskDb_DoneTask_InvalidNonce () {
419+ taskID := uuid .New ()
420+ operatorID := dbmodel .OperatorRecordCounter
421+ correctNonce , _ := uuid .NewV7 ()
422+ wrongNonce , _ := uuid .NewV7 ()
423+
424+ task := & dbmodel.Task {
425+ ID : taskID ,
426+ Name : "test-done-task-wrong-nonce" ,
427+ OperatorID : operatorID ,
428+ InputCollectionID : "input_col_id" ,
429+ OutputCollectionName : "output_col_name" ,
430+ OperatorParams : "{}" ,
431+ TenantID : "tenant1" ,
432+ DatabaseID : "db1" ,
433+ MinRecordsForTask : 100 ,
434+ NextNonce : correctNonce ,
435+ }
436+
437+ err := suite .Db .Insert (task )
438+ suite .Require ().NoError (err )
439+
440+ err = suite .Db .DoneTask (taskID , wrongNonce )
441+ suite .Require ().Error (err )
442+ suite .Require ().Equal (common .ErrTaskNotFound , err )
443+
444+ suite .db .Unscoped ().Delete (& dbmodel.Task {}, "task_id = ?" , task .ID )
445+ }
446+
447+ func (suite * TaskDbTestSuite ) TestTaskDb_DoneTask_NotFound () {
448+ err := suite .Db .DoneTask (uuid .New (), uuid .Must (uuid .NewV7 ()))
449+ suite .Require ().Error (err )
450+ suite .Require ().Equal (common .ErrTaskNotFound , err )
451+ }
452+
315453// TestOperatorConstantsMatchSeededDatabase verifies that operator constants in
316454// dbmodel/constants.go match what we seed in the test database (which should match migrations).
317455// This catches drift between constants and migrations at test time.
0 commit comments