2021-11-24 00:00:22 +01:00
|
|
|
import dayjs from 'dayjs'
|
|
|
|
|
|
|
|
|
|
import {
|
2021-11-28 19:40:16 +01:00
|
|
|
validateJSONRequest,
|
|
|
|
|
validateStringRequest,
|
2021-11-24 00:00:22 +01:00
|
|
|
ValidationError,
|
|
|
|
|
ValidationErrorCode,
|
|
|
|
|
} from '../../src/common/request'
|
|
|
|
|
|
|
|
|
|
describe('request', () => {
|
2021-11-28 19:40:16 +01:00
|
|
|
describe('validateStringRequest', () => {
|
2021-11-24 00:00:22 +01:00
|
|
|
test('should return ReservationRequest', () => {
|
|
|
|
|
const body = JSON.stringify({
|
|
|
|
|
username: 'collin',
|
|
|
|
|
password: '123abc',
|
2021-11-24 15:38:58 +01:00
|
|
|
dateRange: {
|
|
|
|
|
start: '2021-12-25T12:34:56Z',
|
|
|
|
|
end: '2021-12-25T12:45:56Z'
|
|
|
|
|
},
|
2021-11-24 00:00:22 +01:00
|
|
|
opponent: {
|
|
|
|
|
id: '123',
|
|
|
|
|
name: 'collin',
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
2021-11-28 19:40:16 +01:00
|
|
|
expect(() => validateStringRequest(body)).not.toThrow()
|
2021-11-24 00:00:22 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
test('should fail for undefined body', () => {
|
2021-11-28 19:40:16 +01:00
|
|
|
expect(() => validateStringRequest(undefined)).toThrowError(new ValidationError('Invalid request', ValidationErrorCode.UNDEFINED_REQUEST_BODY))
|
2021-11-24 00:00:22 +01:00
|
|
|
})
|
|
|
|
|
|
2021-11-24 15:38:58 +01:00
|
|
|
test('should fail for invalid json', () => {
|
|
|
|
|
const body = `A{
|
|
|
|
|
username: 'collin',
|
|
|
|
|
password: '123abc',
|
|
|
|
|
dateRange: {
|
|
|
|
|
start: '2021-12-25T12:34:56Z',
|
|
|
|
|
end: '2021-12-25T12:45:56Z'
|
|
|
|
|
},
|
|
|
|
|
opponent: {
|
|
|
|
|
id: '123',
|
|
|
|
|
name: 'collin',
|
|
|
|
|
}
|
|
|
|
|
}`
|
|
|
|
|
|
2021-11-28 19:40:16 +01:00
|
|
|
expect(() => validateStringRequest(body)).toThrowError(new ValidationError('Invalid request', ValidationErrorCode.INVALID_JSON))
|
2021-11-24 15:38:58 +01:00
|
|
|
})
|
|
|
|
|
|
2021-11-24 00:00:22 +01:00
|
|
|
test.each([
|
2021-11-24 15:38:58 +01:00
|
|
|
{ username: '', password: '1qaz2wsx', dateRange: { start: '1', end: '1' }, opponent: { id: '123', name: 'abc' } },
|
|
|
|
|
{ password: '1qaz2wsx', dateRange: { start: '1', end: '1' }, opponent: { id: '123', name: 'abc' } },
|
|
|
|
|
{ username: 'collin', password: '', dateRange: { start: '1', end: '1' }, opponent: { id: '123', name: 'abc' } },
|
|
|
|
|
{ username: 'collin', dateRange: { start: '1', end: '1' }, opponent: { id: '123', name: 'abc' } },
|
|
|
|
|
{ username: 'collin', password: '1qaz2wsx', dateRange: {}, opponent: { id: '123', name: 'abc' } },
|
|
|
|
|
{ username: 'collin', password: '1qaz2wsx', dateRange: { start: '1' }, opponent: { id: '123', name: 'abc' } },
|
|
|
|
|
{ username: 'collin', password: '1qaz2wsx', dateRange: { end: '1' }, opponent: { id: '123', name: 'abc' } },
|
2021-11-24 00:00:22 +01:00
|
|
|
{ username: 'collin', password: '1qaz2wsx', opponent: { id: '123', name: 'abc' } },
|
2021-11-24 15:38:58 +01:00
|
|
|
{ username: 'collin', password: '1qaz2wsx', dateRange: { start: '1', end: '1' }, opponent: { id: '', name: 'abc' } },
|
|
|
|
|
{ username: 'collin', password: '1qaz2wsx', dateRange: { start: '1', end: '1' }, opponent: { name: 'abc' } },
|
|
|
|
|
{ username: 'collin', password: '1qaz2wsx', dateRange: { start: '1', end: '1' }, opponent: { id: '123', name: '' } },
|
|
|
|
|
{ username: 'collin', password: '1qaz2wsx', dateRange: { start: '1', end: '1' }, opponent: { id: '123' } },
|
2021-11-24 00:00:22 +01:00
|
|
|
])('should fail for body missing required values', (body) => {
|
2021-11-28 19:40:16 +01:00
|
|
|
expect(() => validateStringRequest(JSON.stringify(body))).toThrowError(new ValidationError('Invalid request', ValidationErrorCode.INVALID_REQUEST_BODY))
|
2021-11-24 00:00:22 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
test('should fail for invalid date range', () => {
|
|
|
|
|
const body = JSON.stringify({
|
|
|
|
|
username: 'collin',
|
|
|
|
|
password: '123abc',
|
2021-11-24 15:38:58 +01:00
|
|
|
dateRange: {
|
|
|
|
|
start: 'monkey',
|
|
|
|
|
end: '2021-12-25T12:45:56Z'
|
|
|
|
|
},
|
2021-11-24 00:00:22 +01:00
|
|
|
opponent: {
|
|
|
|
|
id: '123',
|
|
|
|
|
name: 'collin',
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
2021-11-28 19:40:16 +01:00
|
|
|
expect(() => validateStringRequest(body)).toThrowError(new ValidationError('Invalid request', ValidationErrorCode.INVALID_DATE_RANGE))
|
2021-11-24 00:00:22 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
test.each([
|
|
|
|
|
{ start: dayjs().subtract(1, 'hour').toString(), end: dayjs().add(1, 'hour').toString() },
|
|
|
|
|
{ start: dayjs().add(2, 'hour').toString(), end: dayjs().add(1, 'hour').toString() },
|
|
|
|
|
{ start: dayjs().toString(), end: dayjs().add(1, 'day').toString() }
|
|
|
|
|
])('should fail for improper start or end dates', (dateRange) => {
|
|
|
|
|
const body = JSON.stringify({
|
|
|
|
|
username: 'collin',
|
|
|
|
|
password: '123abc',
|
2021-11-24 15:38:58 +01:00
|
|
|
dateRange: [
|
2021-11-24 00:00:22 +01:00
|
|
|
dateRange
|
|
|
|
|
],
|
|
|
|
|
opponent: {
|
|
|
|
|
id: '123',
|
|
|
|
|
name: 'collin',
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
2021-11-28 19:40:16 +01:00
|
|
|
expect(() => validateStringRequest(body)).toThrowError(new ValidationError('Invalid request', ValidationErrorCode.INVALID_START_OR_END_DATE))
|
2021-11-24 00:00:22 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
test('should not fail if no opponent is provided', () => {
|
|
|
|
|
const body = JSON.stringify({
|
|
|
|
|
username: 'collin',
|
|
|
|
|
password: '123abc',
|
2021-11-24 15:38:58 +01:00
|
|
|
dateRange: {
|
|
|
|
|
start: '2021-12-25T12:34:56Z',
|
|
|
|
|
end: '2021-12-25T12:45:56Z'
|
|
|
|
|
},
|
2021-11-24 00:00:22 +01:00
|
|
|
})
|
|
|
|
|
|
2021-11-28 19:40:16 +01:00
|
|
|
expect(() => validateStringRequest(body)).not.toThrow()
|
2021-11-24 00:00:22 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
test.each([
|
|
|
|
|
{ id: 123, name: 'collin' },
|
|
|
|
|
{ id: '', name: 'collin' },
|
|
|
|
|
{ id: '123', name: true },
|
|
|
|
|
{ id: '123', name: '' },
|
|
|
|
|
])('should fail for invalid opponent id', (opponent) => {
|
|
|
|
|
const body = JSON.stringify({
|
|
|
|
|
username: 'collin',
|
|
|
|
|
password: '123abc',
|
2021-11-24 15:38:58 +01:00
|
|
|
dateRange: {
|
|
|
|
|
start: '2021-12-25T12:34:56Z',
|
|
|
|
|
end: '2021-12-25T12:45:56Z'
|
|
|
|
|
},
|
2021-11-24 00:00:22 +01:00
|
|
|
opponent,
|
|
|
|
|
})
|
|
|
|
|
|
2021-11-28 19:40:16 +01:00
|
|
|
expect(() => validateStringRequest(body)).toThrowError(new ValidationError('Invalid request', ValidationErrorCode.INVALID_OPPONENT))
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
describe('validateJSONRequest', () => {
|
|
|
|
|
test('should return ReservationRequest', () => {
|
|
|
|
|
const body = {
|
|
|
|
|
username: 'collin',
|
|
|
|
|
password: '123abc',
|
|
|
|
|
dateRange: {
|
|
|
|
|
start: '2021-12-25T12:34:56Z',
|
|
|
|
|
end: '2021-12-25T12:45:56Z'
|
|
|
|
|
},
|
|
|
|
|
opponent: {
|
|
|
|
|
id: '123',
|
|
|
|
|
name: 'collin',
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
expect(() => validateJSONRequest(body)).not.toThrow()
|
2021-11-24 00:00:22 +01:00
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
})
|