Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add unit tests for package_.CreatePreservationTask() #901

Merged
merged 9 commits into from
Mar 28, 2024
14 changes: 8 additions & 6 deletions internal/a3m/a3m.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (
temporalsdk_activity "go.temporal.io/sdk/activity"
"google.golang.org/grpc"

"github.com/artefactual-sdps/enduro/internal/datatypes"
"github.com/artefactual-sdps/enduro/internal/enums"
"github.com/artefactual-sdps/enduro/internal/package_"
)

Expand Down Expand Up @@ -158,15 +160,15 @@ func (a *CreateAIPActivity) Execute(
}

func savePreservationTasks(ctx context.Context, jobs []*transferservice.Job, pkgsvc package_.Service, paID uint) error {
jobStatusToPreservationTaskStatus := map[transferservice.Job_Status]package_.PreservationTaskStatus{
transferservice.Job_STATUS_UNSPECIFIED: package_.TaskStatusUnspecified,
transferservice.Job_STATUS_COMPLETE: package_.TaskStatusDone,
transferservice.Job_STATUS_PROCESSING: package_.TaskStatusInProgress,
transferservice.Job_STATUS_FAILED: package_.TaskStatusError,
jobStatusToPreservationTaskStatus := map[transferservice.Job_Status]enums.PreservationTaskStatus{
transferservice.Job_STATUS_UNSPECIFIED: enums.PreservationTaskStatusUnspecified,
transferservice.Job_STATUS_COMPLETE: enums.PreservationTaskStatusDone,
transferservice.Job_STATUS_PROCESSING: enums.PreservationTaskStatusInProgress,
transferservice.Job_STATUS_FAILED: enums.PreservationTaskStatusError,
}

for _, job := range jobs {
pt := package_.PreservationTask{
pt := datatypes.PreservationTask{
TaskID: job.Id,
Name: job.Name,
Status: jobStatusToPreservationTaskStatus[job.Status],
Expand Down
18 changes: 10 additions & 8 deletions internal/am/job_tracker.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,16 @@ import (
"github.com/jonboulle/clockwork"
"go.artefactual.dev/amclient"

"github.com/artefactual-sdps/enduro/internal/datatypes"
"github.com/artefactual-sdps/enduro/internal/enums"
"github.com/artefactual-sdps/enduro/internal/package_"
)

var jobStatusToPreservationTaskStatus = map[amclient.JobStatus]package_.PreservationTaskStatus{
amclient.JobStatusUnknown: package_.TaskStatusUnspecified,
amclient.JobStatusComplete: package_.TaskStatusDone,
amclient.JobStatusProcessing: package_.TaskStatusInProgress,
amclient.JobStatusFailed: package_.TaskStatusError,
var jobStatusToPreservationTaskStatus = map[amclient.JobStatus]enums.PreservationTaskStatus{
amclient.JobStatusUnknown: enums.PreservationTaskStatusUnspecified,
amclient.JobStatusComplete: enums.PreservationTaskStatusDone,
amclient.JobStatusProcessing: enums.PreservationTaskStatusInProgress,
amclient.JobStatusFailed: enums.PreservationTaskStatusError,
}

type JobTracker struct {
Expand Down Expand Up @@ -116,10 +118,10 @@ func filterSavedJobs(jobs []amclient.Job, saved map[string]struct{}) []amclient.
}

// ConvertJobToPreservationTask converts an amclient.Job to a
// package_.PreservationTask.
func ConvertJobToPreservationTask(job amclient.Job) package_.PreservationTask {
// datatypes.PreservationTask.
func ConvertJobToPreservationTask(job amclient.Job) datatypes.PreservationTask {
st, co := jobTimeRange(job)
return package_.PreservationTask{
return datatypes.PreservationTask{
TaskID: job.ID,
Name: job.Name,
Status: jobStatusToPreservationTaskStatus[job.Status],
Expand Down
14 changes: 7 additions & 7 deletions internal/am/job_tracker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ import (
"gotest.tools/v3/assert"

"github.com/artefactual-sdps/enduro/internal/am"
"github.com/artefactual-sdps/enduro/internal/datatypes"
"github.com/artefactual-sdps/enduro/internal/enums"
"github.com/artefactual-sdps/enduro/internal/package_"
fake_package "github.com/artefactual-sdps/enduro/internal/package_/fake"
)

Expand Down Expand Up @@ -181,7 +181,7 @@ func TestConvertJobToPreservationTask(t *testing.T) {
type test struct {
name string
job amclient.Job
want package_.PreservationTask
want datatypes.PreservationTask
}

for _, tt := range []test{
Expand Down Expand Up @@ -212,10 +212,10 @@ func TestConvertJobToPreservationTask(t *testing.T) {
},
},
},
want: package_.PreservationTask{
want: datatypes.PreservationTask{
TaskID: "f60018ac-da79-4769-9509-c6c41d5efe7e",
Name: "Move to processing directory",
Status: package_.PreservationTaskStatus(enums.PackageStatusDone),
Status: enums.PreservationTaskStatus(enums.PackageStatusDone),
StartedAt: sql.NullTime{
Time: time.Date(2024, time.January, 18, 1, 27, 49, 0, time.UTC),
Valid: true,
Expand Down Expand Up @@ -253,10 +253,10 @@ func TestConvertJobToPreservationTask(t *testing.T) {
},
},
},
want: package_.PreservationTask{
want: datatypes.PreservationTask{
TaskID: "c2128d39-2ace-47c5-8cac-39ded8d9c9ef",
Name: "Verify SIP compliance",
Status: package_.PreservationTaskStatus(enums.PackageStatusInProgress),
Status: enums.PreservationTaskStatus(enums.PackageStatusInProgress),
StartedAt: sql.NullTime{
Time: time.Date(2024, time.January, 18, 1, 27, 49, 0, time.UTC),
Valid: true,
Expand All @@ -267,7 +267,7 @@ func TestConvertJobToPreservationTask(t *testing.T) {
{
name: "Returns NULL timestamps in the job has no tasks",
job: amclient.Job{},
want: package_.PreservationTask{},
want: datatypes.PreservationTask{},
},
} {
t.Run(tt.name, func(t *testing.T) {
Expand Down
4 changes: 2 additions & 2 deletions internal/am/poll_ingest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
"gotest.tools/v3/assert"

"github.com/artefactual-sdps/enduro/internal/am"
"github.com/artefactual-sdps/enduro/internal/package_"
"github.com/artefactual-sdps/enduro/internal/datatypes"
fake_package "github.com/artefactual-sdps/enduro/internal/package_/fake"
)

Expand Down Expand Up @@ -154,7 +154,7 @@ func TestPollIngestActivity(t *testing.T) {
)
},
pkgRec: func(m *fake_package.MockServiceMockRecorder) {
tasks := make([]*package_.PreservationTask, len(jobs))
tasks := make([]*datatypes.PreservationTask, len(jobs))
for i, job := range jobs {
pt := am.ConvertJobToPreservationTask(job)
pt.PreservationActionID = presActionID
Expand Down
18 changes: 18 additions & 0 deletions internal/datatypes/preservation_action.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package datatypes

import (
"database/sql"

"github.com/artefactual-sdps/enduro/internal/enums"
)

// PreservationAction represents a preservation action in the preservation_action table.
type PreservationAction struct {
ID uint `db:"id"`
WorkflowID string `db:"workflow_id"`
Type enums.PreservationActionType `db:"type"`
Status enums.PreservationActionStatus `db:"status"`
StartedAt sql.NullTime `db:"started_at"`
CompletedAt sql.NullTime `db:"completed_at"`
PackageID uint `db:"package_id"`
}
20 changes: 20 additions & 0 deletions internal/datatypes/preservation_task.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package datatypes

import (
"database/sql"

"github.com/artefactual-sdps/enduro/internal/enums"
)

// PreservationTask represents a preservation action task in the
// preservation_task table.
type PreservationTask struct {
ID uint `db:"id"`
TaskID string `db:"task_id"`
Name string `db:"name"`
Status enums.PreservationTaskStatus `db:"status"`
StartedAt sql.NullTime `db:"started_at"`
CompletedAt sql.NullTime `db:"completed_at"`
Note string
PreservationActionID uint `db:"preservation_action_id"`
}
42 changes: 42 additions & 0 deletions internal/db/convert_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package db_test

import (
"database/sql"
"testing"
"time"

"gotest.tools/v3/assert"

"github.com/artefactual-sdps/enduro/internal/db"
)

func TestFormatOptionalString(t *testing.T) {
t.Run("Returns nil pointer for an empty string", func(t *testing.T) {
t.Parallel()
got := db.FormatOptionalString("")
assert.Assert(t, got == nil)
})

t.Run("Returns a pointer to a string", func(t *testing.T) {
t.Parallel()
got := db.FormatOptionalString("foo")
assert.Equal(t, *got, "foo")
})
}

func TestFormatOptionalTime(t *testing.T) {
t.Run("Returns nil pointer for null time", func(t *testing.T) {
t.Parallel()
got := db.FormatOptionalTime(sql.NullTime{})
assert.Assert(t, got == nil)
})

t.Run("Returns an RFC3339 time string", func(t *testing.T) {
t.Parallel()
got := db.FormatOptionalTime(sql.NullTime{
Time: time.Date(2024, 3, 6, 11, 57, 17, 115, time.UTC),
Valid: true,
})
assert.Equal(t, *got, "2024-03-06T11:57:17Z")
})
}
124 changes: 124 additions & 0 deletions internal/enums/preservation_action.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
package enums

import (
"encoding/json"
"strings"
)

type PreservationActionType uint

const (
PreservationActionTypeUnspecified PreservationActionType = iota
PreservationActionTypeCreateAIP
PreservationActionTypeCreateAndReviewAIP
PreservationActionTypeMovePackage
)

func NewPreservationActionType(status string) PreservationActionType {
var s PreservationActionType

switch strings.ToLower(status) {
case "create-aip":
s = PreservationActionTypeCreateAIP
case "create-and-review-aip":
s = PreservationActionTypeCreateAndReviewAIP
case "move-package":
s = PreservationActionTypeMovePackage
default:
s = PreservationActionTypeUnspecified
}

return s
}

func (p PreservationActionType) String() string {
switch p {
case PreservationActionTypeCreateAIP:
return "create-aip"
case PreservationActionTypeCreateAndReviewAIP:
return "create-and-review-aip"
case PreservationActionTypeMovePackage:
return "move-package"
}

return "unspecified"
}

func (p PreservationActionType) MarshalJSON() ([]byte, error) {
return json.Marshal(p.String())
}

func (p *PreservationActionType) UnmarshalJSON(b []byte) error {
var s string
if err := json.Unmarshal(b, &s); err != nil {
return err
}

*p = NewPreservationActionType(s)

return nil
}

type PreservationActionStatus uint

const (
PreservationActionStatusUnspecified PreservationActionStatus = iota
PreservationActionStatusInProgress
PreservationActionStatusDone
PreservationActionStatusError
PreservationActionStatusQueued
PreservationActionStatusPending
)

func NewPreservationActionStatus(status string) PreservationActionStatus {
var s PreservationActionStatus

switch strings.ToLower(status) {
case "in progress":
s = PreservationActionStatusInProgress
case "done":
s = PreservationActionStatusDone
case "error":
s = PreservationActionStatusError
case "queued":
s = PreservationActionStatusQueued
case "pending":
s = PreservationActionStatusPending
default:
s = PreservationActionStatusUnspecified
}

return s
}

func (p PreservationActionStatus) String() string {
switch p {
case PreservationActionStatusInProgress:
return "in progress"
case PreservationActionStatusDone:
return "done"
case PreservationActionStatusError:
return "error"
case PreservationActionStatusQueued:
return "queued"
case PreservationActionStatusPending:
return "pending"
}

return "unspecified"
}

func (p PreservationActionStatus) MarshalJSON() ([]byte, error) {
return json.Marshal(p.String())
}

func (p *PreservationActionStatus) UnmarshalJSON(b []byte) error {
var s string
if err := json.Unmarshal(b, &s); err != nil {
return err
}

*p = NewPreservationActionStatus(s)

return nil
}
Loading
Loading