Skip to content

Commit faad2c5

Browse files
IdanIdan
authored andcommitted
Add: missing integration and type validation tests
Refactor more tests and add type validation to more features * Miss: adding type validation to all properties of register user features
1 parent 5e9392d commit faad2c5

30 files changed

Lines changed: 827 additions & 181 deletions

features/AuthenticateUser/tests/authenticateUser.test.ts

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import {afterAll, describe, expect, test} from '@jest/globals';
1+
import {afterAll, beforeAll, describe, expect, test} from '@jest/globals';
2+
23
import UserAuthenticationOnPostgreSQLDatabase from "../AuthenticateUserMain/database/UserAuthenticationOnPostgreSQLDatabase";
34
import AuthenticateUserController from '../AuthenticateUserController/AuthenticateUserController';
45
import AuthenticateUserRequest from '../AuthenticateUserController/AuthenticateUserRequest';
@@ -10,8 +11,11 @@ import RegisterUserController from '../../RegisterUser/RegisterUserController/Re
1011
import RegisterUserRequest from '../../RegisterUser/RegisterUserController/RegisterUserRequest';
1112
import type RegisterUserResponse from '../../RegisterUser/RegisterUserController/RegisterUserResponse';
1213
import RegisterUserJoiValidation from "../../RegisterUser/RegisterUserMain/validation/RegisterUserJoiValidation";
14+
import RegisterUserTypeValidator from '../../RegisterUser/RegisterUserMain/validation/RegisterUserTypeValidator';
15+
1316
import BadRequestError from '../../../services/errors/BadRequestError';
1417
import UnauthorisedActionError from '../../../services/errors/UnauthorisedActionError';
18+
import TypeValidator from '../../../services/validation/TypeValidator';
1519

