const micro = require('micro')
const test = require('ava')
const listen = require('test-listen')
const request = require('request-promise')
const { parse: parseUrl } = require('url')
const fetchManifest = require('./')
test('returns manifest of web page', async t => {
// setup mock site with manifest to use the service on:
const mockSite = micro(async (req, res) => {
const manifestUrl = '/manifest-mock.json'
if (req.url === '/') {
res.setHeader('Content-Type', 'text/html')
return micro.send(res, 200, ``)
}
if (req.url === manifestUrl) {
return micro.send(res, 200, { name: 'mock manifest' })
}
})
const mockSiteUrl = await listen(mockSite)
// use service on mock site:
const service = micro(fetchManifest)
const url = await listen(service)
const body = await request(`${url}/?url=${mockSiteUrl}`)
const data = JSON.parse(body)
// assert service response:
t.deepEqual(parseUrl(data.manifestUrl).pathname, '/manifest-mock.json')
t.deepEqual(data.manifest, { name: 'mock manifest' })
// clean up:
mockSite.close()
service.close()
})
test('returns `400` `MISSING_PARAMETER` if request has no `url` parameter', async t => {
// use service on mock site:
const service = micro(fetchManifest)
const url = await listen(service)
const response = await request({
method: 'GET',
uri: `${url}/`,
resolveWithFullResponse: true,
simple: false,
})
const { errors } = JSON.parse(response.body)
// assert service response:
t.deepEqual(response.statusCode, 400)
t.deepEqual(errors[0].code, 'MISSING_PARAMETER')
// clean up:
service.close()
})
test('returns `404` `MISSING_MANIFEST` if site has no manifest', async t => {
// setup mock site to use the service on:
const mockSite = micro(async (req, res) => micro.send(res, 200, {}))
const mockSiteUrl = await listen(mockSite)
// use service on mock site:
const service = micro(fetchManifest)
const url = await listen(service)
const response = await request({
method: 'GET',
uri: `${url}/?url=${mockSiteUrl}`,
resolveWithFullResponse: true,
simple: false,
})
const { errors } = JSON.parse(response.body)
// assert service response:
t.deepEqual(response.statusCode, 404)
t.deepEqual(errors[0].code, 'MISSING_MANIFEST')
// clean up:
mockSite.close()
service.close()
})
test('returns `405` `METHOD_NOT_ALLOWED` if not a GET request', async t => {
// setup mock site to use the service on:
const mockSite = micro(async (req, res) => micro.send(res, 200, {}))
const mockSiteUrl = await listen(mockSite)
// use service on mock site:
const service = micro(fetchManifest)
const url = await listen(service)
const response = await request({
method: 'DELETE',
uri: `${url}/?url=${mockSiteUrl}`,
resolveWithFullResponse: true,
simple: false,
})
const { errors } = JSON.parse(response.body)
// assert service response:
t.deepEqual(response.statusCode, 405)
t.deepEqual(errors[0].code, 'METHOD_NOT_ALLOWED')
// clean up:
mockSite.close()
service.close()
})
test('returns `500` `FETCH_ERROR` if web page is not found', async t => {
// setup mock site to use the service on:
const mockSite = micro(async (req, res) => micro.send(res, 404, {}))
const mockSiteUrl = await listen(mockSite)
// use service on mock site:
const service = micro(fetchManifest)
const url = await listen(service)
const response = await request({
method: 'GET',
uri: `${url}/?url=${mockSiteUrl}`,
resolveWithFullResponse: true,
simple: false,
})
const { errors } = JSON.parse(response.body)
// assert service response:
t.deepEqual(response.statusCode, 500)
t.deepEqual(errors[0].code, 'FETCH_ERROR')
// clean up:
mockSite.close()
service.close()
})
test('returns `500` `FETCH_ERROR` if linked manifest is not found', async t => {
// setup mock site to use the service on:
const mockSite = micro(async (req, res) => {
const manifestUrl = '/manifest-mock.json'
if (req.url === '/') {
res.setHeader('Content-Type', 'text/html')
return micro.send(res, 200, ``)
}
return micro.send(res, 404, {})
})
const mockSiteUrl = await listen(mockSite)
// use service on mock site:
const service = micro(fetchManifest)
const url = await listen(service)
const response = await request({
method: 'GET',
uri: `${url}/?url=${mockSiteUrl}`,
resolveWithFullResponse: true,
simple: false,
})
const { errors } = JSON.parse(response.body)
// assert service response:
t.deepEqual(response.statusCode, 500)
t.deepEqual(errors[0].code, 'FETCH_ERROR')
// clean up:
mockSite.close()
service.close()
})
test('returns `500` `INVALID_MANIFEST` if linked manifest is invalid', async t => {
// setup mock site to use the service on:
const mockSite = micro(async (req, res) => {
const manifestUrl = '/manifest-mock.json'
if (req.url === '/') {
res.setHeader('Content-Type', 'text/html')
return micro.send(res, 200, ``)
}
if (req.url === manifestUrl) {
return micro.send(res, 200, 'mock manifest')
}
})
const mockSiteUrl = await listen(mockSite)
// use service on mock site:
const service = micro(fetchManifest)
const url = await listen(service)
const response = await request({
method: 'GET',
uri: `${url}/?url=${mockSiteUrl}`,
resolveWithFullResponse: true,
simple: false,
})
const { errors } = JSON.parse(response.body)
// assert service response:
t.deepEqual(response.statusCode, 500)
t.deepEqual(errors[0].code, 'INVALID_MANIFEST')
// clean up:
mockSite.close()
service.close()
})