fix: address review feedback for Load3D E2E tests

This commit is contained in:
Terry Jia
2026-04-08 20:41:59 -04:00
parent b2b39bfa54
commit 3274ccea4a
4 changed files with 52 additions and 61 deletions

View File

@@ -0,0 +1,25 @@
import { comfyPageFixture } from '@e2e/fixtures/ComfyPage'
import { Load3DHelper } from '@e2e/tests/load3d/Load3DHelper'
import { Load3DViewerHelper } from '@e2e/tests/load3d/Load3DViewerHelper'
export const load3dTest = comfyPageFixture.extend<{
load3d: Load3DHelper
}>({
load3d: async ({ comfyPage }, use) => {
await comfyPage.settings.setSetting('Comfy.VueNodes.Enabled', true)
await comfyPage.workflow.loadWorkflow('3d/load3d_node')
await comfyPage.vueNodes.waitForNodes()
const node = comfyPage.vueNodes.getNodeLocator('1')
await use(new Load3DHelper(node))
}
})
export const load3dViewerTest = load3dTest.extend<{
viewer: Load3DViewerHelper
}>({
viewer: async ({ comfyPage }, use) => {
await comfyPage.settings.setSetting('Comfy.Load3D.3DViewerEnable', true)
await use(new Load3DViewerHelper(comfyPage.page))
}
})

View File

