Skip to content

Commit

Permalink
Merge pull request #137 from bcgov/BVPS-410
Browse files Browse the repository at this point in the history
BVPS-410: UserController.ts test coverage
  • Loading branch information
habibaz authored Nov 24, 2023
2 parents 9669ecb + 05cf248 commit 746f674
Show file tree
Hide file tree
Showing 7 changed files with 398 additions and 53 deletions.
5 changes: 3 additions & 2 deletions src/build/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1021,10 +1021,11 @@ export function RegisterRoutes(app: Router) {

function UserController_getAllUsers(request: any, response: any, next: any) {
const args = {
unauthorizedErrorResponse: {"in":"res","name":"401","required":true,"ref":"unauthorizedError"},
badRequestErrorResponse: {"in":"res","name":"400","required":true,"ref":"badRequestError"},
_unauthorizedErrorResponse: {"in":"res","name":"401","required":true,"ref":"unauthorizedError"},
_badRequestErrorResponse: {"in":"res","name":"400","required":true,"ref":"badRequestError"},
forbiddenErrorResponse: {"in":"res","name":"403","required":true,"ref":"forbiddenError"},
notFoundErrorResponse: {"in":"res","name":"404","required":true,"ref":"notFoundError"},
typeORMErrorResponse: {"in":"res","name":"422","required":true,"ref":"GenericTypeORMErrorType"},
serverErrorResponse: {"in":"res","name":"500","required":true,"ref":"serverErrorType"},
noActiveFoundResponse: {"in":"res","name":"204","required":true,"ref":"noActiveUserFound"},
active: {"in":"query","name":"active","required":true,"ref":"userListQueryParam"},
Expand Down
10 changes: 10 additions & 0 deletions src/build/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -2567,6 +2567,16 @@
}
}
},
"422": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GenericTypeORMErrorType"
}
}
}
},
"500": {
"description": "",
"content": {
Expand Down
2 changes: 1 addition & 1 deletion src/controllers/AccessRequestController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ export class AccessRequestController extends Controller {
} catch (err) {
if (err instanceof TypeORMError) {
logger.warn(
`Encountered TypeORMError in getAuditLogs: ${err.message}`,
`Encountered TypeORMError in getAllRequests: ${err.message}`,
);
return typeORMErrorResponse(422, {
message: err.message,
Expand Down
73 changes: 24 additions & 49 deletions src/controllers/UserController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,16 +57,21 @@ export class UserController extends Controller {
* -- 'Forbidden'
* - 404
* -- 'Not Found'
* - 422
* -- 'Type ORM Error'
* - 500
* -- 'Internal Server Error
* @param active Status of the user
* @returns A list of users based on active status
*/

@Get('')
public async getAllUsers(
@Res() unauthorizedErrorResponse: TsoaResponse<401, unauthorizedError>,
@Res() badRequestErrorResponse: TsoaResponse<400, badRequestError>,
@Res() _unauthorizedErrorResponse: TsoaResponse<401, unauthorizedError>,
@Res() _badRequestErrorResponse: TsoaResponse<400, badRequestError>,
@Res() forbiddenErrorResponse: TsoaResponse<403, forbiddenError>,
@Res() notFoundErrorResponse: TsoaResponse<404, notFoundError>,
@Res() typeORMErrorResponse: TsoaResponse<422, GenericTypeORMErrorType>,
@Res() serverErrorResponse: TsoaResponse<500, serverErrorType>,
@Res()
noActiveFoundResponse: TsoaResponse<204, noActiveUserFound>,
Expand All @@ -75,12 +80,14 @@ export class UserController extends Controller {
): Promise<Array<userList>> {
let results: Array<userList> = [];
let permissions: string[] = [];
let payload = { username: '', permissions: [] };
// checking permissions for this api.
try {
permissions = decodingJWT(req.cookies.token)?.payload.permissions;
payload = decodingJWT(req.cookies.token)?.payload;
permissions = payload.permissions;
if (!permissions.includes('USER_ACCESS')) {
throw new AuthenticationError(
`Permission 'USER_ACCESS' is not available for this user`,
`Permission 'USER_ACCESS' is not available for the user ${payload.username}`,
403,
);
}
Expand Down Expand Up @@ -124,47 +131,21 @@ export class UserController extends Controller {
});
}
results = userList;
} catch (err: any) {
if (err.code === 401) {
logger.warn(
`Encountered 401 unauthorized error in getAllUsers: ${err.message}`,
);
return unauthorizedErrorResponse(401, {
message: err.message,
code: err.code,
});
} else if (err.code === 400) {
logger.warn(
`Encountered 400 bad request error in getAllUsers: ${err.message}`,
);
return badRequestErrorResponse(400, {
message: err.message,
code: err.code,
});
} else if (err.code === 403) {
logger.warn(
`Encountered 403 forbidden error in getAllUsers: ${err.message}`,
);
return forbiddenErrorResponse(403, {
message: err.message,
code: err.code,
});
} else if (err.code === 404) {
} catch (err) {
if (err instanceof TypeORMError) {
logger.warn(
`Encountered 404 not found error in getAllUsers: ${err.message}`,
`Encountered TypeORMError in getAllUsers: ${err.message}`,
);
return notFoundErrorResponse(404, {
return typeORMErrorResponse(422, {
message: err.message,
code: err.code,
});
} else {
} as GenericTypeORMErrorType);
} else if (err instanceof Error) {
logger.warn(
`Encountered 500 unknown Internal Server Error in getAllUsers: ${err.message}`,
);
return serverErrorResponse(500, { message: err.message });
}
}

return results;
}

Expand Down Expand Up @@ -192,7 +173,7 @@ export class UserController extends Controller {
permissions = userInfo?.permissions;
if (!permissions.includes('USER_ACCESS')) {
throw new AuthenticationError(
`Permission 'USER_ACCESS' is not available for this user: ${userInfo?.username}`,
`Permission 'USER_ACCESS' is not available for the user ${userInfo?.username}`,
403,
);
}
Expand Down Expand Up @@ -220,6 +201,11 @@ export class UserController extends Controller {
try {
const userId = { userId: requestBody.userId };
const existingUser = await findUser({}, userId);
if (existingUser.length < 1) {
throw new TypeORMError(
`User with userId ${requestBody.userId} not found in database`,
);
}
const updateFields = {
...(existingUser[0].role !== requestBody.role && {
role: requestBody.role,
Expand Down Expand Up @@ -255,7 +241,6 @@ export class UserController extends Controller {
return serverErrorResponse(500, { message: err.message });
}
}

return;
}

Expand Down Expand Up @@ -284,7 +269,7 @@ export class UserController extends Controller {
permissions = payload.permissions;
if (!permissions.includes('USER_ACCESS')) {
throw new AuthenticationError(
`Permission 'USER_ACCESS' is not available for this user: ${payload.username}`,
`Permission 'USER_ACCESS' is not available for the user ${payload.username}`,
403,
);
}
Expand All @@ -310,15 +295,6 @@ export class UserController extends Controller {
}
// validate inputs

if (
requestBody.deactivationReason === null ||
requestBody.deactivationReason === undefined
) {
const message = 'Must provide deactivation reason for user(s).';
logger.warn(message);
return requiredFieldErrorResponse(422, { message });
}

if (requestBody.userIds.length < 1) {
const message = 'Must provide at least one user id';
logger.warn(message);
Expand Down Expand Up @@ -348,7 +324,6 @@ export class UserController extends Controller {
return serverErrorResponse(500, { message: err.message });
}
}

return;
}
}
1 change: 1 addition & 0 deletions src/routes/users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ userRouter.get('', async (req: Request, res: Response) => {
() => {},
() => {},
() => {},
() => {},
req.params.active as userListQueryParam,
req,
);
Expand Down
65 changes: 64 additions & 1 deletion src/tests/commonResponses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -988,7 +988,7 @@ export const UserDeactivateRequestBody: userDeactivateRequestBody = {
givenNames: ['John'],
lastNames: ['Doe'],
deactivationReason: 'Not allowed access',
userIds: ['123'],
userIds: ['82dc08e5-cbca-40c2-9d35-a4d1407d5f8d'],
};

export const UserUpdateRequestBody: userUpdateRequestBody = {
Expand Down Expand Up @@ -1299,3 +1299,66 @@ export const UpdateAccessRequestBodyNoIds = {
lastNames: ['Smith', 'Smith'],
requestedRoles: ['Admin', 'Admin'],
};

export const UserListSuccess = [
{
userId: '82dc08e5-cbca-40c2-9d35-a4d1407d5f8d',
userGuid: 'A84D1AB221334298956C47A7B623E983',
identityType: 'idir',
role: 'Admin',
organization: 'Bc Service',
email: 'abc@gov.ca',
userName: 'johndoe',
givenName: 'John',
lastName: 'Doe',
isActive: true,
updatedAt: '2023-08-25T15:12:59.764Z',
},
];

export const UserListSuccessDeactivated = [
{
userId: '82dc08e5-cbca-40c2-9d35-a4d1407d5f8d',
userGuid: 'A84D1AB221334298956C47A7B623E983',
identityType: 'idir',
role: 'Admin',
organization: 'Bc Service',
email: 'abc@gov.ca',
userName: 'johndoe',
givenName: 'John',
lastName: 'Doe',
isActive: false,
deactivationReason: 'Invalid user',
updatedAt: '2023-08-25T15:12:59.764Z',
},
];

export const updateUserRequestBody = {
userId: '82dc08e5-cbca-40c2-9d35-a4d1407d5f8d',
role: 'Standard',
organization: 'org',
email: 'abc@example.com',
userName: 'username',
givenName: 'givenName',
lastName: 'string',
};

export const updateUserExistingUser = [
{
userId: '82dc08e5-cbca-40c2-9d35-a4d1407d5f8d',
role: 'Admin',
organization: 'bcd',
email: 'bcd@example.com',
userName: 'username1',
givenName: 'givenName1',
lastName: 'string1',
},
];

export const UserDeactivateRequestBodyNoId = {
emails: ['abc@gov.ca'],
deactivationReason: 'Not allowed access',
givenNames: ['John'],
lastNames: ['Doe'],
userIds: [],
};
Loading

0 comments on commit 746f674

Please sign in to comment.