mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-01-27 11:29:53 +00:00
## Summary See https://typescript-eslint.io/blog/project-service/ for context. Creates a browser_tests specific tsconfig so that they can be linted. Does not add a package.json script to do the linting yet, but `pnpm exec eslint browser_tests` should work for now. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5633-lint-add-tsconfig-for-browser_tests-fix-existing-violations-2726d73d3650819d8ef2c4b0abc31e14) by [Unito](https://www.unito.io)
211 lines
7.3 KiB
TypeScript
211 lines
7.3 KiB
TypeScript
import { expect } from '@playwright/test'
|
|
|
|
import { comfyPageFixture as test } from '../../fixtures/ComfyPage'
|
|
|
|
test.describe.skip('Queue sidebar', () => {
|
|
test.beforeEach(async ({ comfyPage }) => {
|
|
await comfyPage.setSetting('Comfy.UseNewMenu', 'Top')
|
|
})
|
|
|
|
test('can display tasks', async ({ comfyPage }) => {
|
|
await comfyPage.setupHistory().withTask(['example.webp']).setupRoutes()
|
|
await comfyPage.menu.queueTab.open()
|
|
await comfyPage.menu.queueTab.waitForTasks()
|
|
expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe(1)
|
|
})
|
|
|
|
test('can display tasks after closing then opening', async ({
|
|
comfyPage
|
|
}) => {
|
|
await comfyPage.setupHistory().withTask(['example.webp']).setupRoutes()
|
|
await comfyPage.menu.queueTab.open()
|
|
await comfyPage.menu.queueTab.close()
|
|
await comfyPage.menu.queueTab.open()
|
|
await comfyPage.menu.queueTab.waitForTasks()
|
|
expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe(1)
|
|
})
|
|
|
|
test.describe('Virtual scroll', () => {
|
|
const layouts = [
|
|
{ description: 'Five columns layout', width: 95, rows: 3, cols: 5 },
|
|
{ description: 'Three columns layout', width: 55, rows: 3, cols: 3 },
|
|
{ description: 'Two columns layout', width: 40, rows: 3, cols: 2 }
|
|
]
|
|
|
|
test.beforeEach(async ({ comfyPage }) => {
|
|
await comfyPage
|
|
.setupHistory()
|
|
.withTask(['example.webp'])
|
|
.repeat(50)
|
|
.setupRoutes()
|
|
})
|
|
|
|
layouts.forEach(({ description, width, rows, cols }) => {
|
|
const preRenderedRows = 1
|
|
const preRenderedTasks = preRenderedRows * cols * 2
|
|
const visibleTasks = rows * cols
|
|
const expectRenderLimit = visibleTasks + preRenderedTasks
|
|
|
|
test.describe(description, () => {
|
|
test.beforeEach(async ({ comfyPage }) => {
|
|
await comfyPage.menu.queueTab.setTabWidth(width)
|
|
await comfyPage.menu.queueTab.open()
|
|
await comfyPage.menu.queueTab.waitForTasks()
|
|
})
|
|
|
|
test('should not render items outside of view', async ({
|
|
comfyPage
|
|
}) => {
|
|
const renderedCount =
|
|
await comfyPage.menu.queueTab.visibleTasks.count()
|
|
expect(renderedCount).toBeLessThanOrEqual(expectRenderLimit)
|
|
})
|
|
|
|
test('should teardown items after scrolling away', async ({
|
|
comfyPage
|
|
}) => {
|
|
await comfyPage.menu.queueTab.scrollTasks('down')
|
|
const renderedCount =
|
|
await comfyPage.menu.queueTab.visibleTasks.count()
|
|
expect(renderedCount).toBeLessThanOrEqual(expectRenderLimit)
|
|
})
|
|
|
|
test('should re-render items after scrolling away then back', async ({
|
|
comfyPage
|
|
}) => {
|
|
await comfyPage.menu.queueTab.scrollTasks('down')
|
|
await comfyPage.menu.queueTab.scrollTasks('up')
|
|
const renderedCount =
|
|
await comfyPage.menu.queueTab.visibleTasks.count()
|
|
expect(renderedCount).toBeLessThanOrEqual(expectRenderLimit)
|
|
})
|
|
})
|
|
})
|
|
})
|
|
|
|
test.describe('Expand tasks', () => {
|
|
test.beforeEach(async ({ comfyPage }) => {
|
|
// 2-item batch and 3-item batch -> 3 additional items when expanded
|
|
await comfyPage
|
|
.setupHistory()
|
|
.withTask(['example.webp', 'example.webp', 'example.webp'])
|
|
.withTask(['example.webp', 'example.webp'])
|
|
.setupRoutes()
|
|
await comfyPage.menu.queueTab.open()
|
|
await comfyPage.menu.queueTab.waitForTasks()
|
|
})
|
|
|
|
test('can expand tasks with multiple outputs', async ({ comfyPage }) => {
|
|
const initialCount = await comfyPage.menu.queueTab.visibleTasks.count()
|
|
await comfyPage.menu.queueTab.expandTasks()
|
|
expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe(
|
|
initialCount + 3
|
|
)
|
|
})
|
|
|
|
test('can collapse flat tasks', async ({ comfyPage }) => {
|
|
const initialCount = await comfyPage.menu.queueTab.visibleTasks.count()
|
|
await comfyPage.menu.queueTab.expandTasks()
|
|
await comfyPage.menu.queueTab.collapseTasks()
|
|
expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe(
|
|
initialCount
|
|
)
|
|
})
|
|
})
|
|
|
|
test.describe('Clear tasks', () => {
|
|
test.beforeEach(async ({ comfyPage }) => {
|
|
await comfyPage
|
|
.setupHistory()
|
|
.withTask(['example.webp'])
|
|
.repeat(6)
|
|
.setupRoutes()
|
|
await comfyPage.menu.queueTab.open()
|
|
})
|
|
|
|
test('can clear all tasks', async ({ comfyPage }) => {
|
|
await comfyPage.menu.queueTab.clearTasks()
|
|
expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe(0)
|
|
expect(
|
|
await comfyPage.menu.queueTab.noResultsPlaceholder.isVisible()
|
|
).toBe(true)
|
|
})
|
|
|
|
test('can load new tasks after clearing all', async ({ comfyPage }) => {
|
|
await comfyPage.menu.queueTab.clearTasks()
|
|
await comfyPage.menu.queueTab.close()
|
|
await comfyPage.setupHistory().withTask(['example.webp']).setupRoutes()
|
|
await comfyPage.menu.queueTab.open()
|
|
await comfyPage.menu.queueTab.waitForTasks()
|
|
expect(await comfyPage.menu.queueTab.visibleTasks.count()).toBe(1)
|
|
})
|
|
})
|
|
|
|
test.describe('Gallery', () => {
|
|
const firstImage = 'example.webp'
|
|
const secondImage = 'image32x32.webp'
|
|
|
|
test.beforeEach(async ({ comfyPage }) => {
|
|
await comfyPage
|
|
.setupHistory()
|
|
.withTask([secondImage])
|
|
.withTask([firstImage])
|
|
.setupRoutes()
|
|
await comfyPage.menu.queueTab.open()
|
|
await comfyPage.menu.queueTab.waitForTasks()
|
|
await comfyPage.menu.queueTab.openTaskPreview(0)
|
|
})
|
|
|
|
test('displays gallery image after opening task preview', async ({
|
|
comfyPage
|
|
}) => {
|
|
await comfyPage.nextFrame()
|
|
await expect(
|
|
comfyPage.menu.queueTab.getGalleryImage(firstImage)
|
|
).toBeVisible()
|
|
})
|
|
|
|
test('maintains active gallery item when new tasks are added', async ({
|
|
comfyPage
|
|
}) => {
|
|
// Add a new task while the gallery is still open
|
|
const newImage = 'image64x64.webp'
|
|
comfyPage.setupHistory().withTask([newImage])
|
|
await comfyPage.menu.queueTab.triggerTasksUpdate()
|
|
await comfyPage.page.waitForTimeout(500)
|
|
const newTask = comfyPage.menu.queueTab.tasks.getByAltText(newImage)
|
|
await newTask.waitFor({ state: 'visible' })
|
|
// The active gallery item should still be the initial image
|
|
await expect(
|
|
comfyPage.menu.queueTab.getGalleryImage(firstImage)
|
|
).toBeVisible()
|
|
})
|
|
|
|
test.describe('Gallery navigation', () => {
|
|
const paths: {
|
|
description: string
|
|
path: ('Right' | 'Left')[]
|
|
end: string
|
|
}[] = [
|
|
{ description: 'Right', path: ['Right'], end: secondImage },
|
|
{ description: 'Left', path: ['Right', 'Left'], end: firstImage },
|
|
{ description: 'Left wrap', path: ['Left'], end: secondImage },
|
|
{ description: 'Right wrap', path: ['Right', 'Right'], end: firstImage }
|
|
]
|
|
|
|
paths.forEach(({ description, path, end }) => {
|
|
test(`can navigate gallery ${description}`, async ({ comfyPage }) => {
|
|
for (const direction of path)
|
|
await comfyPage.page.keyboard.press(`Arrow${direction}`, {
|
|
delay: 256
|
|
})
|
|
await comfyPage.nextFrame()
|
|
await expect(
|
|
comfyPage.menu.queueTab.getGalleryImage(end)
|
|
).toBeVisible()
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|