Fix worker tests.
This commit is contained in:
parent
a9b4d0017f
commit
d7e07bb44a
|
@ -71,7 +71,7 @@ describe("feature flags", () => {
|
||||||
({ tenant, flags, expected }) =>
|
({ tenant, flags, expected }) =>
|
||||||
context.doInTenant(tenant, () =>
|
context.doInTenant(tenant, () =>
|
||||||
withEnv({ TENANT_FEATURE_FLAGS: flags }, () =>
|
withEnv({ TENANT_FEATURE_FLAGS: flags }, () =>
|
||||||
expect(fetch()).rejects.toThrow(expected)
|
expect(fetch).rejects.toThrow(expected)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -159,5 +159,17 @@ describe("feature flags", () => {
|
||||||
expect(flags._TEST_NUMBER).toBe(123)
|
expect(flags._TEST_NUMBER).toBe(123)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it("should not fail when a flag is not known", async () => {
|
||||||
|
mockFlags({
|
||||||
|
featureFlags: {
|
||||||
|
_SOME_RANDOM_FLAG: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
await context.doInIdentityContext(identity, async () => {
|
||||||
|
await expect(fetch()).resolves.not.toThrow()
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { structures, mocks } from "../../../../../tests"
|
import { structures } from "../../../../../tests"
|
||||||
import { testEnv } from "../../../../../tests/extra"
|
import { testEnv } from "../../../../../tests/extra"
|
||||||
import { SSOAuthDetails, User } from "@budibase/types"
|
import { SSOAuthDetails, User } from "@budibase/types"
|
||||||
|
|
||||||
|
|
|
@ -292,9 +292,9 @@ describe("/api/global/auth", () => {
|
||||||
it("redirects to auth provider", async () => {
|
it("redirects to auth provider", async () => {
|
||||||
nock("http://someconfigurl").get("/").times(1).reply(200, {
|
nock("http://someconfigurl").get("/").times(1).reply(200, {
|
||||||
issuer: "test",
|
issuer: "test",
|
||||||
authorization_endpoint: "http://localhost/auth",
|
authorization_endpoint: "http://example.com/auth",
|
||||||
token_endpoint: "http://localhost/token",
|
token_endpoint: "http://example.com/token",
|
||||||
userinfo_endpoint: "http://localhost/userinfo",
|
userinfo_endpoint: "http://example.com/userinfo",
|
||||||
})
|
})
|
||||||
|
|
||||||
const configId = await generateOidcConfig()
|
const configId = await generateOidcConfig()
|
||||||
|
@ -305,7 +305,7 @@ describe("/api/global/auth", () => {
|
||||||
const location: string = res.get("location")
|
const location: string = res.get("location")
|
||||||
expect(
|
expect(
|
||||||
location.startsWith(
|
location.startsWith(
|
||||||
`http://localhost/auth?response_type=code&client_id=clientId&redirect_uri=http%3A%2F%2Flocalhost%3A10000%2Fapi%2Fglobal%2Fauth%2F${config.tenantId}%2Foidc%2Fcallback&scope=openid%20profile%20email%20offline_access`
|
`http://example.com/auth?response_type=code&client_id=clientId&redirect_uri=http%3A%2F%2Flocalhost%3A10000%2Fapi%2Fglobal%2Fauth%2F${config.tenantId}%2Foidc%2Fcallback&scope=openid%20profile%20email%20offline_access`
|
||||||
)
|
)
|
||||||
).toBe(true)
|
).toBe(true)
|
||||||
})
|
})
|
||||||
|
@ -313,11 +313,13 @@ describe("/api/global/auth", () => {
|
||||||
|
|
||||||
describe("GET /api/global/auth/:tenantId/oidc/callback", () => {
|
describe("GET /api/global/auth/:tenantId/oidc/callback", () => {
|
||||||
it("logs in", async () => {
|
it("logs in", async () => {
|
||||||
|
const email = `${generator.guid()}@example.com`
|
||||||
|
|
||||||
nock("http://someconfigurl").get("/").times(2).reply(200, {
|
nock("http://someconfigurl").get("/").times(2).reply(200, {
|
||||||
issuer: "test",
|
issuer: "test",
|
||||||
authorization_endpoint: "http://localhost/auth",
|
authorization_endpoint: "http://example.com/auth",
|
||||||
token_endpoint: "http://localhost/token",
|
token_endpoint: "http://example.com/token",
|
||||||
userinfo_endpoint: "http://localhost/userinfo",
|
userinfo_endpoint: "http://example.com/userinfo",
|
||||||
})
|
})
|
||||||
|
|
||||||
const token = jwt.sign(
|
const token = jwt.sign(
|
||||||
|
@ -326,20 +328,20 @@ describe("/api/global/auth", () => {
|
||||||
sub: "sub",
|
sub: "sub",
|
||||||
aud: "clientId",
|
aud: "clientId",
|
||||||
exp: Math.floor(Date.now() / 1000) + 60 * 60,
|
exp: Math.floor(Date.now() / 1000) + 60 * 60,
|
||||||
email: "oauth@example.com",
|
email,
|
||||||
},
|
},
|
||||||
"secret"
|
"secret"
|
||||||
)
|
)
|
||||||
|
|
||||||
nock("http://localhost").post("/token").reply(200, {
|
nock("http://example.com").post("/token").reply(200, {
|
||||||
access_token: "access",
|
access_token: "access",
|
||||||
refresh_token: "refresh",
|
refresh_token: "refresh",
|
||||||
id_token: token,
|
id_token: token,
|
||||||
})
|
})
|
||||||
|
|
||||||
nock("http://localhost").get("/userinfo?schema=openid").reply(200, {
|
nock("http://example.com").get("/userinfo?schema=openid").reply(200, {
|
||||||
sub: "sub",
|
sub: "sub",
|
||||||
email: "oauth@example.com",
|
email,
|
||||||
})
|
})
|
||||||
|
|
||||||
const configId = await generateOidcConfig()
|
const configId = await generateOidcConfig()
|
||||||
|
@ -351,10 +353,7 @@ describe("/api/global/auth", () => {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(events.auth.login).toHaveBeenCalledWith(
|
expect(events.auth.login).toHaveBeenCalledWith("oidc", email)
|
||||||
"oidc",
|
|
||||||
"oauth@example.com"
|
|
||||||
)
|
|
||||||
expect(events.auth.login).toHaveBeenCalledTimes(1)
|
expect(events.auth.login).toHaveBeenCalledTimes(1)
|
||||||
expect(res.status).toBe(302)
|
expect(res.status).toBe(302)
|
||||||
const location: string = res.get("location")
|
const location: string = res.get("location")
|
||||||
|
|
|
@ -12,6 +12,33 @@ const nodemailer = require("nodemailer")
|
||||||
// for the real email tests give them a long time to try complete/fail
|
// for the real email tests give them a long time to try complete/fail
|
||||||
jest.setTimeout(30000)
|
jest.setTimeout(30000)
|
||||||
|
|
||||||
|
function cancelableTimeout(timeout: number): [Promise<unknown>, () => void] {
|
||||||
|
let timeoutId: NodeJS.Timeout
|
||||||
|
return [
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
timeoutId = setTimeout(() => {
|
||||||
|
reject({
|
||||||
|
status: 301,
|
||||||
|
errno: "ETIME",
|
||||||
|
})
|
||||||
|
}, timeout)
|
||||||
|
}),
|
||||||
|
() => {
|
||||||
|
clearTimeout(timeoutId)
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
async function withTimeout<T>(
|
||||||
|
timeout: number,
|
||||||
|
promise: Promise<T>
|
||||||
|
): Promise<T> {
|
||||||
|
const [timeoutPromise, cancel] = cancelableTimeout(timeout)
|
||||||
|
const result = (await Promise.race([promise, timeoutPromise])) as T
|
||||||
|
cancel()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
describe("/api/global/email", () => {
|
describe("/api/global/email", () => {
|
||||||
const config = new TestConfiguration()
|
const config = new TestConfiguration()
|
||||||
|
|
||||||
|
@ -30,19 +57,8 @@ describe("/api/global/email", () => {
|
||||||
) {
|
) {
|
||||||
let response, text
|
let response, text
|
||||||
try {
|
try {
|
||||||
const timeout = () =>
|
await withTimeout(20000, config.saveEtherealSmtpConfig())
|
||||||
new Promise((resolve, reject) =>
|
await withTimeout(20000, config.saveSettingsConfig())
|
||||||
setTimeout(
|
|
||||||
() =>
|
|
||||||
reject({
|
|
||||||
status: 301,
|
|
||||||
errno: "ETIME",
|
|
||||||
}),
|
|
||||||
20000
|
|
||||||
)
|
|
||||||
)
|
|
||||||
await Promise.race([config.saveEtherealSmtpConfig(), timeout()])
|
|
||||||
await Promise.race([config.saveSettingsConfig(), timeout()])
|
|
||||||
let res
|
let res
|
||||||
if (attachments) {
|
if (attachments) {
|
||||||
res = await config.api.emails
|
res = await config.api.emails
|
||||||
|
|
|
@ -40,7 +40,7 @@ export class ConfigAPI extends TestAPI {
|
||||||
const sessionContent = JSON.parse(
|
const sessionContent = JSON.parse(
|
||||||
Buffer.from(koaSession, "base64").toString("utf-8")
|
Buffer.from(koaSession, "base64").toString("utf-8")
|
||||||
)
|
)
|
||||||
const handle = sessionContent["openidconnect:localhost"].state.handle
|
const handle = sessionContent["openidconnect:example.com"].state.handle
|
||||||
return this.request
|
return this.request
|
||||||
.get(`/api/global/auth/${this.config.getTenantId()}/oidc/callback`)
|
.get(`/api/global/auth/${this.config.getTenantId()}/oidc/callback`)
|
||||||
.query({ code: "test", state: handle })
|
.query({ code: "test", state: handle })
|
||||||
|
|
|
@ -1,13 +1,21 @@
|
||||||
import { mocks, testContainerUtils } from "@budibase/backend-core/tests"
|
import { mocks, testContainerUtils } from "@budibase/backend-core/tests"
|
||||||
import env from "../environment"
|
import env from "../environment"
|
||||||
import { env as coreEnv, timers } from "@budibase/backend-core"
|
import { env as coreEnv, timers } from "@budibase/backend-core"
|
||||||
|
import nock from "nock"
|
||||||
// must explicitly enable fetch mock
|
|
||||||
mocks.fetch.enable()
|
|
||||||
|
|
||||||
// mock all dates to 2020-01-01T00:00:00.000Z
|
// mock all dates to 2020-01-01T00:00:00.000Z
|
||||||
// use tk.reset() to use real dates in individual tests
|
// use tk.reset() to use real dates in individual tests
|
||||||
const tk = require("timekeeper")
|
import tk from "timekeeper"
|
||||||
|
|
||||||
|
nock.disableNetConnect()
|
||||||
|
nock.enableNetConnect(host => {
|
||||||
|
return (
|
||||||
|
host.includes("localhost") ||
|
||||||
|
host.includes("127.0.0.1") ||
|
||||||
|
host.includes("::1") ||
|
||||||
|
host.includes("ethereal.email") // used in realEmail.spec.ts
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
tk.freeze(mocks.date.MOCK_DATE)
|
tk.freeze(mocks.date.MOCK_DATE)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue