From ecedb882a1d5466108ddd4e0e834ddba3844e087 Mon Sep 17 00:00:00 2001 From: Tan Jiang Date: Wed, 24 Feb 2016 14:31:52 +0800 Subject: [PATCH 1/2] replace status codes with constants in net/http --- api/base.go | 8 +++--- api/project.go | 27 ++++++++++--------- api/project_member.go | 47 +++++++++++++++++---------------- api/repository.go | 19 ++++++------- api/search.go | 5 ++-- api/user.go | 27 ++++++++++--------- controllers/item_detail.go | 9 ++++--- controllers/login.go | 8 +++--- controllers/password.go | 47 +++++++++++++++++---------------- controllers/register.go | 7 ++--- service/auth.go | 5 ++-- service/utils/registry_utils.go | 6 ++--- utils/registry_utils.go | 6 ++--- 13 files changed, 116 insertions(+), 105 deletions(-) diff --git a/api/base.go b/api/base.go index 92578bb78..2262bb3ac 100644 --- a/api/base.go +++ b/api/base.go @@ -40,7 +40,7 @@ func (b *BaseAPI) DecodeJsonReq(v interface{}) { err := json.Unmarshal(b.Ctx.Input.CopyBody(1<<32), v) if err != nil { beego.Error("Error while decoding the json request:", err) - b.CustomAbort(400, "Invalid json request") + b.CustomAbort(http.StatusBadRequest, "Invalid json request") } } @@ -49,17 +49,17 @@ func (b *BaseAPI) ValidateUser() int { sessionUserId := b.GetSession("userId") if sessionUserId == nil { beego.Warning("No user id in session, canceling request") - b.CustomAbort(401, "") + b.CustomAbort(http.StatusUnauthorized, "") } userId := sessionUserId.(int) u, err := dao.GetUser(models.User{UserId: userId}) if err != nil { beego.Error("Error occurred in GetUser:", err) - b.CustomAbort(500, "Internal error.") + b.CustomAbort(http.StatusInternalServerError, "Internal error.") } if u == nil { beego.Warning("User was deleted already, user id: ", userId, " canceling request.") - b.CustomAbort(401, "") + b.CustomAbort(http.StatusUnauthorized, "") } return userId } diff --git a/api/project.go b/api/project.go index 73fa4ae70..42944ef51 100644 --- a/api/project.go +++ b/api/project.go @@ -17,6 +17,7 @@ package api import ( "fmt" "log" + "net/http" "github.com/vmware/harbor/dao" "github.com/vmware/harbor/models" @@ -48,15 +49,15 @@ func (p *ProjectAPI) Prepare() { p.projectId, err = strconv.ParseInt(id_str, 10, 64) if err != nil { log.Printf("Error parsing project id: %s, error: %v", id_str, err) - p.CustomAbort(400, "invalid project id") + p.CustomAbort(http.StatusBadRequest, "invalid project id") } exist, err := dao.ProjectExists(p.projectId) if err != nil { log.Printf("Error occurred in ProjectExists: %v", err) - p.CustomAbort(500, "Internal error.") + p.CustomAbort(http.StatusInternalServerError, "Internal error.") } if !exist { - p.CustomAbort(404, fmt.Sprintf("project does not exist, id: %v", p.projectId)) + p.CustomAbort(http.StatusNotFound, fmt.Sprintf("project does not exist, id: %v", p.projectId)) } } } @@ -71,7 +72,7 @@ func (p *ProjectAPI) Post() { err := validateProjectReq(req) if err != nil { beego.Error("Invalid project request, error: ", err) - p.RenderError(400, "Invalid request for creating project") + p.RenderError(http.StatusBadRequest, "Invalid request for creating project") return } projectName := req.ProjectName @@ -80,14 +81,14 @@ func (p *ProjectAPI) Post() { beego.Error("Error happened checking project existence in db:", err, ", project name:", projectName) } if exist { - p.RenderError(409, "") + p.RenderError(http.StatusConflict, "") return } project := models.Project{OwnerId: p.userId, Name: projectName, CreationTime: time.Now(), Public: public} err = dao.AddProject(project) if err != nil { beego.Error("Failed to add project, error: %v", err) - p.RenderError(500, "Failed to add project") + p.RenderError(http.StatusInternalServerError, "Failed to add project") } } @@ -96,11 +97,11 @@ func (p *ProjectAPI) Head() { result, err := dao.ProjectExists(projectName) if err != nil { beego.Error("Error while communicating with DB: ", err) - p.RenderError(500, "Error while communicating with DB") + p.RenderError(http.StatusInternalServerError, "Error while communicating with DB") return } if !result { - p.RenderError(404, "") + p.RenderError(http.StatusNotFound, "") return } } @@ -117,7 +118,7 @@ func (p *ProjectAPI) Get() { projectList, err := dao.QueryProject(queryProject) if err != nil { beego.Error("Error occurred in QueryProject:", err) - p.CustomAbort(500, "Internal error.") + p.CustomAbort(http.StatusInternalServerError, "Internal error.") } for i := 0; i < len(projectList); i++ { if isProjectAdmin(p.userId, projectList[i].ProjectId) { @@ -135,7 +136,7 @@ func (p *ProjectAPI) Put() { projectId, err := strconv.ParseInt(p.Ctx.Input.Param(":id"), 10, 64) if err != nil { beego.Error("Error parsing project id:", projectId, ", error: ", err) - p.RenderError(400, "invalid project id") + p.RenderError(http.StatusBadRequest, "invalid project id") return } @@ -145,13 +146,13 @@ func (p *ProjectAPI) Put() { } if !isProjectAdmin(p.userId, projectId) { beego.Warning("Current user, id:", p.userId, ", does not have project admin role for project, id:", projectId) - p.RenderError(403, "") + p.RenderError(http.StatusForbidden, "") return } err = dao.ToggleProjectPublicity(p.projectId, public) if err != nil { beego.Error("Error while updating project, project id:", projectId, ", error:", err) - p.RenderError(500, "Failed to update project") + p.RenderError(http.StatusInternalServerError, "Failed to update project") } } @@ -173,7 +174,7 @@ func (p *ProjectAPI) FilterAccessLog() { accessLogList, err := dao.GetAccessLogs(query) if err != nil { log.Printf("Error occurred in GetAccessLogs: %v", err) - p.CustomAbort(500, "Internal error.") + p.CustomAbort(http.StatusInternalServerError, "Internal error.") } p.Data["json"] = accessLogList p.ServeJSON() diff --git a/api/project_member.go b/api/project_member.go index b387958e7..37185ad31 100644 --- a/api/project_member.go +++ b/api/project_member.go @@ -15,12 +15,13 @@ package api import ( + "net/http" + "strconv" + "github.com/vmware/harbor/dao" "github.com/vmware/harbor/models" "github.com/astaxie/beego" - - "strconv" ) type ProjectMemberAPI struct { @@ -40,18 +41,18 @@ func (pma *ProjectMemberAPI) Prepare() { pid, err := strconv.ParseInt(pma.Ctx.Input.Param(":pid"), 10, 64) if err != nil { beego.Error("Error parsing project id:", pid, ", error:", err) - pma.CustomAbort(400, "invalid project Id") + pma.CustomAbort(http.StatusBadRequest, "invalid project Id") return } p, err := dao.GetProjectById(models.Project{ProjectId: pid}) if err != nil { beego.Error("Error occurred in GetProjectById:", err) - pma.CustomAbort(500, "Internal error.") + pma.CustomAbort(http.StatusInternalServerError, "Internal error.") } if p == nil { beego.Warning("Project with id:", pid, "does not exist.") - pma.CustomAbort(404, "Project does not exist") + pma.CustomAbort(http.StatusNotFound, "Project does not exist") } pma.project = p pma.currentUserId = pma.ValidateUser() @@ -64,7 +65,7 @@ func (pma *ProjectMemberAPI) Prepare() { memberId, err := strconv.Atoi(mid) if err != nil { beego.Error("Invalid member Id, error:", err) - pma.CustomAbort(400, "Invalid member id") + pma.CustomAbort(http.StatusBadRequest, "Invalid member id") } pma.memberId = memberId } @@ -74,7 +75,7 @@ func (pma *ProjectMemberAPI) Get() { pid := pma.project.ProjectId if !CheckProjectPermission(pma.currentUserId, pid) { beego.Warning("Current user, user id :", pma.currentUserId, "does not have permission for project, id:", pid) - pma.RenderError(403, "") + pma.RenderError(http.StatusForbidden, "") return } if pma.memberId == 0 { //member id not set return list of the members @@ -84,7 +85,7 @@ func (pma *ProjectMemberAPI) Get() { userList, err := dao.GetUserByProject(queryProject, queryUser) if err != nil { beego.Error("Failed to query database for member list, error:", err) - pma.RenderError(500, "Internal Server Error") + pma.RenderError(http.StatusInternalServerError, "Internal Server Error") return } pma.Data["json"] = userList @@ -92,14 +93,14 @@ func (pma *ProjectMemberAPI) Get() { roleList, err := dao.GetUserProjectRoles(models.User{UserId: pma.memberId}, pid) if err != nil { beego.Error("Error occurred in GetUserProjectRoles:", err) - pma.CustomAbort(500, "Internal error.") + pma.CustomAbort(http.StatusInternalServerError, "Internal error.") } //return empty role list to indicate if a user is not a member result := make(map[string]interface{}) user, err := dao.GetUser(models.User{UserId: pma.memberId}) if err != nil { beego.Error("Error occurred in GetUser:", err) - pma.CustomAbort(500, "Internal error.") + pma.CustomAbort(http.StatusInternalServerError, "Internal error.") } result["user_name"] = user.Username result["user_id"] = pma.memberId @@ -115,11 +116,11 @@ func (pma *ProjectMemberAPI) Post() { rolelist, err := dao.GetUserProjectRoles(userQuery, pid) if err != nil { beego.Error("Error occurred in GetUserProjectRoles:", err) - pma.CustomAbort(500, "Internal error.") + pma.CustomAbort(http.StatusInternalServerError, "Internal error.") } if len(rolelist) == 0 { beego.Warning("Current user, id:", pma.currentUserId, "does not have project admin role for project, id:", pid) - pma.RenderError(403, "") + pma.RenderError(http.StatusForbidden, "") return } var req memberReq @@ -128,17 +129,17 @@ func (pma *ProjectMemberAPI) Post() { userId := CheckUserExists(username) if userId <= 0 { beego.Warning("User does not exist, user name:", username) - pma.RenderError(404, "User does not exist") + pma.RenderError(http.StatusNotFound, "User does not exist") return } rolelist, err = dao.GetUserProjectRoles(models.User{UserId: userId}, pid) if err != nil { beego.Error("Error occurred in GetUserProjectRoles:", err) - pma.CustomAbort(500, "Internal error.") + pma.CustomAbort(http.StatusInternalServerError, "Internal error.") } if len(rolelist) > 0 { beego.Warning("user is already added to project, user id:", userId, ", project id:", pid) - pma.RenderError(409, "user is ready in project") + pma.RenderError(http.StatusConflict, "user is ready in project") return } @@ -146,7 +147,7 @@ func (pma *ProjectMemberAPI) Post() { err = dao.AddUserProjectRole(userId, pid, int(rid)) if err != nil { beego.Error("Failed to update DB to add project user role, project id:", pid, ", user id:", userId, ", role id:", rid) - pma.RenderError(500, "Failed to update data in database") + pma.RenderError(http.StatusInternalServerError, "Failed to update data in database") return } } @@ -159,11 +160,11 @@ func (pma *ProjectMemberAPI) Put() { rolelist, err := dao.GetUserProjectRoles(userQuery, pid) if err != nil { beego.Error("Error occurred in GetUserProjectRoles:", err) - pma.CustomAbort(500, "Internal error.") + pma.CustomAbort(http.StatusInternalServerError, "Internal error.") } if len(rolelist) == 0 { beego.Warning("Current user, id:", pma.currentUserId, ", does not have project admin role for project, id:", pid) - pma.RenderError(403, "") + pma.RenderError(http.StatusForbidden, "") return } var req memberReq @@ -171,7 +172,7 @@ func (pma *ProjectMemberAPI) Put() { roleList, err := dao.GetUserProjectRoles(models.User{UserId: mid}, pid) if len(roleList) == 0 { beego.Warning("User is not in project, user id:", mid, ", project id:", pid) - pma.RenderError(404, "user not exist in project") + pma.RenderError(http.StatusNotFound, "user not exist in project") return } //TODO: delete and insert should in one transaction @@ -179,7 +180,7 @@ func (pma *ProjectMemberAPI) Put() { err = dao.DeleteUserProjectRoles(mid, pid) if err != nil { beego.Error("Failed to delete project roles for user, user id:", mid, ", project id: ", pid, ", error: ", err) - pma.RenderError(500, "Failed to update data in DB") + pma.RenderError(http.StatusInternalServerError, "Failed to update data in DB") return } //insert roles in request @@ -187,7 +188,7 @@ func (pma *ProjectMemberAPI) Put() { err = dao.AddUserProjectRole(mid, pid, int(rid)) if err != nil { beego.Error("Failed to update DB to add project user role, project id:", pid, ", user id:", mid, ", role id:", rid) - pma.RenderError(500, "Failed to update data in database") + pma.RenderError(http.StatusInternalServerError, "Failed to update data in database") return } } @@ -200,13 +201,13 @@ func (pma *ProjectMemberAPI) Delete() { rolelist, err := dao.GetUserProjectRoles(userQuery, pid) if len(rolelist) == 0 { beego.Warning("Current user, id:", pma.currentUserId, ", does not have project admin role for project, id:", pid) - pma.RenderError(403, "") + pma.RenderError(http.StatusForbidden, "") return } err = dao.DeleteUserProjectRoles(mid, pid) if err != nil { beego.Error("Failed to delete project roles for user, user id:", mid, ", project id:", pid, ", error:", err) - pma.RenderError(500, "Failed to update data in DB") + pma.RenderError(http.StatusInternalServerError, "Failed to update data in DB") return } } diff --git a/api/repository.go b/api/repository.go index 284a73515..918724638 100644 --- a/api/repository.go +++ b/api/repository.go @@ -16,6 +16,7 @@ package api import ( "encoding/json" + "net/http" "strconv" "strings" "time" @@ -56,28 +57,28 @@ func (ra *RepositoryAPI) Get() { projectId, err0 := ra.GetInt64("project_id") if err0 != nil { beego.Error("Failed to get project id, error:", err0) - ra.RenderError(400, "Invalid project id") + ra.RenderError(http.StatusBadRequest, "Invalid project id") return } projectQuery := models.Project{ProjectId: projectId} p, err := dao.GetProjectById(projectQuery) if err != nil { beego.Error("Error occurred in GetProjectById:", err) - ra.CustomAbort(500, "Internal error.") + ra.CustomAbort(http.StatusInternalServerError, "Internal error.") } if p == nil { beego.Warning("Project with Id:", projectId, ", does not exist", projectId) - ra.RenderError(404, "") + ra.RenderError(http.StatusNotFound, "") return } if p.Public == 0 && !CheckProjectPermission(ra.userId, projectId) { - ra.RenderError(403, "") + ra.RenderError(http.StatusForbidden, "") return } repoList, err := svc_utils.GetRepoFromCache() if err != nil { beego.Error("Failed to get repo from cache, error:", err) - ra.RenderError(500, "internal sever error") + ra.RenderError(http.StatusInternalServerError, "internal sever error") } projectName := p.Name q := ra.GetString("q") @@ -127,7 +128,7 @@ func (ra *RepositoryAPI) GetTags() { result, err := svc_utils.RegistryApiGet(svc_utils.BuildRegistryUrl(repoName, "tags", "list"), ra.username) if err != nil { beego.Error("Failed to get repo tags, repo name:", repoName, ", error: ", err) - ra.RenderError(500, "Failed to get repo tags") + ra.RenderError(http.StatusInternalServerError, "Failed to get repo tags") } else { t := Tag{} json.Unmarshal(result, &t) @@ -146,14 +147,14 @@ func (ra *RepositoryAPI) GetManifests() { result, err := svc_utils.RegistryApiGet(svc_utils.BuildRegistryUrl(repoName, "manifests", tag), ra.username) if err != nil { beego.Error("Failed to get manifests for repo, repo name:", repoName, ", tag:", tag, ", error:", err) - ra.RenderError(500, "Internal Server Error") + ra.RenderError(http.StatusInternalServerError, "Internal Server Error") return } else { mani := Manifest{} err = json.Unmarshal(result, &mani) if err != nil { beego.Error("Failed to decode json from response for manifests, repo name:", repoName, ", tag:", tag, ", error:", err) - ra.RenderError(500, "Internal Server Error") + ra.RenderError(http.StatusInternalServerError, "Internal Server Error") return } else { v1Compatibility := mani.History[0].V1Compatibility @@ -161,7 +162,7 @@ func (ra *RepositoryAPI) GetManifests() { err = json.Unmarshal([]byte(v1Compatibility), &item) if err != nil { beego.Error("Failed to decode V1 field for repo, repo name:", repoName, ", tag:", tag, ", error:", err) - ra.RenderError(500, "Internal Server Error") + ra.RenderError(http.StatusInternalServerError, "Internal Server Error") return } else { item.CreatedStr = item.Created.Format("2006-01-02 15:04:05") diff --git a/api/search.go b/api/search.go index 805647596..e0d7348bc 100644 --- a/api/search.go +++ b/api/search.go @@ -15,6 +15,7 @@ package api import ( + "net/http" "sort" "strings" @@ -44,7 +45,7 @@ func (n *SearchAPI) Get() { projects, err := dao.QueryRelevantProjects(userId) if err != nil { beego.Error("Failed to get projects of user id:", userId, ", error:", err) - n.CustomAbort(500, "Failed to get project search result") + n.CustomAbort(http.StatusInternalServerError, "Failed to get project search result") } projectSorter := &utils.ProjectSorter{Projects: projects} sort.Sort(projectSorter) @@ -66,7 +67,7 @@ func (n *SearchAPI) Get() { repositories, err2 := svc_utils.GetRepoFromCache() if err2 != nil { beego.Error("Failed to get repos from cache, error :", err2) - n.CustomAbort(500, "Failed to get repositories search result") + n.CustomAbort(http.StatusInternalServerError, "Failed to get repositories search result") } sort.Strings(repositories) repositoryResult := filterRepositories(repositories, projects, keyword) diff --git a/api/user.go b/api/user.go index 2df9bf454..1c3fcbc13 100644 --- a/api/user.go +++ b/api/user.go @@ -15,6 +15,7 @@ package api import ( + "net/http" "strconv" "github.com/vmware/harbor/dao" @@ -40,17 +41,17 @@ func (ua *UserAPI) Prepare() { ua.userId, err = strconv.Atoi(id) if err != nil { beego.Error("Invalid user id, error:", err) - ua.CustomAbort(400, "Invalid user Id") + ua.CustomAbort(http.StatusBadRequest, "Invalid user Id") } userQuery := models.User{UserId: ua.userId} u, err := dao.GetUser(userQuery) if err != nil { beego.Error("Error occurred in GetUser:", err) - ua.CustomAbort(500, "Internal error.") + ua.CustomAbort(http.StatusInternalServerError, "Internal error.") } if u == nil { beego.Error("User with Id:", ua.userId, "does not exist") - ua.CustomAbort(404, "") + ua.CustomAbort(http.StatusNotFound, "") } } } @@ -59,13 +60,13 @@ func (ua *UserAPI) Get() { exist, err := dao.IsAdminRole(ua.currentUid) if err != nil { beego.Error("Error occurred in IsAdminRole:", err) - ua.CustomAbort(500, "Internal error.") + ua.CustomAbort(http.StatusInternalServerError, "Internal error.") } if ua.userId == 0 { //list users if !exist { beego.Error("Current user, id:", ua.currentUid, ", does not have admin role, can not list users") - ua.RenderError(403, "User does not have admin role") + ua.RenderError(http.StatusForbidden, "User does not have admin role") return } username := ua.GetString("username") @@ -76,7 +77,7 @@ func (ua *UserAPI) Get() { userList, err := dao.ListUsers(userQuery) if err != nil { beego.Error("Failed to get data from database, error:", err) - ua.RenderError(500, "Failed to query from database") + ua.RenderError(http.StatusInternalServerError, "Failed to query from database") return } ua.Data["json"] = userList @@ -86,12 +87,12 @@ func (ua *UserAPI) Get() { u, err := dao.GetUser(userQuery) if err != nil { beego.Error("Error occurred in GetUser:", err) - ua.CustomAbort(500, "Internal error.") + ua.CustomAbort(http.StatusInternalServerError, "Internal error.") } ua.Data["json"] = u } else { beego.Error("Current user, id:", ua.currentUid, "does not have admin role, can not view other user's detail") - ua.RenderError(403, "User does not have admin role") + ua.RenderError(http.StatusForbidden, "User does not have admin role") return } ua.ServeJSON() @@ -101,11 +102,11 @@ func (ua *UserAPI) Put() { //currently only for toggle admin, so no request body exist, err := dao.IsAdminRole(ua.currentUid) if err != nil { beego.Error("Error occurred in IsAdminRole:", err) - ua.CustomAbort(500, "Internal error.") + ua.CustomAbort(http.StatusInternalServerError, "Internal error.") } if !exist { beego.Warning("current user, id:", ua.currentUid, ", does not have admin role, can not update other user's role") - ua.RenderError(403, "User does not have admin role") + ua.RenderError(http.StatusForbidden, "User does not have admin role") return } userQuery := models.User{UserId: ua.userId} @@ -116,17 +117,17 @@ func (ua *UserAPI) Delete() { exist, err := dao.IsAdminRole(ua.currentUid) if err != nil { beego.Error("Error occurred in IsAdminRole:", err) - ua.CustomAbort(500, "Internal error.") + ua.CustomAbort(http.StatusInternalServerError, "Internal error.") } if !exist { beego.Warning("current user, id:", ua.currentUid, ", does not have admin role, can not remove user") - ua.RenderError(403, "User does not have admin role") + ua.RenderError(http.StatusForbidden, "User does not have admin role") return } err = dao.DeleteUser(ua.userId) if err != nil { beego.Error("Failed to delete data from database, error:", err) - ua.RenderError(500, "Failed to delete User") + ua.RenderError(http.StatusInternalServerError, "Failed to delete User") return } } diff --git a/controllers/item_detail.go b/controllers/item_detail.go index 391fbc04e..34761fce4 100644 --- a/controllers/item_detail.go +++ b/controllers/item_detail.go @@ -15,6 +15,7 @@ package controllers import ( + "net/http" "net/url" "os" @@ -68,7 +69,7 @@ func (idc *ItemDetailController) Get() { projectId, _ := idc.GetInt64("project_id") if CheckPublicProject(projectId) == false && (sessionUserId == nil || !CheckProjectRole(sessionUserId.(int), projectId)) { - idc.Redirect("/signIn?uri="+url.QueryEscape(idc.Ctx.Input.URI()), 302) + idc.Redirect("/signIn?uri="+url.QueryEscape(idc.Ctx.Input.URI()), http.StatusFound) } projectQuery := models.Project{ProjectId: projectId} @@ -76,11 +77,11 @@ func (idc *ItemDetailController) Get() { if err != nil { beego.Error("Error occurred in GetProjectById:", err) - idc.CustomAbort(500, "Internal error.") + idc.CustomAbort(http.StatusInternalServerError, "Internal error.") } if project == nil { - idc.Redirect("/signIn", 302) + idc.Redirect("/signIn", http.StatusFound) } idc.Data["ProjectId"] = project.ProjectId @@ -94,7 +95,7 @@ func (idc *ItemDetailController) Get() { roleList, err := dao.GetUserProjectRoles(models.User{UserId: sessionUserId.(int)}, projectId) if err != nil { beego.Error("Error occurred in GetUserProjectRoles:", err) - idc.CustomAbort(500, "Internal error.") + idc.CustomAbort(http.StatusInternalServerError, "Internal error.") } if len(roleList) > 0 { idc.Data["RoleId"] = roleList[0].RoleId diff --git a/controllers/login.go b/controllers/login.go index d907018d4..0839e483b 100644 --- a/controllers/login.go +++ b/controllers/login.go @@ -15,6 +15,8 @@ package controllers import ( + "net/http" + "github.com/vmware/harbor/models" "github.com/vmware/harbor/opt_auth" @@ -45,11 +47,11 @@ func (c *CommonController) Login() { user, err := opt_auth.Login(models.AuthModel{principal, password}) if err != nil { beego.Error("Error occurred in UserLogin:", err) - c.CustomAbort(500, "Internal error.") + c.CustomAbort(http.StatusInternalServerError, "Internal error.") } if user == nil { - c.CustomAbort(401, "") + c.CustomAbort(http.StatusUnauthorized, "") } c.SetSession("userId", user.UserId) @@ -62,7 +64,7 @@ func (c *CommonController) SwitchLanguage() { c.SetSession("lang", lang) c.Data["Lang"] = lang } - c.Redirect(c.Ctx.Request.Header.Get("Referer"), 302) + c.Redirect(c.Ctx.Request.Header.Get("Referer"), http.StatusFound) } func (c *CommonController) Logout() { diff --git a/controllers/password.go b/controllers/password.go index 9ecc6d713..aede09a0d 100644 --- a/controllers/password.go +++ b/controllers/password.go @@ -16,6 +16,7 @@ package controllers import ( "bytes" + "net/http" "os" "regexp" "text/template" @@ -34,7 +35,7 @@ type ChangePasswordController struct { func (cpc *ChangePasswordController) Get() { sessionUserId := cpc.GetSession("userId") if sessionUserId == nil { - cpc.Redirect("/signIn", 302) + cpc.Redirect("/signIn", http.StatusFound) } cpc.Data["Username"] = cpc.GetSession("username") cpc.ForwardTo("page_title_change_password", "change-password") @@ -46,25 +47,25 @@ func (cpc *CommonController) UpdatePassword() { if sessionUserId == nil { beego.Warning("User does not login.") - cpc.CustomAbort(401, "please_login_first") + cpc.CustomAbort(http.StatusUnauthorized, "please_login_first") } oldPassword := cpc.GetString("old_password") if oldPassword == "" { beego.Error("Old password is blank") - cpc.CustomAbort(400, "Old password is blank") + cpc.CustomAbort(http.StatusBadRequest, "Old password is blank") } queryUser := models.User{UserId: sessionUserId.(int), Password: oldPassword} user, err := dao.CheckUserPassword(queryUser) if err != nil { beego.Error("Error occurred in CheckUserPassword:", err) - cpc.CustomAbort(500, "Internal error.") + cpc.CustomAbort(http.StatusInternalServerError, "Internal error.") } if user == nil { beego.Warning("Password input is not correct") - cpc.CustomAbort(403, "old_password_is_not_correct") + cpc.CustomAbort(http.StatusForbidden, "old_password_is_not_correct") } password := cpc.GetString("password") @@ -73,10 +74,10 @@ func (cpc *CommonController) UpdatePassword() { err = dao.ChangeUserPassword(updateUser, oldPassword) if err != nil { beego.Error("Error occurred in ChangeUserPassword:", err) - cpc.CustomAbort(500, "Internal error.") + cpc.CustomAbort(http.StatusInternalServerError, "Internal error.") } } else { - cpc.CustomAbort(400, "please_input_new_password") + cpc.CustomAbort(http.StatusBadRequest, "please_input_new_password") } } @@ -101,23 +102,23 @@ func (fpc *CommonController) SendEmail() { pass, _ := regexp.MatchString(`^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$`, email) if !pass { - fpc.CustomAbort(400, "email_content_illegal") + fpc.CustomAbort(http.StatusBadRequest, "email_content_illegal") } else { queryUser := models.User{Email: email} exist, err := dao.UserExists(queryUser, "email") if err != nil { beego.Error("Error occurred in UserExists:", err) - fpc.CustomAbort(500, "Internal error.") + fpc.CustomAbort(http.StatusInternalServerError, "Internal error.") } if !exist { - fpc.CustomAbort(404, "email_does_not_exist") + fpc.CustomAbort(http.StatusNotFound, "email_does_not_exist") } messageTemplate, err := template.ParseFiles("views/reset-password-mail.tpl") if err != nil { beego.Error("Parse email template file failed:", err) - fpc.CustomAbort(500, err.Error()) + fpc.CustomAbort(http.StatusInternalServerError, err.Error()) } message := new(bytes.Buffer) @@ -129,7 +130,7 @@ func (fpc *CommonController) SendEmail() { uuid, err := dao.GenerateRandomString() if err != nil { beego.Error("Error occurred in GenerateRandomString:", err) - fpc.CustomAbort(500, "Internal error.") + fpc.CustomAbort(http.StatusInternalServerError, "Internal error.") } err = messageTemplate.Execute(message, MessageDetail{ Hint: fpc.Tr("reset_email_hint"), @@ -139,13 +140,13 @@ func (fpc *CommonController) SendEmail() { if err != nil { beego.Error("message template error:", err) - fpc.CustomAbort(500, "internal_error") + fpc.CustomAbort(http.StatusInternalServerError, "internal_error") } config, err := beego.AppConfig.GetSection("mail") if err != nil { beego.Error("Can not load app.conf:", err) - fpc.CustomAbort(500, "internal_error") + fpc.CustomAbort(http.StatusInternalServerError, "internal_error") } mail := utils.Mail{ @@ -158,7 +159,7 @@ func (fpc *CommonController) SendEmail() { if err != nil { beego.Error("send email failed:", err) - fpc.CustomAbort(500, "send_email_failed") + fpc.CustomAbort(http.StatusInternalServerError, "send_email_failed") } user := models.User{ResetUuid: uuid, Email: email} @@ -177,21 +178,21 @@ func (rpc *ResetPasswordController) Get() { resetUuid := rpc.GetString("reset_uuid") if resetUuid == "" { beego.Error("Reset uuid is blank.") - rpc.Redirect("/", 302) + rpc.Redirect("/", http.StatusFound) } queryUser := models.User{ResetUuid: resetUuid} user, err := dao.GetUser(queryUser) if err != nil { beego.Error("Error occurred in GetUser:", err) - rpc.CustomAbort(500, "Internal error.") + rpc.CustomAbort(http.StatusInternalServerError, "Internal error.") } if user != nil { rpc.Data["ResetUuid"] = user.ResetUuid rpc.ForwardTo("page_title_reset_password", "reset-password") } else { - rpc.Redirect("/", 302) + rpc.Redirect("/", http.StatusFound) } } @@ -199,18 +200,18 @@ func (rpc *CommonController) ResetPassword() { resetUuid := rpc.GetString("reset_uuid") if resetUuid == "" { - rpc.CustomAbort(400, "Reset uuid is blank.") + rpc.CustomAbort(http.StatusBadRequest, "Reset uuid is blank.") } queryUser := models.User{ResetUuid: resetUuid} user, err := dao.GetUser(queryUser) if err != nil { beego.Error("Error occurred in GetUser:", err) - rpc.CustomAbort(500, "Internal error.") + rpc.CustomAbort(http.StatusInternalServerError, "Internal error.") } if user == nil { beego.Error("User does not exist") - rpc.CustomAbort(400, "User does not exist") + rpc.CustomAbort(http.StatusBadRequest, "User does not exist") } password := rpc.GetString("password") @@ -220,9 +221,9 @@ func (rpc *CommonController) ResetPassword() { err = dao.ResetUserPassword(*user) if err != nil { beego.Error("Error occurred in ResetUserPassword:", err) - rpc.CustomAbort(500, "Internal error.") + rpc.CustomAbort(http.StatusInternalServerError, "Internal error.") } } else { - rpc.CustomAbort(400, "password_is_required") + rpc.CustomAbort(http.StatusBadRequest, "password_is_required") } } diff --git a/controllers/register.go b/controllers/register.go index 244770419..7f8553ae5 100644 --- a/controllers/register.go +++ b/controllers/register.go @@ -15,6 +15,7 @@ package controllers import ( + "net/http" "os" "strings" @@ -33,7 +34,7 @@ func (rc *RegisterController) Get() { if authMode == "" || authMode == "db_auth" { rc.ForwardTo("page_title_registration", "register") } else { - rc.Redirect("/signIn", 404) + rc.Redirect("/signIn", http.StatusNotFound) } } @@ -49,7 +50,7 @@ func (rc *CommonController) SignUp() { _, err := dao.Register(user) if err != nil { beego.Error("Error occurred in Register:", err) - rc.CustomAbort(500, "Internal error.") + rc.CustomAbort(http.StatusInternalServerError, "Internal error.") } } @@ -68,7 +69,7 @@ func (rc *CommonController) UserExists() { exist, err := dao.UserExists(user, target) if err != nil { beego.Error("Error occurred in UserExists:", err) - rc.CustomAbort(500, "Internal error.") + rc.CustomAbort(http.StatusInternalServerError, "Internal error.") } rc.Data["json"] = exist rc.ServeJSON() diff --git a/service/auth.go b/service/auth.go index f405ee9ce..bfa3dfd68 100644 --- a/service/auth.go +++ b/service/auth.go @@ -16,6 +16,7 @@ package service import ( "log" + "net/http" "github.com/vmware/harbor/models" "github.com/vmware/harbor/opt_auth" @@ -46,7 +47,7 @@ func (a *AuthController) Auth() { if len(scope) == 0 && !authenticated { log.Printf("login request with invalid credentials") - a.CustomAbort(401, "") + a.CustomAbort(http.StatusUnauthorized, "") } access := svc_utils.GetResourceActions(scope) for _, a := range access { @@ -61,7 +62,7 @@ func (a *AuthController) serveToken(username, service string, access []*token.Re rawToken, err := svc_utils.MakeToken(username, service, access) if err != nil { log.Printf("Failed to make token, error: %v", err) - writer.WriteHeader(500) + writer.WriteHeader(http.StatusInternalServerError) return } tk := make(map[string]string) diff --git a/service/utils/registry_utils.go b/service/utils/registry_utils.go index 8c8892d5b..aa5def9e6 100644 --- a/service/utils/registry_utils.go +++ b/service/utils/registry_utils.go @@ -50,9 +50,9 @@ func RegistryApiGet(url, username string) ([]byte, error) { return nil, err } defer response.Body.Close() - if response.StatusCode == 200 { + if response.StatusCode == http.StatusOK { return result, nil - } else if response.StatusCode == 401 { + } else if response.StatusCode == http.StatusUnauthorized { authenticate := response.Header.Get("WWW-Authenticate") str := strings.Split(authenticate, " ")[1] log.Println("url: " + url) @@ -94,7 +94,7 @@ func RegistryApiGet(url, username string) ([]byte, error) { if err != nil { return nil, err } - if response.StatusCode != 200 { + if response.StatusCode != http.StatusOK { errMsg := fmt.Sprintf("Unexpected return code from registry: %d", response.StatusCode) log.Printf(errMsg) return nil, fmt.Errorf(errMsg) diff --git a/utils/registry_utils.go b/utils/registry_utils.go index 22e1fe455..13f989a2e 100644 --- a/utils/registry_utils.go +++ b/utils/registry_utils.go @@ -55,9 +55,9 @@ func HttpGet(url, sessionId, username, password string) ([]byte, error) { return nil, err } defer response.Body.Close() - if response.StatusCode == 200 { + if response.StatusCode == http.StatusOK { return result, nil - } else if response.StatusCode == 401 { + } else if response.StatusCode == http.StatusUnauthorized { authenticate := response.Header.Get("WWW-Authenticate") str := strings.Split(authenticate, " ")[1] beego.Trace("url: " + url) @@ -106,7 +106,7 @@ func HttpGet(url, sessionId, username, password string) ([]byte, error) { if err != nil { return nil, err } - if response.StatusCode == 200 { + if response.StatusCode == http.StatusOK { tt := make(map[string]string) json.Unmarshal(result, &tt) request, err = http.NewRequest("GET", url, nil) From 9660645fe250750efa4158c89850bb087eee9e23 Mon Sep 17 00:00:00 2001 From: Tan Jiang Date: Wed, 24 Feb 2016 18:16:16 +0800 Subject: [PATCH 2/2] improve test coverage --- api/project_member.go | 5 +- api/repository.go | 3 +- controllers/item_detail.go | 6 +- {tests => dao}/dao_test.go | 199 +++++++++++++++++++++++++++++-------- dao/item_detail.go | 7 +- dao/project.go | 9 +- 6 files changed, 167 insertions(+), 62 deletions(-) rename {tests => dao}/dao_test.go (68%) diff --git a/api/project_member.go b/api/project_member.go index 37185ad31..e20d020ef 100644 --- a/api/project_member.go +++ b/api/project_member.go @@ -44,7 +44,7 @@ func (pma *ProjectMemberAPI) Prepare() { pma.CustomAbort(http.StatusBadRequest, "invalid project Id") return } - p, err := dao.GetProjectById(models.Project{ProjectId: pid}) + p, err := dao.GetProjectById(pid) if err != nil { beego.Error("Error occurred in GetProjectById:", err) pma.CustomAbort(http.StatusInternalServerError, "Internal error.") @@ -79,10 +79,9 @@ func (pma *ProjectMemberAPI) Get() { return } if pma.memberId == 0 { //member id not set return list of the members - queryProject := models.Project{ProjectId: pid} username := pma.GetString("username") queryUser := models.User{Username: "%" + username + "%"} - userList, err := dao.GetUserByProject(queryProject, queryUser) + userList, err := dao.GetUserByProject(pid, queryUser) if err != nil { beego.Error("Failed to query database for member list, error:", err) pma.RenderError(http.StatusInternalServerError, "Internal Server Error") diff --git a/api/repository.go b/api/repository.go index 918724638..7887647a9 100644 --- a/api/repository.go +++ b/api/repository.go @@ -60,8 +60,7 @@ func (ra *RepositoryAPI) Get() { ra.RenderError(http.StatusBadRequest, "Invalid project id") return } - projectQuery := models.Project{ProjectId: projectId} - p, err := dao.GetProjectById(projectQuery) + p, err := dao.GetProjectById(projectId) if err != nil { beego.Error("Error occurred in GetProjectById:", err) ra.CustomAbort(http.StatusInternalServerError, "Internal error.") diff --git a/controllers/item_detail.go b/controllers/item_detail.go index 34761fce4..bb056bff6 100644 --- a/controllers/item_detail.go +++ b/controllers/item_detail.go @@ -51,8 +51,7 @@ func CheckProjectRole(userId int, projectId int64) bool { } func CheckPublicProject(projectId int64) bool { - projectQuery := models.Project{ProjectId: projectId} - project, err := dao.GetProjectById(projectQuery) + project, err := dao.GetProjectById(projectId) if err != nil { beego.Error("Error occurred in GetProjectById:", err) return false @@ -72,8 +71,7 @@ func (idc *ItemDetailController) Get() { idc.Redirect("/signIn?uri="+url.QueryEscape(idc.Ctx.Input.URI()), http.StatusFound) } - projectQuery := models.Project{ProjectId: projectId} - project, err := dao.GetProjectById(projectQuery) + project, err := dao.GetProjectById(projectId) if err != nil { beego.Error("Error occurred in GetProjectById:", err) diff --git a/tests/dao_test.go b/dao/dao_test.go similarity index 68% rename from tests/dao_test.go rename to dao/dao_test.go index 0179da876..8d08903ac 100644 --- a/tests/dao_test.go +++ b/dao/dao_test.go @@ -12,7 +12,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package test +package dao import ( "fmt" @@ -22,7 +22,6 @@ import ( "testing" "time" - "github.com/vmware/harbor/dao" "github.com/vmware/harbor/models" "github.com/astaxie/beego/orm" @@ -120,7 +119,7 @@ func TestMain(m *testing.M) { os.Setenv("MYSQL_USR", dbUser) os.Setenv("MYSQL_PWD", dbPassword) os.Setenv("AUTH_MODE", "db_auth") - dao.InitDB() + InitDB() clearUp(USERNAME) os.Exit(m.Run()) @@ -136,7 +135,7 @@ func TestRegister(t *testing.T) { Comment: "register", } - _, err := dao.Register(user) + _, err := Register(user) if err != nil { t.Errorf("Error occurred in Register: %v", err) } @@ -145,7 +144,7 @@ func TestRegister(t *testing.T) { queryUser := models.User{ Username: USERNAME, } - newUser, err := dao.GetUser(queryUser) + newUser, err := GetUser(queryUser) if err != nil { t.Errorf("Error occurred in GetUser: %v", err) } @@ -162,14 +161,14 @@ func TestUserExists(t *testing.T) { var exists bool var err error - exists, err = dao.UserExists(models.User{Username: USERNAME}, "username") + exists, err = UserExists(models.User{Username: USERNAME}, "username") if err != nil { t.Errorf("Error occurred in UserExists: %v", err) } if !exists { t.Errorf("User %s was inserted but does not exist", USERNAME) } - exists, err = dao.UserExists(models.User{Email: "tester01@vmware.com"}, "email") + exists, err = UserExists(models.User{Email: "tester01@vmware.com"}, "email") if err != nil { t.Errorf("Error occurred in UserExists: %v", err) @@ -177,7 +176,7 @@ func TestUserExists(t *testing.T) { if !exists { t.Errorf("User with email %s inserted but does not exist", "tester01@vmware.com") } - exists, err = dao.UserExists(models.User{Username: "NOTHERE"}, "username") + exists, err = UserExists(models.User{Username: "NOTHERE"}, "username") if err != nil { t.Errorf("Error occurred in UserExists: %v", err) } @@ -193,7 +192,7 @@ func TestLoginByUserName(t *testing.T) { Password: "Abc12345", } - loginUser, err := dao.LoginByDb(models.AuthModel{userQuery.Username, userQuery.Password}) + loginUser, err := LoginByDb(models.AuthModel{userQuery.Username, userQuery.Password}) if err != nil { t.Errorf("Error occurred in LoginByDb: %v", err) } @@ -213,7 +212,7 @@ func TestLoginByEmail(t *testing.T) { Password: "Abc12345", } - loginUser, err := dao.LoginByDb(models.AuthModel{userQuery.Email, userQuery.Password}) + loginUser, err := LoginByDb(models.AuthModel{userQuery.Email, userQuery.Password}) if err != nil { t.Errorf("Error occurred in LoginByDb: %v", err) } @@ -232,7 +231,7 @@ func TestGetUser(t *testing.T) { Username: USERNAME, } var err error - currentUser, err = dao.GetUser(queryUser) + currentUser, err = GetUser(queryUser) if err != nil { t.Errorf("Error occurred in GetUser: %v", err) } @@ -245,14 +244,14 @@ func TestGetUser(t *testing.T) { } func TestListUsers(t *testing.T) { - users, err := dao.ListUsers(models.User{}) + users, err := ListUsers(models.User{}) if err != nil { t.Errorf("Error occurred in ListUsers: %v", err) } if len(users) != 1 { t.Errorf("Expect one user in list, but the acutal length is %d, the list: %+v", len(users), users) } - users2, err := dao.ListUsers(models.User{Username: USERNAME}) + users2, err := ListUsers(models.User{Username: USERNAME}) if len(users2) != 1 { t.Errorf("Expect one user in list, but the acutal length is %d, the list: %+v", len(users), users) } @@ -262,22 +261,22 @@ func TestListUsers(t *testing.T) { } func TestResetUserPassword(t *testing.T) { - uuid, err := dao.GenerateRandomString() + uuid, err := GenerateRandomString() if err != nil { t.Errorf("Error occurred in GenerateRandomString: %v", err) } - err = dao.UpdateUserResetUuid(models.User{ResetUuid: uuid, Email: currentUser.Email}) + err = UpdateUserResetUuid(models.User{ResetUuid: uuid, Email: currentUser.Email}) if err != nil { t.Errorf("Error occurred in UpdateUserResetUuid: %v", err) } - err = dao.ResetUserPassword(models.User{UserId: currentUser.UserId, Password: "HarborTester12345", ResetUuid: uuid, Salt: currentUser.Salt}) + err = ResetUserPassword(models.User{UserId: currentUser.UserId, Password: "HarborTester12345", ResetUuid: uuid, Salt: currentUser.Salt}) if err != nil { t.Errorf("Error occurred in ResetUserPassword: %v", err) } - loginedUser, err := dao.LoginByDb(models.AuthModel{Principal: currentUser.Username, Password: "HarborTester12345"}) + loginedUser, err := LoginByDb(models.AuthModel{Principal: currentUser.Username, Password: "HarborTester12345"}) if err != nil { t.Errorf("Error occurred in LoginByDb: %v", err) } @@ -288,12 +287,12 @@ func TestResetUserPassword(t *testing.T) { } func TestChangeUserPassword(t *testing.T) { - err := dao.ChangeUserPassword(models.User{UserId: currentUser.UserId, Password: "NewHarborTester12345", Salt: currentUser.Salt}) + err := ChangeUserPassword(models.User{UserId: currentUser.UserId, Password: "NewHarborTester12345", Salt: currentUser.Salt}) if err != nil { t.Errorf("Error occurred in ChangeUserPassword: %v", err) } - loginedUser, err := dao.LoginByDb(models.AuthModel{Principal: currentUser.Username, Password: "NewHarborTester12345"}) + loginedUser, err := LoginByDb(models.AuthModel{Principal: currentUser.Username, Password: "NewHarborTester12345"}) if err != nil { t.Errorf("Error occurred in LoginByDb: %v", err) } @@ -304,11 +303,11 @@ func TestChangeUserPassword(t *testing.T) { } func TestChangeUserPasswordWithOldPassword(t *testing.T) { - err := dao.ChangeUserPassword(models.User{UserId: currentUser.UserId, Password: "NewerHarborTester12345", Salt: currentUser.Salt}, "NewHarborTester12345") + err := ChangeUserPassword(models.User{UserId: currentUser.UserId, Password: "NewerHarborTester12345", Salt: currentUser.Salt}, "NewHarborTester12345") if err != nil { t.Errorf("Error occurred in ChangeUserPassword: %v", err) } - loginedUser, err := dao.LoginByDb(models.AuthModel{Principal: currentUser.Username, Password: "NewerHarborTester12345"}) + loginedUser, err := LoginByDb(models.AuthModel{Principal: currentUser.Username, Password: "NewerHarborTester12345"}) if err != nil { t.Errorf("Error occurred in LoginByDb: %v", err) } @@ -318,11 +317,11 @@ func TestChangeUserPasswordWithOldPassword(t *testing.T) { } func TestChangeUserPasswordWithIncorrectOldPassword(t *testing.T) { - err := dao.ChangeUserPassword(models.User{UserId: currentUser.UserId, Password: "NNewerHarborTester12345", Salt: currentUser.Salt}, "WrongNewerHarborTester12345") + err := ChangeUserPassword(models.User{UserId: currentUser.UserId, Password: "NNewerHarborTester12345", Salt: currentUser.Salt}, "WrongNewerHarborTester12345") if err == nil { t.Errorf("Error does not occurred due to old password is incorrect.") } - loginedUser, err := dao.LoginByDb(models.AuthModel{Principal: currentUser.Username, Password: "NNewerHarborTester12345"}) + loginedUser, err := LoginByDb(models.AuthModel{Principal: currentUser.Username, Password: "NNewerHarborTester12345"}) if err != nil { t.Errorf("Error occurred in LoginByDb: %v", err) } @@ -332,7 +331,7 @@ func TestChangeUserPasswordWithIncorrectOldPassword(t *testing.T) { } func TestQueryRelevantProjectsWhenNoProjectAdded(t *testing.T) { - projects, err := dao.QueryRelevantProjects(currentUser.UserId) + projects, err := QueryRelevantProjects(currentUser.UserId) if err != nil { t.Errorf("Error occurred in QueryRelevantProjects: %v", err) } @@ -353,12 +352,12 @@ func TestAddProject(t *testing.T) { OwnerName: currentUser.Username, } - err := dao.AddProject(project) + err := AddProject(project) if err != nil { t.Errorf("Error occurred in AddProject: %v", err) } - newProject, err := dao.GetProjectByName(PROJECT_NAME) + newProject, err := GetProjectByName(PROJECT_NAME) if err != nil { t.Errorf("Error occurred in GetProjectByName: %v", err) } @@ -371,7 +370,7 @@ var currentProject *models.Project func TestGetProject(t *testing.T) { var err error - currentProject, err = dao.GetProjectByName(PROJECT_NAME) + currentProject, err = GetProjectByName(PROJECT_NAME) if err != nil { t.Errorf("Error occurred in GetProjectByName: %v", err) } @@ -414,7 +413,7 @@ func TestGetAccessLog(t *testing.T) { UserId: currentUser.UserId, ProjectId: currentProject.ProjectId, } - accessLogs, err := dao.GetAccessLogs(queryAccessLog) + accessLogs, err := GetAccessLogs(queryAccessLog) if err != nil { t.Errorf("Error occurred in GetAccessLog: %v", err) } @@ -429,14 +428,14 @@ func TestGetAccessLog(t *testing.T) { func TestProjectExists(t *testing.T) { var exists bool var err error - exists, err = dao.ProjectExists(currentProject.ProjectId) + exists, err = ProjectExists(currentProject.ProjectId) if err != nil { t.Errorf("Error occurred in ProjectExists: %v", err) } if !exists { t.Errorf("The project with id: %d, does not exist", currentProject.ProjectId) } - exists, err = dao.ProjectExists(currentProject.Name) + exists, err = ProjectExists(currentProject.Name) if err != nil { t.Errorf("Error occurred in ProjectExists: %v", err) } @@ -445,25 +444,61 @@ func TestProjectExists(t *testing.T) { } } +func TestGetProjectById(t *testing.T) { + id := currentProject.ProjectId + p, err := GetProjectById(id) + if err != nil { + t.Errorf("Error in GetProjectById: %v, id: %d", err, id) + } + if p.Name != currentProject.Name { + t.Errorf("project name does not match, expected: %s, actual: %s", currentProject.Name, p.Name) + } +} + +func TestGetUserByProject(t *testing.T) { + pid := currentProject.ProjectId + u1 := models.User{ + Username: "%%Tester%%", + } + u2 := models.User{ + Username: "nononono", + } + users, err := GetUserByProject(pid, u1) + if err != nil { + t.Errorf("Error happened in GetUserByProject: %v, project Id: %d, user: %+v", u1) + } + if len(users) != 1 { + t.Errorf("unexpected length of user list, expected: 1, the users list: %+v", users) + } + users, err = GetUserByProject(pid, u2) + if err != nil { + t.Errorf("Error happened in GetUserByProject: %v, project Id: %d, user: %+v", u2) + } + if len(users) != 0 { + t.Errorf("unexpected length of user list, expected: 0, the users list: %+v", users) + } + +} + func TestToggleProjectPublicity(t *testing.T) { - err := dao.ToggleProjectPublicity(currentProject.ProjectId, PUBLICITY_ON) + err := ToggleProjectPublicity(currentProject.ProjectId, PUBLICITY_ON) if err != nil { t.Errorf("Error occurred in ToggleProjectPublicity: %v", err) } - currentProject, err = dao.GetProjectByName(PROJECT_NAME) + currentProject, err = GetProjectByName(PROJECT_NAME) if err != nil { t.Errorf("Error occurred in GetProjectByName: %v", err) } if currentProject.Public != PUBLICITY_ON { t.Errorf("project, id: %d, its publicity is not on", currentProject.ProjectId) } - err = dao.ToggleProjectPublicity(currentProject.ProjectId, PUBLICITY_OFF) + err = ToggleProjectPublicity(currentProject.ProjectId, PUBLICITY_OFF) if err != nil { t.Errorf("Error occurred in ToggleProjectPublicity: %v", err) } - currentProject, err = dao.GetProjectByName(PROJECT_NAME) + currentProject, err = GetProjectByName(PROJECT_NAME) if err != nil { t.Errorf("Error occurred in GetProjectByName: %v", err) } @@ -471,6 +506,47 @@ func TestToggleProjectPublicity(t *testing.T) { if currentProject.Public != PUBLICITY_OFF { t.Errorf("project, id: %d, its publicity is not off", currentProject.ProjectId) } + +} + +func TestIsProjectPublic(t *testing.T) { + + if isPublic := IsProjectPublic(PROJECT_NAME); isPublic { + t.Errorf("project, id: %d, its publicity is not false after turning off", currentProject.ProjectId) + } +} + +func TestQueryProject(t *testing.T) { + query1 := models.Project{ + UserId: 1, + } + projects, err := QueryProject(query1) + if err != nil { + t.Errorf("Error in Query Project: %v, query: %+v", err, query1) + } + if len(projects) != 2 { + t.Errorf("Expecting get 2 projects, but actual: %d, the list: %+v", len(projects), projects) + } + query2 := models.Project{ + Public: 1, + } + projects, err = QueryProject(query2) + if err != nil { + t.Errorf("Error in Query Project: %v, query: %+v", err, query2) + } + if len(projects) != 1 { + t.Errorf("Expecting get 1 project, but actual: %d, the list: %+v", len(projects), projects) + } + query3 := models.Project{ + UserId: 9, + } + projects, err = QueryProject(query3) + if err != nil { + t.Errorf("Error in Query Project: %v, query: %+v", err, query3) + } + if len(projects) != 0 { + t.Errorf("Expecting get 0 project, but actual: %d, the list: %+v", len(projects), projects) + } } func getUserProjectRole(projectId int64, userId int) []models.Role { @@ -487,8 +563,12 @@ func getUserProjectRole(projectId int64, userId int) []models.Role { return r } -func TestGetUserProjectRole(t *testing.T) { - r := getUserProjectRole(currentProject.ProjectId, currentUser.UserId) +func TestGetUserProjectRoles(t *testing.T) { + user := *currentUser + r, err := GetUserProjectRoles(user, currentProject.ProjectId) + if err != nil { + t.Errorf("Error happened in GetUserProjectRole: %v, user: %+v, project Id: %d", err, user, currentProject.ProjectId) + } //Get the size of current user project role. if len(r) != 1 { @@ -498,10 +578,20 @@ func TestGetUserProjectRole(t *testing.T) { if r[0].Name != "projectAdmin" { t.Errorf("the expected rolename is: projectAdmin, actual: %s", r[0].Name) } + user.RoleId = 1 + + r, err = GetUserProjectRoles(user, currentProject.ProjectId) + if err != nil { + t.Errorf("Error happened in GetUserProjectRole: %v, user: %+v, project Id: %d", err, user, currentProject.ProjectId) + } + //Get the size of current user project role. + if len(r) != 0 { + t.Errorf("The user, id: %d, should not have role id: 1 in project id: %d, actual role list: %v", currentUser.UserId, currentProject.ProjectId, r) + } } func TestProjectPermission(t *testing.T) { - roleCode, err := dao.GetPermission(currentUser.Username, currentProject.Name) + roleCode, err := GetPermission(currentUser.Username, currentProject.Name) if err != nil { t.Errorf("Error occurred in GetPermission: %v", err) } @@ -511,7 +601,7 @@ func TestProjectPermission(t *testing.T) { } func TestQueryRelevantProjects(t *testing.T) { - projects, err := dao.QueryRelevantProjects(currentUser.UserId) + projects, err := QueryRelevantProjects(currentUser.UserId) if err != nil { t.Errorf("Error occurred in QueryRelevantProjects: %v", err) } @@ -524,7 +614,7 @@ func TestQueryRelevantProjects(t *testing.T) { } func TestAssignUserProjectRole(t *testing.T) { - err := dao.AddUserProjectRole(currentUser.UserId, currentProject.ProjectId, DEVELOPER) + err := AddUserProjectRole(currentUser.UserId, currentProject.ProjectId, DEVELOPER) if err != nil { t.Errorf("Error occurred in AddUserProjectRole: %v", err) } @@ -542,7 +632,7 @@ func TestAssignUserProjectRole(t *testing.T) { } func TestDeleteUserProjectRole(t *testing.T) { - err := dao.DeleteUserProjectRoles(currentUser.UserId, currentProject.ProjectId) + err := DeleteUserProjectRoles(currentUser.UserId, currentProject.ProjectId) if err != nil { t.Errorf("Error occurred in DeleteUserProjectRoles: %v", err) } @@ -554,12 +644,37 @@ func TestDeleteUserProjectRole(t *testing.T) { } } +func TestToggleAdminRole(t *testing.T) { + err := ToggleUserAdminRole(*currentUser) + if err != nil { + t.Errorf("Error in toggle ToggleUserAdmin role: %v, user: %+v", err, currentUser) + } + isAdmin, err := IsAdminRole(currentUser.UserId) + if err != nil { + t.Errorf("Error in IsAdminRole: %v, user id: %d", err, currentUser.UserId) + } + if !isAdmin { + t.Errorf("User is not admin after toggled, user id: %d", currentUser.UserId) + } + err = ToggleUserAdminRole(*currentUser) + if err != nil { + t.Errorf("Error in toggle ToggleUserAdmin role: %v, user: %+v", err, currentUser) + } + isAdmin, err = IsAdminRole(currentUser.UserId) + if err != nil { + t.Errorf("Error in IsAdminRole: %v, user id: %d", err, currentUser.UserId) + } + if isAdmin { + t.Errorf("User is still admin after toggled, user id: %d", currentUser.UserId) + } +} + func TestDeleteUser(t *testing.T) { - err := dao.DeleteUser(currentUser.UserId) + err := DeleteUser(currentUser.UserId) if err != nil { t.Errorf("Error occurred in DeleteUser: %v", err) } - user, err := dao.GetUser(*currentUser) + user, err := GetUser(*currentUser) if err != nil { t.Errorf("Error occurred in GetUser: %v", err) } diff --git a/dao/item_detail.go b/dao/item_detail.go index 17a070471..40d2ed8d9 100644 --- a/dao/item_detail.go +++ b/dao/item_detail.go @@ -20,7 +20,7 @@ import ( "github.com/astaxie/beego/orm" ) -func GetUserByProject(queryProject models.Project, queryUser models.User) ([]models.User, error) { +func GetUserByProject(projectId int64, queryUser models.User) ([]models.User, error) { o := orm.NewOrm() u := []models.User{} sql := `select @@ -35,14 +35,11 @@ func GetUserByProject(queryProject models.Project, queryUser models.User) ([]mod and pr.project_id = ? ` queryParam := make([]interface{}, 1) - queryParam = append(queryParam, queryProject.ProjectId) + queryParam = append(queryParam, projectId) if queryUser.Username != "" { sql += " and u.username like ? " queryParam = append(queryParam, queryUser.Username) - } else if queryUser.RoleId != 0 { - sql += ` and r.role_id <= ? ` - queryParam = append(queryParam, queryUser.RoleId) } sql += ` order by u.user_id ` _, err := o.Raw(sql, queryParam).QueryRows(&u) diff --git a/dao/project.go b/dao/project.go index 6f228e5e6..4e9adc051 100644 --- a/dao/project.go +++ b/dao/project.go @@ -94,6 +94,7 @@ func IsProjectPublic(projectName string) bool { return project.Public == 1 } +//Query the projects based on publicity and user, disregarding the names etc. func QueryProject(query models.Project) ([]models.Project, error) { o := orm.NewOrm() @@ -154,17 +155,13 @@ func ProjectExists(nameOrId interface{}) (bool, error) { } -func GetProjectById(query models.Project) (*models.Project, error) { +func GetProjectById(projectId int64) (*models.Project, error) { o := orm.NewOrm() sql := `select p.project_id, p.name, u.username as owner_name, p.owner_id, p.creation_time, p.public from project p left join user u on p.owner_id = u.user_id where p.deleted = 0 and p.project_id = ?` queryParam := make([]interface{}, 1) - queryParam = append(queryParam, query.ProjectId) - if query.Public != 0 { - sql += " and p.public = ? " - queryParam = append(queryParam, query.Public) - } + queryParam = append(queryParam, projectId) p := []models.Project{} count, err := o.Raw(sql, queryParam).QueryRows(&p)