110 lines
3.2 KiB
TypeScript
110 lines
3.2 KiB
TypeScript
jest.mock("nodemailer")
|
|
import { TestConfiguration, mocks } from "../../../../tests"
|
|
const sendMailMock = mocks.email.mock()
|
|
import { events } from "@budibase/backend-core"
|
|
|
|
describe("/api/global/auth", () => {
|
|
const config = new TestConfiguration()
|
|
|
|
beforeAll(async () => {
|
|
await config.beforeAll()
|
|
})
|
|
|
|
afterAll(async () => {
|
|
await config.afterAll()
|
|
})
|
|
|
|
afterEach(() => {
|
|
jest.clearAllMocks()
|
|
})
|
|
|
|
it("should logout", async () => {
|
|
await config.api.auth.logout()
|
|
expect(events.auth.logout).toBeCalledTimes(1)
|
|
})
|
|
|
|
it("should be able to generate password reset email", async () => {
|
|
const { res, code } = await config.api.auth.requestPasswordReset(
|
|
sendMailMock
|
|
)
|
|
const user = await config.getUser("test@test.com")
|
|
|
|
expect(res.body).toEqual({
|
|
message: "Please check your email for a reset link.",
|
|
})
|
|
expect(sendMailMock).toHaveBeenCalled()
|
|
|
|
expect(code).toBeDefined()
|
|
expect(events.user.passwordResetRequested).toBeCalledTimes(1)
|
|
expect(events.user.passwordResetRequested).toBeCalledWith(user)
|
|
})
|
|
|
|
it("should allow resetting user password with code", async () => {
|
|
const { code } = await config.api.auth.requestPasswordReset(sendMailMock)
|
|
const user = await config.getUser("test@test.com")
|
|
delete user.password
|
|
|
|
const res = await config.api.auth.updatePassword(code)
|
|
|
|
expect(res.body).toEqual({ message: "password reset successfully." })
|
|
expect(events.user.passwordReset).toBeCalledTimes(1)
|
|
expect(events.user.passwordReset).toBeCalledWith(user)
|
|
})
|
|
|
|
describe("oidc", () => {
|
|
const auth = require("@budibase/backend-core/auth")
|
|
|
|
const passportSpy = jest.spyOn(auth.passport, "authenticate")
|
|
let oidcConf
|
|
let chosenConfig: any
|
|
let configId: string
|
|
|
|
// mock the oidc strategy implementation and return value
|
|
let strategyFactory = jest.fn()
|
|
let mockStrategyReturn = jest.fn()
|
|
let mockStrategyConfig = jest.fn()
|
|
auth.oidc.fetchStrategyConfig = mockStrategyConfig
|
|
|
|
strategyFactory.mockReturnValue(mockStrategyReturn)
|
|
auth.oidc.strategyFactory = strategyFactory
|
|
|
|
beforeEach(async () => {
|
|
oidcConf = await config.saveOIDCConfig()
|
|
chosenConfig = oidcConf.config.configs[0]
|
|
configId = chosenConfig.uuid
|
|
mockStrategyConfig.mockReturnValue(chosenConfig)
|
|
})
|
|
|
|
afterEach(() => {
|
|
expect(strategyFactory).toBeCalledWith(chosenConfig, expect.any(Function))
|
|
})
|
|
|
|
describe("oidc configs", () => {
|
|
it("should load strategy and delegate to passport", async () => {
|
|
await config.api.configs.getOIDCConfig(configId)
|
|
|
|
expect(passportSpy).toBeCalledWith(mockStrategyReturn, {
|
|
scope: ["profile", "email", "offline_access"],
|
|
})
|
|
expect(passportSpy.mock.calls.length).toBe(1)
|
|
})
|
|
})
|
|
|
|
describe("oidc callback", () => {
|
|
it("should load strategy and delegate to passport", async () => {
|
|
await config.api.configs.OIDCCallback(configId)
|
|
|
|
expect(passportSpy).toBeCalledWith(
|
|
mockStrategyReturn,
|
|
{
|
|
successRedirect: "/",
|
|
failureRedirect: "/error",
|
|
},
|
|
expect.anything()
|
|
)
|
|
expect(passportSpy.mock.calls.length).toBe(1)
|
|
})
|
|
})
|
|
})
|
|
})
|