dify/e2e/features/step-definitions/auth/session-refresh.steps.ts

44 lines
2.0 KiB
TypeScript

import type { DifyWorld } from '../../support/world'
import { Given, When } from '@cucumber/cucumber'
import { expect } from '@playwright/test'
const consoleAccessTokenCookieName = /^(?:__Host-)?access_token$/
const consoleRefreshTokenCookieName = /^(?:__Host-)?refresh_token$/
Given('my console session requires token refresh', async function (this: DifyWorld) {
if (!this.context)
throw new Error('Playwright browser context has not been initialized for this scenario.')
const cookies = await this.context.cookies()
const hasAccessToken = cookies.some(cookie => consoleAccessTokenCookieName.test(cookie.name))
const hasRefreshToken = cookies.some(cookie => consoleRefreshTokenCookieName.test(cookie.name))
expect(hasAccessToken, 'Expected the authenticated E2E session to include a console access token.').toBe(true)
expect(hasRefreshToken, 'Expected the authenticated E2E session to include a console refresh token.').toBe(true)
await this.context.clearCookies({ name: consoleAccessTokenCookieName })
const remainingCookies = await this.context.cookies()
expect(
remainingCookies.some(cookie => consoleAccessTokenCookieName.test(cookie.name)),
'Expected the console access token to be removed before opening the default console entry.',
).toBe(false)
expect(
remainingCookies.some(cookie => consoleRefreshTokenCookieName.test(cookie.name)),
'Expected the console refresh token to remain available for server-side refresh.',
).toBe(true)
})
When('I open the default console entry after the access token expires', async function (this: DifyWorld) {
const page = this.getPage()
const refreshRequestPromise = page.waitForRequest((request) => {
const url = new URL(request.url())
return url.pathname.endsWith('/auth/refresh') && url.searchParams.get('redirect_url') === '/'
})
await page.goto('/')
const refreshRequest = await refreshRequestPromise
this.attach(`Session refresh request: ${refreshRequest.url()}`, 'text/plain')
})