package mysqldriver import ( "context" "git.aiterp.net/stufflog/server/internal/slerrors" "git.aiterp.net/stufflog/server/models" "github.com/stretchr/testify/assert" "testing" "time" ) var project1 = models.Project{ ID: "STUFF", Name: "Stuff and things", Description: "Items and artifacts", DailyPoints: 200, } var project2 = models.Project{ ID: "MODELING", Name: "3D Modelling", Description: "Making stuff.", DailyPoints: 250, } var project3 = models.Project{ ID: "DINNER", Name: "Dinner", Description: "Shopping lists and meals.", DailyPoints: 0, } var projectSearch1 = "stuff" func TestProjectRepository(t *testing.T) { projects := testDB.projects ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) defer cancel() assert.NoError(t, clearTable("project")) // INSERT result, err := projects.Insert(ctx, project1) assert.NoError(t, err) assert.Equal(t, project1, *result) result, err = projects.Insert(ctx, project2) assert.NoError(t, err) assert.Equal(t, project2, *result) result, err = projects.Insert(ctx, project3) assert.NoError(t, err) assert.Equal(t, project3, *result) if t.Failed() { return } // FIND result, err = projects.Find(ctx, "MODELING") assert.NoError(t, err) assert.Equal(t, &project2, result) // FIND't result, err = projects.Find(ctx, "BLARGH") assert.Error(t, err) assert.True(t, slerrors.IsNotFound(err)) assert.Nil(t, result) // LIST results, err := projects.List(ctx, models.ProjectFilter{}) assert.NoError(t, err) assert.Equal(t, []*models.Project{&project3, &project2, &project1}, results) results, err = projects.List(ctx, models.ProjectFilter{ Search: &projectSearch1, }) assert.NoError(t, err) assert.Equal(t, []*models.Project{&project2, &project1}, results) results, err = projects.List(ctx, models.ProjectFilter{ ProjectIDs: []string{"DINNER", "MODELING"}, }) assert.NoError(t, err) assert.Equal(t, []*models.Project{&project3, &project2}, results) if t.Failed() { return } // UPDATE project2fix := project2 project2fix.Name = "3D Modeling" project2fix.Description = "Modeling 3D stuff." project2fix.DailyPoints = 150 err = projects.Save(ctx, project2fix) assert.NoError(t, err) if t.Failed() { return } // FIND after UPDATE result, err = projects.Find(ctx, "MODELING") assert.NoError(t, err) assert.Equal(t, &project2fix, result) // DELETE err = projects.Delete(ctx, project3) assert.NoError(t, err) if t.Failed() { return } // LIST after DELETE + UPDATE results, err = projects.List(ctx, models.ProjectFilter{}) assert.NoError(t, err) assert.Equal(t, []*models.Project{&project2fix, &project1}, results) // SET PERMISSION err = projects.SetPermission(ctx, models.ProjectPermission{ ProjectID: project1.ID, UserID: user1.ID, Level: models.ProjectPermissionLevelOwner, }) assert.NoError(t, err) err = projects.SetPermission(ctx, models.ProjectPermission{ ProjectID: project2fix.ID, UserID: user1.ID, Level: models.ProjectPermissionLevelMember, }) assert.NoError(t, err) // GET PERMISSIONS permission, err := projects.GetPermission(ctx, project1, user1) assert.NoError(t, err) assert.Equal(t, project1.ID, permission.ProjectID) assert.Equal(t, user1.ID, permission.UserID) assert.Equal(t, models.ProjectPermissionLevelOwner, permission.Level) permission, err = projects.GetPermission(ctx, project2fix, user1) assert.NoError(t, err) assert.Equal(t, models.ProjectPermissionLevelMember, permission.Level) // GET PERMISSION (default) permission, err = projects.GetPermission(ctx, project1, user2) assert.NoError(t, err) assert.Equal(t, project1.ID, permission.ProjectID) assert.Equal(t, user2.ID, permission.UserID) assert.Equal(t, models.ProjectPermissionLevelNoAccess, permission.Level) // LIST after SET PERMISSION results, err = projects.List(ctx, models.ProjectFilter{ Permission: &models.ProjectFilterPermission{ UserID: user1.ID, MinLevel: models.ProjectPermissionLevelMember, }, }) assert.NoError(t, err) assert.Equal(t, []*models.Project{&project2fix, &project1}, results) results, err = projects.List(ctx, models.ProjectFilter{ Permission: &models.ProjectFilterPermission{ UserID: user2.ID, MinLevel: models.ProjectPermissionLevelMember, }, }) assert.NoError(t, err) assert.Equal(t, []*models.Project{}, results) }