diff --git a/backend/internal/config/config_test.go b/backend/internal/config/config_test.go index cb02a31..e8ddce8 100644 --- a/backend/internal/config/config_test.go +++ b/backend/internal/config/config_test.go @@ -5,8 +5,12 @@ import ( "testing" ) +// TestNewConfig tests the creation of a new configuration object func TestNewConfig(t *testing.T) { + // Arrange c := NewConfig() + + // Act & Assert if c.Port != 8080 { t.Errorf("Expected port to be 8080, got %d", c.Port) } @@ -24,9 +28,15 @@ func TestNewConfig(t *testing.T) { } } +// TestWriteConfig tests the function to write the configuration to a file func TestWriteConfig(t *testing.T) { + // Arrange c := NewConfig() + + //Act err := c.WriteConfigToFile("test.toml") + + // Assert if err != nil { t.Errorf("Expected no error, got %s", err) } @@ -35,14 +45,23 @@ func TestWriteConfig(t *testing.T) { _ = os.Remove("test.toml") } +// TestReadConfig tests the function to read the configuration from a file func TestReadConfig(t *testing.T) { + // Arrange c := NewConfig() + + // Act err := c.WriteConfigToFile("test.toml") + + // Assert if err != nil { t.Errorf("Expected no error, got %s", err) } + // Act c2, err := ReadConfigFromFile("test.toml") + + // Assert if err != nil { t.Errorf("Expected no error, got %s", err) } diff --git a/backend/internal/database/db.go b/backend/internal/database/db.go index 8b0c8c4..3f2d2f7 100644 --- a/backend/internal/database/db.go +++ b/backend/internal/database/db.go @@ -39,6 +39,9 @@ type Database interface { SignWeeklyReport(reportId int, projectManagerId int) error IsSiteAdmin(username string) (bool, error) IsProjectManager(username string, projectname string) (bool, error) + GetTotalTimePerActivity(projectName string) (map[string]int, error) + + } // This struct is a wrapper type that holds the database connection @@ -66,10 +69,8 @@ const addWeeklyReport = `WITH UserLookup AS (SELECT id FROM users WHERE username ProjectLookup AS (SELECT id FROM projects WHERE name = ?) INSERT INTO weekly_reports (project_id, user_id, week, development_time, meeting_time, admin_time, own_work_time, study_time, testing_time) VALUES ((SELECT id FROM ProjectLookup), (SELECT id FROM UserLookup),?, ?, ?, ?, ?, ?, ?);` -const addUserToProject = "INSERT INTO user_roles (user_id, project_id, p_role) VALUES (?, ?, ?)" // WIP +const addUserToProject = "INSERT INTO user_roles (user_id, project_id, p_role) VALUES (?, ?, ?)" const changeUserRole = "UPDATE user_roles SET p_role = ? WHERE user_id = ? AND project_id = ?" -const changeUserName = "UPDATE user SET username = ? WHERE user_id = ?" // WIP - const getProjectsForUser = `SELECT p.id, p.name, p.description FROM projects p JOIN user_roles ur ON p.id = ur.project_id JOIN users u ON ur.user_id = u.id @@ -133,7 +134,7 @@ func (d *Db) AddWeeklyReport(projectName string, userName string, week int, deve } // AddUserToProject adds a user to a project with a specified role. -func (d *Db) AddUserToProject(username string, projectname string, role string) error { // WIP +func (d *Db) AddUserToProject(username string, projectname string, role string) error { var userid int userid, err := d.GetUserId(username) if err != nil { @@ -171,18 +172,11 @@ func (d *Db) ChangeUserRole(username string, projectname string, role string) er return err3 } -// ChangeUserRole changes the role of a user within a project. +// ChangeUserName changes the username of a user. func (d *Db) ChangeUserName(username string, newname string) error { - // Get the user ID - var userid int - userid, err := d.GetUserId(username) - if err != nil { - panic(err) - } - - // Execute the SQL query to change the user's role - _, err2 := d.Exec(changeUserName, username, userid) - return err2 + // Execute the SQL query to update the username + _, err := d.Exec("UPDATE users SET username = ? WHERE username = ?", newname, username) + return err } // GetUserRole retrieves the role of a user within a project. @@ -528,3 +522,41 @@ func (d *Db) MigrateSampleData() error { return nil } + +func (d *Db) GetTotalTimePerActivity(projectName string) (map[string]int, error) { + + query := ` + SELECT development_time, meeting_time, admin_time, own_work_time, study_time, testing_time + FROM weekly_reports + JOIN projects ON weekly_reports.project_id = projects.id + WHERE projects.name = ? + ` + + rows, err := d.DB.Query(query, projectName) + if err != nil { + return nil, err + } + defer rows.Close() + + totalTime := make(map[string]int) + + for rows.Next() { + var developmentTime, meetingTime, adminTime, ownWorkTime, studyTime, testingTime int + if err := rows.Scan(&developmentTime, &meetingTime, &adminTime, &ownWorkTime, &studyTime, &testingTime); err != nil { + return nil, err + } + + totalTime["development"] += developmentTime + totalTime["meeting"] += meetingTime + totalTime["admin"] += adminTime + totalTime["own_work"] += ownWorkTime + totalTime["study"] += studyTime + totalTime["testing"] += testingTime + } + + if err := rows.Err(); err != nil { + return nil, err + } + + return totalTime, nil +} diff --git a/backend/internal/database/db_test.go b/backend/internal/database/db_test.go index 2448e7e..df10abc 100644 --- a/backend/internal/database/db_test.go +++ b/backend/internal/database/db_test.go @@ -7,6 +7,7 @@ import ( // Tests are not guaranteed to be sequential +// setupState initializes a database instance with necessary setup for testing func setupState() (Database, error) { db := DbConnect(":memory:") err := db.Migrate() @@ -16,11 +17,13 @@ func setupState() (Database, error) { return db, nil } +// TestDbConnect tests the connection to the database func TestDbConnect(t *testing.T) { db := DbConnect(":memory:") _ = db } +// TestDbAddUser tests the AddUser function of the database func TestDbAddUser(t *testing.T) { db, err := setupState() if err != nil { @@ -32,6 +35,7 @@ func TestDbAddUser(t *testing.T) { } } +// TestDbGetUserId tests the GetUserID function of the database func TestDbGetUserId(t *testing.T) { db, err := setupState() if err != nil { @@ -52,6 +56,7 @@ func TestDbGetUserId(t *testing.T) { } } +// TestDbAddProject tests the AddProject function of the database func TestDbAddProject(t *testing.T) { db, err := setupState() if err != nil { @@ -64,6 +69,7 @@ func TestDbAddProject(t *testing.T) { } } +// TestDbRemoveUser tests the RemoveUser function of the database func TestDbRemoveUser(t *testing.T) { db, err := setupState() if err != nil { @@ -76,6 +82,7 @@ func TestDbRemoveUser(t *testing.T) { } } +// TestPromoteToAdmin tests the PromoteToAdmin function of the database func TestPromoteToAdmin(t *testing.T) { db, err := setupState() if err != nil { @@ -93,6 +100,7 @@ func TestPromoteToAdmin(t *testing.T) { } } +// TestAddWeeklyReport tests the AddWeeklyReport function of the database func TestAddWeeklyReport(t *testing.T) { db, err := setupState() if err != nil { @@ -115,6 +123,7 @@ func TestAddWeeklyReport(t *testing.T) { } } +// TestAddUserToProject tests the AddUseToProject function of the database func TestAddUserToProject(t *testing.T) { db, err := setupState() if err != nil { @@ -142,6 +151,7 @@ func TestAddUserToProject(t *testing.T) { } } +// TestChangeUserRole tests the ChangeUserRole function of the database func TestChangeUserRole(t *testing.T) { db, err := setupState() if err != nil { @@ -186,6 +196,7 @@ func TestChangeUserRole(t *testing.T) { } +// TestGetAllUsersProject tests the GetAllUsersProject function of the database func TestGetAllUsersProject(t *testing.T) { db, err := setupState() if err != nil { @@ -252,6 +263,7 @@ func TestGetAllUsersProject(t *testing.T) { } } +// TestGetAllUsersApplication tests the GetAllUsersApplicsation function of the database func TestGetAllUsersApplication(t *testing.T) { db, err := setupState() if err != nil { @@ -298,6 +310,7 @@ func TestGetAllUsersApplication(t *testing.T) { } } +// TestGetProjectsForUser tests the GetProjectsForUser function of the database func TestGetProjectsForUser(t *testing.T) { db, err := setupState() if err != nil { @@ -338,6 +351,7 @@ func TestGetProjectsForUser(t *testing.T) { } } +// TestAddProject tests AddProject function of the database func TestAddProject(t *testing.T) { db, err := setupState() if err != nil { @@ -373,6 +387,7 @@ func TestAddProject(t *testing.T) { } } +// TestGetWeeklyReport tests GetWeeklyReport function of the database func TestGetWeeklyReport(t *testing.T) { db, err := setupState() if err != nil { @@ -412,6 +427,7 @@ func TestGetWeeklyReport(t *testing.T) { // Check other fields similarly } +// TestSignWeeklyReport tests SignWeeklyReport function of the database func TestSignWeeklyReport(t *testing.T) { db, err := setupState() if err != nil { @@ -484,6 +500,7 @@ func TestSignWeeklyReport(t *testing.T) { } } +// TestSignWeeklyReportByAnotherProjectManager tests the scenario where a project manager attempts to sign a weekly report for a user who is not assigned to their project func TestSignWeeklyReportByAnotherProjectManager(t *testing.T) { db, err := setupState() if err != nil { @@ -537,6 +554,7 @@ func TestSignWeeklyReportByAnotherProjectManager(t *testing.T) { } } +// TestGetProject tests GetProject function of the database func TestGetProject(t *testing.T) { db, err := setupState() if err != nil { @@ -657,3 +675,52 @@ func TestIsProjectManager(t *testing.T) { t.Error("Expected projectManager to be a project manager, but it's not.") } } + +func TestGetTotalTimePerActivity(t *testing.T) { + // Initialize your test database connection + db, err := setupState() + if err != nil { + t.Error("setupState failed:", err) + } + + // Run the query to get total time per activity + totalTime, err := db.GetTotalTimePerActivity("projecttest") + if err != nil { + t.Error("GetTotalTimePerActivity failed:", err) + } + + // Check if the totalTime map is not nil + if totalTime == nil { + t.Error("Expected non-nil totalTime map, got nil") + } + + // ska lägga till fler assertions +} + +func TestEnsureManagerOfCreatedProject(t *testing.T) { + db, err := setupState() + if err != nil { + t.Error("setupState failed:", err) + } + + // Add a user + err = db.AddUser("testuser", "password") + if err != nil { + t.Error("AddUser failed:", err) + } + + // Add a project + err = db.AddProject("testproject", "description", "testuser") + if err != nil { + t.Error("AddProject failed:", err) + } + + managerState, err := db.IsProjectManager("testuser", "testproject") + if err != nil { + t.Error("IsProjectManager failed:", err) + } + + if !managerState { + t.Error("Expected testuser to be a project manager, but it's not.") + } +} diff --git a/backend/internal/database/sample_data/0010_sample_data.sql b/backend/internal/database/sample_data/0010_sample_data.sql index 4dac91b..800bd11 100644 --- a/backend/internal/database/sample_data/0010_sample_data.sql +++ b/backend/internal/database/sample_data/0010_sample_data.sql @@ -33,3 +33,18 @@ VALUES (3,3,"member"); INSERT OR IGNORE INTO user_roles(user_id,project_id,p_role) VALUES (2,1,"project_manager"); + +INSERT INTO weekly_reports (user_id, project_id, week, development_time, meeting_time, admin_time, own_work_time, study_time, testing_time, signed_by) +VALUES (2, 1, 12, 20, 10, 5, 30, 15, 10, NULL); + +INSERT INTO weekly_reports (user_id, project_id, week, development_time, meeting_time, admin_time, own_work_time, study_time, testing_time, signed_by) +VALUES (3, 1, 12, 20, 10, 5, 30, 15, 10, NULL); + +INSERT INTO weekly_reports (user_id, project_id, week, development_time, meeting_time, admin_time, own_work_time, study_time, testing_time, signed_by) +VALUES (3, 1, 14, 20, 10, 5, 30, 15, 10, NULL); + +INSERT INTO weekly_reports (user_id, project_id, week, development_time, meeting_time, admin_time, own_work_time, study_time, testing_time, signed_by) +VALUES (3, 2, 12, 20, 10, 5, 30, 15, 10, NULL); + +INSERT INTO weekly_reports (user_id, project_id, week, development_time, meeting_time, admin_time, own_work_time, study_time, testing_time, signed_by) +VALUES (3, 3, 12, 20, 10, 5, 30, 15, 10, NULL); diff --git a/backend/internal/handlers/handlers_project_related.go b/backend/internal/handlers/handlers_project_related.go index 7b95c26..99696e7 100644 --- a/backend/internal/handlers/handlers_project_related.go +++ b/backend/internal/handlers/handlers_project_related.go @@ -212,8 +212,12 @@ func (gs *GState) AddUserToProjectHandler(c *fiber.Ctx) error { // IsProjectManagerHandler is a handler that checks if a user is a project manager for a given project func (gs *GState) IsProjectManagerHandler(c *fiber.Ctx) error { + // Get the username from the token + user := c.Locals("user").(*jwt.Token) + claims := user.Claims.(jwt.MapClaims) + username := claims["name"].(string) + // Extract necessary parameters from the request query string - username := c.Query("username") projectName := c.Query("projectName") // Check if the user is a project manager for the specified project diff --git a/backend/internal/handlers/handlers_report_related.go b/backend/internal/handlers/handlers_report_related.go index b745400..47d076d 100644 --- a/backend/internal/handlers/handlers_report_related.go +++ b/backend/internal/handlers/handlers_report_related.go @@ -117,14 +117,22 @@ func (gs *GState) SignReport(c *fiber.Ctx) error { // GetWeeklyReportsUserHandler retrieves all weekly reports for a user in a specific project func (gs *GState) GetWeeklyReportsUserHandler(c *fiber.Ctx) error { - // Extract necessary parameters from the request - username := c.Params("username") + // Extract the necessary parameters from the token + user := c.Locals("user").(*jwt.Token) + claims := user.Claims.(jwt.MapClaims) + username := claims["name"].(string) + + // Extract necessary (path) parameters from the request projectName := c.Params("projectName") + // TODO: Here we need to check whether the user is a member of the project + // If not, we should return an error. On the other hand, if the user not a member, + // the returned list of reports will (should) allways be empty. + // Retrieve weekly reports for the user in the project from the database reports, err := gs.Db.GetWeeklyReportsUser(username, projectName) if err != nil { - log.Info("Error getting weekly reports for user:", err) + log.Error("Error getting weekly reports for user:", username, "in project:", projectName, ":", err) return c.Status(500).SendString(err.Error()) } diff --git a/backend/internal/handlers/handlers_user_related.go b/backend/internal/handlers/handlers_user_related.go index ea511ac..116ce90 100644 --- a/backend/internal/handlers/handlers_user_related.go +++ b/backend/internal/handlers/handlers_user_related.go @@ -256,7 +256,7 @@ func (gs *GState) ChangeUserName(c *fiber.Ctx) error { return c.Status(500).SendString(err.Error()) } else if !ismanager { log.Warn("tried changing name when not projectmanager:", err) - return c.Status(401).SendString("you can not change name when not projectManager") + return c.Status(401).SendString("you can not change name when not projectmanager") } // Change the user's name within the project in the database diff --git a/backend/internal/types/users.go b/backend/internal/types/users.go index d3f2170..88b4f06 100644 --- a/backend/internal/types/users.go +++ b/backend/internal/types/users.go @@ -32,3 +32,8 @@ type PublicUser struct { type Token struct { Token string `json:"token"` } + +type StrNameChange struct { + PrevName string `json:"prevName" db:"prevName"` + NewName string `json:"newName" db:"newName"` +} diff --git a/backend/main.go b/backend/main.go index c5ac0bb..ff6b94e 100644 --- a/backend/main.go +++ b/backend/main.go @@ -97,8 +97,8 @@ func main() { server.Put("/api/changeUserName", gs.ChangeUserName) server.Post("/api/promoteToAdmin", gs.PromoteToAdmin) server.Get("/api/users/all", gs.ListAllUsers) - server.Get("/api/getWeeklyReportsUser", gs.GetWeeklyReportsUserHandler) - server.Get("api/checkIfProjectManager", gs.IsProjectManagerHandler) + server.Get("/api/getWeeklyReportsUser/:projectName", gs.GetWeeklyReportsUserHandler) + server.Get("/api/checkIfProjectManager/:projectName", gs.IsProjectManagerHandler) server.Post("/api/ProjectRoleChange", gs.ProjectRoleChange) server.Get("/api/getUsersProject/:projectName", gs.ListAllUsersProject) diff --git a/frontend/src/API/API.ts b/frontend/src/API/API.ts index f82be5a..47299f3 100644 --- a/frontend/src/API/API.ts +++ b/frontend/src/API/API.ts @@ -7,62 +7,131 @@ import { WeeklyReport, } from "../Types/goTypes"; -// This type of pattern should be hard to misuse +/** + * Response object returned by API methods. + */ export interface APIResponse { + /** Indicates whether the API call was successful */ success: boolean; + /** Optional message providing additional information or error description */ message?: string; + /** Optional data returned by the API method */ data?: T; } -// Note that all protected routes also require a token -// Defines all the methods that an instance of the API must implement +/** + * Interface defining methods that an instance of the API must implement. + */ interface API { - /** Register a new user */ + /** + * Register a new user + * @param {NewUser} user The user object to be registered + * @returns {Promise>} A promise containing the API response with the user data. + */ registerUser(user: NewUser): Promise>; - /** Remove a user */ + + /** + * Removes a user. + * @param {string} username The username of the user to be removed. + * @param {string} token The authentication token. + * @returns {Promise>} A promise containing the API response with the removed user data. + */ removeUser(username: string, token: string): Promise>; - /** Check if user is project manager */ + + /** + * Check if user is project manager. + * @param {string} username The username of the user. + * @param {string} projectName The name of the project. + * @param {string} token The authentication token. + * @returns {Promise>} A promise containing the API response indicating if the user is a project manager. + */ checkIfProjectManager( username: string, projectName: string, token: string, ): Promise>; - /** Login */ + + /** Logs in a user with the provided credentials. + * @param {NewUser} NewUser The user object containing username and password. + * @returns {Promise>} A promise resolving to an API response with a token. + */ login(NewUser: NewUser): Promise>; - /** Renew the token */ + + /** + * Renew the token + * @param {string} token The current authentication token. + * @returns {Promise>} A promise resolving to an API response with a renewed token. + */ renewToken(token: string): Promise>; + /** Promote user to admin */ - /** Create a project */ + + /** Creates a new project. + * @param {NewProject} project The project object containing name and description. + * @param {string} token The authentication token. + * @returns {Promise>} A promise resolving to an API response with the created project. + */ createProject( project: NewProject, token: string, ): Promise>; - /** Submit a weekly report */ + + /** Submits a weekly report + * @param {NewWeeklyReport} weeklyReport The weekly report object. + * @param {string} token The authentication token. + * @returns {Promise>} A promise resolving to an API response with the submitted report. + */ submitWeeklyReport( - project: NewWeeklyReport, + weeklyReport: NewWeeklyReport, token: string, ): Promise>; - /**Gets a weekly report*/ + + /** Gets a weekly report for a specific user, project and week + * @param {string} username The username of the user. + * @param {string} projectName The name of the project. + * @param {string} week The week number. + * @param {string} token The authentication token. + * @returns {Promise>} A promise resolving to an API response with the retrieved report. + */ getWeeklyReport( username: string, projectName: string, week: string, token: string, ): Promise>; + + /** + * Returns all the weekly reports for a user in a particular project + * The username is derived from the token + * @param {string} projectName The name of the project + * @param {string} token The token of the user + * @returns {APIResponse} A list of weekly reports + */ getWeeklyReportsForUser( - username: string, projectName: string, token: string, ): Promise>; - /** Gets all the projects of a user*/ + + /** Gets all the projects of a user + * @param {string} token - The authentication token. + * @returns {Promise>} A promise containing the API response with the user's projects. + */ getUserProjects(token: string): Promise>; - /** Gets a project from id*/ + + /** Gets a project by its id. + * @param {number} id The id of the project to retrieve. + * @returns {Promise>} A promise resolving to an API response containing the project data. + */ getProject(id: number): Promise>; - /** Gets a project from id*/ + + /** Gets a list of all users. + * @param {string} token The authentication token of the requesting user. + * @returns {Promise>} A promise resolving to an API response containing the list of users. + */ getAllUsers(token: string): Promise>; } -// Export an instance of the API +/** An instance of the API */ export const api: API = { async registerUser(user: NewUser): Promise> { try { @@ -277,26 +346,24 @@ export const api: API = { }, async getWeeklyReportsForUser( - username: string, projectName: string, token: string, ): Promise> { try { - const response = await fetch( - `/api/getWeeklyReportsUser?username=${username}&projectName=${projectName}`, - { - method: "GET", - headers: { - "Content-Type": "application/json", - Authorization: "Bearer " + token, - }, + const response = await fetch(`/api/getWeeklyReportsUser/${projectName}`, { + method: "GET", + headers: { + "Content-Type": "application/json", + Authorization: "Bearer " + token, }, - ); + }); if (!response.ok) { return { success: false, - message: "Failed to get weekly reports for project", + message: + "Failed to get weekly reports for project: Response code " + + response.status, }; } else { const data = (await response.json()) as WeeklyReport[]; @@ -305,7 +372,7 @@ export const api: API = { } catch (e) { return { success: false, - message: "fucked again", + message: "Failed to get weekly reports for project, unknown error", }; } }, @@ -331,7 +398,6 @@ export const api: API = { } }, - // Gets a projet by id, currently untested since we have no javascript-based tests async getProject(id: number): Promise> { try { const response = await fetch(`/api/project/${id}`, { @@ -357,7 +423,6 @@ export const api: API = { } }, - // Gets all users async getAllUsers(token: string): Promise> { try { const response = await fetch("/api/users/all", { diff --git a/frontend/src/Components/AddProject.tsx b/frontend/src/Components/AddProject.tsx index 45814e3..f5f4a08 100644 --- a/frontend/src/Components/AddProject.tsx +++ b/frontend/src/Components/AddProject.tsx @@ -7,7 +7,7 @@ import Button from "./Button"; /** * Tries to add a project to the system - * @param props - Project name and description + * @param {Object} props - Project name and description * @returns {boolean} True if created, false if not */ function CreateProject(props: { name: string; description: string }): boolean { @@ -34,8 +34,8 @@ function CreateProject(props: { name: string; description: string }): boolean { } /** - * Tries to add a project to the system - * @returns {JSX.Element} UI for project adding + * Provides UI for adding a project to the system. + * @returns {JSX.Element} - Returns the component UI for adding a project */ function AddProject(): JSX.Element { const [name, setName] = useState(""); diff --git a/frontend/src/Components/AllTimeReportsInProject.tsx b/frontend/src/Components/AllTimeReportsInProject.tsx index e8373a4..14d3af9 100644 --- a/frontend/src/Components/AllTimeReportsInProject.tsx +++ b/frontend/src/Components/AllTimeReportsInProject.tsx @@ -7,7 +7,7 @@ import { api } from "../API/API"; /** * Renders a component that displays all the time reports for a specific project. - * @returns JSX.Element representing the component. + * @returns {JSX.Element} representing the component. */ function AllTimeReportsInProject(): JSX.Element { const { projectName } = useParams(); @@ -16,7 +16,6 @@ function AllTimeReportsInProject(): JSX.Element { const getWeeklyReports = async (): Promise => { const token = localStorage.getItem("accessToken") ?? ""; const response = await api.getWeeklyReportsForUser( - localStorage.getItem("username") ?? "", projectName ?? "", token, ); diff --git a/frontend/src/Types/goTypes.ts b/frontend/src/Types/goTypes.ts index 43bb35f..fabc0c9 100644 --- a/frontend/src/Types/goTypes.ts +++ b/frontend/src/Types/goTypes.ts @@ -40,6 +40,44 @@ export interface NewWeeklyReport { */ testingTime: number /* int */; } +export interface WeeklyReportList { + /** + * The name of the project, as it appears in the database + */ + projectName: string; + /** + * The week number + */ + week: number /* int */; + /** + * Total time spent on development + */ + developmentTime: number /* int */; + /** + * Total time spent in meetings + */ + meetingTime: number /* int */; + /** + * Total time spent on administrative tasks + */ + adminTime: number /* int */; + /** + * Total time spent on personal projects + */ + ownWorkTime: number /* int */; + /** + * Total time spent on studying + */ + studyTime: number /* int */; + /** + * Total time spent on testing + */ + testingTime: number /* int */; + /** + * The project manager who signed it + */ + signedBy?: number /* int */; +} export interface WeeklyReport { /** * The ID of the report @@ -106,6 +144,15 @@ export interface NewProject { name: string; description: string; } +export interface RoleChange { + role: 'project_manager' | 'user'; + username: string; + projectname: string; +} +export interface NameChange { + id: number /* int */; + name: string; +} ////////// // source: users.go @@ -138,3 +185,7 @@ export interface PublicUser { export interface Token { token: string; } +export interface StrNameChange { + prevName: string; + newName: string; +} diff --git a/testing.py b/testing.py index 491419f..568cb87 100644 --- a/testing.py +++ b/testing.py @@ -314,9 +314,8 @@ def test_get_weekly_reports_user(): # Get weekly reports for the user in the project response = requests.get( - getWeeklyReportsUserPath, + getWeeklyReportsUserPath + "/" + projectName, headers={"Authorization": "Bearer " + token}, - params={"username": username, "projectName": projectName}, ) dprint(response.text) @@ -330,9 +329,8 @@ def test_check_if_project_manager(): # Check if the user is a project manager for the project response = requests.get( - checkIfProjectManagerPath, + checkIfProjectManagerPath + "/" + projectName, headers={"Authorization": "Bearer " + token}, - params={"username": username, "projectName": projectName}, ) dprint(response.text)