Billie/storage/projects/api-experiment/tests/api/testA01.test.js

255 lines
9.9 KiB
JavaScript
Raw Normal View History

2025-05-14 02:03:05 +00:00
const mongoose = require("mongoose");
const request = require("supertest");
const app = require("../../app");
const packages = require("../../package.json");
require("dotenv").config();
mongoose.set("strictQuery", true);
const options = {
showPrefix: false,
showMatcherMessage: true,
showStack: true,
};
beforeAll(async () => {
await connectDB().then(
async () => {
console.log("Database connected successfully");
},
(err) => {
console.log("There is problem while connecting database " + err);
}
);
});
describe("Testing application configuration", () => {
// Testing the package.json file for the necessary development packages
// the packages are cross-env, jest, nodemon, supertest, jest-image-snapshot, jest-expect-message, puppeteer
it("Should have the necessary development packages", (done) => {
expect(
packages.devDependencies,
`The package "cross-env" was not found in the devDependencies object. Install the package by running this command "npm i cross-env --save-dev"`,
options
).toHaveProperty("cross-env");
expect(
packages.devDependencies,
`The package "jest" was not found in the devDependencies object. Install the package by running this command "npm i jest --save-dev"`,
options
).toHaveProperty("jest");
expect(
packages.devDependencies,
`The package "nodemon" was not found in the devDependencies object. Install the package by running this command "npm i nodemon --save-dev"`,
options
).toHaveProperty("nodemon");
expect(
packages.devDependencies,
`The package "supertest" was not found in the devDependencies object. Install the package by running this command "npm i supertest --save-dev"`,
options
).toHaveProperty("supertest");
expect(
packages.devDependencies,
`The package "jest-image-snapshot" was not found in the devDependencies object. Install the package by running this command "npm i jest-image-snapshot --save-dev"`,
options
).toHaveProperty("jest-image-snapshot");
expect(
packages.devDependencies,
`The package "jest-expect-message" was not found in the devDependencies object. Install the package by running this command "npm i jest-expect-message --save-dev"`,
options
).toHaveProperty("jest-expect-message");
expect(
packages.devDependencies,
`The package "puppeteer" was not found in the devDependencies object. Install the package by running this command "npm i puppeteer --save-dev"`,
options
).toHaveProperty("puppeteer");
done();
});
// Testing the package.json file for the necessary production packages
// the packages are dotenv, ejs, express, express-ejs-layouts, mongoose, mongoose-slug-generator
it("should have the necessary production packages", (done) => {
expect(
packages.dependencies,
`The package "dotenv" was not found in the dependencies object. Install the package by running this command "npm i dotenv --save"`,
options
).toHaveProperty("dotenv");
expect(
packages.dependencies,
`The package "ejs" was not found in the dependencies object. Install the package by running this command "npm i ejs --save"`,
options
).toHaveProperty("ejs");
expect(
packages.dependencies,
`The package "express" was not found in the dependencies object. Install the package by running this command "npm i express --save"`,
options
).toHaveProperty("express");
expect(
packages.dependencies,
`The package "express-ejs-layouts" was not found in the dependencies object. Install the package by running this command "npm i express-ejs-layouts --save"`,
options
).toHaveProperty("express-ejs-layouts");
expect(
packages.dependencies,
`The package "mongoose" was not found in the dependencies object. Install the package by running this command "npm i mongoose --save"`,
options
).toHaveProperty("mongoose");
expect(
packages.dependencies,
`The package "mongoose-slug-generator" was not found in the dependencies object. Install the package by running this command "npm i mongoose-slug-generator --save"`,
options
).toHaveProperty("mongoose-slug-generator");
done();
});
// Testing the application name
// the application name should be "api-experiment"
it("should have the right name and packages", (done) => {
expect(
packages.name,
`The name provided "${packages.name}" is wrong. The application name should be "api-experiment", check the package.json file`,
options
).toBe("api-experiment");
done();
});
// Testing the application environment variables
// the application should have the following environment variables
// MONGODB_URI, MONGODB_URI_TEST, PORT
it("should have the right environment variables", (done) => {
expect(
process.env,
`The environment variable "MONGODB_URI" was not found. Check the .env file`,
options
).toHaveProperty("MONGODB_URI");
expect(
process.env,
`The environment variable "MONGODB_URI_TEST" was not found. Check the .env.test file`,
options
).toHaveProperty("MONGODB_URI_TEST");
expect(
process.env.MONGODB_URI !== process.env.MONGODB_URI_TEST,
`The environment variable "MONGODB_URI" and "MONGODB_URI_TEST" should not be the same. Check the .env`,
options
).toBeTruthy();
expect(
process.env,
`The environment variable "PORT" was not found. Check the .env file`,
options
).toHaveProperty("PORT");
expect(
process.env.NODE_ENV,
`The environment variable "NODE_ENV" was not found. Check the test script in the package.json file`
).toBe("test");
done();
});
// Testing the application connection to the database using the test environment
it("should have the right database connection", (done) => {
expect(
mongoose.connection.readyState,
`The application is not connected to the database. Check the correctness of the MONGODB_URI_TEST variable in the .env file or the connection to the internet`,
options
).toBe(1);
done();
});
// Testing the application configuration
it("should be using json format and express framework", (done) => {
let application_stack = [];
app._router.stack.forEach((element) => {
application_stack.push(element.name);
});
expect(
application_stack,
`The application is not using the json format. Check the app.js file`,
options
).toContain("query");
expect(
application_stack,
`The application is not using the express framework. Check the app.js file`,
options
).toContain("expressInit");
expect(
application_stack,
`The application is not using the json format. Check the app.js file`,
options
).toContain("jsonParser");
expect(
application_stack,
`The application is not using the urlencoded format. Check the app.js file`,
options
).toContain("urlencodedParser");
done();
});
});
// Testing the application testing route
describe("Testing GET /api/v1/test", () => {
// Testing the application testing route without request
it("should return alive", async () => {
const res = await request(app).get("/api/v1/test");
expect(
res.statusCode,
`The status code should be 200, but it is "${res.statusCode}", change the status code in the function that handles the GET /api/v1/test route`,
options
).toBe(200);
expect(
res.body,
`The response should contain the property "alive", but it does not, change the response in the function that handles the GET /api/v1/test route to return {alive: 'True'}`,
options
).toHaveProperty("alive");
expect(
res.body.alive,
`The response should be {alive: 'True'}, but it is "${res.body.alive}", change the response in the function that handles the GET /api/v1/test route to return {alive: 'True'}`,
options
).toBe("True");
expect(
res.req.method,
`The request method should be GET, but it is "${res.req.method}", change the request method in the function that handles the GET /api/v1/test route`,
options
).toBe("GET");
expect(
res.type,
`The response type should be application/json, but it is "${res.type}", change the response type in the function that handles the GET /api/v1/test route`
).toBe("application/json");
});
// Testing the application testing route with request
it("should return the same message", async () => {
const res = await request(app)
.get("/api/v1/test")
.send({ message: "Hello" });
expect(
res.statusCode,
`The status code should be 200, but it is "${res.statusCode}", change the status code in the function that handles the GET /api/v1/test route`,
options
).toBe(200);
expect(
res.body,
`The response should contain the property "message", but it does not, change the response in the function that handles the GET /api/v1/test route to return {message: req.body.message}`,
options
).toHaveProperty("message");
expect(
res.body.message,
`The response should be {message: 'Hello'}, but it is "${res.body.message}", change the response in the function that handles the GET /api/v1/test route to return {message: req.body.message}`,
options
).toBe("Hello");
const res2 = await request(app)
.get("/api/v1/test")
.send({ message: "Hello World" });
expect(
res2.body.message,
`The response should be {message: 'Hello World'}, but it is "${res2.body.message}", change the response in the function that handles the GET /api/v1/test route to return {message: req.body.message}`,
options
).toBe("Hello World");
});
});
afterAll(async () => {
await disconnectDB();
});
async function connectDB() {
return mongoose.connect(process.env.MONGODB_URI_TEST, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
}
async function disconnectDB() {
await mongoose.connection.close();
}