Pass text-to-cad tests
This commit is contained in:
@ -4,11 +4,14 @@ import { join } from 'path'
|
|||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
|
|
||||||
test.describe('Text-to-CAD tests', () => {
|
test.describe('Text-to-CAD tests', () => {
|
||||||
test('basic lego happy case', async ({ page, homePage }) => { const u = await getUtils(page)
|
test('basic lego happy case', async ({ page, homePage }) => {
|
||||||
|
|
||||||
|
const u = await getUtils(page)
|
||||||
|
|
||||||
await test.step('Set up', async () => {
|
await test.step('Set up', async () => {
|
||||||
await page.setBodyDimensions({ width: 1000, height: 500 })
|
await page.setBodyDimensions({ width: 1000, height: 500 })
|
||||||
await homePage.goToModelingScene()
|
await homePage.goToModelingScene()
|
||||||
|
await u.waitForPageLoad()
|
||||||
})
|
})
|
||||||
|
|
||||||
await sendPromptFromCommandBar(page, 'a 2x4 lego')
|
await sendPromptFromCommandBar(page, 'a 2x4 lego')
|
||||||
@ -28,25 +31,18 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
const successToastMessage = page.getByText(`Text-to-CAD successful`)
|
const successToastMessage = page.getByText(`Text-to-CAD successful`)
|
||||||
await expect(successToastMessage).toBeVisible({ timeout: 15000 })
|
await expect(successToastMessage).toBeVisible({ timeout: 15000 })
|
||||||
|
|
||||||
await expect(page.getByText('Copied')).not.toBeVisible()
|
|
||||||
|
|
||||||
// Hit copy to clipboard.
|
// Hit accept.
|
||||||
const copyToClipboardButton = page.getByRole('button', {
|
const copyToClipboardButton = page.getByRole('button', {
|
||||||
name: 'Copy to clipboard',
|
name: 'Accept',
|
||||||
})
|
})
|
||||||
await expect(copyToClipboardButton).toBeVisible()
|
await expect(copyToClipboardButton).toBeVisible()
|
||||||
|
|
||||||
await copyToClipboardButton.click()
|
await copyToClipboardButton.click()
|
||||||
|
|
||||||
// Expect the code to be copied.
|
|
||||||
await expect(page.getByText('Copied')).toBeVisible()
|
|
||||||
|
|
||||||
// Click in the code editor.
|
// Click in the code editor.
|
||||||
await page.locator('.cm-content').click()
|
await page.locator('.cm-content').click()
|
||||||
|
|
||||||
// Paste the code.
|
|
||||||
await page.keyboard.press('ControlOrMeta+KeyV')
|
|
||||||
|
|
||||||
// Expect the code to be pasted.
|
// Expect the code to be pasted.
|
||||||
await expect(page.locator('.cm-content')).toContainText(`const`)
|
await expect(page.locator('.cm-content')).toContainText(`const`)
|
||||||
|
|
||||||
@ -56,24 +52,14 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
await u.expectCmdLog('[data-message-type="execution-done"]')
|
await u.expectCmdLog('[data-message-type="execution-done"]')
|
||||||
await u.closeDebugPanel()
|
await u.closeDebugPanel()
|
||||||
|
|
||||||
// Find the toast close button.
|
})
|
||||||
const closeButton = page
|
|
||||||
.getByRole('status')
|
|
||||||
.locator('div')
|
|
||||||
.filter({ hasText: 'Text-to-CAD successfulPrompt' })
|
|
||||||
.first()
|
|
||||||
.getByRole('button', { name: 'Close' })
|
|
||||||
await expect(closeButton).toBeVisible()
|
|
||||||
await closeButton.click()
|
|
||||||
|
|
||||||
// The toast should disappear.
|
|
||||||
await expect(successToastMessage).not.toBeVisible() })
|
|
||||||
|
|
||||||
test('success model, then ignore success toast, user can create new prompt from command bar', async ({ page, homePage }) => { const u = await getUtils(page)
|
test('success model, then ignore success toast, user can create new prompt from command bar', async ({ page, homePage }) => { const u = await getUtils(page)
|
||||||
|
|
||||||
await page.setBodyDimensions({ width: 1000, height: 500 })
|
await page.setBodyDimensions({ width: 1000, height: 500 })
|
||||||
|
|
||||||
await homePage.goToModelingScene()
|
await homePage.goToModelingScene()
|
||||||
|
await u.waitForPageLoad()
|
||||||
|
|
||||||
await sendPromptFromCommandBar(page, 'a 2x6 lego')
|
await sendPromptFromCommandBar(page, 'a 2x6 lego')
|
||||||
|
|
||||||
@ -92,10 +78,6 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
const successToastMessage = page.getByText(`Text-to-CAD successful`)
|
const successToastMessage = page.getByText(`Text-to-CAD successful`)
|
||||||
await expect(successToastMessage).toBeVisible({ timeout: 15000 })
|
await expect(successToastMessage).toBeVisible({ timeout: 15000 })
|
||||||
|
|
||||||
await expect(page.getByText('Copied')).not.toBeVisible()
|
|
||||||
|
|
||||||
await expect(successToastMessage).toBeVisible()
|
|
||||||
|
|
||||||
// Can send a new prompt from the command bar.
|
// Can send a new prompt from the command bar.
|
||||||
await sendPromptFromCommandBar(page, 'a 2x4 lego')
|
await sendPromptFromCommandBar(page, 'a 2x4 lego')
|
||||||
|
|
||||||
@ -116,6 +98,7 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
await page.setBodyDimensions({ width: 1000, height: 500 })
|
await page.setBodyDimensions({ width: 1000, height: 500 })
|
||||||
|
|
||||||
await homePage.goToModelingScene()
|
await homePage.goToModelingScene()
|
||||||
|
await u.waitForPageLoad()
|
||||||
|
|
||||||
await sendPromptFromCommandBar(page, 'a 2x4 lego')
|
await sendPromptFromCommandBar(page, 'a 2x4 lego')
|
||||||
|
|
||||||
@ -151,6 +134,7 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
await page.setBodyDimensions({ width: 1000, height: 500 })
|
await page.setBodyDimensions({ width: 1000, height: 500 })
|
||||||
|
|
||||||
await homePage.goToModelingScene()
|
await homePage.goToModelingScene()
|
||||||
|
await u.waitForPageLoad()
|
||||||
|
|
||||||
const commandBarButton = page.getByRole('button', { name: 'Commands' })
|
const commandBarButton = page.getByRole('button', { name: 'Commands' })
|
||||||
await expect(commandBarButton).toBeVisible()
|
await expect(commandBarButton).toBeVisible()
|
||||||
@ -213,6 +197,7 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
await page.setBodyDimensions({ width: 1000, height: 500 })
|
await page.setBodyDimensions({ width: 1000, height: 500 })
|
||||||
|
|
||||||
await homePage.goToModelingScene()
|
await homePage.goToModelingScene()
|
||||||
|
await u.waitForPageLoad()
|
||||||
|
|
||||||
const commandBarButton = page.getByRole('button', { name: 'Commands' })
|
const commandBarButton = page.getByRole('button', { name: 'Commands' })
|
||||||
await expect(commandBarButton).toBeVisible()
|
await expect(commandBarButton).toBeVisible()
|
||||||
@ -297,6 +282,7 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
await page.setBodyDimensions({ width: 1000, height: 500 })
|
await page.setBodyDimensions({ width: 1000, height: 500 })
|
||||||
|
|
||||||
await homePage.goToModelingScene()
|
await homePage.goToModelingScene()
|
||||||
|
await u.waitForPageLoad()
|
||||||
|
|
||||||
const commandBarButton = page.getByRole('button', { name: 'Commands' })
|
const commandBarButton = page.getByRole('button', { name: 'Commands' })
|
||||||
await expect(commandBarButton).toBeVisible()
|
await expect(commandBarButton).toBeVisible()
|
||||||
@ -358,8 +344,6 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
|
|
||||||
await expect(successToastMessage).toBeVisible({ timeout: 15000 })
|
await expect(successToastMessage).toBeVisible({ timeout: 15000 })
|
||||||
|
|
||||||
await expect(page.getByText('Copied')).not.toBeVisible()
|
|
||||||
|
|
||||||
// old failure toast should stick around.
|
// old failure toast should stick around.
|
||||||
await expect(failureToastMessage).toBeVisible()
|
await expect(failureToastMessage).toBeVisible()
|
||||||
await expect(page.getByText(`Text-to-CAD failed`)).toBeVisible() })
|
await expect(page.getByText(`Text-to-CAD failed`)).toBeVisible() })
|
||||||
@ -369,6 +353,7 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
await page.setBodyDimensions({ width: 1000, height: 500 })
|
await page.setBodyDimensions({ width: 1000, height: 500 })
|
||||||
|
|
||||||
await homePage.goToModelingScene()
|
await homePage.goToModelingScene()
|
||||||
|
await u.waitForPageLoad()
|
||||||
|
|
||||||
const promptWithNewline = `a 2x4\nlego`
|
const promptWithNewline = `a 2x4\nlego`
|
||||||
|
|
||||||
@ -430,6 +415,7 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
await page.setBodyDimensions({ width: 1000, height: 500 })
|
await page.setBodyDimensions({ width: 1000, height: 500 })
|
||||||
|
|
||||||
await homePage.goToModelingScene()
|
await homePage.goToModelingScene()
|
||||||
|
await u.waitForPageLoad()
|
||||||
|
|
||||||
await sendPromptFromCommandBar(page, 'a 2x4 lego')
|
await sendPromptFromCommandBar(page, 'a 2x4 lego')
|
||||||
|
|
||||||
@ -455,8 +441,6 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
// We should have three success toasts.
|
// We should have three success toasts.
|
||||||
await expect(successToastMessage).toHaveCount(3, { timeout: 25_000 })
|
await expect(successToastMessage).toHaveCount(3, { timeout: 25_000 })
|
||||||
|
|
||||||
await expect(page.getByText('Copied')).not.toBeVisible()
|
|
||||||
|
|
||||||
await expect(page.getByText(`a 2x4 lego`)).toBeVisible()
|
await expect(page.getByText(`a 2x4 lego`)).toBeVisible()
|
||||||
await expect(page.getByText(`a 2x8 lego`)).toBeVisible()
|
await expect(page.getByText(`a 2x8 lego`)).toBeVisible()
|
||||||
await expect(page.getByText(`a 2x10 lego`)).toBeVisible()
|
await expect(page.getByText(`a 2x10 lego`)).toBeVisible()
|
||||||
@ -474,31 +458,15 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
|
|
||||||
// Ensure you can copy the code for one of the models remaining.
|
// Ensure you can copy the code for one of the models remaining.
|
||||||
const copyToClipboardButton = page.getByRole('button', {
|
const copyToClipboardButton = page.getByRole('button', {
|
||||||
name: 'Copy to clipboard',
|
name: 'Accept',
|
||||||
})
|
})
|
||||||
await expect(copyToClipboardButton.first()).toBeVisible()
|
await expect(copyToClipboardButton.first()).toBeVisible()
|
||||||
// Click the button.
|
// Click the button.
|
||||||
await copyToClipboardButton.first().click()
|
await copyToClipboardButton.first().click()
|
||||||
|
|
||||||
// Expect the code to be copied.
|
|
||||||
await expect(page.getByText('Copied')).toBeVisible()
|
|
||||||
|
|
||||||
// Click in the code editor.
|
|
||||||
await page.locator('.cm-content').click({ position: { x: 10, y: 10 } })
|
|
||||||
|
|
||||||
// Paste the code.
|
|
||||||
await page.keyboard.down('ControlOrMeta')
|
|
||||||
await page.keyboard.press('KeyV')
|
|
||||||
await page.keyboard.up('ControlOrMeta')
|
|
||||||
|
|
||||||
// Expect the code to be pasted.
|
// Expect the code to be pasted.
|
||||||
await expect(page.locator('.cm-content')).toContainText(`2x8`)
|
await expect(page.locator('.cm-content')).toContainText(`2x8`)
|
||||||
|
|
||||||
// Find the toast close button.
|
|
||||||
const closeButton = page.locator('[data-negative-button="close"]').first()
|
|
||||||
await expect(closeButton).toBeVisible()
|
|
||||||
await closeButton.click()
|
|
||||||
|
|
||||||
// Ensure the final toast remains.
|
// Ensure the final toast remains.
|
||||||
await expect(page.getByText(`a 2x10 lego`)).not.toBeVisible()
|
await expect(page.getByText(`a 2x10 lego`)).not.toBeVisible()
|
||||||
await expect(page.getByText(`Prompt: "a 2x8 lego`)).not.toBeVisible()
|
await expect(page.getByText(`Prompt: "a 2x8 lego`)).not.toBeVisible()
|
||||||
@ -509,35 +477,17 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
// Click the button.
|
// Click the button.
|
||||||
await copyToClipboardButton.click()
|
await copyToClipboardButton.click()
|
||||||
|
|
||||||
// Expect the code to be copied.
|
|
||||||
await expect(page.getByText('Copied')).toBeVisible()
|
|
||||||
|
|
||||||
// Click in the code editor.
|
|
||||||
await page.locator('.cm-content').click({ position: { x: 10, y: 10 } })
|
|
||||||
|
|
||||||
// Paste the code.
|
|
||||||
await page.keyboard.down('ControlOrMeta')
|
|
||||||
await page.keyboard.press('KeyA')
|
|
||||||
await page.keyboard.up('ControlOrMeta')
|
|
||||||
await page.keyboard.press('Backspace')
|
|
||||||
await page.keyboard.down('ControlOrMeta')
|
|
||||||
await page.keyboard.press('KeyV')
|
|
||||||
await page.keyboard.up('ControlOrMeta')
|
|
||||||
|
|
||||||
// Expect the code to be pasted.
|
// Expect the code to be pasted.
|
||||||
await expect(page.locator('.cm-content')).toContainText(`2x4`)
|
await expect(page.locator('.cm-content')).toContainText(`2x4`)
|
||||||
|
|
||||||
// Expect the toast to disappear.
|
})
|
||||||
// Find the toast close button.
|
|
||||||
await expect(closeButton).toBeVisible()
|
|
||||||
await closeButton.click()
|
|
||||||
await expect(successToastMessage).not.toBeVisible() })
|
|
||||||
|
|
||||||
test('can do many at once with errors, clicking dismiss error does not dismiss all', async ({ page, homePage }) => { const u = await getUtils(page)
|
test('can do many at once with errors, clicking dismiss error does not dismiss all', async ({ page, homePage }) => { const u = await getUtils(page)
|
||||||
|
|
||||||
await page.setBodyDimensions({ width: 1000, height: 500 })
|
await page.setBodyDimensions({ width: 1000, height: 500 })
|
||||||
|
|
||||||
await homePage.goToModelingScene()
|
await homePage.goToModelingScene()
|
||||||
|
await u.waitForPageLoad()
|
||||||
|
|
||||||
await sendPromptFromCommandBar(page, 'a 2x4 lego')
|
await sendPromptFromCommandBar(page, 'a 2x4 lego')
|
||||||
|
|
||||||
@ -586,57 +536,37 @@ test.describe('Text-to-CAD tests', () => {
|
|||||||
|
|
||||||
// Ensure you can copy the code for one of the models remaining.
|
// Ensure you can copy the code for one of the models remaining.
|
||||||
const copyToClipboardButton = page.getByRole('button', {
|
const copyToClipboardButton = page.getByRole('button', {
|
||||||
name: 'Copy to clipboard',
|
name: 'Accept',
|
||||||
})
|
})
|
||||||
await expect(copyToClipboardButton.first()).toBeVisible()
|
await expect(copyToClipboardButton.first()).toBeVisible()
|
||||||
// Click the button.
|
// Click the button.
|
||||||
await copyToClipboardButton.first().click()
|
await copyToClipboardButton.first().click()
|
||||||
|
|
||||||
// Expect the code to be copied.
|
|
||||||
await expect(page.getByText('Copied')).toBeVisible()
|
|
||||||
|
|
||||||
// Click in the code editor.
|
|
||||||
await page.locator('.cm-content').click({ position: { x: 10, y: 10 } })
|
|
||||||
|
|
||||||
// Paste the code.
|
|
||||||
await page.keyboard.down('ControlOrMeta')
|
|
||||||
await page.keyboard.press('KeyV')
|
|
||||||
await page.keyboard.up('ControlOrMeta')
|
|
||||||
|
|
||||||
// Expect the code to be pasted.
|
// Expect the code to be pasted.
|
||||||
await expect(page.locator('.cm-content')).toContainText(`2x4`)
|
await expect(page.locator('.cm-content')).toContainText(`2x4`)
|
||||||
|
})
|
||||||
// Find the toast close button.
|
|
||||||
const closeButton = page
|
|
||||||
.getByRole('status')
|
|
||||||
.locator('div')
|
|
||||||
.filter({ hasText: 'Text-to-CAD successfulPrompt' })
|
|
||||||
.first()
|
|
||||||
.getByRole('button', { name: 'Close' })
|
|
||||||
await expect(closeButton).toBeVisible()
|
|
||||||
await closeButton.click()
|
|
||||||
|
|
||||||
// Expect the toast to disappear.
|
|
||||||
await expect(page.getByText('Copied')).not.toBeVisible()
|
|
||||||
await expect(successToastMessage).not.toBeVisible() })
|
|
||||||
})
|
})
|
||||||
|
|
||||||
async function sendPromptFromCommandBar(page: Page, promptStr: string) {
|
async function sendPromptFromCommandBar(page: Page, promptStr: string) {
|
||||||
|
await page.waitForTimeout(1000)
|
||||||
await test.step(`Send prompt from command bar: ${promptStr}`, async () => {
|
await test.step(`Send prompt from command bar: ${promptStr}`, async () => {
|
||||||
const commandBarButton = page.getByRole('button', { name: 'Commands' })
|
const commandBarButton = page.getByRole('button', { name: 'Commands' })
|
||||||
await expect(commandBarButton).toBeVisible()
|
await expect(commandBarButton).toBeVisible()
|
||||||
// Click the command bar button
|
// Click the command bar button
|
||||||
await commandBarButton.hover()
|
await commandBarButton.hover()
|
||||||
await commandBarButton.click()
|
await commandBarButton.click()
|
||||||
|
await page.waitForTimeout(1000)
|
||||||
|
|
||||||
// Wait for the command bar to appear
|
// Wait for the command bar to appear
|
||||||
const cmdSearchBar = page.getByPlaceholder('Search commands')
|
const cmdSearchBar = page.getByPlaceholder('Search commands')
|
||||||
await expect(cmdSearchBar).toBeVisible()
|
await expect(cmdSearchBar).toBeVisible()
|
||||||
|
|
||||||
const textToCadCommand = page.getByText('Text-to-CAD')
|
const textToCadCommand = page.getByText('Use the Zoo Text-to-CAD API')
|
||||||
await expect(textToCadCommand.first()).toBeVisible()
|
await expect(textToCadCommand.first()).toBeVisible()
|
||||||
// Click the Text-to-CAD command
|
// Click the Text-to-CAD command
|
||||||
|
await textToCadCommand.first().scrollIntoViewIfNeeded()
|
||||||
await textToCadCommand.first().click()
|
await textToCadCommand.first().click()
|
||||||
|
await page.waitForTimeout(1000)
|
||||||
|
|
||||||
// Enter the prompt.
|
// Enter the prompt.
|
||||||
const prompt = page.getByText('Prompt')
|
const prompt = page.getByText('Prompt')
|
||||||
@ -652,12 +582,13 @@ async function sendPromptFromCommandBar(page: Page, promptStr: string) {
|
|||||||
test(
|
test(
|
||||||
'Text-to-CAD functionality',
|
'Text-to-CAD functionality',
|
||||||
{ tag: '@electron' },
|
{ tag: '@electron' },
|
||||||
async ({ browserName }, testInfo) => {
|
async ({ context, page }, testInfo) => {
|
||||||
const projectName = 'project-000'
|
const projectName = 'project-000'
|
||||||
const prompt = 'lego 2x4'
|
const prompt = 'lego 2x4'
|
||||||
const textToCadFileName = 'lego-2x4.kcl'
|
const textToCadFileName = 'lego-2x4.kcl'
|
||||||
|
|
||||||
const { electronApp, page, dir } = await setupElectron({ testInfo })
|
const { dir } = await context.folderSetupFn(async () => {})
|
||||||
|
|
||||||
const fileExists = () =>
|
const fileExists = () =>
|
||||||
fs.existsSync(join(dir, projectName, textToCadFileName))
|
fs.existsSync(join(dir, projectName, textToCadFileName))
|
||||||
|
|
||||||
@ -716,7 +647,5 @@ test(
|
|||||||
// Confirm we've navigated back to the main.kcl file after deletion
|
// Confirm we've navigated back to the main.kcl file after deletion
|
||||||
await expect(projectMenuButton).toContainText('main.kcl')
|
await expect(projectMenuButton).toContainText('main.kcl')
|
||||||
})
|
})
|
||||||
|
|
||||||
await electronApp.close()
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user