Compare commits

..

No commits in common. "cdea2dce1cf59019e188ef4210df90de88ffa443" and "9bf00e8dce606d7a40117a50553025ebc22841ad" have entirely different histories.

8 changed files with 173 additions and 264 deletions

View file

@ -40,6 +40,8 @@ type Database interface {
IsSiteAdmin(username string) (bool, error) IsSiteAdmin(username string) (bool, error)
IsProjectManager(username string, projectname string) (bool, error) IsProjectManager(username string, projectname string) (bool, error)
GetTotalTimePerActivity(projectName string) (map[string]int, error) GetTotalTimePerActivity(projectName string) (map[string]int, error)
} }
// This struct is a wrapper type that holds the database connection // This struct is a wrapper type that holds the database connection
@ -61,16 +63,14 @@ var sampleData embed.FS
// TODO: Possibly break these out into separate files bundled with the embed package? // TODO: Possibly break these out into separate files bundled with the embed package?
const userInsert = "INSERT INTO users (username, password) VALUES (?, ?)" const userInsert = "INSERT INTO users (username, password) VALUES (?, ?)"
const projectInsert = "INSERT INTO projects (name, description, owner_user_id) VALUES (?, ?, (SELECT id FROM users WHERE username = ?))" const projectInsert = "INSERT INTO projects (name, description, owner_user_id) SELECT ?, ?, id FROM users WHERE username = ?"
const promoteToAdmin = "INSERT INTO site_admin (admin_id) SELECT id FROM users WHERE username = ?" const promoteToAdmin = "INSERT INTO site_admin (admin_id) SELECT id FROM users WHERE username = ?"
const addWeeklyReport = `WITH UserLookup AS (SELECT id FROM users WHERE username = ?), const addWeeklyReport = `WITH UserLookup AS (SELECT id FROM users WHERE username = ?),
ProjectLookup AS (SELECT id FROM projects WHERE name = ?) 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) 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),?, ?, ?, ?, ?, ?, ?);` VALUES ((SELECT id FROM ProjectLookup), (SELECT id FROM UserLookup),?, ?, ?, ?, ?, ?, ?);`
const addUserToProject = `INSERT OR IGNORE INTO user_roles (user_id, project_id, p_role) const addUserToProject = "INSERT INTO user_roles (user_id, project_id, p_role) VALUES (?, ?, ?)"
VALUES ((SELECT id FROM users WHERE username = ?), const changeUserRole = "UPDATE user_roles SET p_role = ? WHERE user_id = ? AND project_id = ?"
(SELECT id FROM projects WHERE name = ?), ?)`
const changeUserRole = "UPDATE user_roles SET p_role = ? WHERE user_id = (SELECT id FROM users WHERE username = ?) AND project_id = (SELECT id FROM projects WHERE name = ?)"
const getProjectsForUser = `SELECT p.id, p.name, p.description FROM projects p const getProjectsForUser = `SELECT p.id, p.name, p.description FROM projects p
JOIN user_roles ur ON p.id = ur.project_id JOIN user_roles ur ON p.id = ur.project_id
JOIN users u ON ur.user_id = u.id JOIN users u ON ur.user_id = u.id
@ -78,11 +78,6 @@ const getProjectsForUser = `SELECT p.id, p.name, p.description FROM projects p
const deleteProject = `DELETE FROM projects const deleteProject = `DELETE FROM projects
WHERE id = ? AND owner_username = ?` WHERE id = ? AND owner_username = ?`
const isProjectManagerQuery = `SELECT COUNT(*) > 0 FROM user_roles
JOIN users ON user_roles.user_id = users.id
JOIN projects ON user_roles.project_id = projects.id
WHERE users.username = ? AND projects.name = ? AND user_roles.p_role = 'project_manager'`
// DbConnect connects to the database // DbConnect connects to the database
func DbConnect(dbpath string) Database { func DbConnect(dbpath string) Database {
// Open the database // Open the database
@ -140,15 +135,41 @@ func (d *Db) AddWeeklyReport(projectName string, userName string, week int, deve
// AddUserToProject adds a user to a project with a specified role. // AddUserToProject adds a user to a project with a specified role.
func (d *Db) AddUserToProject(username string, projectname string, role string) error { func (d *Db) AddUserToProject(username string, projectname string, role string) error {
_, err := d.Exec(addUserToProject, username, projectname, role) var userid int
return err userid, err := d.GetUserId(username)
if err != nil {
panic(err)
}
var projectid int
projectid, err2 := d.GetProjectId(projectname)
if err2 != nil {
panic(err2)
}
_, err3 := d.Exec(addUserToProject, userid, projectid, role)
return err3
} }
// ChangeUserRole changes the role of a user within a project. // ChangeUserRole changes the role of a user within a project.
func (d *Db) ChangeUserRole(username string, projectname string, role string) error { func (d *Db) ChangeUserRole(username string, projectname string, role string) error {
// Get the user ID
var userid int
userid, err := d.GetUserId(username)
if err != nil {
panic(err)
}
// Get the project ID
var projectid int
projectid, err2 := d.GetProjectId(projectname)
if err2 != nil {
panic(err2)
}
// Execute the SQL query to change the user's role // Execute the SQL query to change the user's role
_, err := d.Exec(changeUserRole, role, username, projectname) _, err3 := d.Exec(changeUserRole, role, userid, projectid)
return err return err3
} }
// ChangeUserName changes the username of a user. // ChangeUserName changes the username of a user.
@ -197,7 +218,6 @@ func (d *Db) GetProjectId(projectname string) (int, error) {
// Creates a new project in the database, associated with a user // Creates a new project in the database, associated with a user
func (d *Db) AddProject(name string, description string, username string) error { func (d *Db) AddProject(name string, description string, username string) error {
tx := d.MustBegin() tx := d.MustBegin()
// Insert the project into the database
_, err := tx.Exec(projectInsert, name, description, username) _, err := tx.Exec(projectInsert, name, description, username)
if err != nil { if err != nil {
if err := tx.Rollback(); err != nil { if err := tx.Rollback(); err != nil {
@ -205,9 +225,7 @@ func (d *Db) AddProject(name string, description string, username string) error
} }
return err return err
} }
_, err = tx.Exec(changeUserRole, "project_manager", username, name)
// Add creator to project as project manager
_, err = tx.Exec(addUserToProject, username, name, "project_manager")
if err != nil { if err != nil {
if err := tx.Rollback(); err != nil { if err := tx.Rollback(); err != nil {
return err return err
@ -447,9 +465,23 @@ func (d *Db) GetWeeklyReportsUser(username string, projectName string) ([]types.
// IsProjectManager checks if a given username is a project manager for the specified project // IsProjectManager checks if a given username is a project manager for the specified project
func (d *Db) IsProjectManager(username string, projectname string) (bool, error) { func (d *Db) IsProjectManager(username string, projectname string) (bool, error) {
var manager bool // Define the SQL query to check if the user is a project manager for the project
err := d.Get(&manager, isProjectManagerQuery, username, projectname) query := `
return manager, err SELECT COUNT(*) FROM user_roles
JOIN users ON user_roles.user_id = users.id
JOIN projects ON user_roles.project_id = projects.id
WHERE users.username = ? AND projects.name = ? AND user_roles.p_role = 'project_manager'
`
// Execute the query
var count int
err := d.Get(&count, query, username, projectname)
if err != nil {
return false, err
}
// If count is greater than 0, the user is a project manager for the project
return count > 0, nil
} }
// MigrateSampleData applies sample data to the database. // MigrateSampleData applies sample data to the database.

View file

@ -1,6 +1,7 @@
package database package database
import ( import (
"fmt"
"testing" "testing"
) )
@ -16,61 +17,12 @@ func setupState() (Database, error) {
return db, nil return db, nil
} }
// This is a more advanced setup that includes more data in the database.
// This is useful for more complex testing scenarios.
func setupAdvancedState() (Database, error) {
db, err := setupState()
if err != nil {
return nil, err
}
// Add a user
if err = db.AddUser("demouser", "password"); err != nil {
return nil, err
}
// Add a project
if err = db.AddProject("projecttest", "description", "demouser"); err != nil {
return nil, err
}
// Add a weekly report
if err = db.AddWeeklyReport("projecttest", "demouser", 1, 1, 1, 1, 1, 1, 1); err != nil {
return nil, err
}
return db, nil
}
// TestDbConnect tests the connection to the database // TestDbConnect tests the connection to the database
func TestDbConnect(t *testing.T) { func TestDbConnect(t *testing.T) {
db := DbConnect(":memory:") db := DbConnect(":memory:")
_ = db _ = db
} }
func TestSetupAdvancedState(t *testing.T) {
db, err := setupAdvancedState()
if err != nil {
t.Error("setupAdvancedState failed:", err)
}
// Check if the user was added
if _, err = db.GetUserId("demouser"); err != nil {
t.Error("GetUserId failed:", err)
}
// Check if the project was added
projects, err := db.GetAllProjects()
if err != nil {
t.Error("GetAllProjects failed:", err)
}
if len(projects) != 1 {
t.Error("GetAllProjects failed: expected 1, got", len(projects))
}
// To be continued...
}
// TestDbAddUser tests the AddUser function of the database // TestDbAddUser tests the AddUser function of the database
func TestDbAddUser(t *testing.T) { func TestDbAddUser(t *testing.T) {
db, err := setupState() db, err := setupState()
@ -106,12 +58,12 @@ func TestDbGetUserId(t *testing.T) {
// TestDbAddProject tests the AddProject function of the database // TestDbAddProject tests the AddProject function of the database
func TestDbAddProject(t *testing.T) { func TestDbAddProject(t *testing.T) {
db, err := setupAdvancedState() db, err := setupState()
if err != nil { if err != nil {
t.Error("setupState failed:", err) t.Error("setupState failed:", err)
} }
err = db.AddProject("test", "description", "demouser") err = db.AddProject("test", "description", "test")
if err != nil { if err != nil {
t.Error("AddProject failed:", err) t.Error("AddProject failed:", err)
} }
@ -216,15 +168,20 @@ func TestChangeUserRole(t *testing.T) {
t.Error("AddProject failed:", err) t.Error("AddProject failed:", err)
} }
err = db.AddUserToProject("testuser", "testproject", "user")
if err != nil {
t.Error("AddUserToProject failed:", err)
}
role, err := db.GetUserRole("testuser", "testproject") role, err := db.GetUserRole("testuser", "testproject")
if err != nil { if err != nil {
t.Error("GetUserRole failed:", err) t.Error("GetUserRole failed:", err)
} }
if role != "project_manager" { if role != "user" {
t.Error("GetUserRole failed: expected project_manager, got", role) t.Error("GetUserRole failed: expected user, got", role)
} }
err = db.ChangeUserRole("testuser", "testproject", "member") err = db.ChangeUserRole("testuser", "testproject", "admin")
if err != nil { if err != nil {
t.Error("ChangeUserRole failed:", err) t.Error("ChangeUserRole failed:", err)
} }
@ -233,8 +190,8 @@ func TestChangeUserRole(t *testing.T) {
if err != nil { if err != nil {
t.Error("GetUserRole failed:", err) t.Error("GetUserRole failed:", err)
} }
if role != "member" { if role != "admin" {
t.Error("GetUserRole failed: expected member, got", role) t.Error("GetUserRole failed: expected admin, got", role)
} }
} }
@ -523,6 +480,7 @@ func TestSignWeeklyReport(t *testing.T) {
if err != nil { if err != nil {
t.Error("GetUserId failed:", err) t.Error("GetUserId failed:", err)
} }
fmt.Println("Project Manager's ID:", projectManagerID)
// Sign the report with the project manager // Sign the report with the project manager
err = db.SignWeeklyReport(report.ReportId, projectManagerID) err = db.SignWeeklyReport(report.ReportId, projectManagerID)
@ -561,7 +519,7 @@ func TestSignWeeklyReportByAnotherProjectManager(t *testing.T) {
t.Error("AddUser failed:", err) t.Error("AddUser failed:", err)
} }
// Add project, projectManager is the owner // Add project
err = db.AddProject("testproject", "description", "projectManager") err = db.AddProject("testproject", "description", "projectManager")
if err != nil { if err != nil {
t.Error("AddProject failed:", err) t.Error("AddProject failed:", err)
@ -585,25 +543,14 @@ func TestSignWeeklyReportByAnotherProjectManager(t *testing.T) {
t.Error("GetWeeklyReport failed:", err) t.Error("GetWeeklyReport failed:", err)
} }
managerID, err := db.GetUserId("projectManager") anotherManagerID, err := db.GetUserId("projectManager")
if err != nil { if err != nil {
t.Error("GetUserId failed:", err) t.Error("GetUserId failed:", err)
} }
err = db.SignWeeklyReport(report.ReportId, managerID) err = db.SignWeeklyReport(report.ReportId, anotherManagerID)
if err != nil { if err == nil {
t.Error("SignWeeklyReport failed:", err) t.Error("Expected SignWeeklyReport to fail with a project manager who is not in the project, but it didn't")
}
// Retrieve the report again to check if it's signed
signedReport, err := db.GetWeeklyReport("testuser", "testproject", 1)
if err != nil {
t.Error("GetWeeklyReport failed:", err)
}
// Ensure the report is signed by the project manager
if *signedReport.SignedBy != managerID {
t.Errorf("Expected SignedBy to be %d, got %d", managerID, *signedReport.SignedBy)
} }
} }
@ -768,12 +715,6 @@ func TestEnsureManagerOfCreatedProject(t *testing.T) {
t.Error("AddProject failed:", err) t.Error("AddProject failed:", err)
} }
// Set user to a project manager
// err = db.AddUserToProject("testuser", "testproject", "project_manager")
// if err != nil {
// t.Error("AddUserToProject failed:", err)
// }
managerState, err := db.IsProjectManager("testuser", "testproject") managerState, err := db.IsProjectManager("testuser", "testproject")
if err != nil { if err != nil {
t.Error("IsProjectManager failed:", err) t.Error("IsProjectManager failed:", err)

View file

@ -65,8 +65,8 @@ func (gs *GState) ProjectRoleChange(c *fiber.Ctx) error {
//check token and get username of current user //check token and get username of current user
user := c.Locals("user").(*jwt.Token) user := c.Locals("user").(*jwt.Token)
claims := user.Claims.(jwt.MapClaims) claims := user.Claims.(jwt.MapClaims)
username := claims["name"].(string) projectManagerUsername := claims["name"].(string)
log.Info(projectManagerUsername)
// Extract the necessary parameters from the request // Extract the necessary parameters from the request
data := new(types.RoleChange) data := new(types.RoleChange)
if err := c.BodyParser(data); err != nil { if err := c.BodyParser(data); err != nil {
@ -74,19 +74,18 @@ func (gs *GState) ProjectRoleChange(c *fiber.Ctx) error {
return c.Status(400).SendString(err.Error()) return c.Status(400).SendString(err.Error())
} }
log.Info("Changing role for user: ", username, " in project: ", data.Projectname, " to: ", data.Role) // dubble diping and checcking if current user is
// Dubble diping and checcking if current user is if ismanager, err := gs.Db.IsProjectManager(projectManagerUsername, data.Projectname); err != nil {
if ismanager, err := gs.Db.IsProjectManager(username, data.Projectname); err != nil {
log.Warn("Error checking if projectmanager:", err) log.Warn("Error checking if projectmanager:", err)
return c.Status(500).SendString(err.Error()) return c.Status(500).SendString(err.Error())
} else if !ismanager { } else if !ismanager {
log.Warn("User is not projectmanager") log.Warn("tried chaning role when not projectmanager:", err)
return c.Status(401).SendString("User is not projectmanager") return c.Status(401).SendString("you can not change role when not projectManager")
} }
// Change the user's role within the project in the database // Change the user's role within the project in the database
if err := gs.Db.ChangeUserRole(username, data.Projectname, data.Role); err != nil { if err := gs.Db.ChangeUserRole(data.Username, data.Projectname, data.Role); err != nil {
return c.Status(500).SendString(err.Error()) return c.Status(500).SendString(err.Error())
} }
@ -219,9 +218,7 @@ func (gs *GState) IsProjectManagerHandler(c *fiber.Ctx) error {
username := claims["name"].(string) username := claims["name"].(string)
// Extract necessary parameters from the request query string // Extract necessary parameters from the request query string
projectName := c.Params("projectName") projectName := c.Query("projectName")
log.Info("Checking if user ", username, " is a project manager for project ", projectName)
// Check if the user is a project manager for the specified project // Check if the user is a project manager for the specified project
isManager, err := gs.Db.IsProjectManager(username, projectName) isManager, err := gs.Db.IsProjectManager(username, projectName)
@ -231,5 +228,10 @@ func (gs *GState) IsProjectManagerHandler(c *fiber.Ctx) error {
} }
// Return the result as JSON // Return the result as JSON
return c.JSON(fiber.Map{"isProjectManager": isManager}) return c.JSON(map[string]bool{"isProjectManager": isManager})
}
func (gs *GState) CreateTask(c *fiber.Ctx) error {
return nil
} }

View file

@ -14,12 +14,9 @@ type NewProject struct {
Description string `json:"description"` Description string `json:"description"`
} }
// Used to change the role of a user in a project.
// If name is identical to the name contained in the token, the role can be changed.
// If the name is different, only a project manager can change the role.
type RoleChange struct { type RoleChange struct {
UserName string `json:"username"`
Role string `json:"role" tstype:"'project_manager' | 'user'"` Role string `json:"role" tstype:"'project_manager' | 'user'"`
Username string `json:"username"`
Projectname string `json:"projectname"` Projectname string `json:"projectname"`
} }

View file

@ -7,102 +7,52 @@ import {
WeeklyReport, WeeklyReport,
} from "../Types/goTypes"; } from "../Types/goTypes";
/** // This type of pattern should be hard to misuse
* Response object returned by API methods.
*/
export interface APIResponse<T> { export interface APIResponse<T> {
/** Indicates whether the API call was successful */
success: boolean; success: boolean;
/** Optional message providing additional information or error description */
message?: string; message?: string;
/** Optional data returned by the API method */
data?: T; data?: T;
} }
/** // Note that all protected routes also require a token
* Interface defining methods that an instance of the API must implement. // Defines all the methods that an instance of the API must implement
*/
interface API { interface API {
/** /** Register a new user */
* Register a new user
* @param {NewUser} user The user object to be registered
* @returns {Promise<APIResponse<User>>} A promise containing the API response with the user data.
*/
registerUser(user: NewUser): Promise<APIResponse<User>>; registerUser(user: NewUser): Promise<APIResponse<User>>;
/** 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<APIResponse<User>>} A promise containing the API response with the removed user data.
*/
removeUser(username: string, token: string): Promise<APIResponse<User>>; removeUser(username: string, token: string): Promise<APIResponse<User>>;
/** 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<APIResponse<boolean>>} A promise containing the API response indicating if the user is a project manager.
*/
checkIfProjectManager( checkIfProjectManager(
username: string, username: string,
projectName: string, projectName: string,
token: string, token: string,
): Promise<APIResponse<boolean>>; ): Promise<APIResponse<boolean>>;
/** Login */
/** Logs in a user with the provided credentials.
* @param {NewUser} NewUser The user object containing username and password.
* @returns {Promise<APIResponse<string>>} A promise resolving to an API response with a token.
*/
login(NewUser: NewUser): Promise<APIResponse<string>>; login(NewUser: NewUser): Promise<APIResponse<string>>;
/** Renew the token */
/**
* Renew the token
* @param {string} token The current authentication token.
* @returns {Promise<APIResponse<string>>} A promise resolving to an API response with a renewed token.
*/
renewToken(token: string): Promise<APIResponse<string>>; renewToken(token: string): Promise<APIResponse<string>>;
/** Promote user to admin */ /** 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<APIResponse<Project>>} A promise resolving to an API response with the created project.
*/
createProject( createProject(
project: NewProject, project: NewProject,
token: string, token: string,
): Promise<APIResponse<Project>>; ): Promise<APIResponse<Project>>;
/** Submit a weekly report */
/** Submits a weekly report
* @param {NewWeeklyReport} weeklyReport The weekly report object.
* @param {string} token The authentication token.
* @returns {Promise<APIResponse<NewWeeklyReport>>} A promise resolving to an API response with the submitted report.
*/
submitWeeklyReport( submitWeeklyReport(
weeklyReport: NewWeeklyReport, project: NewWeeklyReport,
token: string, token: string,
): Promise<APIResponse<NewWeeklyReport>>; ): Promise<APIResponse<NewWeeklyReport>>;
/**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<APIResponse<WeeklyReport>>} A promise resolving to an API response with the retrieved report.
*/
getWeeklyReport( getWeeklyReport(
username: string, username: string,
projectName: string, projectName: string,
week: string, week: string,
token: string, token: string,
): Promise<APIResponse<WeeklyReport>>; ): Promise<APIResponse<WeeklyReport>>;
/** /**
* Returns all the weekly reports for a user in a particular project * Returns all the weekly reports for a user in a particular project
* The username is derived from the token * The username is derived from the token
*
* @param {string} projectName The name of the project * @param {string} projectName The name of the project
* @param {string} token The token of the user * @param {string} token The token of the user
* @returns {APIResponse<WeeklyReport[]>} A list of weekly reports * @returns {APIResponse<WeeklyReport[]>} A list of weekly reports
@ -111,27 +61,15 @@ interface API {
projectName: string, projectName: string,
token: string, token: string,
): Promise<APIResponse<WeeklyReport[]>>; ): Promise<APIResponse<WeeklyReport[]>>;
/** Gets all the projects of a user*/
/** Gets all the projects of a user
* @param {string} token - The authentication token.
* @returns {Promise<APIResponse<Project[]>>} A promise containing the API response with the user's projects.
*/
getUserProjects(token: string): Promise<APIResponse<Project[]>>; getUserProjects(token: string): Promise<APIResponse<Project[]>>;
/** Gets a project from id*/
/** Gets a project by its id.
* @param {number} id The id of the project to retrieve.
* @returns {Promise<APIResponse<Project>>} A promise resolving to an API response containing the project data.
*/
getProject(id: number): Promise<APIResponse<Project>>; getProject(id: number): Promise<APIResponse<Project>>;
/** Gets a project from id*/
/** Gets a list of all users.
* @param {string} token The authentication token of the requesting user.
* @returns {Promise<APIResponse<string[]>>} A promise resolving to an API response containing the list of users.
*/
getAllUsers(token: string): Promise<APIResponse<string[]>>; getAllUsers(token: string): Promise<APIResponse<string[]>>;
} }
/** An instance of the API */ // Export an instance of the API
export const api: API = { export const api: API = {
async registerUser(user: NewUser): Promise<APIResponse<User>> { async registerUser(user: NewUser): Promise<APIResponse<User>> {
try { try {
@ -398,6 +336,7 @@ export const api: API = {
} }
}, },
// Gets a projet by id, currently untested since we have no javascript-based tests
async getProject(id: number): Promise<APIResponse<Project>> { async getProject(id: number): Promise<APIResponse<Project>> {
try { try {
const response = await fetch(`/api/project/${id}`, { const response = await fetch(`/api/project/${id}`, {
@ -423,6 +362,7 @@ export const api: API = {
} }
}, },
// Gets all users
async getAllUsers(token: string): Promise<APIResponse<string[]>> { async getAllUsers(token: string): Promise<APIResponse<string[]>> {
try { try {
const response = await fetch("/api/users/all", { const response = await fetch("/api/users/all", {

View file

@ -7,7 +7,7 @@ import Button from "./Button";
/** /**
* Tries to add a project to the system * Tries to add a project to the system
* @param {Object} props - Project name and description * @param props - Project name and description
* @returns {boolean} True if created, false if not * @returns {boolean} True if created, false if not
*/ */
function CreateProject(props: { name: string; description: string }): boolean { function CreateProject(props: { name: string; description: string }): boolean {
@ -34,8 +34,8 @@ function CreateProject(props: { name: string; description: string }): boolean {
} }
/** /**
* Provides UI for adding a project to the system. * Tries to add a project to the system
* @returns {JSX.Element} - Returns the component UI for adding a project * @returns {JSX.Element} UI for project adding
*/ */
function AddProject(): JSX.Element { function AddProject(): JSX.Element {
const [name, setName] = useState(""); const [name, setName] = useState("");

View file

@ -7,7 +7,7 @@ import { api } from "../API/API";
/** /**
* Renders a component that displays all the time reports for a specific project. * 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 { function AllTimeReportsInProject(): JSX.Element {
const { projectName } = useParams(); const { projectName } = useParams();

View file

@ -20,8 +20,8 @@ def randomString(len=10):
# Defined once per test run # Defined once per test run
username = "user_" + randomString() username = randomString()
projectName = "project_" + randomString() projectName = randomString()
# The base URL of the API # The base URL of the API
base_url = "http://localhost:8080" base_url = "http://localhost:8080"
@ -45,37 +45,30 @@ getUsersProjectPath = base_url + "/api/getUsersProject"
#ta bort auth i handlern för att få testet att gå igenom #ta bort auth i handlern för att få testet att gå igenom
def test_ProjectRoleChange(): def test_ProjectRoleChange():
dprint("Testing ProjectRoleChange") dprint("Testing ProjectRoleChange")
localUsername = randomString() project_manager = randomString()
localProjectName = randomString() register(project_manager, "project_manager_password")
register(localUsername, "username_password")
token = login(localUsername, "username_password").json()[ token = login(project_manager, "project_manager_password").json()[
"token" "token"
] ]
# Just checking since this test is built somewhat differently than the others
assert token != None, "Login failed"
response = requests.post( response = requests.post(
addProjectPath, addProjectPath,
json={"name": localProjectName, "description": "This is a project"}, json={"name": projectName, "description": "This is a project"},
headers={"Authorization": "Bearer " + token}, headers={"Authorization": "Bearer " + token},
) )
if response.status_code != 200:
print("Add project failed")
response = requests.post( response = requests.post(
ProjectRoleChangePath, ProjectRoleChangePath,
headers={"Authorization": "Bearer " + token}, headers={"Authorization": "Bearer " + token},
json={ json={
"projectName": localProjectName, "username": username,
"role": "project_manager", "projectName": projectName,
"week": 1
}, },
) )
if response.status_code != 200:
print("auth not working, för att man inte kan få tag på pm token atm, för att få igenom det så ta bort auth i handler")
assert response.status_code == 200, "ProjectRoleChange failed" assert response.status_code == 200, "change role successfully"
gprint("test_ProjectRoleChange successful")
def test_get_user_projects(): def test_get_user_projects():
@ -344,28 +337,33 @@ def test_check_if_project_manager():
assert response.status_code == 200, "Check if project manager failed" assert response.status_code == 200, "Check if project manager failed"
gprint("test_check_if_project_manager successful") gprint("test_check_if_project_manager successful")
def test_ensure_manager_of_created_project(): def test_list_all_users_project():
# Create a new user to add to the project # Log in as a user who is a member of the project
newUser = "karen_" + randomString() admin_username = randomString()
newProject = "HR_" + randomString() admin_password = "admin_password2"
register(newUser, "new_user_password") dprint(
token = login(newUser, "new_user_password").json()["token"] "Registering with username: ", admin_username, " and password: ", admin_password
)
# Create a new project
response = requests.post( response = requests.post(
addProjectPath, registerPath, json={"username": admin_username, "password": admin_password}
json={"name": newProject, "description": "This is a project"},
headers={"Authorization": "Bearer " + token},
) )
assert response.status_code == 200, "Add project failed" dprint(response.text)
response = requests.get( # Log in as the admin
checkIfProjectManagerPath + "/" + newProject, admin_token = login(admin_username, admin_password).json()["token"]
headers={"Authorization": "Bearer " + token}, response = requests.post(
promoteToAdminPath,
json={"username": admin_username},
headers={"Authorization": "Bearer " + admin_token},
) )
assert response.status_code == 200, "Check if project manager failed"
assert response.json()["isProjectManager"] == True, "User is not project manager" # Make a request to list all users associated with the project
gprint("test_ensure_admin_of_created_project successful") response = requests.get(
getUsersProjectPath + "/" + projectName,
headers={"Authorization": "Bearer " + admin_token},
)
assert response.status_code == 200, "List all users project failed"
gprint("test_list_all_users_project sucessful")
if __name__ == "__main__": if __name__ == "__main__":
@ -381,5 +379,4 @@ if __name__ == "__main__":
test_get_weekly_reports_user() test_get_weekly_reports_user()
test_check_if_project_manager() test_check_if_project_manager()
test_ProjectRoleChange() test_ProjectRoleChange()
#test_list_all_users_project() test_list_all_users_project()
test_ensure_manager_of_created_project()