package mysqldriver import ( "context" "git.aiterp.net/stufflog/server/internal/xlerrors" "git.aiterp.net/stufflog/server/models" "github.com/stretchr/testify/assert" "testing" "time" ) var projectStatus1 = models.ProjectStatus{ ProjectID: project1.ID, Stage: models.IssueStagePending, Name: "Ready", Description: "This task is ready to be done.", } var projectStatus2 = models.ProjectStatus{ ProjectID: project1.ID, Stage: models.IssueStageInactive, Name: "Idea", Description: "Maybe do this?", } var projectStatus3 = models.ProjectStatus{ ProjectID: project2.ID, Stage: models.IssueStageActive, Name: "In Progress", Description: "It is being done.", } var projectStatus4 = models.ProjectStatus{ ProjectID: project2.ID, Stage: models.IssueStageReview, Name: "Rendered", Description: "It is rendered and awaiting feedback.", } var projectStatus5 = models.ProjectStatus{ ProjectID: project3.ID, Stage: models.IssueStageCompleted, Name: "Om Nom Nom", Description: "Sustenance intake complete.", } var projectStatus6 = models.ProjectStatus{ ProjectID: project1.ID, Stage: models.IssueStageFailed, Name: "Bad Stuff", Description: "Stuff could not be done.", } var projectStatus7 = models.ProjectStatus{ ProjectID: project2.ID, Stage: models.IssueStagePostponed, Name: "Too Hard", Description: "Do it later.", } var projectStatus7Updated = models.ProjectStatus{ ProjectID: project2.ID, Stage: models.IssueStageInactive, Name: "Too Hard", Description: "Do it later, when you're less of newbie.", } func TestProjectStatusRepository(t *testing.T) { statuses := testDB.projectStatuses ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() assert.NoError(t, clearTable("project_status")) // INSERT assert.NoError(t, statuses.Save(ctx, projectStatus1)) assert.NoError(t, statuses.Save(ctx, projectStatus2)) assert.NoError(t, statuses.Save(ctx, projectStatus3)) assert.NoError(t, statuses.Save(ctx, projectStatus4)) assert.NoError(t, statuses.Save(ctx, projectStatus5)) assert.NoError(t, statuses.Save(ctx, projectStatus6)) assert.NoError(t, statuses.Save(ctx, projectStatus7)) // FIND result, err := statuses.Find(ctx, project2.ID, projectStatus3.Name) assert.NoError(t, err) assert.Equal(t, &projectStatus3, result) result, err = statuses.Find(ctx, project1.ID, projectStatus6.Name) assert.NoError(t, err) assert.Equal(t, &projectStatus6, result) // FINDn't result, err = statuses.Find(ctx, project3.ID, projectStatus6.Name) assert.Error(t, err) assert.True(t, xlerrors.IsNotFound(err)) assert.Nil(t, result) result, err = statuses.Find(ctx, project2.ID, "Non-existent Name") assert.Error(t, err) assert.True(t, xlerrors.IsNotFound(err)) assert.Nil(t, result) // LIST results, err := statuses.List(ctx, models.ProjectStatusFilter{}) assert.NoError(t, err) assert.Equal(t, []*models.ProjectStatus{ &projectStatus5, &projectStatus3, &projectStatus4, &projectStatus7, &projectStatus2, &projectStatus1, &projectStatus6, }, results) results, err = statuses.List(ctx, models.ProjectStatusFilter{ProjectID: &project1.ID}) assert.NoError(t, err) assert.Equal(t, []*models.ProjectStatus{ &projectStatus2, &projectStatus1, &projectStatus6, }, results) results, err = statuses.List(ctx, models.ProjectStatusFilter{ProjectID: &project2.ID, MinStage: ptrInt(models.IssueStageReview)}) assert.NoError(t, err) assert.Equal(t, []*models.ProjectStatus{ &projectStatus4, &projectStatus7, }, results) results, err = statuses.List(ctx, models.ProjectStatusFilter{ProjectID: &project2.ID, MaxStage: ptrInt(models.IssueStageReview)}) assert.NoError(t, err) assert.Equal(t, []*models.ProjectStatus{ &projectStatus3, &projectStatus4, }, results) results, err = statuses.List(ctx, models.ProjectStatusFilter{ProjectID: &project3.ID, MaxStage: ptrInt(models.IssueStagePending)}) assert.NoError(t, err) assert.Equal(t, []*models.ProjectStatus{}, results) // UPDATE assert.NoError(t, statuses.Save(ctx, projectStatus7Updated)) // FIND after UPDATE result, err = statuses.Find(ctx, project2.ID, projectStatus7.Name) assert.NoError(t, err) assert.Equal(t, &projectStatus7Updated, result) // LIST after UPDATE results, err = statuses.List(ctx, models.ProjectStatusFilter{}) assert.NoError(t, err) assert.Equal(t, []*models.ProjectStatus{ &projectStatus5, &projectStatus7Updated, &projectStatus3, &projectStatus4, &projectStatus2, &projectStatus1, &projectStatus6, }, results) // DELETE assert.NoError(t, statuses.Delete(ctx, projectStatus7Updated)) // LIST after DELETE results, err = statuses.List(ctx, models.ProjectStatusFilter{}) assert.NoError(t, err) assert.Equal(t, []*models.ProjectStatus{ &projectStatus5, &projectStatus3, &projectStatus4, &projectStatus2, &projectStatus1, &projectStatus6, }, results) }