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
25 changes: 24 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,27 @@ Jest documentation:
* Käivita: `npm test -- app.mock.test.js`
* Lisa coverage info
* Lisa testide jooksuaja info
* Võrdle jooksumisaega (Ülesanne 1 vs Ülesanne 2)
* Võrdle jooksumisaega (Ülesanne 1 vs Ülesanne 2)

## Test Results

### Ülesanne 1: API testid (`app.test.js`)

- Test Suites: `1 passed, 1 total`
- Tests: `6 passed, 6 total`
- Coverage (All files): `100% statements`, `100% branches`, `100% functions`, `100% lines`
- Runtime: approximately `12s+`

Note: `validateEmail` has an intentional ~2 second busy wait per request, so integration tests without mocking are significantly slower.

### Ülesanne 2: Mocked API testid (`app.mock.test.js`)

- Test Suites: `1 passed, 1 total`
- Tests: `6 passed, 6 total`
- Coverage (All files): `100% statements`, `100% branches`, `100% functions`, `100% lines`
- Runtime: `1.704s`

### Runtime Comparison

- Non-mocked API tests are much slower because real email validation blocks ~2 seconds on every request.
- Mocked API tests remove that delay and run about `6x` faster in this project setup.
70 changes: 46 additions & 24 deletions app.mock.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,44 +16,66 @@ jest.mock('./validation/validateEmail', () => {
const validateEmail = require('./validation/validateEmail')
const app = createApp(validateUsername, validatePassword, validateEmail)

describe('given correct username and password', () => {
test('return status 200', async () => {
const validPayload = {
username: 'User.Name99',
password: 'Password123',
email: 'student@example.com'
}

describe('POST /users', () => {
test('returns success response for valid user', async () => {
const response = await request(app).post('/users').send(validPayload)

expect(response.statusCode).toBe(200)
expect(response.body).toEqual({ userId: '1', message: 'Valid User' })
})

test('returns status 400 when username is shorter than 6 characters', async () => {
const response = await request(app).post('/users').send({
username: 'Username',
password: 'Password123',
email: 'student@example.com'
...validPayload,
username: 'user1'
})
expect(response.statusCode).toBe(200)

expect(response.statusCode).toBe(400)
expect(response.body).toEqual({ error: 'Invalid User' })
})

test('returns userId', async () => {
test('returns status 400 when username contains disallowed characters', async () => {
const response = await request(app).post('/users').send({
username: 'Username',
password: 'Password123',
email: 'student@example.com'
...validPayload,
username: 'User_name'
})
expect(response.body.userId).toBeDefined();

expect(response.statusCode).toBe(400)
})

// test response content type?
// test response message
// test response user id value
// ...
})
test('returns status 400 when password does not meet complexity rules', async () => {
const response = await request(app).post('/users').send({
...validPayload,
password: 'password'
})

expect(response.statusCode).toBe(400)
})

test('returns status 400 when email has no at-symbol', async () => {
const response = await request(app).post('/users').send({
...validPayload,
email: 'student.example.com'
})

expect(response.statusCode).toBe(400)
})

describe('given incorrect or missing username and password', () => {
test('return status 400', async () => {
test('returns only error payload for invalid user', async () => {
const response = await request(app).post('/users').send({
username: 'user',
password: 'password',
email: 'not-an-email'
})

expect(response.statusCode).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
// ...
})
70 changes: 46 additions & 24 deletions app.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,44 +6,66 @@ const validateEmail = require('./validation/validateEmail')

const app = createApp(validateUsername, validatePassword, validateEmail)

describe('given correct username and password', () => {
test('return status 200', async () => {
const validPayload = {
username: 'User.Name99',
password: 'Password123',
email: 'student@example.com'
}

describe('POST /users', () => {
test('returns success response for valid user', async () => {
const response = await request(app).post('/users').send(validPayload)

expect(response.statusCode).toBe(200)
expect(response.body).toEqual({ userId: '1', message: 'Valid User' })
})

test('returns status 400 when username is shorter than 6 characters', async () => {
const response = await request(app).post('/users').send({
username: 'Username',
password: 'Password123',
email: 'student@example.com'
...validPayload,
username: 'user1'
})
expect(response.statusCode).toBe(200)

expect(response.statusCode).toBe(400)
expect(response.body).toEqual({ error: 'Invalid User' })
})

test('returns userId', async () => {
test('returns status 400 when username contains disallowed characters', async () => {
const response = await request(app).post('/users').send({
username: 'Username',
password: 'Password123',
email: 'student@example.com'
...validPayload,
username: 'User_name'
})
expect(response.body.userId).toBeDefined();

expect(response.statusCode).toBe(400)
})

// test response content type?
// test response message
// test response user id value
// ...
})
test('returns status 400 when password does not meet complexity rules', async () => {
const response = await request(app).post('/users').send({
...validPayload,
password: 'password'
})

describe('given incorrect or missing username and password', () => {
test('return status 400', async () => {
expect(response.statusCode).toBe(400)
})

test('returns status 400 when email has no at-symbol', async () => {
const response = await request(app).post('/users').send({
...validPayload,
email: 'student.example.com'
})

expect(response.statusCode).toBe(400)
})

test('returns only error payload for invalid user', async () => {
const response = await request(app).post('/users').send({
username: 'user',
password: 'password',
email: 'not-an-email'
})

expect(response.statusCode).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
// ...
})
10 changes: 9 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading