-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use
persistence.CreatePreservationTask()
Fixes #900 - Use `persistence.CreatePreservationTask()` instead of a SQL query in the package service - Add a `preservationTaskToGoa()` function to convert `datatypes.PreservationTask` to a Goa `EnduroPackagePreservationTask` struct [skip codecov]
- Loading branch information
Showing
3 changed files
with
168 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package package_ | ||
|
||
import ( | ||
"go.artefactual.dev/tools/ref" | ||
|
||
goapackage "github.com/artefactual-sdps/enduro/internal/api/gen/package_" | ||
"github.com/artefactual-sdps/enduro/internal/datatypes" | ||
"github.com/artefactual-sdps/enduro/internal/db" | ||
) | ||
|
||
// preservationTaskToGoa returns the API representation of a preservation task. | ||
func preservationTaskToGoa(pt *datatypes.PreservationTask) *goapackage.EnduroPackagePreservationTask { | ||
return &goapackage.EnduroPackagePreservationTask{ | ||
ID: pt.ID, | ||
TaskID: pt.TaskID, | ||
Name: pt.Name, | ||
Status: pt.Status.String(), | ||
|
||
// TODO: Make Goa StartedAt a pointer to a string to avoid having to | ||
// convert a null time to an empty (zero value) string. | ||
StartedAt: ref.DerefZero(db.FormatOptionalTime(pt.CompletedAt)), | ||
|
||
CompletedAt: db.FormatOptionalTime(pt.CompletedAt), | ||
Note: &pt.Note, | ||
PreservationActionID: &pt.PreservationActionID, | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
package package__test | ||
|
||
import ( | ||
"context" | ||
"database/sql" | ||
"fmt" | ||
"testing" | ||
"time" | ||
|
||
"go.artefactual.dev/tools/mockutil" | ||
"gotest.tools/v3/assert" | ||
|
||
"github.com/artefactual-sdps/enduro/internal/datatypes" | ||
"github.com/artefactual-sdps/enduro/internal/enums" | ||
persistence_fake "github.com/artefactual-sdps/enduro/internal/persistence/fake" | ||
) | ||
|
||
func TestCreatePreservationTask(t *testing.T) { | ||
taskID := "a499e8fc-7309-4e26-b39d-d8ab68466c27" | ||
|
||
type test struct { | ||
name string | ||
pt datatypes.PreservationTask | ||
mock func(*persistence_fake.MockService, datatypes.PreservationTask) *persistence_fake.MockService | ||
want datatypes.PreservationTask | ||
wantErr string | ||
} | ||
for _, tt := range []test{ | ||
{ | ||
name: "Creates a preservation task", | ||
pt: datatypes.PreservationTask{ | ||
TaskID: taskID, | ||
Name: "PT1", | ||
Status: enums.PreservationTaskStatusInProgress, | ||
PreservationActionID: 11, | ||
}, | ||
want: datatypes.PreservationTask{ | ||
ID: 1, | ||
TaskID: taskID, | ||
Name: "PT1", | ||
Status: enums.PreservationTaskStatusInProgress, | ||
PreservationActionID: 11, | ||
}, | ||
mock: func(svc *persistence_fake.MockService, pt datatypes.PreservationTask) *persistence_fake.MockService { | ||
svc.EXPECT(). | ||
CreatePreservationTask(mockutil.Context(), &pt). | ||
DoAndReturn( | ||
func(ctx context.Context, pt *datatypes.PreservationTask) error { | ||
pt.ID = 1 | ||
return nil | ||
}, | ||
) | ||
return svc | ||
}, | ||
}, | ||
{ | ||
name: "Creates a preservation task with optional values", | ||
pt: datatypes.PreservationTask{ | ||
TaskID: taskID, | ||
Name: "PT2", | ||
Status: enums.PreservationTaskStatusInProgress, | ||
StartedAt: sql.NullTime{ | ||
Time: time.Date(2024, 3, 27, 11, 32, 41, 0, time.UTC), | ||
Valid: true, | ||
}, | ||
CompletedAt: sql.NullTime{ | ||
Time: time.Date(2024, 3, 27, 11, 32, 43, 0, time.UTC), | ||
Valid: true, | ||
}, | ||
Note: "PT2 Note", | ||
PreservationActionID: 12, | ||
}, | ||
mock: func(svc *persistence_fake.MockService, pt datatypes.PreservationTask) *persistence_fake.MockService { | ||
svc.EXPECT(). | ||
CreatePreservationTask(mockutil.Context(), &pt). | ||
DoAndReturn( | ||
func(ctx context.Context, pt *datatypes.PreservationTask) error { | ||
pt.ID = 2 | ||
return nil | ||
}, | ||
) | ||
return svc | ||
}, | ||
want: datatypes.PreservationTask{ | ||
ID: 2, | ||
TaskID: taskID, | ||
Name: "PT2", | ||
Status: enums.PreservationTaskStatusInProgress, | ||
StartedAt: sql.NullTime{ | ||
Time: time.Date(2024, 3, 27, 11, 32, 41, 0, time.UTC), | ||
Valid: true, | ||
}, | ||
CompletedAt: sql.NullTime{ | ||
Time: time.Date(2024, 3, 27, 11, 32, 43, 0, time.UTC), | ||
Valid: true, | ||
}, | ||
Note: "PT2 Note", | ||
PreservationActionID: 12, | ||
}, | ||
}, | ||
{ | ||
name: "Errors creating a package with a missing TaskID", | ||
pt: datatypes.PreservationTask{}, | ||
mock: func(svc *persistence_fake.MockService, pt datatypes.PreservationTask) *persistence_fake.MockService { | ||
svc.EXPECT(). | ||
CreatePreservationTask(mockutil.Context(), &pt). | ||
Return( | ||
fmt.Errorf("invalid data error: field \"TaskID\" is required"), | ||
) | ||
return svc | ||
}, | ||
wantErr: "preservation task: create: invalid data error: field \"TaskID\" is required", | ||
}, | ||
} { | ||
t.Run(tt.name, func(t *testing.T) { | ||
t.Parallel() | ||
|
||
pkgSvc, perSvc := testSvc(t) | ||
if tt.mock != nil { | ||
tt.mock(perSvc, tt.pt) | ||
} | ||
|
||
pt := tt.pt | ||
err := pkgSvc.CreatePreservationTask(context.Background(), &pt) | ||
|
||
if tt.wantErr != "" { | ||
assert.Error(t, err, tt.wantErr) | ||
return | ||
} | ||
|
||
assert.NilError(t, err) | ||
assert.DeepEqual(t, pt, tt.want) | ||
}) | ||
} | ||
} |