From 9ad89d60636ac6091d71b0bf307982becc9b89fe Mon Sep 17 00:00:00 2001 From: dDogge Date: Mon, 18 Mar 2024 16:01:00 +0100 Subject: [PATCH] Handler for SignReport added and corresponding test in testing.pu added --- .../handlers/handlers_report_related.go | 32 +++-- testing.py | 124 +++++++++++++++++- 2 files changed, 141 insertions(+), 15 deletions(-) diff --git a/backend/internal/handlers/handlers_report_related.go b/backend/internal/handlers/handlers_report_related.go index 509bd67..291d068 100644 --- a/backend/internal/handlers/handlers_report_related.go +++ b/backend/internal/handlers/handlers_report_related.go @@ -64,30 +64,42 @@ func (gs *GState) GetWeeklyReport(c *fiber.Ctx) error { return c.JSON(report) } +type ReportId struct { + ReportId int +} + func (gs *GState) SignReport(c *fiber.Ctx) error { + println("Signing report...") // Extract the necessary parameters from the token user := c.Locals("user").(*jwt.Token) claims := user.Claims.(jwt.MapClaims) - managerUsername := claims["name"].(string) + projectManagerUsername := claims["name"].(string) - // Extract the report ID and project manager ID from request parameters - reportID, err := strconv.Atoi(c.Params("reportId")) - if err != nil { - return c.Status(400).SendString("Invalid report ID") + // Extract report ID from the request query parameters + // reportID := c.Query("reportId") + rid := new(ReportId) + if err := c.BodyParser(rid); err != nil { + return err } + println("Signing report for: ", rid.ReportId) + // reportIDInt, err := strconv.Atoi(rid.ReportId) + // println("Signing report for: ", rid.ReportId) + // if err != nil { + // return c.Status(400).SendString("Invalid report ID") + // } - // Call the database function to get the project manager ID - managerID, err := gs.Db.GetUserId(managerUsername) + // Get the project manager's ID + projectManagerID, err := gs.Db.GetUserId(projectManagerUsername) if err != nil { return c.Status(500).SendString("Failed to get project manager ID") } + println("blabla", projectManagerID) // Call the database function to sign the weekly report - err = gs.Db.SignWeeklyReport(reportID, managerID) + err = gs.Db.SignWeeklyReport(rid.ReportId, projectManagerID) if err != nil { - return c.Status(500).SendString("Failed to sign the weekly report: " + err.Error()) + return c.Status(500).SendString(err.Error()) } - // Return success response return c.Status(200).SendString("Weekly report signed successfully") } diff --git a/testing.py b/testing.py index 38d09cc..164c64e 100644 --- a/testing.py +++ b/testing.py @@ -22,6 +22,9 @@ loginPath = base_url + "/api/login" addProjectPath = base_url + "/api/project" submitReportPath = base_url + "/api/submitReport" getWeeklyReportPath = base_url + "/api/getWeeklyReport" +signReportPath = base_url + "/api/signReport" +addUserToProjectPath = base_url + "/api/addUserToProject" +promoteToAdminPath = base_url + "/api/promoteToAdmin" # Posts the username and password to the register endpoint @@ -43,20 +46,20 @@ def login(username: string, password: string): print(response.text) return response - +# Test function to login def test_login(): response = login(username, "always_same") assert response.status_code == 200, "Login failed" print("Login successful") return response.json()["token"] - +# Test function to create a new user def test_create_user(): response = register(username, "always_same") assert response.status_code == 200, "Registration failed" print("Registration successful") - +# Test function to add a project def test_add_project(): loginResponse = login(username, "always_same") token = loginResponse.json()["token"] @@ -69,7 +72,7 @@ def test_add_project(): assert response.status_code == 200, "Add project failed" print("Add project successful") - +# Test function to submit a report def test_submit_report(): token = login(username, "always_same").json()["token"] response = requests.post( @@ -90,6 +93,7 @@ def test_submit_report(): assert response.status_code == 200, "Submit report failed" print("Submit report successful") +# Test function to get a weekly report def test_get_weekly_report(): token = login(username, "always_same").json()["token"] response = requests.get( @@ -99,9 +103,119 @@ def test_get_weekly_report(): ) print(response.text) +# Test function to add a user to a project +def test_add_user_to_project(): + # Log in as a site admin + admin_username = randomString() + admin_password = "admin_password" + print("Registering with username: ", admin_username, " and password: ", admin_password) + response = requests.post( + registerPath, json={"username": admin_username, "password": admin_password} + ) + print(response.text) + + admin_token = login(admin_username, admin_password).json()["token"] + response = requests.post(promoteToAdminPath, json={"username": admin_username}, headers={"Authorization": "Bearer " + admin_token}) + print(response.text) + assert response.status_code == 200, "Promote to site admin failed" + print("Admin promoted to site admin successfully") + + # Create a new user to add to the project + new_user = randomString() + register(new_user, "new_user_password") + + # Add the new user to the project as a member + response = requests.put( + addUserToProjectPath, + json={"projectName": projectName, "username": new_user, "role": "member"}, + headers={"Authorization": "Bearer " + admin_token}, + ) + + print(response.text) + assert response.status_code == 200, "Add user to project failed" + print("Add user to project successful") + +# Test function to sign a report +def test_sign_report(): + # Create a project manager user + project_manager = randomString() + register(project_manager, "project_manager_password") + + # Register an admin + admin_username = randomString() + admin_password = "admin_password2" + print("Registering with username: ", admin_username, " and password: ", admin_password) + response = requests.post( + registerPath, json={"username": admin_username, "password": admin_password} + ) + print(response.text) + + # Log in as the admin + admin_token = login(admin_username, admin_password).json()["token"] + response = requests.post(promoteToAdminPath, json={"username": admin_username}, headers={"Authorization": "Bearer " + admin_token}) + + response = requests.put( + addUserToProjectPath, + json={"projectName": projectName, "username": project_manager, "role": "project_manager"}, + headers={"Authorization": "Bearer " + admin_token}, + ) + assert response.status_code == 200, "Add project manager to project failed" + print("Project manager added to project successfully") + + # Log in as the project manager + project_manager_token = login(project_manager, "project_manager_password").json()["token"] + + # Submit a report for the project + token = login(username, "always_same").json()["token"] + response = requests.post( + submitReportPath, + json={ + "projectName": projectName, + "week": 1, + "developmentTime": 10, + "meetingTime": 5, + "adminTime": 5, + "ownWorkTime": 10, + "studyTime": 10, + "testingTime": 10, + }, + headers={"Authorization": "Bearer " + token}, + ) + assert response.status_code == 200, "Submit report failed" + print("Submit report successful") + + # Retrieve the report ID + response = requests.get( + getWeeklyReportPath, + headers={"Authorization": "Bearer " + token}, + params={"username": username, "projectName": projectName , "week": 1} + ) + print(response.text) + report_id = response.json()["reportId"] + + # Sign the report as the project manager + response = requests.post( + signReportPath, + json={"reportId": report_id}, + headers={"Authorization": "Bearer " + project_manager_token}, + ) + assert response.status_code == 200, "Sign report failed" + print("Sign report successful") + + # Retrieve the report ID again for confirmation + response = requests.get( + getWeeklyReportPath, + headers={"Authorization": "Bearer " + token}, + params={"username": username, "projectName": projectName , "week": 1} + ) + print(response.text) + + if __name__ == "__main__": test_create_user() test_login() test_add_project() test_submit_report() - test_get_weekly_report() \ No newline at end of file + test_get_weekly_report() + test_sign_report() + test_add_user_to_project() \ No newline at end of file