Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 73 additions & 53 deletions app.mock.test.js
Original file line number Diff line number Diff line change
@@ -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()
})
})
103 changes: 63 additions & 40 deletions app.test.js
Original file line number Diff line number Diff line change
@@ -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()
})
})
Loading