Pass another painful spec suite: testing-settings

This commit is contained in:
49lf
2024-11-29 17:01:40 -05:00
parent 7a448760e7
commit b9a7ca26d0
3 changed files with 1199 additions and 1297 deletions

View File

@ -30,6 +30,10 @@ import { isErrorWhitelisted } from './lib/console-error-whitelist'
import { isArray } from 'lib/utils'
import { reportRejection } from 'lib/trap'
const toNormalizedCode = (text: string) => {
return text.replace(/\s+/g, '')
}
type TestColor = [number, number, number]
export const TEST_COLORS = {
WHITE: [249, 249, 249] as TestColor,
@ -505,13 +509,16 @@ export async function getUtils(page: Page, test_?: typeof test) {
)
},
toNormalizedCode: (text: string) => {
return text.replace(/\s+/g, '')
toNormalizedCode(text: string) {
return toNormalizedCode(text)
},
editorTextMatches: async (code: string) => {
async editorTextMatches(code: string) {
const editor = page.locator(editorSelector)
return expect.poll(() => editor.textContent()).toContain(code)
return expect.poll(async () => {
const text = await editor.textContent()
return toNormalizedCode(text)
}).toContain(toNormalizedCode(code))
},
pasteCodeInEditor: async (code: string) => {

View File

@ -1,11 +1,8 @@
import { test, expect } from '@playwright/test'
import { test, expect } from './zoo-test'
import * as fsp from 'fs/promises'
import { join } from 'path'
import {
getUtils,
setup,
setupElectron,
tearDown,
executorInputPath,
createProject,
} from './test-utils'
@ -19,35 +16,16 @@ import {
} from './storageStates'
import * as TOML from '@iarna/toml'
test.beforeEach(async ({ context, page }, testInfo) => {
await setup(context, page, testInfo)
})
test.afterEach(async ({ page }, testInfo) => {
await tearDown(page, testInfo)
})
test.describe('Testing settings', () => {
test('Stored settings are validated and fall back to defaults', async ({
page,
}) => {
const u = await getUtils(page)
test('Stored settings are validated and fall back to defaults',
// Override beforeEach test setup
// with corrupted settings
await page.addInitScript(
async ({ settingsKey, settings }) => {
localStorage.setItem(settingsKey, settings)
},
{
settingsKey: TEST_SETTINGS_KEY,
settings: TOML.stringify({ settings: TEST_SETTINGS_CORRUPTED }),
}
)
appSettings: TEST_SETTINGS_CORRUPTED
},
async ({ page, homePage }) => { const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart()
await page.setBodyDimensions({ width: 1200, height: 500 })
// Check the settings were reset
const storedSettings = TOML.parse(
@ -57,24 +35,21 @@ test.describe('Testing settings', () => {
)
) as { settings: SaveSettingsPayload }
expect(storedSettings.settings?.app?.theme).toBe(undefined)
expect(storedSettings.settings?.app?.theme).toBe('dark')
// Check that the invalid settings were removed
expect(storedSettings.settings?.modeling?.defaultUnit).toBe(undefined)
expect(storedSettings.settings?.modeling?.mouseControls).toBe(undefined)
expect(storedSettings.settings?.app?.projectDirectory).toBe(undefined)
// Check that the invalid settings were changed to good defaults
expect(storedSettings.settings?.modeling?.defaultUnit).toBe("in")
expect(storedSettings.settings?.modeling?.mouseControls).toBe("KittyCAD")
expect(storedSettings.settings?.app?.projectDirectory).toBe("")
expect(storedSettings.settings?.projects?.defaultProjectName).toBe(
undefined
)
})
"project-$nnn"
) })
test('Project settings can be set and override user settings', async ({
page,
}) => {
const u = await getUtils(page)
// The behavior is actually broken. Parent always takes precedence
test.fixme('Project settings can be set and override user settings', async ({ page, homePage }) => { const u = await getUtils(page)
await test.step(`Setup`, async () => {
await page.setViewportSize({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart()
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await page
.getByRole('button', { name: 'Start Sketch' })
.waitFor({ state: 'visible' })
@ -89,7 +64,7 @@ test.describe('Testing settings', () => {
const inputLocator = page.locator('input[name="modeling-showDebugPanel"]')
await test.step('Open settings dialog and set "Show debug panel" to on', async () => {
await page.keyboard.press('ControlOrMeta+Shift+,')
await page.keyboard.press('ControlOrMeta+,')
await expect(headingLocator).toBeVisible()
/** Test to close https://github.com/KittyCAD/modeling-app/issues/2713 */
@ -111,7 +86,7 @@ test.describe('Testing settings', () => {
await test.step('Open settings with keyboard shortcut', async () => {
await page.getByTestId('settings-close-button').click()
await page.locator('.cm-content').click()
await page.keyboard.press('ControlOrMeta+Shift+,')
await page.keyboard.press('ControlOrMeta+,')
await expect(headingLocator).toBeVisible()
})
@ -119,7 +94,11 @@ test.describe('Testing settings', () => {
await expect(
page.getByText(`Set show debug panel to "false" for this project`)
).toBeVisible()
// Check that the theme changed
await expect(
page.getByText(`Set show debug panel to "false" for this project`)
).not.toBeVisible()
// Check that the debug panel button is gone
await expect(paneButtonLocator).not.toBeVisible()
// Check that the user setting was not changed
@ -141,19 +120,17 @@ test.describe('Testing settings', () => {
await page.getByRole('radio', { name: 'Project' }).click()
await expect(
page.locator('input[name="modeling-showDebugPanel"]')
).not.toBeChecked()
})
).not.toBeChecked() })
test('Keybindings display the correct hotkey for Command Palette', async ({
page,
}) => {
test('Keybindings display the correct hotkey for Command Palette', async ({ page, homePage }) => {
const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart()
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await test.step('Open keybindings settings', async () => {
// Open the settings modal with the browser keyboard shortcut
await page.keyboard.press('ControlOrMeta+Shift+,')
// Open the settings modal with the keyboard shortcut
await page.keyboard.press('ControlOrMeta+,')
// Go to Keybindings tab.
const keybindingsTab = page.getByRole('radio', { name: 'Keybindings' })
@ -171,14 +148,14 @@ test.describe('Testing settings', () => {
// The hotkey is in a kbd element next to the heading.
const hotkey = commandPaletteHeading.locator('+ div kbd')
const text = process.platform === 'darwin' ? 'Command+K' : 'Control+K'
await expect(hotkey).toHaveText(text)
})
await expect(hotkey).toHaveText(text) })
test('Project and user settings can be reset', async ({ page }) => {
const u = await getUtils(page)
test('Project and user settings can be reset', async ({ page, homePage }) => { const u = await getUtils(page)
await test.step(`Setup`, async () => {
await page.setViewportSize({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart()
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.waitForTimeout(1000)
})
// Selectors and constants
@ -255,35 +232,29 @@ test.describe('Testing settings', () => {
await projectSettingsTab.click()
await expect(themeColorSetting).toHaveValue(settingValues.project)
})
})
})
}) })
test.fixme(
`Project settings override user settings on desktop`,
{ tag: ['@electron', '@skipWin'] },
async ({ browser: _ }, testInfo) => {
async ({ context, page, browser: _ }, testInfo) => {
test.skip(
process.platform === 'win32',
'TODO: remove this skip https://github.com/KittyCAD/modeling-app/issues/3557'
)
const projectName = 'bracket'
const {
electronApp,
page,
dir: projectDirName,
} = await setupElectron({
testInfo,
folderSetupFn: async (dir) => {
} = await context.folderSetupFn(async (dir) => {
const bracketDir = join(dir, projectName)
await fsp.mkdir(bracketDir, { recursive: true })
await fsp.copyFile(
executorInputPath('focusrite_scarlett_mounting_braket.kcl'),
join(bracketDir, 'main.kcl')
)
},
})
await page.setViewportSize({ width: 1200, height: 500 })
await page.setBodyDimensions({ width: 1200, height: 500 })
// Selectors and constants
const tempProjectSettingsFilePath = join(
@ -354,21 +325,18 @@ test.describe('Testing settings', () => {
await expect(logoLink).toHaveCSS('--primary-hue', userThemeColor)
})
await electronApp.close()
}
)
test(
`Load desktop app with no settings file`,
{ tag: '@electron' },
async ({ browser: _ }, testInfo) => {
const { electronApp, page } = await setupElectron({
{
tag: '@electron',
// This is what makes no settings file get created
cleanProjectDir: false,
testInfo,
})
await page.setViewportSize({ width: 1200, height: 500 })
},
async ({ page, browser: _ }, testInfo) => {
await page.setBodyDimensions({ width: 1200, height: 500 })
// Selectors and constants
const errorHeading = page.getByRole('heading', {
@ -380,24 +348,21 @@ test.describe('Testing settings', () => {
await expect(errorHeading).not.toBeVisible()
await expect(projectDirLink).toBeVisible()
await electronApp.close()
}
)
test(
`Load desktop app with a settings file, but no project directory setting`,
{ tag: '@electron' },
async ({ browser: _ }, testInfo) => {
const { electronApp, page } = await setupElectron({
testInfo,
{
tag: '@electron',
appSettings: {
app: {
themeColor: '259',
},
},
})
await page.setViewportSize({ width: 1200, height: 500 })
},
async ({ context, page, browser: _ }, testInfo) => {
await page.setBodyDimensions({ width: 1200, height: 500 })
// Selectors and constants
const errorHeading = page.getByRole('heading', {
@ -408,32 +373,26 @@ test.describe('Testing settings', () => {
// If the app loads without exploding we're in the clear
await expect(errorHeading).not.toBeVisible()
await expect(projectDirLink).toBeVisible()
await electronApp.close()
}
)
// It was much easier to test the logo color than the background stream color.
test.fixme(
'user settings reload on external change, on project and modeling view',
{ tag: '@electron' },
async ({ browserName }, testInfo) => {
const {
electronApp,
page,
dir: projectDirName,
} = await setupElectron({
testInfo,
{
tag: '@electron',
appSettings: {
app: {
// Doesn't matter what you set it to. It will
// default to 264.5
themeColor: '0',
},
}
},
})
async ({ context, page, browserName }, testInfo) => {
const { dir: projectDirName } = await context.folderSetupFn(async () => {})
await page.setViewportSize({ width: 1200, height: 500 })
await page.setBodyDimensions({ width: 1200, height: 500 })
const logoLink = page.getByTestId('app-logo')
const projectDirLink = page.getByText('Loaded from')
@ -467,23 +426,16 @@ test.describe('Testing settings', () => {
await changeColor('21')
await expect(logoLink).toHaveCSS('--primary-hue', '21')
})
await electronApp.close()
}
)
test(
'project settings reload on external change',
{ tag: '@electron' },
async ({ browserName: _ }, testInfo) => {
const {
electronApp,
page,
dir: projectDirName,
} = await setupElectron({
testInfo,
})
async ({ context, page, browserName: _ }, testInfo) => {
const { dir: projectDirName } = await context.folderSetupFn(async () => {})
await page.setViewportSize({ width: 1200, height: 500 })
await page.setBodyDimensions({ width: 1200, height: 500 })
const logoLink = page.getByTestId('app-logo')
const projectDirLink = page.getByText('Loaded from')
@ -515,17 +467,14 @@ test.describe('Testing settings', () => {
await expect(logoLink).toHaveCSS('--primary-hue', '99')
})
await electronApp.close()
}
)
test(
`Closing settings modal should go back to the original file being viewed`,
{ tag: '@electron' },
async ({ browser: _ }, testInfo) => {
const { electronApp, page } = await setupElectron({
testInfo,
folderSetupFn: async (dir) => {
async ({ context, page, browser: _ }, testInfo) => {
await context.folderSetupFn(async (dir) => {
const bracketDir = join(dir, 'project-000')
await fsp.mkdir(bracketDir, { recursive: true })
await fsp.copyFile(
@ -536,7 +485,6 @@ test.describe('Testing settings', () => {
executorInputPath('cylinder.kcl'),
join(bracketDir, '2.kcl')
)
},
})
const kclCube = await fsp.readFile(executorInputPath('cube.kcl'), 'utf-8')
const kclCylinder = await fsp.readFile(
@ -552,7 +500,7 @@ test.describe('Testing settings', () => {
editorTextMatches,
} = await getUtils(page, test)
await page.setViewportSize({ width: 1200, height: 500 })
await page.setBodyDimensions({ width: 1200, height: 500 })
page.on('console', console.log)
await test.step('Precondition: Open to second project file', async () => {
@ -583,16 +531,17 @@ test.describe('Testing settings', () => {
await test.step('Postcondition: Same file content is in editor as before settings opened', async () => {
await editorTextMatches(kclCylinder)
})
await electronApp.close()
}
)
test('Changing modeling default unit', async ({ page }) => {
const u = await getUtils(page)
test('Changing modeling default unit', async ({ page, homePage }) => { const u = await getUtils(page)
await test.step(`Test setup`, async () => {
await page.setViewportSize({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart()
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
const toastMessage = page.getByText(
`Successfully created "testDefault"`
)
await expect(toastMessage).not.toBeVisible()
await page
.getByRole('button', { name: 'Start Sketch' })
.waitFor({ state: 'visible' })
@ -619,7 +568,9 @@ test.describe('Testing settings', () => {
await userSettingsTab.click()
await defaultUnitSection.hover()
await defaultUnitRollbackButton.click()
await projectSettingsTab.hover()
await projectSettingsTab.click()
await page.waitForTimeout(1000)
})
await test.step('Change modeling default unit within project tab', async () => {
@ -631,7 +582,10 @@ test.describe('Testing settings', () => {
const toastMessage = page.getByText(
`Set default unit to "${unitOfMeasure}" for this project`
)
// Assert visibility and disapperance
await expect(toastMessage).toBeVisible()
await expect(toastMessage).not.toBeVisible()
})
}
await changeUnitOfMeasureInProjectTab('in')
@ -643,7 +597,10 @@ test.describe('Testing settings', () => {
})
// Go to the user tab
await userSettingsTab.hover()
await userSettingsTab.click()
await page.waitForTimeout(1000)
await test.step('Change modeling default unit within user tab', async () => {
const changeUnitOfMeasureInUserTab = async (unitOfMeasure: string) => {
await test.step(`Set modeling default unit to ${unitOfMeasure}`, async () => {
@ -723,12 +680,10 @@ test.describe('Testing settings', () => {
await changeUnitOfMeasureInGizmo('mm', 'Millimeters')
await changeUnitOfMeasureInGizmo('cm', 'Centimeters')
await changeUnitOfMeasureInGizmo('m', 'Meters')
})
})
}) })
test('Changing theme in sketch mode', async ({ page }) => {
const u = await getUtils(page)
await page.addInitScript(() => {
test('Changing theme in sketch mode', async ({ context, page, homePage }) => { const u = await getUtils(page)
await context.addInitScript(() => {
localStorage.setItem(
'persistCode',
`sketch001 = startSketchOn('XZ')
@ -742,7 +697,10 @@ extrude001 = extrude(5, sketch001)
`
)
})
await page.setViewportSize({ width: 1200, height: 500 })
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.waitForTimeout(1000)
// Selectors and constants
const editSketchButton = page.getByRole('button', { name: 'Edit Sketch' })
@ -753,7 +711,6 @@ extrude001 = extrude(5, sketch001)
const lightThemeSegmentColor: [number, number, number] = [90, 90, 90]
await test.step(`Get into sketch mode`, async () => {
await u.waitForAuthSkipAppStart()
await page.mouse.click(700, 200)
await expect(editSketchButton).toBeVisible()
await editSketchButton.click()
@ -789,24 +746,13 @@ extrude001 = extrude(5, sketch001)
u.getGreatestPixDiff(sketchOriginLocation, lightThemeSegmentColor)
)
.toBeLessThan(15)
})
})
}) })
test(`Changing system theme preferences (via media query) should update UI and stream`, async ({
page,
}) => {
test(`Changing system theme preferences (via media query) should update UI and stream`, {
// Override the settings so that the theme is set to `system`
await page.addInitScript(
({ settingsKey, settings }) => {
localStorage.setItem(settingsKey, settings)
},
{
settingsKey: TEST_SETTINGS_KEY,
settings: TOML.stringify({
settings: TEST_SETTINGS_DEFAULT_THEME,
}),
}
)
appSettings: TEST_SETTINGS_DEFAULT_THEME,
}, async ({ page, homePage }) => {
const u = await getUtils(page)
// Selectors and constants
@ -822,8 +768,10 @@ extrude001 = extrude(5, sketch001)
const toolbar = page.locator('menu').filter({ hasText: 'Start Sketch' })
await test.step(`Test setup`, async () => {
await page.setViewportSize({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart()
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.waitForTimeout(1000)
await expect(toolbar).toBeVisible()
})
@ -843,36 +791,30 @@ extrude001 = extrude(5, sketch001)
await expect
.poll(() => streamBackgroundPixelIsColor(darkBackgroundColor))
.toBeLessThan(15)
})
})
test(`Turning off "Show debug panel" with debug panel open leaves no phantom panel`, async ({
page,
}) => {
const u = await getUtils(page)
}) })
test(`Turning off "Show debug panel" with debug panel open leaves no phantom panel`, {
// Override beforeEach test setup
// with debug panel open
// but "show debug panel" set to false
await page.addInitScript(
async ({ settingsKey, settings }) => {
localStorage.setItem(settingsKey, settings)
appSettings: {
...TEST_SETTINGS,
modeling: { ...TEST_SETTINGS.modeling, showDebugPanel: false },
}
}, async ({ context, page, homePage }) => {
const u = await getUtils(page)
await context.addInitScript(
async ({ }) => {
localStorage.setItem(
'persistModelingContext',
'{"openPanes":["debug"]}'
)
},
{
settingsKey: TEST_SETTINGS_KEY,
settings: TOML.stringify({
settings: {
...TEST_SETTINGS,
modeling: { ...TEST_SETTINGS.modeling, showDebugPanel: false },
},
}),
}
)
await page.setViewportSize({ width: 1200, height: 500 })
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
// Constants and locators
const resizeHandle = page.locator('.sidebar-resize-handles > div.block')
@ -894,7 +836,6 @@ extrude001 = extrude(5, sketch001)
}
await test.step(`Initial load with corrupted settings`, async () => {
await u.waitForAuthSkipAppStart()
// Check that the debug panel is not visible
await expect(debugPaneButton).not.toBeVisible()
// Check the pane resize handle wrapper is not visible
@ -921,6 +862,5 @@ extrude001 = extrude(5, sketch001)
await setShowDebugPanelTo('Off')
await expect(debugPaneButton).not.toBeVisible()
await expect(resizeHandle).not.toBeVisible()
})
})
}) })
})

View File

@ -1,29 +1,14 @@
import { test, expect, Page } from '@playwright/test'
import {
getUtils,
setup,
tearDown,
setupElectron,
createProject,
} from './test-utils'
import { test, expect, Page } from './zoo-test'
import { getUtils, createProject, } from './test-utils'
import { join } from 'path'
import fs from 'fs'
test.beforeEach(async ({ context, page }) => {
await setup(context, page)
})
test.afterEach(async ({ page }, testInfo) => {
await tearDown(page, testInfo)
})
test.describe('Text-to-CAD tests', () => {
test('basic lego happy case', async ({ page }) => {
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 page.setViewportSize({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart()
await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
})
await sendPromptFromCommandBar(page, 'a 2x4 lego')
@ -82,17 +67,13 @@ test.describe('Text-to-CAD tests', () => {
await closeButton.click()
// The toast should disappear.
await expect(successToastMessage).not.toBeVisible()
})
await expect(successToastMessage).not.toBeVisible() })
test('success model, then ignore success toast, user can create new prompt from command bar', async ({
page,
}) => {
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.setViewportSize({ width: 1000, height: 500 })
await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart()
await homePage.goToModelingScene()
await sendPromptFromCommandBar(page, 'a 2x6 lego')
@ -128,17 +109,13 @@ test.describe('Text-to-CAD tests', () => {
timeout: 15000,
})
await expect(page.getByText('a 2x4 lego')).toBeVisible()
await expect(page.getByText('a 2x6 lego')).toBeVisible()
})
await expect(page.getByText('a 2x6 lego')).toBeVisible() })
test('you can reject text-to-cad output and it does nothing', async ({
page,
}) => {
const u = await getUtils(page)
test('you can reject text-to-cad output and it does nothing', async ({ page, homePage }) => { const u = await getUtils(page)
await page.setViewportSize({ width: 1000, height: 500 })
await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart()
await homePage.goToModelingScene()
await sendPromptFromCommandBar(page, 'a 2x4 lego')
@ -167,15 +144,13 @@ test.describe('Text-to-CAD tests', () => {
await expect(successToastMessage).not.toBeVisible()
// Expect no code.
await expect(page.locator('.cm-content')).toContainText(``)
})
await expect(page.locator('.cm-content')).toContainText(``) })
test('sending a bad prompt fails, can dismiss', async ({ page }) => {
const u = await getUtils(page)
test('sending a bad prompt fails, can dismiss', async ({ page, homePage }) => { const u = await getUtils(page)
await page.setViewportSize({ width: 1000, height: 500 })
await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart()
await homePage.goToModelingScene()
const commandBarButton = page.getByRole('button', { name: 'Commands' })
await expect(commandBarButton).toBeVisible()
@ -231,17 +206,13 @@ test.describe('Text-to-CAD tests', () => {
await dismissButton.click()
// The toast should disappear.
await expect(failureToastMessage).not.toBeVisible()
})
await expect(failureToastMessage).not.toBeVisible() })
test('sending a bad prompt fails, can start over from toast', async ({
page,
}) => {
const u = await getUtils(page)
test('sending a bad prompt fails, can start over from toast', async ({ page, homePage }) => { const u = await getUtils(page)
await page.setViewportSize({ width: 1000, height: 500 })
await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart()
await homePage.goToModelingScene()
const commandBarButton = page.getByRole('button', { name: 'Commands' })
await expect(commandBarButton).toBeVisible()
@ -319,17 +290,13 @@ test.describe('Text-to-CAD tests', () => {
await expect(generatingToastMessage).toBeVisible({ timeout: 10000 })
await expect(successToastMessage).toBeVisible({ timeout: 15000 })
})
await expect(successToastMessage).toBeVisible({ timeout: 15000 }) })
test('sending a bad prompt fails, can ignore toast, can start over from command bar', async ({
page,
}) => {
const u = await getUtils(page)
test('sending a bad prompt fails, can ignore toast, can start over from command bar', async ({ page, homePage }) => { const u = await getUtils(page)
await page.setViewportSize({ width: 1000, height: 500 })
await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart()
await homePage.goToModelingScene()
const commandBarButton = page.getByRole('button', { name: 'Commands' })
await expect(commandBarButton).toBeVisible()
@ -395,15 +362,13 @@ test.describe('Text-to-CAD tests', () => {
// old failure toast should stick around.
await expect(failureToastMessage).toBeVisible()
await expect(page.getByText(`Text-to-CAD failed`)).toBeVisible()
})
await expect(page.getByText(`Text-to-CAD failed`)).toBeVisible() })
test('ensure you can shift+enter in the prompt box', async ({ page }) => {
const u = await getUtils(page)
test('ensure you can shift+enter in the prompt box', async ({ page, homePage }) => { const u = await getUtils(page)
await page.setViewportSize({ width: 1000, height: 500 })
await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart()
await homePage.goToModelingScene()
const promptWithNewline = `a 2x4\nlego`
@ -450,14 +415,9 @@ test.describe('Text-to-CAD tests', () => {
const successToastMessage = page.getByText(`Text-to-CAD successful`)
await expect(successToastMessage).toBeVisible({ timeout: 15000 })
await expect(page.getByText(promptWithNewline)).toBeVisible()
})
await expect(page.getByText(promptWithNewline)).toBeVisible() })
test(
'can do many at once and get many prompts back, and interact with many',
{ tag: ['@skipWin'] },
async ({ page }) => {
// Let this test run longer since we've seen it timeout.
test('can do many at once and get many prompts back, and interact with many', { tag: ['@skipWin'] }, async ({ page, homePage }) => { // Let this test run longer since we've seen it timeout.
test.setTimeout(180_000)
// skip on windows
test.skip(
@ -467,9 +427,9 @@ test.describe('Text-to-CAD tests', () => {
const u = await getUtils(page)
await page.setViewportSize({ width: 1000, height: 500 })
await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart()
await homePage.goToModelingScene()
await sendPromptFromCommandBar(page, 'a 2x4 lego')
@ -571,18 +531,13 @@ test.describe('Text-to-CAD tests', () => {
// Find the toast close button.
await expect(closeButton).toBeVisible()
await closeButton.click()
await expect(successToastMessage).not.toBeVisible()
}
)
await expect(successToastMessage).not.toBeVisible() })
test('can do many at once with errors, clicking dismiss error does not dismiss all', async ({
page,
}) => {
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.setViewportSize({ width: 1000, height: 500 })
await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart()
await homePage.goToModelingScene()
await sendPromptFromCommandBar(page, 'a 2x4 lego')
@ -663,8 +618,7 @@ test.describe('Text-to-CAD tests', () => {
// Expect the toast to disappear.
await expect(page.getByText('Copied')).not.toBeVisible()
await expect(successToastMessage).not.toBeVisible()
})
await expect(successToastMessage).not.toBeVisible() })
})
async function sendPromptFromCommandBar(page: Page, promptStr: string) {
@ -672,13 +626,14 @@ async function sendPromptFromCommandBar(page: Page, promptStr: string) {
const commandBarButton = page.getByRole('button', { name: 'Commands' })
await expect(commandBarButton).toBeVisible()
// Click the command bar button
await commandBarButton.hover()
await commandBarButton.click()
// Wait for the command bar to appear
const cmdSearchBar = page.getByPlaceholder('Search commands')
await expect(cmdSearchBar).toBeVisible()
const textToCadCommand = page.getByText('Use the Zoo Text-to-CAD API ')
const textToCadCommand = page.getByText('Text-to-CAD')
await expect(textToCadCommand.first()).toBeVisible()
// Click the Text-to-CAD command
await textToCadCommand.first().click()
@ -711,7 +666,7 @@ test(
test
)
await page.setViewportSize({ width: 1200, height: 500 })
await page.setBodyDimensions({ width: 1200, height: 500 })
// Locators
const projectMenuButton = page