165 lines
4.6 KiB
JavaScript
165 lines
4.6 KiB
JavaScript
|
import { Eltro as t, assert} from 'eltro'
|
||
|
import http from 'http'
|
||
|
import { request } from '../core/client.mjs'
|
||
|
|
||
|
const port = 61412
|
||
|
const defaultHandler = function(req, res) {
|
||
|
res.statusCode = 200
|
||
|
res.end('{"a":1}');
|
||
|
}
|
||
|
let server = null
|
||
|
let prefix = `http://localhost:${port}/`
|
||
|
let handler = defaultHandler
|
||
|
|
||
|
t.before(function(cb) {
|
||
|
server = http.createServer(function(req, res) {
|
||
|
req.on('error', function(err) {
|
||
|
console.log('error', err)
|
||
|
})
|
||
|
res.on('error', function(err) {
|
||
|
console.log('error', err)
|
||
|
})
|
||
|
handler(req, res)
|
||
|
})
|
||
|
server.listen(port, cb)
|
||
|
})
|
||
|
|
||
|
t.describe('Basics', function() {
|
||
|
t.beforeEach(function() {
|
||
|
handler = defaultHandler
|
||
|
})
|
||
|
|
||
|
t.test('should require valid config', async function() {
|
||
|
function checkError(err) {
|
||
|
assert.match(err.message, /config/i)
|
||
|
}
|
||
|
|
||
|
await assert.isRejected(request(prefix)).then(checkError)
|
||
|
await assert.isRejected(request('', prefix)).then(checkError)
|
||
|
await assert.isRejected(request([], prefix)).then(checkError)
|
||
|
await assert.isRejected(request(123, prefix)).then(checkError)
|
||
|
await assert.isRejected(request(0, prefix)).then(checkError)
|
||
|
})
|
||
|
|
||
|
t.test('should fail if url is invalid', async function() {
|
||
|
function checkError(err) {
|
||
|
assert.match(err.message, /invalid/i)
|
||
|
assert.match(err.message, /url/i)
|
||
|
}
|
||
|
|
||
|
await assert.isRejected(request({}, 123)).then(checkError)
|
||
|
await assert.isRejected(request({}, [])).then(checkError)
|
||
|
await assert.isRejected(request({}, {})).then(checkError)
|
||
|
await assert.isRejected(request({}, '')).then(checkError)
|
||
|
await assert.isRejected(request({}, 'asdf')).then(checkError)
|
||
|
await assert.isRejected(request({}, 'httpppp')).then(checkError)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
t.describe('Request', function() {
|
||
|
t.beforeEach(function() {
|
||
|
handler = defaultHandler
|
||
|
})
|
||
|
|
||
|
t.test('should work normally', async function() {
|
||
|
let res = await request({}, prefix)
|
||
|
assert.deepEqual(res.body, {a:1})
|
||
|
})
|
||
|
|
||
|
t.test('should follow redirects', async function() {
|
||
|
let counter = 0
|
||
|
handler = function(req, res) {
|
||
|
if (counter < 3) {
|
||
|
res.statusCode = 302
|
||
|
res.setHeader('Location', encodeURI(prefix))
|
||
|
res.end();
|
||
|
counter++
|
||
|
return
|
||
|
}
|
||
|
assert.strictEqual(req.url, '/')
|
||
|
res.statusCode = 200
|
||
|
res.end('{"a":1}');
|
||
|
return
|
||
|
}
|
||
|
let res = await request({}, prefix)
|
||
|
assert.deepEqual(res.body, {a:1})
|
||
|
assert.strictEqual(counter, 3)
|
||
|
})
|
||
|
|
||
|
t.test('should fail if infinite redirect', async function() {
|
||
|
const assertRelativeLocation = 'some/text/here'
|
||
|
const assertLocation = prefix + assertRelativeLocation
|
||
|
let counter = 0
|
||
|
handler = function(req, res) {
|
||
|
res.statusCode = 302
|
||
|
res.setHeader('Location', encodeURI(assertLocation))
|
||
|
if (counter === 0) {
|
||
|
assert.strictEqual(req.url, '/')
|
||
|
} else {
|
||
|
assert.strictEqual(req.url, '/' + assertRelativeLocation)
|
||
|
}
|
||
|
res.end();
|
||
|
counter++
|
||
|
}
|
||
|
|
||
|
let err = await assert.isRejected(request({}, prefix))
|
||
|
assert.strictEqual(counter, 6)
|
||
|
assert.match(err.message, /redirect/i)
|
||
|
assert.match(err.message, new RegExp(assertRelativeLocation))
|
||
|
})
|
||
|
|
||
|
t.test('should fail if redirect is missing location', async function() {
|
||
|
let counter = 0
|
||
|
handler = function(req, res) {
|
||
|
res.statusCode = 302
|
||
|
res.end();
|
||
|
counter++
|
||
|
}
|
||
|
|
||
|
let err = await assert.isRejected(request({}, prefix))
|
||
|
assert.strictEqual(counter, 1)
|
||
|
assert.match(err.message, /redirect/i)
|
||
|
assert.match(err.message, /location/i)
|
||
|
})
|
||
|
|
||
|
t.test('should follow relative redirects', async function() {
|
||
|
const assertUrl = 'asdf1234'
|
||
|
let counter = 0
|
||
|
let url = ''
|
||
|
handler = function(req, res) {
|
||
|
if (counter < 1) {
|
||
|
res.statusCode = 302
|
||
|
res.setHeader('Location', encodeURI(assertUrl))
|
||
|
res.end();
|
||
|
counter++
|
||
|
return
|
||
|
}
|
||
|
url = req.url
|
||
|
res.statusCode = 200
|
||
|
res.end('{"a":1}');
|
||
|
return
|
||
|
}
|
||
|
let res = await request({}, prefix)
|
||
|
assert.deepEqual(res.body, {a:1})
|
||
|
assert.strictEqual(counter, 1)
|
||
|
assert.strictEqual(url, '/' + assertUrl)
|
||
|
|
||
|
counter = 0
|
||
|
res = await request({}, prefix + 'some/url/here')
|
||
|
assert.deepEqual(res.body, {a:1})
|
||
|
assert.strictEqual(counter, 1)
|
||
|
assert.strictEqual(url, '/some/url/' + assertUrl)
|
||
|
})
|
||
|
|
||
|
t.timeout(30).test('should support timeout on invalid url', async function() {
|
||
|
// blocked off port, should time out
|
||
|
let err = await assert.isRejected(request({ timeout: 15 }, 'http://git.nfp.is:8080'))
|
||
|
assert.match(err.message, /timed out/i)
|
||
|
assert.match(err.message, /15/i)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
t.after(function(cb) {
|
||
|
server.close(cb)
|
||
|
})
|