forked from baron/baron-sso
devfront 로그인 claim e2e 검증 추가
This commit is contained in:
@@ -73,6 +73,22 @@ export type DeveloperRequest = {
|
||||
adminNotes?: string; // 추가
|
||||
};
|
||||
|
||||
export type SeedAuthOptions = {
|
||||
role?: string;
|
||||
accessToken?: string;
|
||||
idToken?: string;
|
||||
refreshToken?: string;
|
||||
sessionState?: string;
|
||||
expiresInSeconds?: number;
|
||||
state?: Record<string, unknown>;
|
||||
profile?: Record<string, unknown>;
|
||||
tenantId?: string;
|
||||
companyCode?: string;
|
||||
email?: string;
|
||||
name?: string;
|
||||
phone?: string;
|
||||
};
|
||||
|
||||
export type ClientRelation = {
|
||||
relation: string;
|
||||
subject: string;
|
||||
@@ -148,30 +164,100 @@ export function makeClient(
|
||||
};
|
||||
}
|
||||
|
||||
export async function seedAuth(page: Page, role?: string) {
|
||||
function resolveSeedAuthOptions(
|
||||
roleOrOptions?: string | SeedAuthOptions,
|
||||
): Required<Pick<SeedAuthOptions, "role">> & SeedAuthOptions {
|
||||
if (typeof roleOrOptions === "string") {
|
||||
return { role: roleOrOptions };
|
||||
}
|
||||
return { role: roleOrOptions?.role ?? "super_admin", ...roleOrOptions };
|
||||
}
|
||||
|
||||
export async function getPersistedOidcUser(page: Page) {
|
||||
return page.evaluate(() => {
|
||||
const storage = window.localStorage;
|
||||
for (let index = 0; index < storage.length; index += 1) {
|
||||
const key = storage.key(index);
|
||||
if (
|
||||
key === null ||
|
||||
!key.startsWith("oidc.user:") ||
|
||||
!key.endsWith(":devfront")
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const rawValue = storage.getItem(key);
|
||||
if (!rawValue) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
return JSON.parse(rawValue) as Record<string, unknown>;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
export async function seedAuth(
|
||||
page: Page,
|
||||
roleOrOptions?: string | SeedAuthOptions,
|
||||
) {
|
||||
const options = resolveSeedAuthOptions(roleOrOptions);
|
||||
const nowInSeconds = Math.floor(Date.now() / 1000);
|
||||
seededRoles.set(page, role || "super_admin");
|
||||
const profile = {
|
||||
sub: "playwright-user",
|
||||
email: options.email ?? "playwright@example.com",
|
||||
name: options.name ?? "Playwright User",
|
||||
phone: options.phone ?? "",
|
||||
role: options.profile?.role ?? options.role,
|
||||
tenant_id: options.tenantId ?? "tenant-a",
|
||||
companyCode: options.companyCode ?? "tenant-a",
|
||||
...options.profile,
|
||||
};
|
||||
seededRoles.set(
|
||||
page,
|
||||
typeof profile.role === "string" ? profile.role : options.role,
|
||||
);
|
||||
|
||||
await page.addInitScript(
|
||||
({ issuedAt, injectedRole }) => {
|
||||
({
|
||||
issuedAt,
|
||||
injectedRole,
|
||||
injectedProfile,
|
||||
injectedState,
|
||||
injectedIdToken,
|
||||
injectedAccessToken,
|
||||
injectedRefreshToken,
|
||||
injectedSessionState,
|
||||
injectedExpiresInSeconds,
|
||||
}) => {
|
||||
(
|
||||
window as Window & typeof globalThis & { _IS_TEST_MODE?: boolean }
|
||||
)._IS_TEST_MODE = true;
|
||||
|
||||
const mockOidcUser = {
|
||||
id_token: "playwright-id-token",
|
||||
session_state: "playwright-session",
|
||||
access_token: "playwright-access-token",
|
||||
refresh_token: "playwright-refresh-token",
|
||||
id_token: injectedIdToken,
|
||||
session_state: injectedSessionState,
|
||||
access_token: injectedAccessToken,
|
||||
refresh_token: injectedRefreshToken,
|
||||
token_type: "Bearer",
|
||||
scope: "openid profile email",
|
||||
profile: {
|
||||
sub: "playwright-user",
|
||||
email: "playwright@example.com",
|
||||
name: "Playwright User",
|
||||
...(injectedRole ? { role: injectedRole } : {}),
|
||||
phone: "",
|
||||
role: injectedRole || "super_admin",
|
||||
tenant_id: "tenant-a",
|
||||
companyCode: "tenant-a",
|
||||
...(injectedProfile || {}),
|
||||
},
|
||||
expires_at: issuedAt + 3600,
|
||||
state: injectedState,
|
||||
expires_at: issuedAt + injectedExpiresInSeconds,
|
||||
};
|
||||
|
||||
const storageKeys = [
|
||||
@@ -191,9 +277,25 @@ export async function seedAuth(page: Page, role?: string) {
|
||||
}
|
||||
|
||||
window.localStorage.setItem("dev_role", injectedRole || "super_admin");
|
||||
window.localStorage.setItem("dev_tenant_id", "tenant-a");
|
||||
window.localStorage.setItem(
|
||||
"dev_tenant_id",
|
||||
typeof injectedProfile.tenant_id === "string"
|
||||
? injectedProfile.tenant_id
|
||||
: "tenant-a",
|
||||
);
|
||||
},
|
||||
{
|
||||
issuedAt: nowInSeconds,
|
||||
injectedRole:
|
||||
typeof profile.role === "string" ? profile.role : options.role,
|
||||
injectedProfile: profile,
|
||||
injectedState: options.state ?? { returnTo: "/clients" },
|
||||
injectedIdToken: options.idToken ?? "playwright-id-token",
|
||||
injectedAccessToken: options.accessToken ?? "playwright-access-token",
|
||||
injectedRefreshToken: options.refreshToken ?? "playwright-refresh-token",
|
||||
injectedSessionState: options.sessionState ?? "playwright-session",
|
||||
injectedExpiresInSeconds: options.expiresInSeconds ?? 3600,
|
||||
},
|
||||
{ issuedAt: nowInSeconds, injectedRole: role ?? "" },
|
||||
);
|
||||
|
||||
await page.route("**/oidc/**", async (route) => {
|
||||
|
||||
Reference in New Issue
Block a user