@baukit/auth-node 0.9.0 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -43,6 +43,11 @@ export interface KeycloakLoginPage {
|
|
|
43
43
|
timeout?: number;
|
|
44
44
|
}): Promise<unknown>;
|
|
45
45
|
locator(selector: string): {
|
|
46
|
+
waitFor(options: {
|
|
47
|
+
state: 'visible';
|
|
48
|
+
timeout?: number;
|
|
49
|
+
}): Promise<unknown>;
|
|
50
|
+
isVisible(): Promise<boolean>;
|
|
46
51
|
fill(value: string): Promise<unknown>;
|
|
47
52
|
click(): Promise<unknown>;
|
|
48
53
|
};
|
|
@@ -63,6 +68,6 @@ export declare function revokeKeycloakUserSessions(stack: KeycloakStack, subject
|
|
|
63
68
|
* when the client lacks it.
|
|
64
69
|
*/
|
|
65
70
|
export declare function allowKeycloakWebOrigin(stack: KeycloakStack, origin: string, options?: KeycloakRequestOptions): Promise<void>;
|
|
66
|
-
/**
|
|
71
|
+
/** Submits the Keycloak login or password-only reauthentication form. */
|
|
67
72
|
export declare function signInWithKeycloak(loginPage: KeycloakLoginPage, user: Pick<KeycloakTestUser, 'username' | 'password'>, stack: KeycloakStack, options?: KeycloakSignInOptions): Promise<void>;
|
|
68
73
|
//# sourceMappingURL=keycloak-testing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keycloak-testing.d.ts","sourceRoot":"","sources":["../src/keycloak-testing.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,wFAAwF;AACxF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2BAA2B;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,2BAA2B;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,qCAAqC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,sCAAsC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,oFAAoF;IACpF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzF,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG;QACzB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACtC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,mCAAmC,QAAS,CAAC;AAK1D,uFAAuF;AACvF,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,qBAAqB,EAC/B,WAAW,GAAE,MAAM,CAAC,UAAwB,GAC3C,aAAa,CAWf;AAED,oEAAoE;AACpE,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,aAAa,EACpB,IAAI,GAAE,uBAA4B,EAClC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,gBAAgB,CAAC,CAyB3B;AAED,gFAAgF;AAChF,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CAMf;AAaD;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED,
|
|
1
|
+
{"version":3,"file":"keycloak-testing.d.ts","sourceRoot":"","sources":["../src/keycloak-testing.ts"],"names":[],"mappings":"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"}
|
package/dist/keycloak-testing.js
CHANGED
|
@@ -92,15 +92,23 @@ export async function allowKeycloakWebOrigin(stack, origin, options = {}) {
|
|
|
92
92
|
throw new Error(`Keycloak client update failed with HTTP ${String(update.status)}.`);
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
|
-
/**
|
|
95
|
+
/** Submits the Keycloak login or password-only reauthentication form. */
|
|
96
96
|
export async function signInWithKeycloak(loginPage, user, stack, options = {}) {
|
|
97
97
|
const origin = new URL(stack.url).origin;
|
|
98
98
|
const isKeycloak = (url) => url.origin === origin;
|
|
99
99
|
await (options.timeoutMs === undefined
|
|
100
100
|
? loginPage.waitForURL(isKeycloak)
|
|
101
101
|
: loginPage.waitForURL(isKeycloak, { timeout: options.timeoutMs }));
|
|
102
|
-
|
|
103
|
-
await
|
|
102
|
+
const password = loginPage.locator('#password');
|
|
103
|
+
await password.waitFor({
|
|
104
|
+
state: 'visible',
|
|
105
|
+
...(options.timeoutMs === undefined ? {} : { timeout: options.timeoutMs }),
|
|
106
|
+
});
|
|
107
|
+
const username = loginPage.locator('#username');
|
|
108
|
+
if (await username.isVisible()) {
|
|
109
|
+
await username.fill(user.username);
|
|
110
|
+
}
|
|
111
|
+
await password.fill(user.password);
|
|
104
112
|
await loginPage.locator('#kc-login').click();
|
|
105
113
|
}
|
|
106
114
|
async function adminRequester(stack, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keycloak-testing.js","sourceRoot":"","sources":["../src/keycloak-testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"keycloak-testing.js","sourceRoot":"","sources":["../src/keycloak-testing.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -315,18 +315,42 @@ describe('allowKeycloakWebOrigin', () => {
|
|
|
315
315
|
});
|
|
316
316
|
|
|
317
317
|
describe('signInWithKeycloak', () => {
|
|
318
|
-
function fakePage(
|
|
318
|
+
function fakePage(form: 'login' | 'reauthentication' = 'login'): {
|
|
319
|
+
readonly page: KeycloakLoginPage;
|
|
320
|
+
readonly steps: string[];
|
|
321
|
+
} {
|
|
319
322
|
const steps: string[] = [];
|
|
323
|
+
let formReady = false;
|
|
320
324
|
const onKeycloak = new URL('http://localhost:8081/realms/notes/login');
|
|
321
325
|
const onApp = new URL('http://localhost:5173/');
|
|
322
326
|
const page: KeycloakLoginPage = {
|
|
323
327
|
waitForURL: (matches, options) => {
|
|
328
|
+
formReady = false;
|
|
324
329
|
const timeout = options?.timeout === undefined ? 'default' : String(options.timeout);
|
|
325
330
|
steps.push(`wait ${String(matches(onKeycloak))} ${String(matches(onApp))} ${timeout}`);
|
|
326
331
|
return Promise.resolve();
|
|
327
332
|
},
|
|
328
333
|
locator: (selector) => ({
|
|
334
|
+
waitFor: (options) => {
|
|
335
|
+
expect(selector).toBe('#password');
|
|
336
|
+
expect(options.state).toBe('visible');
|
|
337
|
+
const timeout = options.timeout === undefined ? 'default' : String(options.timeout);
|
|
338
|
+
steps.push(`ready ${selector} ${timeout}`);
|
|
339
|
+
formReady = true;
|
|
340
|
+
return Promise.resolve();
|
|
341
|
+
},
|
|
342
|
+
isVisible: () => {
|
|
343
|
+
expect(formReady).toBe(true);
|
|
344
|
+
expect(selector).toBe('#username');
|
|
345
|
+
const visible = form === 'login';
|
|
346
|
+
steps.push(`visible ${selector} ${String(visible)}`);
|
|
347
|
+
return Promise.resolve(visible);
|
|
348
|
+
},
|
|
329
349
|
fill: (value) => {
|
|
350
|
+
expect(formReady).toBe(true);
|
|
351
|
+
if (form === 'reauthentication' && selector === '#username') {
|
|
352
|
+
throw new Error('The reauthentication username input is not visible.');
|
|
353
|
+
}
|
|
330
354
|
steps.push(`fill ${selector} ${value}`);
|
|
331
355
|
return Promise.resolve();
|
|
332
356
|
},
|
|
@@ -349,16 +373,34 @@ describe('signInWithKeycloak', () => {
|
|
|
349
373
|
|
|
350
374
|
expect(steps).toEqual([
|
|
351
375
|
'wait true false 60000',
|
|
376
|
+
'ready #password 60000',
|
|
377
|
+
'visible #username true',
|
|
352
378
|
'fill #username ada',
|
|
353
379
|
'fill #password pw',
|
|
354
380
|
'click #kc-login',
|
|
355
381
|
'wait true false default',
|
|
382
|
+
'ready #password default',
|
|
383
|
+
'visible #username true',
|
|
356
384
|
'fill #username ada',
|
|
357
385
|
'fill #password pw',
|
|
358
386
|
'click #kc-login',
|
|
359
387
|
]);
|
|
360
388
|
});
|
|
361
389
|
|
|
390
|
+
it('submits a password-only form when Keycloak retains the SSO identity', async () => {
|
|
391
|
+
const { page, steps } = fakePage('reauthentication');
|
|
392
|
+
|
|
393
|
+
await signInWithKeycloak(page, { username: 'ada', password: 'pw' }, STACK);
|
|
394
|
+
|
|
395
|
+
expect(steps).toEqual([
|
|
396
|
+
'wait true false default',
|
|
397
|
+
'ready #password default',
|
|
398
|
+
'visible #username false',
|
|
399
|
+
'fill #password pw',
|
|
400
|
+
'click #kc-login',
|
|
401
|
+
]);
|
|
402
|
+
});
|
|
403
|
+
|
|
362
404
|
it('accepts a Playwright page', () => {
|
|
363
405
|
const asLoginPage = (page: Page): KeycloakLoginPage => page;
|
|
364
406
|
expect(asLoginPage).toBeTypeOf('function');
|
package/src/keycloak-testing.ts
CHANGED
|
@@ -48,6 +48,8 @@ export interface KeycloakRequestOptions {
|
|
|
48
48
|
export interface KeycloakLoginPage {
|
|
49
49
|
waitForURL(url: (url: URL) => boolean, options?: { timeout?: number }): Promise<unknown>;
|
|
50
50
|
locator(selector: string): {
|
|
51
|
+
waitFor(options: { state: 'visible'; timeout?: number }): Promise<unknown>;
|
|
52
|
+
isVisible(): Promise<boolean>;
|
|
51
53
|
fill(value: string): Promise<unknown>;
|
|
52
54
|
click(): Promise<unknown>;
|
|
53
55
|
};
|
|
@@ -186,7 +188,7 @@ export async function allowKeycloakWebOrigin(
|
|
|
186
188
|
}
|
|
187
189
|
}
|
|
188
190
|
|
|
189
|
-
/**
|
|
191
|
+
/** Submits the Keycloak login or password-only reauthentication form. */
|
|
190
192
|
export async function signInWithKeycloak(
|
|
191
193
|
loginPage: KeycloakLoginPage,
|
|
192
194
|
user: Pick<KeycloakTestUser, 'username' | 'password'>,
|
|
@@ -198,8 +200,16 @@ export async function signInWithKeycloak(
|
|
|
198
200
|
await (options.timeoutMs === undefined
|
|
199
201
|
? loginPage.waitForURL(isKeycloak)
|
|
200
202
|
: loginPage.waitForURL(isKeycloak, { timeout: options.timeoutMs }));
|
|
201
|
-
|
|
202
|
-
await
|
|
203
|
+
const password = loginPage.locator('#password');
|
|
204
|
+
await password.waitFor({
|
|
205
|
+
state: 'visible',
|
|
206
|
+
...(options.timeoutMs === undefined ? {} : { timeout: options.timeoutMs }),
|
|
207
|
+
});
|
|
208
|
+
const username = loginPage.locator('#username');
|
|
209
|
+
if (await username.isVisible()) {
|
|
210
|
+
await username.fill(user.username);
|
|
211
|
+
}
|
|
212
|
+
await password.fill(user.password);
|
|
203
213
|
await loginPage.locator('#kc-login').click();
|
|
204
214
|
}
|
|
205
215
|
|