Skip to content

Commit ca9355d

Browse files
committed
test: octokit.request()
1 parent af8d7e7 commit ca9355d

File tree

10 files changed

+364
-1
lines changed

10 files changed

+364
-1
lines changed

test/agent-ca/README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Setup for local SSL tests
2+
3+
We use a self-signed certificate for local SSL testing. If tests start to fail
4+
due to invalid SSL certificates, try to run these commands
5+
6+
```shell
7+
openssl genrsa -out localhost.key 2048
8+
# Set the common name to "localhost"
9+
openssl req -new -key localhost.key -out localhost.csr
10+
openssl genrsa -out ca.key 2048
11+
# Set the common name to "Nock CA"
12+
openssl req -new -x509 -key ca.key -out ca.crt -days 3650
13+
openssl x509 -req -in localhost.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out localhost.crt -days 3650
14+
rm ca.srl localhost.csr ca.key
15+
```
16+
17+
Thanks to [@timrogers](https://github.com/timrogers) who submitted [a similar
18+
fix for nock](https://github.com/nock/nock/pull/1181).
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { Agent, createServer } from "https";
2+
import { readFileSync } from "fs";
3+
import { resolve } from "path";
4+
5+
const { Octokit } = require("../../src");
6+
const ca = readFileSync(resolve(__dirname, "./ca.crt"));
7+
8+
describe("custom client certificate", () => {
9+
let server: any;
10+
beforeAll(done => {
11+
server = createServer(
12+
{
13+
key: readFileSync(resolve(__dirname, "./localhost.key")),
14+
cert: readFileSync(resolve(__dirname, "./localhost.crt"))
15+
},
16+
(request: any, response: any) => {
17+
expect(request.method).toEqual("GET");
18+
expect(request.url).toEqual("/");
19+
20+
response.writeHead(200);
21+
response.write("ok");
22+
response.end();
23+
}
24+
);
25+
26+
server.listen(0, done);
27+
});
28+
29+
it("https.Agent({ca})", () => {
30+
const agent = new Agent({
31+
ca
32+
});
33+
const octokit = new Octokit({
34+
baseUrl: "https://localhost:" + server.address().port,
35+
request: { agent }
36+
});
37+
38+
return octokit.request("/");
39+
});
40+
41+
it("https.Agent({ca, rejectUnauthorized})", () => {
42+
const agent = new Agent({
43+
ca: "invalid",
44+
rejectUnauthorized: false
45+
});
46+
const octokit = new Octokit({
47+
baseUrl: "https://localhost:" + server.address().port,
48+
request: { agent }
49+
});
50+
51+
return octokit.request("/");
52+
});
53+
54+
afterAll(done => server.close(done));
55+
});

test/agent-ca/ca.crt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICpjCCAY4CCQDBy1d59Ft7YzANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDDApP
3+
Y3Rva2l0IENBMB4XDTE4MDgxMzA1NTY1MVoXDTI4MDgxMDA1NTY1MVowFTETMBEG
4+
A1UEAwwKT2N0b2tpdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
5+
AM48j8SuxA2MZ79v6kR68Olg0dAt57rrd0lQVbViwJaK97DdbydHpS3X+tYCvpsr
6+
54/QYLzCWDzPm837WIpu+Kn0dpCJOYYAyHjI+vz8umfZ0fJ1di1zQRTH/qoEgDLz
7+
h5aZDcYuj4fNc5j6Y5KCxw5X0XaoWOefwrlujl5cpDLAtOCVvLltgJ5UmBpvcfUf
8+
JgJmVGPb/Og5Xgaq0OQXa9S9P8H51P0xOO/FPAND9+Z5iR10z6llYIhESjhmsFow
9+
b0P/S1nNU0KXjdA8PY8coQnbk01oUmXp3XS3kUD8lKL7ytZbNk/rKrL4mcVArq0o
10+
4NYhO+W7YOHJ+Zz+bFHvH+0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEACtJJ1YQi
11+
rhuq3j4xFoxWvwzUngdNnnOdRUp5TC4SFSPU4YVwzwJbgr23zAGjGpOsOpZxavBd
12+
1LPI2ywakF/1pFHHvYWfBWn/hoFUGG6IhN8FdEqoEUN7Gn3dWgnYZf0pdYs8U9oh
13+
7sExF1K4oWNVU1AGJf9Wjxjmu3XTVXVXchMkWGNhYPPZGg6RnpUXE3/EUEpGfu+s
14+
G6Noi/A4tXx+r/pM0lwZEkJFRvlyhZmXaW+QnhKfiMsN2QKcpwwhfp5gX+ek79Ds
15+
wOcfrpXVBFXyIEEpbLiHjm2blItCm6GpE3CR94X15VEXZlIbXphSzjTZvzVfhgYR
16+
UdPnCAOasD6UQQ==
17+
-----END CERTIFICATE-----

test/agent-ca/localhost.crt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIICpTCCAY0CCQDUMK5pArmyETANBgkqhkiG9w0BAQUFADAVMRMwEQYDVQQDDApP
3+
Y3Rva2l0IENBMB4XDTE4MDgxMzA1NTY1NloXDTI4MDgxMDA1NTY1NlowFDESMBAG
4+
A1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
5+
t0MeBHqQUzjtXjd9f0YsM1uHzqj+Do7lTygKumE8UrFvxaf6OalqUTy+Rq/JIaWa
6+
12iIECEzKF4SZC9CUMD/enW/quHar3RdwCenOo1UrwYXDPDEc7XWIJtRvk8AV6Yk
7+
5l0MtBoccLB1IGWDdsbX4uXoPAxnTa7tcl6VXky8Qlf3069frF3DeuDQx1lJ57yH
8+
IRFSd5thoSkcaxGAqQhotFjwbjTdeZ9Ni5bfZr19eQukr+8phJjWtEZ2i0ryBKt/
9+
OQkkBV64YfjuFePwwgy6GqQYr2qjvs9XatPuDWEzm+b1WjdFmipGg3uyqTNdlnHr
10+
CBtlFUWuQfnLG4gg4QzbDQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQBP2a+4eqPF
11+
jbqg8cVSQzj82KtHmluEgq58BCMuj5d4xbcFdJHjeQSw9TAx3OtsupK51UP0bAlf
12+
WrkMhyKW1GeND3JsPL37aT6qK/ON+9lSwWfvLvdkym9DsKPWqQZ3ekAmjN9jWglt
13+
h7Zj4OGYM7eKmcTu7FSioHR8/crttv/dfIX7N2CMGCkl6PzxxAo2yohTR7cIzgUh
14+
FVufKgvTi79COYyNyVefL6rp5J5+8986QPWShqzAM6lkNgiEVBoX7lsIbIiOQsdu
15+
8jXInTP+BrQ+RF3+ztkFBuw4nYjjM7sI/7K7goIdnNx+Fufjmq16LiYHBnigGgi4
16+
htR/8Tj7gsEf
17+
-----END CERTIFICATE-----

test/agent-ca/localhost.key

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIIEogIBAAKCAQEAt0MeBHqQUzjtXjd9f0YsM1uHzqj+Do7lTygKumE8UrFvxaf6
3+
OalqUTy+Rq/JIaWa12iIECEzKF4SZC9CUMD/enW/quHar3RdwCenOo1UrwYXDPDE
4+
c7XWIJtRvk8AV6Yk5l0MtBoccLB1IGWDdsbX4uXoPAxnTa7tcl6VXky8Qlf3069f
5+
rF3DeuDQx1lJ57yHIRFSd5thoSkcaxGAqQhotFjwbjTdeZ9Ni5bfZr19eQukr+8p
6+
hJjWtEZ2i0ryBKt/OQkkBV64YfjuFePwwgy6GqQYr2qjvs9XatPuDWEzm+b1WjdF
7+
mipGg3uyqTNdlnHrCBtlFUWuQfnLG4gg4QzbDQIDAQABAoIBAHjyPrlN+joyc9We
8+
YaDBuyIZ4kMtnJ4XCJd5IbtnuNwKZm3YMngjqxr6L8mO8frWxJ4tSr76ajzV+OVN
9+
m0KYXQOA+oHYlO7+qXDLur4V0DHCnyvXKpADDdJvLz+d++fcqrWt61hhcyucCXDc
10+
DisxiAEjImWe+f522BaG/aVCl2xgbC1lDaursn3RkdLWzF6UnbW+uHAvFmVGo8Vj
11+
2/w58HyY0YsnBJjYt2Dfmf9wFTTJXiYaVJ7Jkt1QRaDdq++LJo+tgktbbZZrQ8bg
12+
e3W3HafhK0EsUEWjsGtCoMlBkJ+O57fIRCWGyOo0ls/2Ie982UMo8vuQpE1b+NgJ
13+
i7MbM4ECgYEA26aISkJpguFymrsHgcof9OmmLvJYfLskCouRBU/Ryfozpz1efgeB
14+
7X9uVSE3wO2S9J9voNR/pr25j5vshA8GeawI4ERw5aCqf51WyulBgpwSu5B78bav
15+
0HCXt4T2Kh9GIw0tRp28KqCeMZ9rpi3KfwoBBGIqmrAgWYxjGImvmvkCgYEA1Zb/
16+
SolpDZH/AsPksOfjANAlDBatXrSOYTtvVTUMyB673wgEnKuvYPwvApg7NAE3eAdD
17+
EzR0FyJm6N6id6KxLaPMwmktsYESC/gowEp3h1VJBHeNHxFzj+K1K1vfAsGk6+ze
18+
1ijNxBe5G/cqdFndOyycmjQjSuMHsSCFG64X0bUCgYAl2H/LK746StYQSwF0H3t6
19+
G3gCxsbwVt5S4tFN9P7UqkOUIULSvEBqx3YfPOX6W/TiKUZ2k6aa+D2svNT3vA8F
20+
j9rHqYM6TYCTFG0L8TzUYEfqAW8ZqryIUZ4ShNpVT6YqC+8tJ6hwP9SCAFHwBBvL
21+
39FlC/UDSi2IwGOiqraTIQKBgAMW8BJv8mkT15B+rOwyLoJwgFiwa0mXawfVCEM/
22+
RTQP3b/YKdjqUtsgSr3K3fBepCLEWCAK/jLneH2d2tPIMq/qUqftRY/vwgcSS+Sc
23+
LyZyAWBjKlNsuTM3oE9EQPGVQ4F2J7MJXBCeFztkU+Ti9+RHPOyuHGSU7COPyN0h
24+
o46RAoGAfaN1g+C2ALXT+28hwRzLWR2gMdmArHx22TIRMYPwLzIoc/hbEto9iTXh
25+
UIIxiXVRApJgoje3C7A26EGggF0DO+sqavG0HriRqIoO46kyr7k/yKsO9/17IzYm
26+
wOn9QYs1EyVK2vAXfBrHftclnTnKlRCE5Ac10J5WT3d0f6Rt6DQ=
27+
-----END RSA PRIVATE KEY-----
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*!
2+
* Tests are based on work by Nathan Rajlich:
3+
* https://github.com/TooTallNate/node-http-proxy-agent/blob/65307ac8fe4e6ce1a2685d21ec4affa4c2a0a30d/test/test.js
4+
*
5+
* Copyright (c) 2013 Nathan Rajlich <nathan@tootallnate.net>
6+
* Released under the MIT license
7+
*/
8+
const http = require("http");
9+
10+
const HttpProxy = require("proxy");
11+
const HttpProxyAgent = require("http-proxy-agent");
12+
13+
import { Octokit } from "../../src";
14+
15+
describe("client proxy", () => {
16+
let proxy: any;
17+
let proxyUrl: string;
18+
19+
// start HTTP proxy & http server
20+
beforeAll(done => {
21+
proxy = HttpProxy();
22+
proxy.listen(() => {
23+
proxyUrl = "http://localhost:" + proxy.address().port;
24+
done();
25+
});
26+
});
27+
28+
let server: any;
29+
beforeAll(done => {
30+
server = http.createServer((request: any, response: any) => {
31+
expect(request.method).toEqual("GET");
32+
expect(request.url).toEqual("/");
33+
34+
response.writeHead(200);
35+
response.write("ok");
36+
response.end();
37+
});
38+
39+
server.listen(0, done);
40+
});
41+
42+
// stop proxy HTTP & http server
43+
afterAll(done => {
44+
proxy.once("close", () => done());
45+
proxy.close();
46+
});
47+
48+
afterAll(done => server.close(done));
49+
50+
it("options.agent = new HttpProxyAgent(proxyUrl)", async () => {
51+
let proxyReceivedRequest;
52+
53+
proxy.once("request", (request: any) => {
54+
expect(request.headers.accept).toBe("application/vnd.github.v3+json");
55+
proxyReceivedRequest = true;
56+
});
57+
58+
const octokit = new Octokit({
59+
baseUrl: "http://localhost:" + server.address().port,
60+
request: { agent: new HttpProxyAgent(proxyUrl) }
61+
});
62+
63+
await octokit.request("/");
64+
65+
expect(proxyReceivedRequest).toBe(true);
66+
});
67+
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-----BEGIN RSA PRIVATE KEY-----
2+
MIICWwIBAAKBgQCzURxIqzer0ACAbX/lHdsn4Gd9PLKrf7EeDYfIdV0HZKPD8WDr
3+
bBx2/fBu0OW2sjnzv/SVZbJ0DAuPE/p0+eT0qb2qC10iz9iTD7ribd7gxhirVb8y
4+
b3fBjXsxc8V8p4Ny1LcvNSqCjwUbJqdRogfoJeTiqPM58z5sNzuv5iq7iwIDAQAB
5+
AoGAPMQy4olrP0UotlzlJ36bowLP70ffgHCwU+/f4NWs5fF78c3du0oSx1w820Dd
6+
Z7E0JF8bgnlJJTxjumPZz0RUCugrEHBKJmzEz3cxF5E3+7NvteZcjKn9D67RrM5x
7+
1/uSZ9cqKE9cYvY4fSuHx18diyZ4axR/wB1Pea2utjjDM+ECQQDb9ZbmmaWMiRpQ
8+
5Up+loxP7BZNPsEVsm+DVJmEFbaFgGfncWBqSIqnPNjMwTwj0OigTwCAEGPkfRVW
9+
T0pbYWCxAkEA0LK7SCTwzyDmhASUalk0x+3uCAA6ryFdwJf/wd8TRAvVOmkTEldX
10+
uJ7ldLvfrONYO3v56uKTU/SoNdZYzKtO+wJAX2KM4ctXYy5BXztPpr2acz4qHa1N
11+
Bh+vBAC34fOYhyQ76r3b1btHhWZ5jbFuZwm9F2erC94Ps5IaoqcX07DSwQJAPKGw
12+
h2U0EPkd/3zVIZCJJQya+vgWFIs9EZcXVtvYXQyTBkVApTN66MhBIYjzkub5205J
13+
bVQmOV37AKklY1DhwQJAA1wos0cYxro02edzatxd0DIR2r4qqOqLkw6BhYHhq6HJ
14+
ZvIcQkHqdSXzdETFc01I1znDGGIrJHcnvKWgBPoEUg==
15+
-----END RSA PRIVATE KEY-----
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIB1TCCAT4CCQDV5mPlzm9+izANBgkqhkiG9w0BAQUFADAvMS0wKwYDVQQDEyQ3
3+
NTI3YmQ3Ny1hYjNlLTQ3NGItYWNlNy1lZWQ2MDUzOTMxZTcwHhcNMTUwNzA2MjI0
4+
NTA3WhcNMjUwNzAzMjI0NTA3WjAvMS0wKwYDVQQDEyQ3NTI3YmQ3Ny1hYjNlLTQ3
5+
NGItYWNlNy1lZWQ2MDUzOTMxZTcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB
6+
ALNRHEirN6vQAIBtf+Ud2yfgZ308sqt/sR4Nh8h1XQdko8PxYOtsHHb98G7Q5bay
7+
OfO/9JVlsnQMC48T+nT55PSpvaoLXSLP2JMPuuJt3uDGGKtVvzJvd8GNezFzxXyn
8+
g3LUty81KoKPBRsmp1GiB+gl5OKo8znzPmw3O6/mKruLAgMBAAEwDQYJKoZIhvcN
9+
AQEFBQADgYEACzoHUF8UV2Z6541Q2wKEA0UFUzmUjf/E1XwBO+1P15ZZ64uw34B4
10+
1RwMPtAo9RY/PmICTWtNxWGxkzwb2JtDWtnxVER/lF8k2XcXPE76fxTHJF/BKk9J
11+
QU8OTD1dd9gHCBviQB9TqntRZ5X7axjtuWjb2umY+owBYzAHZkp1HKI=
12+
-----END CERTIFICATE-----

test/plugin.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Octokit, OctokitOptions } from "../src";
1+
import { Octokit } from "../src";
22

33
describe("Octokit.plugin()", () => {
44
it("gets called in constructor", () => {

test/request.test.ts

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import getUserAgent from "universal-user-agent";
2+
import fetchMock from "fetch-mock";
3+
4+
import { Octokit } from "../src";
5+
6+
const userAgent = `octokit-core.js/0.0.0-development ${getUserAgent()}`;
7+
8+
describe("octokit.request()", () => {
9+
it("is a function", () => {
10+
const octokit = new Octokit();
11+
expect(octokit.request).toBeInstanceOf(Function);
12+
});
13+
14+
it("GET /", () => {
15+
const mock = fetchMock.sandbox().getOnce(
16+
"https://api.github.com/",
17+
{ ok: true },
18+
{
19+
headers: {
20+
accept: "application/vnd.github.v3+json",
21+
"user-agent": userAgent
22+
}
23+
}
24+
);
25+
26+
const octokit = new Octokit({
27+
request: {
28+
fetch: mock
29+
}
30+
});
31+
32+
return octokit.request("GET /").then(response => {
33+
expect(response.data).toStrictEqual({ ok: true });
34+
});
35+
});
36+
37+
it("custom baseUrl", () => {
38+
const mock = fetchMock
39+
.sandbox()
40+
.getOnce("https://github.acme-inc.com/api/v3/orgs/octokit", { id: 123 });
41+
42+
const octokit = new Octokit({
43+
baseUrl: "https://github.acme-inc.com/api/v3",
44+
request: {
45+
fetch: mock
46+
}
47+
});
48+
49+
return octokit.request("GET /orgs/:org", {
50+
org: "octokit"
51+
});
52+
});
53+
54+
it("custom user agent", () => {
55+
const mock = fetchMock.sandbox().getOnce(
56+
"https://api.github.com/",
57+
{ ok: true },
58+
{
59+
headers: {
60+
accept: "application/vnd.github.v3+json",
61+
"user-agent": `myApp/1.2.3 ${userAgent}`
62+
}
63+
}
64+
);
65+
66+
const octokit = new Octokit({
67+
userAgent: "myApp/1.2.3",
68+
request: {
69+
fetch: mock
70+
}
71+
});
72+
73+
return octokit.request("GET /").then(response => {
74+
expect(response.data).toStrictEqual({ ok: true });
75+
});
76+
});
77+
78+
it("previews", async () => {
79+
const mock = fetchMock
80+
.sandbox()
81+
.getOnce(
82+
"https://api.github.com/",
83+
{},
84+
{
85+
headers: {
86+
accept:
87+
"application/vnd.github.foo-preview+json,application/vnd.github.bar-preview+json",
88+
"user-agent": userAgent
89+
}
90+
}
91+
)
92+
.getOnce(
93+
"https://api.github.com/",
94+
{},
95+
{
96+
headers: {
97+
accept:
98+
"application/vnd.github.foo-preview.raw,application/vnd.github.bar-preview.raw,application/vnd.github.baz-preview.raw",
99+
"user-agent": userAgent
100+
},
101+
overwriteRoutes: false
102+
}
103+
);
104+
105+
const octokit = new Octokit({
106+
previews: ["foo", "bar-preview"],
107+
request: {
108+
fetch: mock
109+
}
110+
});
111+
112+
await octokit.request("/");
113+
await octokit.request("/", {
114+
mediaType: {
115+
previews: ["bar", "baz-preview"],
116+
format: "raw"
117+
}
118+
});
119+
});
120+
121+
it('octokit.request.endpoint("GET /")', () => {
122+
const octokit = new Octokit();
123+
const requestOptions = octokit.request.endpoint("GET /");
124+
125+
expect(requestOptions).toStrictEqual({
126+
method: "GET",
127+
url: "https://api.github.com/",
128+
headers: {
129+
accept: "application/vnd.github.v3+json",
130+
"user-agent": userAgent
131+
},
132+
request: {}
133+
});
134+
});
135+
});

0 commit comments

Comments
 (0)