Skip to content

Commit 0ebf0fa

Browse files
committed
test: Add testutil.HttpServer
The goal is to remove supertest as it does not support typescript well and there's really no good reason for the dependency. Also no websocket testing support.
1 parent 4ff5443 commit 0ebf0fa

File tree

3 files changed

+82
-74
lines changed

3 files changed

+82
-74
lines changed

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@
3838
"@types/js-yaml": "^3.12.3",
3939
"@types/mocha": "^8.0.3",
4040
"@types/node": "^12.12.7",
41+
"@types/node-fetch": "^2.5.7",
4142
"@types/parcel-bundler": "^1.12.1",
4243
"@types/pem": "^1.9.5",
4344
"@types/proxy-from-env": "^1.0.1",
4445
"@types/safe-compare": "^1.1.0",
4546
"@types/semver": "^7.1.0",
4647
"@types/split2": "^2.1.6",
47-
"@types/supertest": "^2.0.10",
4848
"@types/tar-fs": "^2.0.0",
4949
"@types/tar-stream": "^2.1.0",
5050
"@types/ws": "^7.2.6",
@@ -61,7 +61,6 @@
6161
"prettier": "^2.0.5",
6262
"stylelint": "^13.0.0",
6363
"stylelint-config-recommended": "^3.0.0",
64-
"supertest": "^6.0.1",
6564
"ts-node": "^9.0.0",
6665
"typescript": "4.0.2"
6766
},
@@ -81,6 +80,7 @@
8180
"httpolyglot": "^0.1.2",
8281
"js-yaml": "^3.13.1",
8382
"limiter": "^1.1.5",
83+
"node-fetch": "^2.6.1",
8484
"pem": "^1.14.2",
8585
"proxy-agent": "^4.0.0",
8686
"proxy-from-env": "^1.1.0",

test/testutil.ts

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import * as http from "http"
2+
import { logger } from "@coder/logger"
3+
import { ensureAddress } from "../src/node/app"
4+
import * as nodeFetch from "node-fetch"
5+
6+
export class HttpServer {
7+
private hs = http.createServer()
8+
9+
/**
10+
* listen starts the server on a random localhost port.
11+
* Use close to cleanup when done.
12+
*/
13+
public listen(fn: http.RequestListener): Promise<void> {
14+
this.hs.on("request", fn)
15+
16+
let resolved = false
17+
return new Promise((res, rej) => {
18+
this.hs.listen(0, "localhost", () => {
19+
res()
20+
resolved = true
21+
})
22+
23+
this.hs.on("error", (err) => {
24+
if (!resolved) {
25+
rej(err)
26+
} else {
27+
// Promise resolved earlier so this is some other error.
28+
logError("server error", err)
29+
}
30+
})
31+
})
32+
}
33+
34+
/**
35+
* close cleans up the server.
36+
*/
37+
public close(): Promise<void> {
38+
return new Promise((res, rej) => {
39+
this.hs.close((err) => {
40+
if (err) {
41+
rej(err)
42+
return
43+
}
44+
res()
45+
})
46+
})
47+
}
48+
49+
/**
50+
* fetch fetches the request path.
51+
* The request path must be rooted!
52+
*/
53+
public fetch(requestPath: string, opts?: nodeFetch.RequestInit): Promise<nodeFetch.Response> {
54+
return nodeFetch.default(`${ensureAddress(this.hs)}${requestPath}`, opts)
55+
}
56+
}
57+
58+
59+
export function logError(prefix: string, err: any): void {
60+
if (err instanceof Error) {
61+
logger.error(`${prefix}: ${err.message} ${err.stack}`)
62+
} else {
63+
logger.error(`${prefix}: ${err}`)
64+
}
65+
}

yarn.lock

+15-72
Original file line numberDiff line numberDiff line change
@@ -1040,11 +1040,6 @@
10401040
dependencies:
10411041
"@types/express" "*"
10421042

1043-
"@types/cookiejar@*":
1044-
version "2.1.2"
1045-
resolved "https://registry.yarnpkg.com/@types/cookiejar/-/cookiejar-2.1.2.tgz#66ad9331f63fe8a3d3d9d8c6e3906dd10f6446e8"
1046-
integrity sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==
1047-
10481043
"@types/express-serve-static-core@*":
10491044
version "4.17.13"
10501045
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz#d9af025e925fc8b089be37423b8d1eac781be084"
@@ -1108,6 +1103,14 @@
11081103
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.0.3.tgz#51b21b6acb6d1b923bbdc7725c38f9f455166402"
11091104
integrity sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg==
11101105

1106+
"@types/node-fetch@^2.5.7":
1107+
version "2.5.7"
1108+
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c"
1109+
integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==
1110+
dependencies:
1111+
"@types/node" "*"
1112+
form-data "^3.0.0"
1113+
11111114
"@types/node@*", "@types/node@^12.12.7":
11121115
version "12.12.67"
11131116
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.67.tgz#4f86badb292e822e3b13730a1f9713ed2377f789"
@@ -1184,21 +1187,6 @@
11841187
dependencies:
11851188
"@types/node" "*"
11861189