@@ -45,27 +45,6 @@ export class Load3DHelper {
}, hex)
}
async waitForWidgetValue(
nodeId: number,
widgetName: string,
expected: string
): Promise<void> {
await expect
.poll(
() =>
this.node.page().evaluate(
({ nodeId, widgetName }) => {
const n = window.app!.graph.getNodeById(nodeId)
const w = n?.widgets?.find((w) => w.name === widgetName)
return w?.value
},
{ nodeId, widgetName }
),
{ timeout: 15000 }
)
.toContain(expected)
}
async waitForModelLoaded(): Promise<void> {
await expect(this.node.getByTestId(TestIds.loading.overlay)).toBeHidden({
timeout: 30000

View File

@@ -1,25 +1,13 @@
import { expect } from '@playwright/test'
import { comfyPageFixture as test } from '@e2e/fixtures/ComfyPage'
import { assetPath } from '@e2e/fixtures/utils/paths'
import { Load3DHelper } from './Load3DHelper'
import { load3dTest as test } from '@e2e/fixtures/helpers/Load3DFixtures'
test.describe('Load3D', () => {
let load3d: Load3DHelper
test.beforeEach(async ({ comfyPage }) => {
await comfyPage.settings.setSetting('Comfy.VueNodes.Enabled', true)
await comfyPage.workflow.loadWorkflow('3d/load3d_node')
await comfyPage.vueNodes.waitForNodes()
const node = comfyPage.vueNodes.getNodeLocator('1')
load3d = new Load3DHelper(node)
})
test(
'Renders canvas with upload buttons and controls menu',
{ tag: ['@smoke', '@screenshot'] },
async () => {
async ({ load3d }) => {
await expect(load3d.node).toBeVisible()
await expect(load3d.canvas).toBeVisible()
@@ -45,7 +33,7 @@ test.describe('Load3D', () => {
test(
'Controls menu opens and shows all categories',
{ tag: ['@smoke', '@screenshot'] },
async () => {
async ({ load3d }) => {
await load3d.openMenu()
await expect(load3d.getMenuCategory('Scene')).toBeVisible()
@@ -64,7 +52,7 @@ test.describe('Load3D', () => {
test(
'Changing background color updates the scene',
{ tag: ['@smoke', '@screenshot'] },
async ({ comfyPage }) => {
async ({ comfyPage, load3d }) => {
await load3d.setBackgroundColor('#cc3333')
await comfyPage.nextFrame()
@@ -91,7 +79,7 @@ test.describe('Load3D', () => {
test(
'Recording controls are visible for Load3D',
{ tag: '@smoke' },
async () => {
async ({ load3d }) => {
await expect(load3d.recordingButton).toBeVisible()
}
)
@@ -99,7 +87,7 @@ test.describe('Load3D', () => {
test(
'Uploads a 3D model via button and renders it',
{ tag: ['@screenshot'] },
async ({ comfyPage }) => {
async ({ comfyPage, load3d }) => {
const uploadResponsePromise = comfyPage.page.waitForResponse(
(resp) => resp.url().includes('/upload/') && resp.status() === 200,
{ timeout: 15000 }
@@ -112,7 +100,11 @@ test.describe('Load3D', () => {
await uploadResponsePromise
await load3d.waitForWidgetValue(1, 'model_file', 'cube.obj')
const node = await comfyPage.nodeOps.getNodeRefById(1)
const modelFileWidget = await node.getWidget(0)
await expect
.poll(() => modelFileWidget.getValue(), { timeout: 5000 })
.toContain('cube.obj')
await load3d.waitForModelLoaded()
await comfyPage.nextFrame()
@@ -127,7 +119,7 @@ test.describe('Load3D', () => {
test(
'Drag-and-drops a 3D model onto the canvas',
{ tag: ['@screenshot'] },
async ({ comfyPage }) => {
async ({ comfyPage, load3d }) => {
const canvasBox = await load3d.canvas.boundingBox()
expect(canvasBox, 'Canvas bounding box should exist').not.toBeNull()
const dropPosition = {
@@ -140,7 +132,11 @@ test.describe('Load3D', () => {
waitForUpload: true
})
await load3d.waitForWidgetValue(1, 'model_file', 'cube.obj')
const node = await comfyPage.nodeOps.getNodeRefById(1)
const modelFileWidget = await node.getWidget(0)
await expect
.poll(() => modelFileWidget.getValue(), { timeout: 5000 })
.toContain('cube.obj')
await load3d.waitForModelLoaded()
await comfyPage.nextFrame()

View File

@@ -1,24 +1,10 @@
import { expect } from '@playwright/test'
import { comfyPageFixture as test } from '@e2e/fixtures/ComfyPage'
import { assetPath } from '@e2e/fixtures/utils/paths'
import { Load3DHelper } from './Load3DHelper'
import { Load3DViewerHelper } from './Load3DViewerHelper'
import { load3dViewerTest as test } from '@e2e/fixtures/helpers/Load3DFixtures'
test.describe('Load3D Viewer', () => {
let load3d: Load3DHelper
let viewer: Load3DViewerHelper
test.beforeEach(async ({ comfyPage }) => {
await comfyPage.settings.setSetting('Comfy.VueNodes.Enabled', true)
await comfyPage.settings.setSetting('Comfy.Load3D.3DViewerEnable', true)
await comfyPage.workflow.loadWorkflow('3d/load3d_node')
await comfyPage.vueNodes.waitForNodes()
const node = comfyPage.vueNodes.getNodeLocator('1')
load3d = new Load3DHelper(node)
viewer = new Load3DViewerHelper(comfyPage.page)
test.beforeEach(async ({ comfyPage, load3d }) => {
// Upload cube.obj so the node has a model loaded
const uploadResponsePromise = comfyPage.page.waitForResponse(
(resp) => resp.url().includes('/upload/') && resp.status() === 200,
@@ -30,14 +16,19 @@ test.describe('Load3D Viewer', () => {
await fileChooser.setFiles(assetPath('cube.obj'))
await uploadResponsePromise
await load3d.waitForWidgetValue(1, 'model_file', 'cube.obj')
const nodeRef = await comfyPage.nodeOps.getNodeRefById(1)
const modelFileWidget = await nodeRef.getWidget(0)
await expect
.poll(() => modelFileWidget.getValue(), { timeout: 5000 })
.toContain('cube.obj')
await load3d.waitForModelLoaded()
})
test(
'Opens viewer dialog with canvas and controls sidebar',
{ tag: '@smoke' },
async () => {
async ({ load3d, viewer }) => {
await load3d.openViewerButton.click()
await viewer.waitForOpen()
@@ -54,7 +45,7 @@ test.describe('Load3D Viewer', () => {
test(
'Cancel button closes the viewer dialog',
{ tag: '@smoke' },
async () => {
async ({ load3d, viewer }) => {
await load3d.openViewerButton.click()
await viewer.waitForOpen()