1620
afterAll(async() => {
1721
const userAuthenticationOnPostgreSQLDatabase: UserAuthenticationOnPostgreSQLDatabase = await retrieveUserAuthenticationOnPostgreSQLDatabase();
@@ -33,24 +37,27 @@ const retrieveUserRegistrationOnPostgreSQLDatabase = async (): Promise<UserRegis
3337
return userRegistrationOnPostgreSQLDatabase;
3438
}
3539

40+
beforeAll(async() => {
41+
const userRegistrationOnPostgreSQLDatabase: UserRegistrationOnPostgreSQLDatabase = await retrieveUserRegistrationOnPostgreSQLDatabase();
42+
const registerUserJoiValidation: RegisterUserJoiValidation = new RegisterUserJoiValidation();
43+
44+
const registerUserTypeValidator = new RegisterUserTypeValidator(new TypeValidator());
45+
const registerUserRequest: RegisterUserRequest = new RegisterUserRequest(registerUserTypeValidator);
46+
registerUserRequest.setUsername("user")
47+
.setEmail("test@mail.com")
48+
.setPassword("Sdf sdfs sdSDFdfi 1234 !")
49+
.setFirstName("Bob")
50+
.setLastName("Bobby");
51+
52+
const registerUserController: RegisterUserController = new RegisterUserController();
53+
const registerUserResponse: RegisterUserResponse = await registerUserController.handleRegisterUserRequest(registerUserRequest, userRegistrationOnPostgreSQLDatabase, registerUserJoiValidation);
54+
55+
expect(registerUserResponse.userIsRegistered()).toBe(true);
56+
});
57+
3658
describe("test user authentication featured", () => {
3759
test("Can authenticate a registered user", async () => {
38-
const userRegistrationOnPostgreSQLDatabase: UserRegistrationOnPostgreSQLDatabase = await retrieveUserRegistrationOnPostgreSQLDatabase();
39-
const registerUserJoiValidation: RegisterUserJoiValidation = new RegisterUserJoiValidation();
4060
const authenticationUserJoiValidation: AuthenticationUserJoiValidation = new AuthenticationUserJoiValidation();
41-
42-
const registerUserRequest: RegisterUserRequest = new RegisterUserRequest();
43-
registerUserRequest.setUsername("user")
44-
.setEmail("test@mail.com")
45-
.setPassword("Sdf sdfs sdSDFdfi 1234 !")
46-
.setFirstName("Bob")
47-
.setLastName("Bobby");
48-
49-
const registerUserController: RegisterUserController = new RegisterUserController();
50-
const registerUserResponse: RegisterUserResponse = await registerUserController.handleRegisterUserRequest(registerUserRequest, userRegistrationOnPostgreSQLDatabase, registerUserJoiValidation);
51-
52-
expect(registerUserResponse.userIsRegistered()).toBe(true);
53-
5461
const userAuthenticationOnPostgreSQLDatabase: UserAuthenticationOnPostgreSQLDatabase = await retrieveUserAuthenticationOnPostgreSQLDatabase();
5562

5663
const authenticateUserRequest: AuthenticateUserRequest = new AuthenticateUserRequest();

features/RegisterUser/RegisterUserController/RegisterUserRequest.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import BadRequestError from "../../../services/errors/BadRequestError";
2+
import RegisterUserTypeValidation from "./RegisterUserTypeValidation";
23

34
export default class RegisterUserRequest
45
{
@@ -7,6 +8,12 @@ export default class RegisterUserRequest
78
private password!: string;
89
private firstName!: string;
910
private lastName!: string;
11+
private registerUserTypeValidation: RegisterUserTypeValidation
12+
13+
constructor(registerUserTypeValidation: RegisterUserTypeValidation)
14+
{
15+
this.registerUserTypeValidation = registerUserTypeValidation;
16+
}
1017

1118
public getUsername(): string
1219
{
@@ -15,8 +22,10 @@ export default class RegisterUserRequest
1522

1623
public setUsername(username: string): RegisterUserRequest
1724
{
25+
this.registerUserTypeValidation.isString(username, "Username");
26+
1827
if (username.length === 0) {
19-
throw new BadRequestError("User cannot register without a username");
28+
throw new BadRequestError("User cannot register without a username", "username_not_informed");
2029
}
2130

2231
this.username = username;
@@ -31,8 +40,10 @@ export default class RegisterUserRequest
3140

3241
public setEmail(email: string): RegisterUserRequest
3342
{
43+
this.registerUserTypeValidation.isString(email, "Email");
44+
3445
if (email.length === 0) {
35-
throw new BadRequestError("User cannot register without an email");
46+
throw new BadRequestError("User cannot register without an email", "email_not_informed");
3647
}
3748

3849
this.email = email;
@@ -48,7 +59,7 @@ export default class RegisterUserRequest
4859
public setPassword(password: string): RegisterUserRequest
4960
{
5061
if (password.length === 0) {
51-
throw new BadRequestError("User cannot register without a password");
62+
throw new BadRequestError("User cannot register without a password", "password_not_informed");
5263
}
5364

5465
this.password = password;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default interface RegisterUserTypeValidation {
2+
isString(testedVariable: any, variableName: string): boolean;
3+
}

features/RegisterUser/RegisterUserMain/router.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@ import express from 'express';
22
import type { Request, Response, Router } from 'express';
33
import bodyParser from 'body-parser';
44
import type { NextHandleFunction } from "connect";
5+
56
import UserRegistrationOnPostgreSQLDatabase from "./database/UserRegistrationOnPostgreSQLDatabase";
67
import RegisterUserController from '../RegisterUserController/RegisterUserController';
78
import RegisterUserRequest from '../RegisterUserController/RegisterUserRequest';
89
import type RegisterUserResponse from '../RegisterUserController/RegisterUserResponse';
10+
import RegisterUserTypeValidator from './validation/RegisterUserTypeValidator';
11+
912
import BadRequestError from '../../../services/errors/BadRequestError';
1013
import UnauthorisedActionError from '../../../services/errors/UnauthorisedActionError';
1114
import RegisterUserJoiValidation from './validation/RegisterUserJoiValidation';
15+
import TypeValidator from '../../../services/validation/TypeValidator';
1216

1317
const RegisterUserRouter: Router = express.Router();
1418
const jsonParser: NextHandleFunction = bodyParser.json();
@@ -51,7 +55,8 @@ RegisterUserRouter.post("/", jsonParser, async (request: Request, response: Resp
5155
});
5256

5357
const composeRegisterUserRequest = (requestBody: any): RegisterUserRequest => {
54-
const registerUserRequest = new RegisterUserRequest();
58+
const registerUserTypeValidator = new RegisterUserTypeValidator(new TypeValidator());
59+
const registerUserRequest = new RegisterUserRequest(registerUserTypeValidator);
5560

5661
registerUserRequest.setEmail(requestBody.email)
5762
.setUsername(requestBody.username)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import TypeValidator from "../../../../services/validation/TypeValidator";
2+
import RegisterUserTypeValidation from "../../RegisterUserController/RegisterUserTypeValidation";
3+
4+
export default class RegisterUserTypeValidator implements RegisterUserTypeValidation {
5+
private typeValidator: TypeValidator
6+
7+
constructor(typeValidator: TypeValidator)
8+
{
9+
this.typeValidator = typeValidator;
10+
}
11+
12+
public isString(testedVariable: any, variableName: string): boolean
13+
{
14+
return this.typeValidator.isString(testedVariable, variableName);
15+
}
16+
}

features/RegisterUser/RegisterUserUseCase/RegisterUserUseCase.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default class RegisterUserUseCase
1212
const emailIsAvailable = await registerUserGateway.emailIsAvailable(userRegistrationInput.getEmail());
1313

1414
if (! emailIsAvailable) {
15-
throw new UnauthorisedActionError("Email was already registered by another user");
15+
throw new UnauthorisedActionError("Email was already registered by another user", "email_is_already_registered");
1616
}
1717

1818
userRegistrationOutput.setWetherUserSuccessfullyRegistered(await registerUserGateway.registerUser(userRegistrationInput));

features/RegisterUser/RegisterUserUseCase/UserRegistrationInput.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ export default class UserRegistrationInput {
2323
const [usernameHasAtLeat3Letters, usernameHasOnlyLettersNumberAndUnderscores] = await Promise.all([this.userRegistrationInputValidator.usernameHasAtLeat3Letters(username), this.userRegistrationInputValidator.usernameHasOnlyLettersNumberAndUnderscores(username)]);
2424

2525
if (! usernameHasAtLeat3Letters) {
26-
throw new UnauthorisedActionError("Username needs to have at least 3 letters");
26+
throw new UnauthorisedActionError("Username needs to have at least 3 letters", "username_must_have_at_least_3_letters");
2727
}
2828

2929
if (! usernameHasOnlyLettersNumberAndUnderscores) {
30-
throw new UnauthorisedActionError("Username can only contain letters, numbers and underscores");
30+
throw new UnauthorisedActionError("Username can only contain letters, numbers and underscores", "username_has_special_characters");
3131
}
3232

3333
this.username = username;
@@ -45,7 +45,7 @@ export default class UserRegistrationInput {
4545
const emailIsValid = await this.userRegistrationInputValidator.emailMustBeValid(email);
4646

4747
if (!emailIsValid) {
48-
throw new UnauthorisedActionError("Email must be valid");
48+
throw new UnauthorisedActionError("Email must be valid", "email_is_invalid");
4949
}
5050

5151
this.email = email;
@@ -74,23 +74,23 @@ export default class UserRegistrationInput {
7474
]);
7575

7676
if (!passwordMustBeAtLeast12CharactersLong) {
77-
throw new UnauthorisedActionError("Password must be at least 12 characters long");
77+
throw new UnauthorisedActionError("Password must be at least 12 characters long", "password_doesnt_have_12_characters");
7878
}
7979

8080
if (!passwordMustHaveAtLeast3LowercaseLetters) {
81-
throw new UnauthorisedActionError("Password needs to have at least 3 lowercase letters");
81+
throw new UnauthorisedActionError("Password needs to have at least 3 lowercase letters", "password_doesnt_have_3_lowercase_letters");
8282
}
8383

8484
if (!passwordMustHaveAtLeast3UppercaseLetters) {
85-
throw new UnauthorisedActionError("Password needs to have at least 3 uppercase letters");
85+
throw new UnauthorisedActionError("Password needs to have at least 3 uppercase letters", "password_doesnt_have_3_uppercase_letters");
8686
}
8787

8888
if (!passwordMustHaveAtLeast3Symbols) {
89-
throw new UnauthorisedActionError("Password needs to have at least 3 symbols, special characters or space");
89+
throw new UnauthorisedActionError("Password needs to have at least 3 symbols, special characters or space", "password_miss_special_characters");
9090
}
9191

9292
if (!passwordMustHaveAtLeast3Numbers) {
93-
throw new UnauthorisedActionError("Password needs to have at least 3 numbers");
93+
throw new UnauthorisedActionError("Password needs to have at least 3 numbers", "password_doesnt_have_3_numbers");
9494
}
9595

9696
this.password = password;
@@ -108,7 +108,7 @@ export default class UserRegistrationInput {
108108
const firstNameHasLettersOnly = await this.userRegistrationInputValidator.firstNameHasLettersOnly(firstName);
109109

110110
if (! firstNameHasLettersOnly) {
111-
throw new UnauthorisedActionError("Firstname needs to have letters only");
111+
throw new UnauthorisedActionError("Firstname needs to have letters only", "first_name_not_letters_only");
112112
}
113113

114114
this.firstName = firstName;
@@ -126,7 +126,7 @@ export default class UserRegistrationInput {
126126
const lastNameHasLettersOnly = await this.userRegistrationInputValidator.lastNameHasLettersOnly(lastName);
127127

128128
if (! lastNameHasLettersOnly) {
129-
throw new UnauthorisedActionError("Lastname needs to have letters only");
129+
throw new UnauthorisedActionError("Lastname needs to have letters only", "last_name_not_letters_only");
130130
}
131131

132132
this.lastName = lastName;

features/RegisterUser/tests/registerUserLogic.test.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import {afterAll, describe, expect, test} from '@jest/globals';
2+
23
import UserRegistrationOnPostgreSQLDatabase from "../RegisterUserMain/database/UserRegistrationOnPostgreSQLDatabase";
34
import RegisterUserController from '../RegisterUserController/RegisterUserController';
45
import RegisterUserRequest from '../RegisterUserController/RegisterUserRequest';
56
import type RegisterUserResponse from '../RegisterUserController/RegisterUserResponse';
6-
import BadRequestError from '../../../services/errors/BadRequestError';
7+
import RegisterUserTypeValidator from '../RegisterUserMain/validation/RegisterUserTypeValidator';
8+
79
import UnauthorisedActionError from '../../../services/errors/UnauthorisedActionError';
810
import RegisterUserJoiValidation from "../RegisterUserMain/validation/RegisterUserJoiValidation";
911

12+
import TypeValidator from '../../../services/validation/TypeValidator';
13+
1014
afterAll(async() => {
1115
const userRegistrationOnPostgreSQLDatabase: UserRegistrationOnPostgreSQLDatabase = await retrieveUserRegistrationOnPostgreSQLDatabase();
1216
await userRegistrationOnPostgreSQLDatabase.query("TRUNCATE TABLE application_users");
@@ -25,7 +29,8 @@ describe("Test register user feature", () => {
2529
const userRegistrationOnPostgreSQLDatabase: UserRegistrationOnPostgreSQLDatabase = await retrieveUserRegistrationOnPostgreSQLDatabase();
2630
const registerUserJoiValidation: RegisterUserJoiValidation = new RegisterUserJoiValidation();
2731

28-
const registerUserRequest: RegisterUserRequest = new RegisterUserRequest();
32+
const registerUserTypeValidator = new RegisterUserTypeValidator(new TypeValidator());
33+
const registerUserRequest: RegisterUserRequest = new RegisterUserRequest(registerUserTypeValidator);
2934
registerUserRequest.setUsername("user")
3035
.setEmail("test@mail.com")
3136
.setPassword("Sdf sdfs sdSDFdfi 1234 !")
@@ -43,7 +48,8 @@ describe("Test register user feature", () => {
4348
const userRegistrationOnPostgreSQLDatabase: UserRegistrationOnPostgreSQLDatabase = await retrieveUserRegistrationOnPostgreSQLDatabase();
4449
const registerUserJoiValidation: RegisterUserJoiValidation = new RegisterUserJoiValidation();
4550

46-
const registerUserRequest: RegisterUserRequest = new RegisterUserRequest();
51+
const registerUserTypeValidator = new RegisterUserTypeValidator(new TypeValidator());
52+
const registerUserRequest: RegisterUserRequest = new RegisterUserRequest(registerUserTypeValidator);
4753
registerUserRequest.setUsername("user2")
4854
.setEmail("test2@mail.com")
4955
.setPassword("Sdf sdfs sdfsSDfSDdfi 1234 !");
@@ -58,7 +64,8 @@ describe("Test register user feature", () => {
5864
const userRegistrationOnPostgreSQLDatabase: UserRegistrationOnPostgreSQLDatabase = await retrieveUserRegistrationOnPostgreSQLDatabase();
5965
const registerUserJoiValidation: RegisterUserJoiValidation = new RegisterUserJoiValidation();
6066

61-
const registerUserRequest: RegisterUserRequest = new RegisterUserRequest();
67+
const registerUserTypeValidator = new RegisterUserTypeValidator(new TypeValidator());
68+
const registerUserRequest: RegisterUserRequest = new RegisterUserRequest(registerUserTypeValidator);
6269
registerUserRequest.setUsername("user")
6370
.setEmail("test@mail.com")
6471
.setPassword("Sdf sdfs sdSDFdfi 1234 !")

0 commit comments

Comments
 (0)