Files
modeling-app/e2e/playwright/prompt-to-edit-snapshot-tests.spec.ts
Jace Browning 55e1ec7dad Rename desktop e2e scripts and tags for consistency (#7240)
* Rename desktop e2e scripts and tags for consistency

* Show local command in main test step

* Restore 'e2e' prefix to clarify GitHub UI

* Add web script to contributor guide
2025-05-29 09:29:03 -04:00

115 lines
4.2 KiB
TypeScript

import { expect, test } from '@e2e/playwright/zoo-test'
import path from 'path'
import fsp from 'fs/promises'
/* eslint-disable jest/no-conditional-expect */
/**
* Snapshot Tests for Text-to-CAD API Requests
*
* These tests are primarily designed to capture the requests sent to the Text-to-CAD API
* rather than to verify application behavior. Unlike regular tests, these tests:
*
* 1. Don't assert much about the application's response or state changes
* 2. Focus on setting up specific scenarios and triggering API requests
* 3. Use the captureTextToCadRequestSnapshot() method to save request payloads to snapshot files
*
* The main purpose is to maintain a collection of real-world API request examples that can be:
* - Used for regression testing the (AI) API
* - Referenced when making changes to the Text-to-CAD integration, particularly the meta-prompts
* the frontend adds to the user's prompt
*
* These tests intentionally don't wait for or verify responses, as we're primarily
* interested in capturing the outgoing requests for documentation and analysis.
*
*/
const fileWithImport = `import "b.kcl" as b
sketch001 = startSketchOn(XZ)
profile001 = startProfile(sketch001, at = [57.81, 250.51])
|> line(end = [121.13, 56.63], tag = $seg02)
|> line(end = [83.37, -34.61], tag = $seg01)
|> line(end = [19.66, -116.4])
|> line(end = [-221.8, -41.69])
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude001 = extrude(profile001, length = 200)
sketch002 = startSketchOn(XZ)
|> startProfile(at = [-73.64, -42.89])
|> xLine(length = 173.71)
|> line(end = [-22.12, -94.4])
|> xLine(length = -156.98)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude002 = extrude(sketch002, length = 50)
b
`
const importedFile = `sketch003 = startSketchOn(XY)
|> startProfile(at = [52.92, 157.81])
|> angledLine(angle = 0, length = 176.4, tag = $rectangleSegmentA001)
|> angledLine(
angle = segAng(rectangleSegmentA001) - 90,
length = 53.4,
tag = $rectangleSegmentB001,
)
|> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001), tag = $rectangleSegmentC001)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude(sketch003, length = 20)
`
test.describe('edit with AI example snapshots', () => {
test(
`change colour`,
// TODO this is more of a snapshot, but atm it needs to be manually run locally to update the files
{ tag: ['@desktop'] },
async ({ context, homePage, cmdBar, editor, page, scene }) => {
const project = 'test-dir'
await context.folderSetupFn(async (dir) => {
const projectDir = path.join(dir, project)
await fsp.mkdir(projectDir, { recursive: true })
// Create the imported file
await fsp.writeFile(path.join(projectDir, 'b.kcl'), importedFile)
// Create the main file that imports
await fsp.writeFile(path.join(projectDir, 'main.kcl'), fileWithImport)
})
await homePage.openProject(project)
await scene.settled(cmdBar)
const body1CapCoords = { x: 571, y: 351 }
const [clickBody1Cap] = scene.makeMouseHelpers(
body1CapCoords.x,
body1CapCoords.y
)
const submittingToast = page.getByText('Submitting to Text-to-CAD API...')
await test.step('wait for scene to load select body and check selection came through', async () => {
await clickBody1Cap()
await editor.expectState({
highlightedCode: '',
activeLines: ['|>startProfile(at=[-73.64,-42.89])'],
diagnostics: [],
})
})
await test.step('fire off edit prompt', async () => {
await cmdBar.captureTextToCadRequestSnapshot(test.info())
await cmdBar.openCmdBar('promptToEdit')
await page.waitForTimeout(100)
await cmdBar.progressCmdBar()
// being specific about the color with a hex means asserting pixel color is more stable
await page
.getByTestId('cmd-bar-arg-value')
.fill('make this neon green please, use #39FF14')
await page.waitForTimeout(100)
await cmdBar.progressCmdBar()
await expect(submittingToast).toBeVisible()
})
}
)
})