Billie/storage/projects/auth-experiment/tests/web/testB05.test.js
2025-05-14 09:03:05 +07:00

160 lines
5.0 KiB
JavaScript

const bcrypt = require("bcryptjs");
const puppeteer = require("puppeteer");
const mongoose = require("mongoose");
const { toMatchImageSnapshot } = require("jest-image-snapshot");
expect.extend({ toMatchImageSnapshot });
require("dotenv").config();
const options = {
showPrefix: false,
showMatcherMessage: true,
showStack: true,
};
let browser;
let page;
const user = {
name: "John Doe",
username: "johndoe",
email: "johndoe@gmail.com",
password: "12345678",
};
beforeAll(async () => {
mongoose.set("strictQuery", true);
await mongoose.connect(process.env.MONGODB_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
await mongoose.connection
.collection("users")
.findOneAndDelete({ username: user.username });
user.password = bcrypt.hashSync(user.password, bcrypt.genSaltSync(10));
await mongoose.connection.collection("users").insertOne(user);
user.password = "12345678";
browser = await puppeteer.launch({
headless: true,
slowMo: 0,
devtools: false,
defaultViewport: {
width: 1024,
height: 768,
},
});
page = await browser.newPage();
await page.setDefaultTimeout(10000);
await page.setDefaultNavigationTimeout(20000);
});
beforeEach(async () => {
await page.goto(`http://localhost:${process.env.PORT}/login`);
});
afterAll(async () => {
await mongoose.connection
.collection("users")
.findOneAndDelete({ username: user.username });
await mongoose.connection.close();
await browser.close();
});
describe("Testing the logout button", () => {
it("should login a user", async () => {
await page.type("#username", user.username);
await page.type("#password", user.password);
await page.click("button");
await new Promise((resolve) => setTimeout(resolve, 1000));
const url = await page.url();
expect(
url,
`The user should be redirected to the profile page after logging in, the current url is "${url}"`,
options
).toBe(`http://localhost:${process.env.PORT}/profile`);
});
it("should logout users by clicking the logout button", async () => {
await page.goto(`http://localhost:${process.env.PORT}/profile`);
await page.click(".action > a:nth-child(3)");
await new Promise((resolve) => setTimeout(resolve, 1000));
const url = await page.url();
expect(
url,
`The user should be redirected to the home page after logging out, the current url is "${url}"`,
options
).toBe(`http://localhost:${process.env.PORT}/`);
const cookies = await page.cookies();
expect(
cookies,
`The user should be logged out, the cookies should be empty`,
options
).toEqual([]);
});
});
describe("Testing the delete button", () => {
it("should login a user", async () => {
await page.type("#username", user.username);
await page.type("#password", user.password);
await page.click("button");
await new Promise((resolve) => setTimeout(resolve, 1000));
const url = await page.url();
expect(
url,
`The user should be redirected to the profile page after logging in, the current url is "${url}"`,
options
).toBe(`http://localhost:${process.env.PORT}/profile`);
});
it("should delete the user's account", async () => {
await page.goto(`http://localhost:${process.env.PORT}/profile`);
await page.click(".action > form > button");
await new Promise((resolve) => setTimeout(resolve, 1000));
const url = await page.url();
expect(
url,
`The user should be redirected to the home page after deleting the account, the current url is "${url}"`,
options
).toBe(`http://localhost:${process.env.PORT}/`);
const cookies = await page.cookies();
expect(
cookies,
`The user should be logged out, the cookies should be empty`,
options
).toEqual([]);
});
it("should delete the user from the database", async () => {
const userNull = await mongoose.connection
.collection("users")
.findOne({ username: user.username });
expect(
userNull,
`The user should be deleted from the database`,
options
).toBe(null);
});
it("should not login a deleted user", async () => {
await page.type("#username", user.username);
await page.type("#password", user.password);
await page.click("button");
await new Promise((resolve) => setTimeout(resolve, 1000));
const url = await page.url();
expect(
url,
`The user should not be able to login, the current url is "${url}"`,
options
).toBe(`http://localhost:${process.env.PORT}/login`);
});
});