overleaf/services/web/test/frontend/infrastructure/fetch-json.test.js
Alf Eaton c7f3c72663 Merge pull request #3618 from overleaf/ae-fetch-json-oerror
Ensure that fetchJSON always throws OError

GitOrigin-RevId: 24bea67992e7b5957b2eaaf5ffe2202879534d39
2021-02-11 03:04:25 +00:00

96 lines
2.3 KiB
JavaScript

import { expect } from 'chai'
import fetchMock from 'fetch-mock'
import {
deleteJSON,
FetchError,
getJSON,
postJSON,
putJSON
} from '../../../frontend/js/infrastructure/fetch-json'
describe('fetchJSON', function() {
before(function() {
fetchMock.restore()
})
afterEach(function() {
fetchMock.restore()
})
const headers = {
Accept: 'application/json',
'Content-Type': 'application/json'
}
it('handles GET requests', function() {
fetchMock.once(
{ method: 'GET', url: '/test', headers },
{ status: 200, body: { result: 'success' } }
)
return expect(getJSON('/test')).to.eventually.deep.equal({
result: 'success'
})
})
it('handles 4xx responses', function() {
fetchMock.get('/test', {
status: 400,
body: { message: 'The request was invalid' }
})
return expect(getJSON('/test'))
.to.eventually.be.rejectedWith('Bad Request')
.and.be.an.instanceOf(FetchError)
.to.nested.include({
message: 'Bad Request',
'data.message': 'The request was invalid',
'response.status': 400,
'info.statusCode': 400
})
})
it('handles 5xx responses', async function() {
fetchMock.get('/test', { status: 500 })
return expect(getJSON('/test'))
.to.eventually.be.rejectedWith('Internal Server Error')
.and.be.an.instanceOf(FetchError)
.to.nested.include({
'response.status': 500,
'info.statusCode': 500
})
})
it('handles POST requests', function() {
const body = { example: true }
fetchMock.once(
{ method: 'POST', url: '/test', headers, body },
{ status: 200, body: { result: 'success' } }
)
return expect(postJSON('/test', { body })).to.eventually.deep.equal({
result: 'success'
})
})
it('handles PUT requests', function() {
const body = { example: true }
fetchMock.once(
{ method: 'PUT', url: '/test', headers, body },
{ status: 200, body: { result: 'success' } }
)
return expect(putJSON('/test', { body })).to.eventually.deep.equal({
result: 'success'
})
})
it('handles DELETE requests', function() {
fetchMock.once({ method: 'DELETE', url: '/test', headers }, { status: 204 })
return expect(deleteJSON('/test')).to.eventually.deep.equal({})
})
})