@@ -239,4 +239,48 @@ describe("browser assertion helpers", () => {
239239 await browser . close ( ) ;
240240 }
241241 } ) ;
242+
243+ test ( "waits through ZITADEL username to password transition without stale username typing" , async ( ) => {
244+ const browser = await chromium . launch ( { headless : true } ) ;
245+ try {
246+ const page = await browser . newPage ( ) ;
247+ await page . route ( "**/*" , ( route ) =>
248+ route . fulfill ( {
249+ contentType : "text/html" ,
250+ body : [
251+ "<form>" ,
252+ '<input data-testid="username-text-input" value="">' ,
253+ '<button type="submit">Continue</button>' ,
254+ "</form>" ,
255+ "<script>" ,
256+ "window.submits = 0;" ,
257+ "document.querySelector('form').addEventListener('submit', (event) => {" ,
258+ " event.preventDefault();" ,
259+ " window.submits += 1;" ,
260+ " setTimeout(() => {" ,
261+ " history.pushState(null, '', '/ui/v2/login/password?requestId=oidc_123');" ,
262+ " document.body.innerHTML = '<form><input data-testid=\"password-text-input\" name=\"password\" type=\"password\"><button type=\"submit\">Continue</button></form>';" ,
263+ " }, 10);" ,
264+ "});" ,
265+ "</script>"
266+ ] . join ( "" )
267+ } )
268+ ) ;
269+
270+ await page . goto ( "http://issuer.example.test/ui/v2/login/loginname?requestId=oidc_123" ) ;
271+ const selector = await __browserTestHooks . waitForPasswordInputAfterUsernameSubmit (
272+ page ,
273+ '[data-testid="username-text-input"]' ,
274+ "agent@example.test" ,
275+ "app.example.test"
276+ ) ;
277+
278+ expect ( selector ) . toBe ( '[data-testid="password-text-input"]' ) ;
279+ expect ( page . url ( ) ) . toContain ( "/ui/v2/login/password" ) ;
280+ expect ( await page . locator ( '[data-testid="password-text-input"]' ) . isVisible ( ) ) . toBe ( true ) ;
281+ expect ( await page . evaluate ( ( ) => ( window as unknown as { submits : number } ) . submits ) ) . toBe ( 1 ) ;
282+ } finally {
283+ await browser . close ( ) ;
284+ }
285+ } ) ;
242286} ) ;
0 commit comments