started adding user unit tests

This commit is contained in:
kyle hoell
2020-12-04 01:43:04 -05:00
parent 415c9c3b77
commit 9feb7409a3
18 changed files with 329 additions and 67 deletions
+5 -11
View File
@@ -59,14 +59,14 @@ class UserController {
const {user, accessToken, refreshToken} = await UserProvider.login(body, ipAddress);
await user.save();
// await user.save();
createLoginCookie(res, accessToken, refreshToken);
user.tokens = [];
user.tempTokens = []
user.privateKey = undefined;
user.publicKey = undefined;
// user.tokens = [];
// user.tempTokens = []
// user.privateKey = undefined;
// user.publicKey = undefined;
res.status(200).send({user});
@@ -171,12 +171,6 @@ class UserController {
const {user, accessToken, refreshToken} = await UserProvider.create(req.body, ipAddress);
createLoginCookie(res, accessToken, refreshToken);
user.tokens = [];
user.tempTokens = []
user.password = '';
user.privateKey = undefined;
user.publicKey = undefined;
res.status(201).send({user})
+2
View File
@@ -267,6 +267,8 @@ userSchema.methods.toJSON = function() {
delete userObject.password;
delete userObject.tokens;
delete userObject.tempTokens;
delete userObject.privateKey;
delete userObject.publicKey;
return userObject;
}
+2 -3
View File
@@ -257,9 +257,6 @@ class UserService {
if (!user.storageDataPersonal || (!user.storageDataPersonal.storageSize && !user.storageDataPersonal.failed)) user.storageDataPersonal = {storageSize: 0}
if (!user.storageDataGoogle || (!user.storageDataGoogle.storageLimit && !user.storageDataGoogle.storageSize && !user.storageDataGoogle.failed)) user.storageDataGoogle = {storageLimit: 0, storageSize: 0}
delete user.privateKey;
delete user.publicKey;
return user;
}
@@ -342,6 +339,8 @@ class UserService {
addName = async(userID: string, name: string) => {
if (!name || name.length === 0) throw new ForbiddenError("No name")
const user = await User.findById(userID);
if (!user) throw new NotFoundError("Cannot find user")
+4
View File
@@ -4,6 +4,10 @@ import sgMail from "@sendgrid/mail";
const sendPasswordResetEmail = async (user: UserInterface, passwordResetToken: string) => {
if (process.env.NODE_ENV === "test") {
return;
}
const apiKey: any = env.sendgridKey;
const sendgridEmail:any = env.sendgridEmail;
const url = env.remoteURL + `/reset-password/${passwordResetToken}`
+4
View File
@@ -5,6 +5,10 @@ const currentURL = env.remoteURL;
const sendShareEmail = async (file: any, respient: string) => {
if (process.env.NODE_ENV === "test") {
return;
}
const apiKey: any = env.sendgridKey;
const sendgridEmail:any = env.sendgridEmail;
+4
View File
@@ -4,6 +4,10 @@ import sgMail from "@sendgrid/mail";
const sendVerificationEmail = async (user: UserInterface, emailToken: string) => {
if (process.env.NODE_ENV === "test") {
return;
}
const apiKey: any = env.sendgridKey;
const sendgridEmail:any = env.sendgridEmail;
const url = env.remoteURL + `/verify-email/${emailToken}`
+4 -2
View File
@@ -13,9 +13,10 @@
"build:docker": "export NODE_OPTIONS=--max_old_space_size=8000 && tsc && webpack -p --env production && webpack --config webUI.config.js && webpack --config webUISetup.config.js",
"build:webUI": "webpack --config webUI.config.js",
"build:dev": "tsc && webpack --env development",
"build:test": "tsc && webpack --env test",
"build:webUISetup": "webpack --config webUISetup.config.js",
"dev-server": "webpack-dev-server",
"test": "NODE_ENV=test env-cmd -f ./config/test.env jest --config=jest.config.json --watchAll --runInBand",
"test": "NODE_ENV=test env-cmd -f ./config/test.env jest --config=jest.config.json --runInBand",
"start:dev": "NODE_ENV=development node dist/server/serverStart.js",
"start:debug": "NODE_ENV=development node --inspect dist/server/serverStart.js",
"start": "node dist/server/serverStart.js --env production",
@@ -103,6 +104,7 @@
"request-ip": "^2.1.3",
"sharp": "^0.23.4",
"stream-skip": "^1.0.3",
"supertest-session": "^4.1.0",
"sweetalert2": "^9.7.2",
"temp": "^0.9.1",
"typescript": "^3.8.3",
@@ -132,7 +134,7 @@
"sass-loader": "^8.0.2",
"style-loader": "^1.1.3",
"superagent-binary-parser": "^1.0.1",
"supertest": "^4.0.2",
"supertest": "^6.0.1",
"webpack-bundle-analyzer": "^3.6.0",
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.10.3"
+253 -45
View File
@@ -5,6 +5,9 @@ const createUser = require("../fixtures/createUser");
import servers from "../../dist/server/server";
const request = require("supertest");
import env from "../../dist/enviroment/env";
const session = require("supertest-session");
const loginUser = require("../fixtures/loginUser");
const createUserNotEmailVerified = require("../fixtures/createUserNotEmailVerified");
const {server, serverHttps} = servers;
@@ -12,29 +15,57 @@ const app = server;
let user;
let userToken;
let userData;
const waitForDatabase = () => {
return new Promise((resolve, reject) => {
if (conn.readyState !== 1) {
conn.once("open", () => {
resolve();
})
} else {
resolve();
}
})
}
beforeEach(async(done) => {
if (conn.readyState === 0) {
await waitForDatabase();
// user = await createUser();
// userToken = user.tokens[0].token;
const {user: gotUser, token: gotToken} = await createUser();
user = gotUser;
userToken = gotToken;
const {user: gotUser, userData: gotUserData} = await createUser();
user = gotUser;
userData = gotUserData;
done()
done();
// if (conn.readyState === 0) {
} else {
// // user = await createUser();
// // userToken = user.tokens[0].token;
// const {user: gotUser, token: gotToken} = await createUser();
// user = gotUser;
// userToken = gotToken;
// done()
// } else {
// user = await createUser();
// userToken = user.tokens[0].token;
const {user: gotUser, token: gotToken} = await createUser();
user = gotUser;
userToken = gotToken;
// // user = await createUser();
// // userToken = user.tokens[0].token;
// const {user: gotUser, token: gotToken} = await createUser();
// user = gotUser;
// userToken = gotToken;
done();
}
// done();
// }
})
afterEach(async(done) => {
@@ -45,9 +76,12 @@ afterEach(async(done) => {
test("When authorized, should return user, with no sensitive data", async() => {
const response = await request(app)
const appSession = session(app);
await loginUser(appSession, userData);
const response = await appSession
.get(`/user-service/user`)
.set("Authorization", `Bearer ${userToken}`)
.send()
.expect(200);
@@ -66,34 +100,30 @@ test("When not authorized should return 401 for user", async() => {
.send()
.expect(401);
expect(response.body).toEqual({
"error": "Error Authenticating",
});
expect(response.body).toEqual({});
})
test("When giving credentials, should login user, and not return sensitive info", async() => {
const response = await request(app)
.post(`/user-service/login`)
.set("Authorization", `Bearer ${userToken}`)
.send({
email: user.email,
password: "12345678"
})
.expect(200);
expect(response.body.password).toEqual(undefined);
expect(response.body.privateKey).toEqual(undefined);
expect(response.body.publicKey).toEqual(undefined);
expect(response.body.tokens).toEqual(undefined);
expect(response.body.tempTokens).toEqual(undefined);
expect(response.body.user.password).toEqual(undefined);
expect(response.body.user.privateKey).toEqual(undefined);
expect(response.body.user.publicKey).toEqual(undefined);
expect(response.body.user.tokens).toEqual(undefined);
expect(response.body.user.tempTokens).toEqual(undefined);
})
test("When giving wrong creditentials, should return 500 error", async() => {
const response = await request(app)
.post(`/user-service/login`)
.set("Authorization", `Bearer ${userToken}`)
.send({
email: user.email,
password: "1454524"
@@ -105,9 +135,12 @@ test("When giving wrong creditentials, should return 500 error", async() => {
test("When authorized should logout user", async() => {
await request(app)
const appSession = session(app);
await loginUser(appSession, userData);
await appSession
.post(`/user-service/logout`)
.set("Authorization", `Bearer ${userToken}`)
.send()
.expect(200);
})
@@ -119,16 +152,17 @@ test("When not authorized for logout, should return 401 error", async() => {
.send()
.expect(401);
expect(response.body).toEqual({
"error": "Error Authenticating",
});
expect(response.body).toEqual({});
})
test("When authoized should logout all sessions of a user", async() => {
await request(app)
const appSession = session(app);
await loginUser(appSession, userData);
await appSession
.post(`/user-service/logout-all`)
.set("Authorization", `Bearer ${userToken}`)
.send()
.expect(200);
})
@@ -140,9 +174,7 @@ test("When not authorized for logout all, should return 401 error", async() => {
.send()
.expect(401);
expect(response.body).toEqual({
"error": "Error Authenticating",
});
expect(response.body).toEqual({});
})
test("When giving user data, should create account without returning sensitive data", async() => {
@@ -179,27 +211,48 @@ test("When env variable is set to block accounts, should return 401 error", asyn
test("When giving old password, and new password, should change password", async() => {
const appSession = session(app);
await loginUser(appSession, userData);
const oldPassword = "12345678";
const newPassword = "987654321";
await request(app)
await appSession
.post(`/user-service/change-password`)
.set("Authorization", `Bearer ${userToken}`)
.send({
oldPassword,
newPassword
})
.expect(200);
await request(app)
.post(`/user-service/login`)
.send({
email: user.email,
password: oldPassword
})
.expect(500);
await request(app)
.post(`/user-service/login`)
.send({
email: user.email,
password: newPassword
})
.expect(200);
})
test("When giving wrong old password for change password, should return 500 error", async() => {
const appSession = session(app);
await loginUser(appSession, userData);
const wrongOldPassword = "12342345";
const newPassword = "987654321";
await request(app)
await appSession
.post(`/user-service/change-password`)
.set("Authorization", `Bearer ${userToken}`)
.send({
wrongOldPassword,
newPassword
@@ -220,7 +273,162 @@ test("When not authorized for change password, should return 401 error", async()
})
.expect(401);
expect(response.body).toEqual({
"error": "Error Authenticating",
});
})
expect(response.body).toEqual({});
})
test("When not email verified should not change password", async() => {
const appSession = session(app);
const {userData: userData2} = await createUserNotEmailVerified()
await loginUser(appSession, userData2);
const oldPassword = "12345678";
const newPassword = "987654321";
await appSession
.post(`/user-service/change-password`)
.send({
oldPassword,
newPassword
})
.expect(401);
})
test("When not giving email, should not create user", async() => {
await request(app)
.post(`/user-service/create`)
.send({
email: "",
password: "12345678"
})
.expect(500);
})
test("When giving not a valid email, should not create user", async() => {
await request(app)
.post(`/user-service/create`)
.send({
email: "imnotvalid",
password: "12345678"
})
.expect(500);
})
test("When not giving long enouph password, should not create user", async() => {
await request(app)
.post(`/user-service/create`)
.send({
email: "test12341@email.com",
password: "123"
})
.expect(500);
})
test("When giving duplicate email, should not create user", async() => {
await request(app)
.post(`/user-service/create`)
.send({
email: "test55@gmail.com",
password: "12345678"
})
.expect(201);
await request(app)
.post(`/user-service/create`)
.send({
email: "test55@gmail.com",
password: "12345678"
})
.expect(500);
})
test("When authenticated should get refresh token", async() => {
const appSession = session(app);
await loginUser(appSession, userData);
await appSession.post("/user-service/get-token").send().expect(201);
})
test("When authenticated should get detailed user", async() => {
const appSession = session(app);
await loginUser(appSession, userData);
const response = await appSession.get("/user-service/user-detailed").send().expect(200);
const responseData = response.body;
const email = responseData.email;
const username = responseData.username;
const password = responseData.password;
const emailVerified = responseData.emailVerified;
const tokens = responseData.tokens;
const publicKey = responseData.publicKey;
const privateKey = responseData.privateKey;
expect(email).toEqual(userData.email);
expect(username).toEqual(userData.username);
expect(password).toEqual(undefined);
expect(emailVerified).toEqual(true);
expect(tokens).toEqual(undefined);
expect(publicKey).toEqual(undefined);
expect(privateKey).toEqual(undefined)
})
test("When not authenticated should not get detailed user", async() => {
await request(app).get("/user-service/user-detailed").send().expect(401);
})
test("When not email verified should not get detailed user", async() => {
const appSession = session(app);
const {userData: userData2} = await createUserNotEmailVerified();
await loginUser(appSession, userData2);
await request(app).get("/user-service/user-detailed").send().expect(401);
})
test("When giving existing email should send password reset email", async() => {
await request(app).post("/user-service/send-password-reset").send({email: userData.email}).expect(200);
})
test("When giving not existing email should return 404", async() => {
await request(app).post("/user-service/send-password-reset").send({email: "idontexist@void.com"}).expect(404);
})
test("When autheniticated should set users name", async() => {
const appSession = session(app);
await loginUser(appSession, userData);
await appSession.patch("/user-service/add-name").send({name: "testname"}).expect(200);
})
test("When giving a not valid name length should not set users name", async() => {
const appSession = session(app);
await loginUser(appSession, userData);
await appSession.patch("/user-service/add-name").send({name: ""}).expect(403);
})
test("When not giving name should not set users name", async() => {
const appSession = session(app);
await loginUser(appSession, userData);
await appSession.patch("/user-service/add-name").send().expect(403);
})
+4 -6
View File
@@ -16,6 +16,8 @@ const createUser = async() => {
name: "Test User",
email: "test2@test.com",
password: "12345678",
emailVerified: true,
tokens: []
}
let user = new User(userData);
@@ -23,13 +25,9 @@ const createUser = async() => {
await user.generateEncryptionKeys();
const token = await user.generateAuthToken();
await user.generateAuthToken("192.168.0.1");
user.emailVerified = true;
await user.save();
return {user, token};
return {user, userData};
}
module.exports = createUser;
+33
View File
@@ -0,0 +1,33 @@
const jwt = require("jsonwebtoken");
import mongoose from "../../dist/db/mongoose";
import User from "../../dist/models/user";
import env from "../../dist/enviroment/env";
const createUser = async() => {
env.key = "1234";
env.password = "1234";
process.env.KEY = "1234";
process.env.PASSWORD = "1234";
const userID = new mongoose.Types.ObjectId();
const userData = {
_id: userID,
name: "Test User",
email: "test23@test.com",
password: "12345678",
emailVerified: false,
tokens: []
}
let user = new User(userData);
await user.save();
await user.generateEncryptionKeys();
await user.generateAuthToken("192.168.0.1");
return {user, userData};
}
module.exports = createUser;
+14
View File
@@ -0,0 +1,14 @@
import mongoose from "../../dist/db/mongoose";
import User from "../../dist/models/user";
import env from "../../dist/enviroment/env";
const request = require("supertest");
const loginUser = async(appSession, userData) => {
const response = await appSession.post("/user-service/login")
.send({email: userData.email, password: userData.password}).expect(200);
return response.body;
}
module.exports = loginUser;