mirror of
https://github.com/rustfs/console.git
synced 2026-10-30 19:33:40 +08:00
66 lines
3.5 KiB
JavaScript
66 lines
3.5 KiB
JavaScript
import test from "node:test"
|
|
import assert from "node:assert/strict"
|
|
import fs from "node:fs"
|
|
|
|
const rootLayout = fs.readFileSync("app/layout.tsx", "utf8")
|
|
const dashboardLayout = fs.readFileSync("app/(dashboard)/layout.tsx", "utf8")
|
|
const authContext = fs.readFileSync("contexts/auth-context.tsx", "utf8")
|
|
const loginPage = fs.readFileSync("app/(auth)/auth/login/page.tsx", "utf8")
|
|
const oidcCallbackPage = fs.readFileSync("app/(auth)/auth/oidc-callback/page.tsx", "utf8")
|
|
const i18nProvider = fs.readFileSync("components/providers/i18n-provider.tsx", "utf8")
|
|
const i18nSource = fs.readFileSync("lib/i18n.ts", "utf8")
|
|
const loadingShell = fs.readFileSync("components/app-loading-shell.tsx", "utf8")
|
|
|
|
test("root layout does not load dashboard-only providers on auth routes", () => {
|
|
assert.doesNotMatch(rootLayout, /@\/contexts\/api-context/)
|
|
assert.doesNotMatch(rootLayout, /@\/contexts\/s3-context/)
|
|
assert.doesNotMatch(rootLayout, /@\/contexts\/task-context/)
|
|
assert.doesNotMatch(rootLayout, /@\/hooks\/use-permissions/)
|
|
assert.doesNotMatch(rootLayout, /<ApiProvider>/)
|
|
assert.doesNotMatch(rootLayout, /<S3Provider>/)
|
|
assert.doesNotMatch(rootLayout, /<TaskProvider>/)
|
|
assert.doesNotMatch(rootLayout, /<PermissionsProvider>/)
|
|
})
|
|
|
|
test("dashboard layout owns dashboard providers before the auth guard", () => {
|
|
for (const symbol of ["ApiProvider", "S3Provider", "TaskProvider", "PermissionsProvider", "DashboardAuthGuard"]) {
|
|
assert.match(dashboardLayout, new RegExp(symbol))
|
|
}
|
|
|
|
assert.ok(dashboardLayout.indexOf("<ApiProvider>") < dashboardLayout.indexOf("<S3Provider>"))
|
|
assert.ok(dashboardLayout.indexOf("<S3Provider>") < dashboardLayout.indexOf("<TaskProvider>"))
|
|
assert.ok(dashboardLayout.indexOf("<TaskProvider>") < dashboardLayout.indexOf("<PermissionsProvider>"))
|
|
assert.ok(dashboardLayout.indexOf("<PermissionsProvider>") < dashboardLayout.indexOf("<DashboardAuthGuard>"))
|
|
})
|
|
|
|
test("auth routes do not depend on dashboard permission resolution", () => {
|
|
assert.doesNotMatch(loginPage, /useFirstAccessibleDashboardRoute/)
|
|
assert.doesNotMatch(oidcCallbackPage, /useFirstAccessibleDashboardRoute/)
|
|
})
|
|
|
|
test("STS client is loaded only when login is submitted", () => {
|
|
assert.doesNotMatch(authContext, /import\s+\{\s*getStsToken\s*\}\s+from\s+["']@\/lib\/sts["']/)
|
|
assert.match(authContext, /await import\(["']@\/lib\/sts["']\)/)
|
|
})
|
|
|
|
test("login and i18n fallbacks render a visible loading shell", () => {
|
|
assert.match(loginPage, /fallback=\{<AppLoadingShell \/>\}/)
|
|
assert.match(i18nProvider, /return <AppLoadingShell \/>/)
|
|
assert.doesNotMatch(loginPage, /fallback=\{<div className="min-h-screen bg-background" \/>\}/)
|
|
assert.doesNotMatch(i18nProvider, /return <div className="min-h-screen bg-background" \/>/)
|
|
assert.match(loadingShell, /animate-pulse/)
|
|
})
|
|
|
|
test("OIDC provider discovery is deferred off the first render path", () => {
|
|
assert.match(loginPage, /requestIdleCallback/)
|
|
assert.doesNotMatch(loginPage, /fetchOidcProviders\(config\.serverHost\)\.then\(setOidcProviders\)/)
|
|
})
|
|
|
|
test("i18n initializes only the detected locale plus fallback and lazy-loads later languages", () => {
|
|
assert.match(i18nSource, /function detectInitialLocale/)
|
|
assert.match(i18nSource, /const initialLocales = \[\.\.\.new Set<Locale>\(\[DEFAULT_LOCALE, initialLocale\]\)\]/)
|
|
assert.match(i18nSource, /export async function ensureLocaleResources/)
|
|
assert.match(i18nSource, /export async function changeLocale/)
|
|
assert.doesNotMatch(i18nSource, /for \(const \[code, file\] of Object\.entries\(LOCALE_FILE_MAP\)\)/)
|
|
})
|