forked from JonnyBnator/remix-auth-discord
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.test.ts
139 lines (116 loc) · 4.22 KB
/
index.test.ts
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
import { createCookieSessionStorage } from "@remix-run/node";
import { DiscordStrategy, type DiscordStrategyOptions } from "../src";
describe(DiscordStrategy, () => {
const verify = jest.fn();
const strategyDefaultOptions = {
clientID: "CLIENT_ID",
clientSecret: "CLIENT_SECRET",
callbackURL: "https://example.app/callback",
};
const sessionStorage = createCookieSessionStorage({
cookie: { secrets: ["s3cr3t"] },
});
const sessionAuthenticateOptions = {
sessionKey: "user",
sessionErrorKey: "auth:error",
sessionStrategyKey: "strategy",
name: "__session",
};
const testDiscordStrategy = async (
strategyOptions: Partial<DiscordStrategyOptions>,
callback: (error: Error | Response) => void,
) => {
try {
const strategy = new DiscordStrategy(
{ ...strategyDefaultOptions, ...strategyOptions },
verify,
);
const request = new Request("https://example.app/auth/discord");
await strategy.authenticate(
request,
sessionStorage,
sessionAuthenticateOptions,
);
} catch (error) {
return callback(error);
}
};
beforeEach(() => {
jest.resetAllMocks();
});
test("should allow changing the scope", async () => {
await testDiscordStrategy({ scope: ["guilds"] }, (error) => {
if (!(error instanceof Response)) throw error;
expect(error).toBeInstanceOf(Response);
const location = error.headers.get("Location");
if (!location) throw new Error("No redirect header");
const redirectUrl = new URL(location);
expect(redirectUrl.searchParams.get("scope")).toBe("guilds");
});
});
test("should have the scope `identify email` as default", async () => {
await testDiscordStrategy({}, (error) => {
if (!(error instanceof Response)) throw error;
expect(error).toBeInstanceOf(Response);
const location = error.headers.get("Location");
if (!location) throw new Error("No redirect header");
const redirectUrl = new URL(location);
expect(redirectUrl.searchParams.get("scope")).toBe("identify email");
});
});
test("should require integrationType when scope `applications.commands` is added", async () => {
await testDiscordStrategy(
{ scope: ["email", "applications.commands", "identify"] },
(error) => {
if (!(error instanceof Error)) throw error;
expect(error).toBeInstanceOf(Error);
expect(error.message).toBe(
"integrationType is required when scope contains applications.commands",
);
},
);
});
test("should correctly set the integrationType to 0", async () => {
await testDiscordStrategy(
{
scope: ["email", "applications.commands", "identify"],
integrationType: 0,
},
(error) => {
if (!(error instanceof Response)) throw error;
expect(error).toBeInstanceOf(Response);
const location = error.headers.get("Location");
if (!location) throw new Error("No redirect header");
const redirectUrl = new URL(location);
expect(redirectUrl.searchParams.get("integration_type")).toBe("0");
},
);
});
test("should correctly set the integrationType to 1", async () => {
await testDiscordStrategy(
{
scope: ["email", "applications.commands", "identify"],
integrationType: 1,
},
(error) => {
if (!(error instanceof Response)) throw error;
expect(error).toBeInstanceOf(Response);
const location = error.headers.get("Location");
if (!location) throw new Error("No redirect header");
const redirectUrl = new URL(location);
expect(redirectUrl.searchParams.get("integration_type")).toBe("1");
},
);
});
test("should correctly format the authorization URL", async () => {
await testDiscordStrategy({}, (error) => {
if (!(error instanceof Response)) throw error;
expect(error).toBeInstanceOf(Response);
const location = error.headers.get("Location");
if (!location) throw new Error("No redirect header");
const redirectUrl = new URL(location);
expect(redirectUrl.hostname).toBe("discord.com");
expect(redirectUrl.pathname).toBe("/api/v10/oauth2/authorize");
});
});
});