diff --git a/package.json b/package.json index 28f0922d..0370af01 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,10 @@ "dotenv": "^16.4.7", "express": "^4.21.2", "jest": "^29.7.0", + "pg": "^8.16.3", + "pg-hstore": "^2.3.4", "prettier": "3.4.2", + "sequelize": "^6.37.7", "supertest": "^7.0.0", "vitepress": "^1.5.0" }, diff --git a/templates/express_pg_sequelize/.gitignore b/templates/express_pg_sequelize/.gitignore new file mode 100644 index 00000000..ba920d3a --- /dev/null +++ b/templates/express_pg_sequelize/.gitignore @@ -0,0 +1,3 @@ +node_modules +.env +coverage diff --git a/templates/express_pg_sequelize/index.js b/templates/express_pg_sequelize/index.js index 8cda3f95..eca9f27d 100644 --- a/templates/express_pg_sequelize/index.js +++ b/templates/express_pg_sequelize/index.js @@ -27,7 +27,7 @@ app.get("/db-test", async (req, res) => { const [results, metadata] = await db.query("SELECT NOW()"); return res .status(200) - .json({ message: "DB query successful!", data: results }); + .json({ message: "DB Query Successful!", data: results }); } catch (error) { return res .status(500) @@ -36,6 +36,10 @@ app.get("/db-test", async (req, res) => { }); // Start the server -app.listen(appConfig.PORT, () => { - console.log(`Server is running on http://localhost:${appConfig.PORT}`); -}); +if (process.env.NODE_ENV !== "test") { + app.listen(appConfig.PORT, () => { + console.log(`Server is running on http://localhost:${appConfig.PORT}`); + }); +} + +export default app; diff --git a/templates/express_pg_sequelize/index.test.js b/templates/express_pg_sequelize/index.test.js new file mode 100644 index 00000000..a8dabc3f --- /dev/null +++ b/templates/express_pg_sequelize/index.test.js @@ -0,0 +1,36 @@ +import { jest } from "@jest/globals"; +import request from "supertest"; + +jest.unstable_mockModule("./db.js", () => ({ + default: { + authenticate: jest.fn(() => Promise.resolve()), + query: jest.fn(() => Promise.resolve([[{ "now()": new Date() }], {}])), + }, +})); + +const { default: app } = await import("./index.js"); +const { default: db } = await import("./db.js"); + +describe("express_pg_sequelize API Endpoints", () => { + it("should return welcome message on GET /", async () => { + const res = await request(app).get("/"); + expect(res.statusCode).toEqual(200); + expect(res.text).toBe("Hello, Express with PostgreSQL!"); + }); + + it("should return DB query results on GET /db-test", async () => { + const res = await request(app).get("/db-test"); + expect(res.statusCode).toEqual(200); + expect(res.body.message).toBe("DB Query Successful!"); + expect(res.body.data).toBeDefined(); + }); + + it("should handle DB errors on GET /db-test", async () => { + db.query.mockImplementationOnce(() => + Promise.reject(new Error("DB Error")), + ); + const res = await request(app).get("/db-test"); + expect(res.statusCode).toEqual(500); + expect(res.body.message).toBe("Error querying the database"); + }); +}); diff --git a/templates/express_pg_sequelize/package.json b/templates/express_pg_sequelize/package.json index 950f7ade..902e3a43 100644 --- a/templates/express_pg_sequelize/package.json +++ b/templates/express_pg_sequelize/package.json @@ -4,8 +4,10 @@ "main": "index.js", "scripts": { "start": "node index.js", - "dev": "nodemon index.js" + "dev": "nodemon index.js", + "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js" }, + "type": "module", "dependencies": { "express": "^4.17.1", "pg": "^8.6.0", @@ -14,6 +16,8 @@ "dotenv": "^16.4.7" }, "devDependencies": { - "nodemon": "^3.1.9" + "nodemon": "^3.1.9", + "jest": "^29.7.0", + "supertest": "^7.0.0" } }