-
Notifications
You must be signed in to change notification settings - Fork 17
/
index.js
143 lines (113 loc) · 3.41 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/**
* Copyright 2015 Urban Airship Inc. and Contributors. Subject to the LICENSE
* file at the top-level directory of this distribution and at
* https://github.com/urbanairship/frock/blob/master/LICENSE
*/
const fs = require('fs')
const http = require('http')
const net = require('net')
const path = require('path')
const url = require('url')
const test = require('tape')
const portfinder = require('portfinder')
const proxyquire = require('proxyquire')
const fakeModule = require('../stubs/fake-module')
const fakeBole = fakeModule({}, ['debug', 'warn', 'error', 'info'])
const lib = proxyquire(
'../../lib',
{
'bole': fakeBole.mock,
'@noCallThru': true
}
)
const pwd = __dirname
const TEST_HEADER_NAME = 'x-frock-header'
let ports
let frockfile
let frock
test(`setup ${__filename}`, t => {
t.plan(1)
frockfile = JSON.parse(fs.readFileSync(path.join(__dirname, 'frockfile.json')))
portfinder.getPorts(3, (err, foundPorts) => {
if (err) {
t.fail(err)
}
ports = foundPorts
// mangle the found ports into the loaded frockfile
frockfile.servers[0].port = ports[0]
frockfile.servers[1].port = ports[1]
frockfile.sockets[0].port = ports[2]
frock = lib(frockfile, {pwd})
frock.run(err => {
if (err) {
t.fail(err)
}
t.pass('started frock instance')
})
})
fakeBole.on('error', () => {}) // silences eventemitter errors
})
test('can contact started http services', t => {
const servers = [
['get', `http://localhost:${ports[0]}`, 'any-route'],
['get', `http://localhost:${ports[0]}/path/`, 'whoop'],
['post', `http://localhost:${ports[0]}/path/`, 'post-route'],
['get', `http://localhost:${ports[1]}/`, 'any-route']
]
t.plan(servers.length)
servers.forEach(([method, path, expected]) => {
makeRequest(method, path, (err, result) => {
if (err) t.fail('error during request', err)
t.equal(result, expected)
})
})
})
test('middleware was set where appropriate', t => {
t.plan(3)
makeRequest('get', `http://localhost:${ports[0]}`, (err, _, res) => {
if (err) t.fail('got error', err)
t.notOk(res.headers[TEST_HEADER_NAME], 'no middleware applied')
})
makeRequest('get', `http://localhost:${ports[0]}/path/`, (err, _, res) => {
if (err) t.fail('got error', err)
t.equal(res.headers[TEST_HEADER_NAME], 'frock', 'per-route middleware')
})
makeRequest('get', `http://localhost:${ports[1]}/`, (err, _, res) => {
if (err) t.fail('got error', err)
t.equal(res.headers[TEST_HEADER_NAME], 'frock', 'per-server middleware')
})
})
test('can contact started socket server', t => {
t.plan(1)
const client = net.createConnection(ports[2], () => {
client.on('data', buf => {
t.equal(buf.toString(), 'socket')
})
})
})
test('can restart frock', t => {
t.plan(2)
frock.reload(() => {
t.pass('reloaded')
makeRequest('get', `http://localhost:${ports[0]}`, (err, result) => {
if (err) t.fail('got error', err)
t.equal(result, 'any-route')
})
})
})
test(`teardown ${__filename}`, t => {
t.plan(1)
frock.stop(() => t.pass('tore it down'))
})
function makeRequest (method, path, ready) {
const req = http.request(Object.assign(url.parse(path), {method}), res => {
res.on('data', buf => {
ready(null, buf.toString(), res)
})
})
req.on('error', err => ready(err))
if (method === 'post') {
req.write(new Buffer('payload'))
}
req.end()
}