dify/e2e/features/step-definitions/apps/web-app-service.steps.ts
yyh 04f9026724
fix(web): show unavailable state for disabled Web Apps (#39392)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-22 03:32:40 +00:00

102 lines
4.0 KiB
TypeScript

import type { DifyWorld } from '../../support/world'
import { Given, Then, When } from '@cucumber/cucumber'
import { expect } from '@playwright/test'
import {
createTestApp,
getAppSiteDetail,
getAppSiteURL,
publishWorkflowApp,
syncRunnableWorkflowDraft,
} from '../../../support/api'
import { createE2EResourceName } from '../../../support/naming'
import { baseURL, defaultLocale } from '../../../test-env'
Given('a new runnable workflow app has been published', async function (this: DifyWorld) {
const app = await createTestApp(createE2EResourceName('App', 'WebApp'), 'workflow')
this.createdAppIds.push(app.id)
this.lastCreatedAppName = app.name
await syncRunnableWorkflowDraft(app.id)
await publishWorkflowApp(app.id)
const appDetail = await getAppSiteDetail(app.id)
expect(appDetail.enable_site).toBe(true)
this.shareURL = getAppSiteURL(appDetail)
})
When('I open the app information panel', async function (this: DifyWorld) {
const appName = this.lastCreatedAppName
if (!appName) {
throw new Error('No app name available. Create an app before opening its information panel.')
}
await this.getPage().getByRole('button', { name: appName }).click()
})
const getWebAppSwitch = (world: DifyWorld) => {
const webAppCard = world.getPage().getByRole('region', { name: 'Web App' })
return webAppCard.getByRole('switch', { name: 'Web App' })
}
When('an anonymous visitor opens the Web App', async function (this: DifyWorld) {
if (!this.shareURL) throw new Error('No Web App URL is available.')
if (!this.context) throw new Error('Playwright browser context has not been initialized.')
const browser = this.context.browser()
if (!browser) throw new Error('Playwright browser has not been initialized.')
const anonymousContext = await browser.newContext({ baseURL, locale: defaultLocale })
this.registerCleanup(() => anonymousContext.close())
this.sharedAppPage = await anonymousContext.newPage()
await this.sharedAppPage.goto(this.shareURL, { timeout: 20_000 })
})
When('the anonymous visitor reloads the Web App', async function (this: DifyWorld) {
if (!this.sharedAppPage) throw new Error('The anonymous visitor has not opened the Web App.')
await this.sharedAppPage.reload({ timeout: 20_000 })
})
When('I disable the Web App', async function (this: DifyWorld) {
const webAppSwitch = getWebAppSwitch(this)
await expect(webAppSwitch).not.toHaveAttribute('aria-disabled', 'true', { timeout: 15_000 })
await expect(webAppSwitch).toHaveAttribute('aria-checked', 'true')
await webAppSwitch.click()
})
When('I enable the Web App', async function (this: DifyWorld) {
const webAppSwitch = getWebAppSwitch(this)
await expect(webAppSwitch).not.toHaveAttribute('aria-disabled', 'true', { timeout: 15_000 })
await expect(webAppSwitch).toHaveAttribute('aria-checked', 'false')
await webAppSwitch.click()
})
Then('the Web App should be in service', async function (this: DifyWorld) {
const webAppCard = this.getPage().getByRole('region', { name: 'Web App' })
await expect(webAppCard.getByText('In Service', { exact: true })).toBeVisible({
timeout: 10_000,
})
})
Then('the Web App should be disabled', async function (this: DifyWorld) {
const webAppCard = this.getPage().getByRole('region', { name: 'Web App' })
await expect(webAppCard.getByText('Disabled', { exact: true })).toBeVisible({
timeout: 10_000,
})
})
Then('the published workflow Web App should be accessible', async function (this: DifyWorld) {
if (!this.sharedAppPage) throw new Error('The anonymous visitor has not opened the Web App.')
await expect(this.sharedAppPage.getByRole('button', { name: 'Execute' })).toBeVisible({
timeout: 15_000,
})
})
Then('the published workflow Web App should be unavailable', async function (this: DifyWorld) {
if (!this.sharedAppPage) throw new Error('The anonymous visitor has not opened the Web App.')
await expect(this.sharedAppPage.getByRole('heading', { name: '404' })).toBeVisible({
timeout: 15_000,
})
await expect(this.sharedAppPage.getByText('App is unavailable', { exact: true })).toBeVisible()
})