From 7ca963149a916e9868ca8add4a37b51702fc5935 Mon Sep 17 00:00:00 2001 From: Dimitri Larionov Date: Wed, 22 Apr 2026 11:40:43 +0300 Subject: [PATCH] API testid and Mocked API testid --- app.mock.test.js | 126 +++++++++++++++++++++++++++-------------------- app.test.js | 103 +++++++++++++++++++++++--------------- 2 files changed, 136 insertions(+), 93 deletions(-) diff --git a/app.mock.test.js b/app.mock.test.js index 79b9449..efe6fac 100644 --- a/app.mock.test.js +++ b/app.mock.test.js @@ -1,59 +1,79 @@ -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 createApp = require('./app') +jest.mock('./validation/validateEmail', () => jest.fn()) const validateEmail = require('./validation/validateEmail') -const app = createApp(validateUsername, validatePassword, validateEmail) - -describe('given correct username and password', () => { - test('return status 200', async () => { - const response = await request(app).post('/users').send({ - username: 'Username', - password: 'Password123', - email: 'student@example.com' - }) - expect(response.statusCode).toBe(200) - }) - - test('returns userId', async () => { - const response = await request(app).post('/users').send({ - username: 'Username', - password: 'Password123', - email: 'student@example.com' - }) - expect(response.body.userId).toBeDefined(); - }) - - // test response content type? - // test response message - // test response user id value - // ... + +const testRunStart = Date.now() + +afterAll(() => { + const durationMs = Date.now() - testRunStart + console.log(`Test run time: ${durationMs}ms`) }) -describe('given incorrect or missing username and password', () => { - test('return status 400', async () => { - const response = await request(app).post('/users').send({ - username: 'user', - password: 'password', - email: 'not-an-email' - }) - 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 - // ... +const validPayload = { + username: 'User.name1', + password: 'Password123', + email: 'student@example.com' +} + +beforeEach(() => { + jest.clearAllMocks() +}) + +describe('POST /users validation flow with mocked email validator', () => { + test('returns 200 with user details when validators approve', async () => { + const mockValidateUsername = jest.fn().mockReturnValue(true) + const mockValidatePassword = jest.fn().mockReturnValue(true) + validateEmail.mockReturnValue(true) + const app = createApp(mockValidateUsername, mockValidatePassword, validateEmail) + + const response = await request(app).post('/users').send(validPayload) + + expect(response.status).toBe(200) + expect(response.headers['content-type']).toMatch(/json/) + expect(response.body).toEqual({ userId: '1', message: 'Valid User' }) + expect(mockValidateUsername).toHaveBeenCalledWith(validPayload.username) + expect(mockValidatePassword).toHaveBeenCalledWith(validPayload.password) + expect(validateEmail).toHaveBeenCalledWith(validPayload.email) + }) + + test('returns 400 when username validation fails', async () => { + const mockValidateUsername = jest.fn().mockReturnValue(false) + const mockValidatePassword = jest.fn().mockReturnValue(true) + validateEmail.mockReturnValue(true) + const app = createApp(mockValidateUsername, mockValidatePassword, validateEmail) + + const response = await request(app).post('/users').send(validPayload) + + expect(response.status).toBe(400) + expect(response.body).toEqual({ error: 'Invalid User' }) + expect(response.body.userId).toBeUndefined() + }) + + test('returns 400 when password validation fails', async () => { + const mockValidateUsername = jest.fn().mockReturnValue(true) + const mockValidatePassword = jest.fn().mockReturnValue(false) + validateEmail.mockReturnValue(true) + const app = createApp(mockValidateUsername, mockValidatePassword, validateEmail) + + const response = await request(app).post('/users').send(validPayload) + + expect(response.status).toBe(400) + expect(response.body).toEqual({ error: 'Invalid User' }) + expect(response.body.userId).toBeUndefined() + }) + + test('returns 400 when email validation fails', async () => { + const mockValidateUsername = jest.fn().mockReturnValue(true) + const mockValidatePassword = jest.fn().mockReturnValue(true) + validateEmail.mockReturnValue(false) + const app = createApp(mockValidateUsername, mockValidatePassword, validateEmail) + + const response = await request(app).post('/users').send(validPayload) + + expect(response.status).toBe(400) + expect(response.body).toEqual({ error: 'Invalid User' }) + expect(response.body.userId).toBeUndefined() + }) }) \ No newline at end of file diff --git a/app.test.js b/app.test.js index f1b561d..3fa931f 100644 --- a/app.test.js +++ b/app.test.js @@ -1,49 +1,72 @@ -const createApp = require('./app') const request = require('supertest') -const validateUsername = require('./validation/validateUsername') -const validatePassword = require('./validation/validatePassword') -const validateEmail = require('./validation/validateEmail') - -const app = createApp(validateUsername, validatePassword, validateEmail) - -describe('given correct username and password', () => { - test('return status 200', async () => { - const response = await request(app).post('/users').send({ - username: 'Username', - password: 'Password123', - email: 'student@example.com' - }) - expect(response.statusCode).toBe(200) +const createApp = require('./app') + +const testRunStart = Date.now() + +afterAll(() => { + const durationMs = Date.now() - testRunStart + console.log(`Test run time: ${durationMs}ms`) +}) + +const validPayload = { + username: 'User.name1', + password: 'Password123', + email: 'student@example.com' +} + +describe('POST /users validation flow', () => { + test('returns 200 with user details when validators approve', async () => { + const mockValidateUsername = jest.fn().mockReturnValue(true) + const mockValidatePassword = jest.fn().mockReturnValue(true) + const mockValidateEmail = jest.fn().mockReturnValue(true) + const app = createApp(mockValidateUsername, mockValidatePassword, mockValidateEmail) + + const response = await request(app).post('/users').send(validPayload) + + expect(response.status).toBe(200) + expect(response.headers['content-type']).toMatch(/json/) + expect(response.body).toEqual({ userId: '1', message: 'Valid User' }) + expect(mockValidateUsername).toHaveBeenCalledWith(validPayload.username) + expect(mockValidatePassword).toHaveBeenCalledWith(validPayload.password) + expect(mockValidateEmail).toHaveBeenCalledWith(validPayload.email) }) - test('returns userId', async () => { - const response = await request(app).post('/users').send({ - username: 'Username', - password: 'Password123', - email: 'student@example.com' - }) - expect(response.body.userId).toBeDefined(); + test('returns 400 when username validation fails', async () => { + const mockValidateUsername = jest.fn().mockReturnValue(false) + const mockValidatePassword = jest.fn().mockReturnValue(true) + const mockValidateEmail = jest.fn().mockReturnValue(true) + const app = createApp(mockValidateUsername, mockValidatePassword, mockValidateEmail) + + const response = await request(app).post('/users').send(validPayload) + + expect(response.status).toBe(400) + expect(response.body).toEqual({ error: 'Invalid User' }) + expect(response.body.userId).toBeUndefined() }) - // test response content type? - // test response message - // test response user id value - // ... -}) + test('returns 400 when password validation fails', async () => { + const mockValidateUsername = jest.fn().mockReturnValue(true) + const mockValidatePassword = jest.fn().mockReturnValue(false) + const mockValidateEmail = jest.fn().mockReturnValue(true) + const app = createApp(mockValidateUsername, mockValidatePassword, mockValidateEmail) -describe('given incorrect or missing username and password', () => { - test('return status 400', async () => { - const response = await request(app).post('/users').send({ - username: 'user', - password: 'password', - email: 'not-an-email' - }) - expect(response.statusCode).toBe(400) + const response = await request(app).post('/users').send(validPayload) + + expect(response.status).toBe(400) + expect(response.body).toEqual({ error: 'Invalid User' }) + expect(response.body.userId).toBeUndefined() }) - // 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 400 when email validation fails', async () => { + const mockValidateUsername = jest.fn().mockReturnValue(true) + const mockValidatePassword = jest.fn().mockReturnValue(true) + const mockValidateEmail = jest.fn().mockReturnValue(false) + const app = createApp(mockValidateUsername, mockValidatePassword, mockValidateEmail) + + const response = await request(app).post('/users').send(validPayload) + + expect(response.status).toBe(400) + expect(response.body).toEqual({ error: 'Invalid User' }) + expect(response.body.userId).toBeUndefined() + }) }) \ No newline at end of file