From f7580f923bfe31ce70b8836abe4cda06aad2cfce Mon Sep 17 00:00:00 2001 From: Mariann Adelbert Date: Sun, 12 Apr 2026 18:13:05 +0300 Subject: [PATCH 1/2] Added missing API tests. --- app.test.js | 87 ++++++++++++++++++++++++++++++---- validation/validatePassword.js | 1 + validation/validateUsername.js | 1 + 3 files changed, 80 insertions(+), 9 deletions(-) diff --git a/app.test.js b/app.test.js index f1b561d..07d1725 100644 --- a/app.test.js +++ b/app.test.js @@ -25,10 +25,32 @@ describe('given correct username and password', () => { expect(response.body.userId).toBeDefined(); }) - // test response content type? - // test response message - // test response user id value - // ... + test('returns correct message', async () => { + const response = await request(app).post('/users').send({ + username: 'Username', + password: 'Password123', + email: 'student@example.com' + }) + expect(response.body.message).toBe("Valid User") + }) + + test('content-type is json', async () => { + const response = await request(app).post('/users').send({ + username: 'Username', + password: 'Password123', + email: 'student@example.com' + }) + expect(response.headers['content-type']).toMatch(/json/) + }) + + test('userId has correct value', async () => { + const response = await request(app).post('/users').send({ + username: 'Username', + password: 'Password123', + email: 'student@example.com' + }) + expect(response.body.userId).toBe('1') + }) }) describe('given incorrect or missing username and password', () => { @@ -41,9 +63,56 @@ describe('given incorrect or missing username and password', () => { expect(response.statusCode).toBe(400) }) - // test response message - // test that response does NOT have userId - // test incorrect username or password according to requirements - // test missing username or password - // ... + test('returns error message', async () => { + const response = await request(app).post('/users').send({ + username: 'user', + password: 'password', + email: 'not-an-email' + }) + expect(response.body.error).toBe("Invalid User") + }) + + test('does NOT return userId', async () => { + const response = await request(app).post('/users').send({ + username: 'user', + password: 'password', + email: 'not-an-email' + }) + expect(response.body.userId).toBeUndefined() + }) + + test('missing username returns 400', async () => { + const response = await request(app).post('/users').send({ + password: 'Password123', + email: 'student@example.com' + }) + expect(response.statusCode).toBe(400) + }) + + test('missing password returns 400', async () => { + const response = await request(app).post('/users').send({ + username: 'Username', + email: 'student@example.com' + }) + expect(response.statusCode).toBe(400) + }) + + test('missing email returns 400 (coverage for validateEmail)', async () => { + const response = await request(app).post('/users').send({ + username: 'Username', + password: 'Password123' + }) + + expect(response.statusCode).toBe(400) + }) + + test('email is not a string returns 400', async () => { + const response = await request(app).post('/users').send({ + username: 'Username', + password: 'Password123', + email: 12345 + }) + + expect(response.statusCode).toBe(400) + }) }) \ No newline at end of file diff --git a/validation/validatePassword.js b/validation/validatePassword.js index 44d8a8b..0f9eb84 100644 --- a/validation/validatePassword.js +++ b/validation/validatePassword.js @@ -1,4 +1,5 @@ function validatePassword(password) { + if (!password) return false; const validLength = password.length >= 8; const hasNumber = /[0-9]/g.test(password); const hasUpperCaseLetters = /[A-Z]/g.test(password); diff --git a/validation/validateUsername.js b/validation/validateUsername.js index 30213b1..088ba22 100644 --- a/validation/validateUsername.js +++ b/validation/validateUsername.js @@ -1,4 +1,5 @@ function validateUsername(username) { + if (!username) return false; const validLength = username.length >= 6 && username.length <=30; const allowedcharacters = /^[a-zA-Z0-9.]+$/g.test(username); From 04e13fa557ecd9cba39f72109d8e0c56198e3621 Mon Sep 17 00:00:00 2001 From: Mariann Adelbert Date: Sun, 12 Apr 2026 18:55:31 +0300 Subject: [PATCH 2/2] Added mocked API tests. --- app.mock.test.js | 129 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 109 insertions(+), 20 deletions(-) diff --git a/app.mock.test.js b/app.mock.test.js index 79b9449..3d03908 100644 --- a/app.mock.test.js +++ b/app.mock.test.js @@ -1,23 +1,21 @@ +jest.mock('./validation/validateEmail', () => jest.fn()) + const createApp = require('./app') const request = require('supertest') const validateUsername = require('./validation/validateUsername') const validatePassword = require('./validation/validatePassword') - -//Mock validateEmail to isolate tests -jest.mock('./validation/validateEmail', () => { - return jest.fn((email) => { - //Simulate real world simulation - if (!email || typeof email !== 'string') return false; - const re = /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/i; - return re.test(email); - }) -}) - const validateEmail = require('./validation/validateEmail') + const app = createApp(validateUsername, validatePassword, validateEmail) +beforeEach(() => { + validateEmail.mockReset() +}) + describe('given correct username and password', () => { test('return status 200', async () => { + validateEmail.mockReturnValue(true) + const response = await request(app).post('/users').send({ username: 'Username', password: 'Password123', @@ -27,6 +25,8 @@ describe('given correct username and password', () => { }) test('returns userId', async () => { + validateEmail.mockReturnValue(true) + const response = await request(app).post('/users').send({ username: 'Username', password: 'Password123', @@ -35,25 +35,114 @@ describe('given correct username and password', () => { expect(response.body.userId).toBeDefined(); }) - // test response content type? - // test response message - // test response user id value - // ... + test('returns correct message', async () => { + validateEmail.mockReturnValue(true) + + const response = await request(app).post('/users').send({ + username: 'Username', + password: 'Password123', + email: 'student@example.com' + }) + expect(response.body.message).toBe("Valid User") + }) + + test('content-type is json', async () => { + validateEmail.mockReturnValue(true) + + const response = await request(app).post('/users').send({ + username: 'Username', + password: 'Password123', + email: 'student@example.com' + }) + expect(response.headers['content-type']).toMatch(/json/) + }) + + test('userId has correct value', async () => { + validateEmail.mockReturnValue(true) + + const response = await request(app).post('/users').send({ + username: 'Username', + password: 'Password123', + email: 'student@example.com' + }) + expect(response.body.userId).toBe('1') + }) }) describe('given incorrect or missing username and password', () => { test('return status 400', async () => { + validateEmail.mockReturnValue(false) + + const response = await request(app).post('/users').send({ + username: 'user', + password: 'password', + email: 'not-an-email' + }) + expect(response.statusCode).toBe(400) + }) + + test('returns error message', async () => { + validateEmail.mockReturnValue(false) + const response = await request(app).post('/users').send({ username: 'user', password: 'password', email: 'not-an-email' }) + expect(response.body.error).toBe("Invalid User") + }) + + test('does NOT return userId', async () => { + validateEmail.mockReturnValue(false) + + const response = await request(app).post('/users').send({ + username: 'user', + password: 'password', + email: 'not-an-email' + }) + expect(response.body.userId).toBeUndefined() + }) + + test('missing username returns 400', async () => { + validateEmail.mockReturnValue(true) + + const response = await request(app).post('/users').send({ + password: 'Password123', + email: 'student@example.com' + }) expect(response.statusCode).toBe(400) }) - // test response message - // test that response does NOT have userId - // test incorrect username or password according to requirements - // test missing username or password - // ... + test('missing password returns 400', async () => { + validateEmail.mockReturnValue(true) + + const response = await request(app).post('/users').send({ + username: 'Username', + email: 'student@example.com' + }) + expect(response.statusCode).toBe(400) + }) + + test('missing email returns 400 (coverage for validateEmail)', async () => { + validateEmail.mockReturnValue(false) + + const response = await request(app).post('/users').send({ + username: 'Username', + password: 'Password123' + }) + + expect(response.statusCode).toBe(400) + }) + + test('email is not a string returns 400', async () => { + validateEmail.mockReturnValue(false) + + const response = await request(app).post('/users').send({ + username: 'Username', + password: 'Password123', + email: 12345 + }) + + expect(response.statusCode).toBe(400) + }) }) \ No newline at end of file