keycloak_theme/test/lib/getKcContext.spec.ts

254 lines
7.1 KiB
TypeScript
Raw Normal View History

import { getKcContext } from "keycloakify/login/kcContext/getKcContext";
import type { ExtendKcContext } from "keycloakify/login/kcContext/getKcContextFromWindow";
import type { KcContext } from "keycloakify/login/kcContext";
import { same } from "evt/tools/inDepth";
import { assert } from "tsafe/assert";
import type { Equals } from "tsafe";
2024-05-20 15:48:51 +02:00
import {
kcContextMocks,
kcContextCommonMock
} from "keycloakify/login/kcContext/kcContextMocks";
import { deepClone } from "keycloakify/tools/deepClone";
import { expect, it, describe } from "vitest";
describe("getKcContext", () => {
2024-05-20 15:48:51 +02:00
const authorizedMailDomains = [
"example.com",
"another-example.com",
"*.yet-another-example.com",
"*.example.com",
"hello-world.com"
];
const displayName = "this is an overwritten common value";
const aNonStandardValue1 = "a non standard value 1";
const aNonStandardValue2 = "a non standard value 2";
2023-03-19 14:48:01 +01:00
type KcContextExtension =
| {
pageId: "register.ftl";
authorizedMailDomains: string[];
}
| {
pageId: "info.ftl";
aNonStandardValue1: string;
}
| {
pageId: "my-extra-page-1.ftl";
}
| {
pageId: "my-extra-page-2.ftl";
aNonStandardValue2: string;
};
2024-05-20 15:48:51 +02:00
const getKcContextProxy = (params: {
mockPageId: ExtendKcContext<KcContextExtension>["pageId"];
}) => {
const { mockPageId } = params;
2023-03-19 14:48:01 +01:00
const { kcContext } = getKcContext<KcContextExtension>({
mockPageId,
2024-05-20 15:48:51 +02:00
mockData: [
{
2024-05-20 15:48:51 +02:00
pageId: "login.ftl",
realm: { displayName }
},
{
2024-05-20 15:48:51 +02:00
pageId: "info.ftl",
aNonStandardValue1
},
{
2024-05-20 15:48:51 +02:00
pageId: "register.ftl",
authorizedMailDomains
},
{
2024-05-20 15:48:51 +02:00
pageId: "my-extra-page-2.ftl",
aNonStandardValue2
}
]
});
return { kcContext };
};
it("has proper API for login.ftl", () => {
const pageId = "login.ftl";
2024-05-20 15:48:51 +02:00
const { kcContext } = getKcContextProxy({ mockPageId: pageId });
assert(kcContext?.pageId === pageId);
2023-03-18 18:27:50 +01:00
assert<Equals<typeof kcContext, KcContext.Login>>();
expect(
same(
//NOTE: deepClone for printIfExists or other functions...
deepClone(kcContext),
(() => {
2024-05-20 15:48:51 +02:00
const mock = deepClone(
kcContextMocks.find(
({ pageId: pageId_i }) => pageId_i === pageId
)!
);
mock.realm.displayName = displayName;
return mock;
})()
)
).toBe(true);
});
it("has a proper API for info.ftl", () => {
const pageId = "info.ftl";
2024-05-20 15:48:51 +02:00
const { kcContext } = getKcContextProxy({ mockPageId: pageId });
assert(kcContext?.pageId === pageId);
//NOTE: I don't understand the need to add: pageId: typeof pageId; ...
assert<
Equals<
typeof kcContext,
2023-03-18 18:27:50 +01:00
KcContext.Info & {
pageId: typeof pageId;
aNonStandardValue1: string;
}
>
>();
expect(
same(
deepClone(kcContext),
(() => {
2024-05-20 15:48:51 +02:00
const mock = deepClone(
kcContextMocks.find(
({ pageId: pageId_i }) => pageId_i === pageId
)!
);
Object.assign(mock, { aNonStandardValue1 });
return mock;
})()
)
).toBe(true);
});
it("has a proper API for register.ftl", () => {
const pageId = "register.ftl";
2024-05-20 15:48:51 +02:00
const { kcContext } = getKcContextProxy({ mockPageId: pageId });
assert(kcContext?.pageId === pageId);
//NOTE: I don't understand the need to add: pageId: typeof pageId; ...
assert<
Equals<
typeof kcContext,
2023-03-18 18:27:50 +01:00
KcContext.Register & {
pageId: typeof pageId;
authorizedMailDomains: string[];
}
>
>();
expect(
same(
deepClone(kcContext),
(() => {
2024-05-20 15:48:51 +02:00
const mock = deepClone(
kcContextMocks.find(
({ pageId: pageId_i }) => pageId_i === pageId
)!
);
Object.assign(mock, { authorizedMailDomains });
return mock;
})()
)
).toBe(true);
});
it("has a proper API for my-extra-page-2.ftl", () => {
const pageId = "my-extra-page-2.ftl";
2024-05-20 15:48:51 +02:00
const { kcContext } = getKcContextProxy({ mockPageId: pageId });
assert(kcContext?.pageId === pageId);
assert<
Equals<
typeof kcContext,
2023-03-18 18:27:50 +01:00
KcContext.Common & {
pageId: typeof pageId;
aNonStandardValue2: string;
}
>
>();
kcContext.aNonStandardValue2;
expect(
same(
deepClone(kcContext),
(() => {
const mock = deepClone(kcContextCommonMock);
Object.assign(mock, { pageId, aNonStandardValue2 });
return mock;
})()
)
).toBe(true);
});
it("has a proper API for my-extra-page-1.ftl", () => {
const pageId = "my-extra-page-1.ftl";
console.log("We expect a warning here =>");
2024-05-20 15:48:51 +02:00
const { kcContext } = getKcContextProxy({ mockPageId: pageId });
assert(kcContext?.pageId === pageId);
2023-03-18 18:27:50 +01:00
assert<Equals<typeof kcContext, KcContext.Common & { pageId: typeof pageId }>>();
expect(
same(
deepClone(kcContext),
(() => {
const mock = deepClone(kcContextCommonMock);
Object.assign(mock, { pageId });
return mock;
})()
)
).toBe(true);
});
it("returns the proper mock for login.ftl", () => {
const pageId = "login.ftl";
const { kcContext } = getKcContext({
2024-05-20 15:48:51 +02:00
mockPageId: pageId
});
assert<Equals<typeof kcContext, KcContext | undefined>>();
2024-05-20 15:48:51 +02:00
assert(
same(
deepClone(kcContext),
deepClone(
kcContextMocks.find(({ pageId: pageId_i }) => pageId_i === pageId)!
)
)
);
});
it("returns undefined when no mock is specified", () => {
const { kcContext } = getKcContext();
2021-07-03 02:39:39 +02:00
assert<Equals<typeof kcContext, KcContext | undefined>>();
2021-07-03 02:39:39 +02:00
assert(kcContext === undefined);
});
});