1187-
"@types/superagent@*":
1188-
version "4.1.10"
1189-
resolved "https://registry.yarnpkg.com/@types/superagent/-/superagent-4.1.10.tgz#5e2cc721edf58f64fe9b819f326ee74803adee86"
1190-
integrity sha512-xAgkb2CMWUMCyVc/3+7iQfOEBE75NvuZeezvmixbUw3nmENf2tCnQkW5yQLTYqvXUQ+R6EXxdqKKbal2zM5V/g==
1191-
dependencies:
1192-
"@types/cookiejar" "*"
1193-
"@types/node" "*"
1194-
1195-
"@types/supertest@^2.0.10":
1196-
version "2.0.10"
1197-
resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.10.tgz#630d79b4d82c73e043e43ff777a9ca98d457cab7"
1198-
integrity sha512-Xt8TbEyZTnD5Xulw95GLMOkmjGICrOQyJ2jqgkSjAUR3mm7pAIzSR0NFBaMcwlzVvlpCjNwbATcWWwjNiZiFrQ==
1199-
dependencies:
1200-
"@types/superagent" "*"
1201-
12021190
"@types/tar-fs@^2.0.0":
12031191
version "2.0.0"
12041192
resolved "https://registry.yarnpkg.com/@types/tar-fs/-/tar-fs-2.0.0.tgz#db94cb4ea1cccecafe3d1a53812807efb4bbdbc1"
@@ -2255,7 +2243,7 @@ commander@^5.0.0:
22552243
resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
22562244
integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
22572245

2258-
component-emitter@^1.2.1, component-emitter@^1.3.0:
2246+
component-emitter@^1.2.1:
22592247
version "1.3.0"
22602248
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
22612249
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
@@ -2327,11 +2315,6 @@ [email protected]:
23272315
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
23282316
integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
23292317

2330-
cookiejar@^2.1.2:
2331-
version "2.1.2"
2332-
resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
2333-
integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
2334-
23352318
copy-descriptor@^0.1.0:
23362319
version "0.1.1"
23372320
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
@@ -3428,11 +3411,6 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
34283411
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
34293412
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
34303413

3431-
fast-safe-stringify@^2.0.7:
3432-
version "2.0.7"
3433-
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
3434-
integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==
3435-
34363414
fastest-levenshtein@^1.0.12:
34373415
version "1.0.12"
34383416
resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
@@ -3603,11 +3581,6 @@ format@^0.2.0:
36033581
resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
36043582
integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
36053583

3606-
formidable@^1.2.2:
3607-
version "1.2.2"
3608-
resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9"
3609-
integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==
3610-
36113584
forwarded@~0.1.2:
36123585
version "0.1.2"
36133586
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
@@ -4978,7 +4951,7 @@ merge2@^1.2.3, merge2@^1.3.0:
49784951
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
49794952
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
49804953

4981-
methods@1.1.2, methods@^1.1.2, methods@~1.1.2:
4954+
methods@~1.1.2:
49824955
version "1.1.2"
49834956
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
49844957
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
@@ -5035,11 +5008,6 @@ [email protected]:
50355008
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
50365009
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
50375010

5038-
mime@^2.4.6:
5039-
version "2.4.6"
5040-
resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1"
5041-
integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==
5042-
50435011
mimic-fn@^1.0.0:
50445012
version "1.2.0"
50455013
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
@@ -5214,6 +5182,11 @@ node-addon-api@^1.7.1:
52145182
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d"
52155183
integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==
52165184

5185+
node-fetch@^2.6.1:
5186+
version "2.6.1"
5187+
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
5188+
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
5189+
52175190
node-forge@^0.7.1:
52185191
version "0.7.6"
52195192
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac"
@@ -6405,11 +6378,6 @@ [email protected]:
64056378
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
64066379
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
64076380

6408-
qs@^6.9.4:
6409-
version "6.9.4"
6410-
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
6411-
integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==
6412-
64136381
qs@~6.5.2:
64146382
version "6.5.2"
64156383
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
@@ -7522,31 +7490,6 @@ sugarss@^2.0.0:
75227490
dependencies:
75237491
postcss "^7.0.2"
75247492

7525-
7526-
version "6.1.0"
7527-
resolved "https://registry.yarnpkg.com/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6"
7528-
integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==
7529-
dependencies:
7530-
component-emitter "^1.3.0"
7531-
cookiejar "^2.1.2"
7532-
debug "^4.1.1"
7533-
fast-safe-stringify "^2.0.7"
7534-
form-data "^3.0.0"
7535-
formidable "^1.2.2"
7536-
methods "^1.1.2"
7537-
mime "^2.4.6"
7538-
qs "^6.9.4"
7539-
readable-stream "^3.6.0"
7540-
semver "^7.3.2"
7541-
7542-
supertest@^6.0.1:
7543-
version "6.0.1"
7544-
resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.0.1.tgz#f6b54370de85c45d6557192c8d7df604ca2c9e18"
7545-
integrity sha512-8yDNdm+bbAN/jeDdXsRipbq9qMpVF7wRsbwLgsANHqdjPsCoecmlTuqEcLQMGpmojFBhxayZ0ckXmLXYq7e+0g==
7546-
dependencies:
7547-
methods "1.1.2"
7548-
superagent "6.1.0"
7549-
75507493
75517494
version "7.1.0"
75527495
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"

0 commit comments

Comments
 (0)