From 6ee810474333b6d80a0f4e36cf4beb37ec38d04d Mon Sep 17 00:00:00 2001 From: Danny Prikazsky Date: Sun, 1 Jun 2025 17:04:36 -0700 Subject: [PATCH 1/3] Add integration tests for User API Endpoints --- backend/test/user.integration.test.js | 123 ++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 backend/test/user.integration.test.js diff --git a/backend/test/user.integration.test.js b/backend/test/user.integration.test.js new file mode 100644 index 000000000..1c7e2f86b --- /dev/null +++ b/backend/test/user.integration.test.js @@ -0,0 +1,123 @@ +const supertest = require('supertest'); +const app = require('../app'); +const request = supertest(app); + +const { setupIntegrationDB } = require('../setup-test'); +setupIntegrationDB('api-users'); + +const backendHeaders = process.env.CUSTOM_REQUEST_HEADER; + +const submittedData = { + name: { + firstName: 'test', + lastName: 'user', + }, + email: 'newtest@test.com', +}; +var createdUserId = ''; + +describe('CREATE', () => { + test('Create a User with POST to /api/users/', async (done) => { + // Submit a User + const res = await request + .post('/api/users/') + .set('Accept', 'application/json') + .set('x-customrequired-header', backendHeaders) + .send(submittedData); + expect(res.status).toBe(201); + expect(res.body.name).toMatchObject(submittedData.name); + + createdUserId = res.body._id; + + done(); + }); +}); + +describe('READ', () => { + test('Get a list of Users with with GET to /api/users/', async (done) => { + // Get all Users + const res = await request.get('/api/users/').set('x-customrequired-header', backendHeaders); + expect(res.status).toBe(200); + + const APIData = res.body[0]; + expect(APIData.name).toMatchObject(submittedData.name); + + done(); + }); + test('Get a specific User by param with GET to /api/users?email=', async (done) => { + // Get User by query of email + const res = await request + .get('/api/users?email=newtest@test.com') + .set('x-customrequired-header', backendHeaders); + expect(res.status).toBe(200); + + const APIData = res.body[0]; + expect(APIData.name).toMatchObject(submittedData.name); + + done(); + }); + + test('Get a specific User by UserId with GET to /api/users/:UserId', async (done) => { + // Get User by UserId + const res = await request + .get(`/api/users/${createdUserId}`) + .set('x-customrequired-header', backendHeaders); + expect(res.status).toBe(200); + + const APIData = res.body; + expect(APIData.email).toBe(submittedData.email); + expect(APIData.name).toMatchObject(submittedData.name); + + done(); + }); +}); + +describe('UPDATE', () => { + test('Update a User with PATCH to /api/users/:UserId', async (done) => { + const updatedEmail = { + email: 'newtest2@test.com', + }; + + // Update User + const resUpdate = await request + .patch(`/api/users/${createdUserId}`) + .set('Accept', 'application/json') + .set('x-customrequired-header', backendHeaders) + .send(updatedEmail); + expect(resUpdate.status).toBe(200); + expect(resUpdate.body.name).toMatchObject(submittedData.name); + + const res2 = await request + .get(`/api/users/${createdUserId}`) + .set('x-customrequired-header', backendHeaders); + expect(res2.status).toBe(200); + + const APIData = res2.body; + expect(APIData.email).toBe(updatedEmail.email); + expect(APIData.name).toMatchObject(submittedData.name); + + done(); + }); +}); + +describe('DELETE', () => { + test('Delete a specific user by Id with DELETE /api/users/:UserId', async (done) => { + // Delete User + const res = await request + .delete(`/api/users/${createdUserId}`) + .set('x-customrequired-header', backendHeaders); + expect(res.status).toBe(200); + + const APIData = res.body; + expect(APIData.name).toMatchObject(submittedData.name); + + // Check to see that deleted User is gone + const res2 = await request + .get(`/api/users/${createdUserId}`) + .set('x-customrequired-header', backendHeaders); + expect(res2.body).toEqual({}); + + + done(); + }); +}); From 3513217171ca3f9ef3860f76c3bdb97f5be5cf08 Mon Sep 17 00:00:00 2001 From: Danny Prikazsky Date: Sun, 1 Jun 2025 17:06:08 -0700 Subject: [PATCH 2/3] Add TODO note for desired future behavior --- backend/controllers/user.controller.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/controllers/user.controller.js b/backend/controllers/user.controller.js index 897496e75..783f3a9d0 100644 --- a/backend/controllers/user.controller.js +++ b/backend/controllers/user.controller.js @@ -94,6 +94,8 @@ UserController.user_by_id = async function (req, res) { try { const user = await User.findById(UserId); + // TODO throw 404 if User.findById returns empty object + // and look downstream to see whether 404 would break anything return res.status(200).send(user); } catch (err) { return res.sendStatus(400); From f80aff1b21de103644ed23cebf0dbec1d37e8ab8 Mon Sep 17 00:00:00 2001 From: Danny Prikazsky Date: Mon, 16 Jun 2025 19:44:17 -0700 Subject: [PATCH 3/3] Test that emails must be unique for users --- backend/test/user.integration.test.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/test/user.integration.test.js b/backend/test/user.integration.test.js index 1c7e2f86b..8e2b2145c 100644 --- a/backend/test/user.integration.test.js +++ b/backend/test/user.integration.test.js @@ -31,6 +31,19 @@ describe('CREATE', () => { done(); }); + + test('Fail when creating a User with duplicate email', async (done) => { + // Submit a User + const res = await request + .post('/api/users/') + .set('Accept', 'application/json') + .set('x-customrequired-header', backendHeaders) + .send(submittedData); + expect(res.status).toBe(409); + expect(res.body).toMatchObject({error: { code: 11000, driver: true, name: 'MongoError', index: 0 }, message: 'User already exists'}); + + done(); + }); }); describe('READ', () => {