Pass regresion-tests.spec tests

This commit is contained in:
49lf
2024-11-28 12:14:27 -05:00
parent f81dc5d96e
commit 35431279f5

View File

@ -1,36 +1,24 @@
import { test, expect, Page } from '@playwright/test' import { test, expect, Page } from './zoo-test'
import { join } from 'path' import path from 'path'
import * as fsp from 'fs/promises' import * as fsp from 'fs/promises'
import { import {
getUtils, getUtils,
setup,
setupElectron,
tearDown,
executorInputPath, executorInputPath,
} from './test-utils' } from './test-utils'
import { TEST_CODE_TRIGGER_ENGINE_EXPORT_ERROR } from './storageStates' import { TEST_CODE_TRIGGER_ENGINE_EXPORT_ERROR } from './storageStates'
import { bracket } from 'lib/exampleKcl' import { bracket } from 'lib/exampleKcl'
test.beforeEach(async ({ context, page }, testInfo) => {
await setup(context, page, testInfo)
})
test.afterEach(async ({ page }, testInfo) => {
await tearDown(page, testInfo)
})
test.describe('Regression tests', () => { test.describe('Regression tests', () => {
// bugs we found that don't fit neatly into other categories // bugs we found that don't fit neatly into other categories
test('bad model has inline error #3251', async ({ page }) => { test('bad model has inline error #3251', async ({ context, page, homePage }) => { // because the model has `line([0,0]..` it is valid code, but the model is invalid
// because the model has `line([0,0]..` it is valid code, but the model is invalid
// regression test for https://github.com/KittyCAD/modeling-app/issues/3251 // regression test for https://github.com/KittyCAD/modeling-app/issues/3251
// Since the bad model also found as issue with the artifact graph, which in tern blocked the editor diognostics // Since the bad model also found as issue with the artifact graph, which in tern blocked the editor diognostics
const u = await getUtils(page) const u = await getUtils(page)
await page.addInitScript(async () => { await context.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`sketch2 = startSketchOn("XY") `sketch2 = startSketchOn("XY")
sketch001 = startSketchAt([-0, -0]) sketch001 = startSketchAt([-0, -0])
|> line([0, 0], %) |> line([0, 0], %)
|> line([-4.84, -5.29], %) |> line([-4.84, -5.29], %)
|> lineTo([profileStartX(%), profileStartY(%)], %) |> lineTo([profileStartX(%), profileStartY(%)], %)
@ -38,9 +26,10 @@ sketch001 = startSketchAt([-0, -0])
) )
}) })
await page.setViewportSize({ width: 1000, height: 500 }) await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
// error in guter // error in guter
await expect(page.locator('.cm-lint-marker-error')).toBeVisible() await expect(page.locator('.cm-lint-marker-error')).toBeVisible()
@ -52,38 +41,45 @@ sketch001 = startSketchAt([-0, -0])
// when https://github.com/KittyCAD/modeling-app/issues/3268 is closed // when https://github.com/KittyCAD/modeling-app/issues/3268 is closed
// this test will need updating // this test will need updating
const crypticErrorText = `ApiError` const crypticErrorText = `ApiError`
await expect(page.getByText(crypticErrorText).first()).toBeVisible() await expect(page.getByText(crypticErrorText).first()).toBeVisible() })
}) test('user should not have to press down twice in cmdbar', async ({ page, homePage }) => { // because the model has `line([0,0]..` it is valid code, but the model is invalid
test('user should not have to press down twice in cmdbar', async ({
page,
}) => {
// because the model has `line([0,0]..` it is valid code, but the model is invalid
// regression test for https://github.com/KittyCAD/modeling-app/issues/3251 // regression test for https://github.com/KittyCAD/modeling-app/issues/3251
// Since the bad model also found as issue with the artifact graph, which in tern blocked the editor diognostics // Since the bad model also found as issue with the artifact graph, which in tern blocked the editor diognostics
const u = await getUtils(page) const u = await getUtils(page)
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`sketch2 = startSketchOn("XY") `sketch001 = startSketchOn('XY')
sketch001 = startSketchAt([-0, -0]) |> startProfileAt([82.33, 238.21], %)
|> line([0, 0], %) |> angledLine([0, 288.63], %, $rectangleSegmentA001)
|> line([-4.84, -5.29], %) |> angledLine([
segAng(rectangleSegmentA001) - 90,
197.97
], %, $rectangleSegmentB001)
|> angledLine([
segAng(rectangleSegmentA001),
-segLen(rectangleSegmentA001)
], %, $rectangleSegmentC001)
|> lineTo([profileStartX(%), profileStartY(%)], %) |> lineTo([profileStartX(%), profileStartY(%)], %)
|> close(%)` |> close(%)
extrude001 = extrude(50, sketch001)
`
) )
}) })
await page.setViewportSize({ width: 1000, height: 500 }) await page.setBodyDimensions({ width: 1000, height: 500 })
await page.goto('/') await homePage.goToModelingScene()
await u.waitForPageLoad() await u.waitForPageLoad()
await test.step('Check arrow down works', async () => { await test.step('Check arrow down works', async () => {
await page.getByTestId('command-bar-open-button').hover()
await page.getByTestId('command-bar-open-button').click() await page.getByTestId('command-bar-open-button').click()
await page const floppy = page
.getByRole('option', { name: 'floppy disk arrow Export' }) .getByRole('option', { name: 'floppy disk arrow Export' })
.click()
await floppy.click()
// press arrow down key twice // press arrow down key twice
await page.keyboard.press('ArrowDown') await page.keyboard.press('ArrowDown')
@ -113,10 +109,8 @@ sketch001 = startSketchAt([-0, -0])
await expect(page.locator('[data-headlessui-state="active"]')).toHaveText( await expect(page.locator('[data-headlessui-state="active"]')).toHaveText(
'light' 'light'
) )
}) }) })
}) test('executes on load', async ({ page, homePage }) => { const u = await getUtils(page)
test('executes on load', async ({ page }) => {
const u = await getUtils(page)
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
@ -127,9 +121,10 @@ sketch001 = startSketchAt([-0, -0])
|> line([-23.44, 0.52], %)` |> line([-23.44, 0.52], %)`
) )
}) })
await page.setViewportSize({ width: 1000, height: 500 }) await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
// expand variables section // expand variables section
const variablesTabButton = page.getByTestId('variables-pane-button') const variablesTabButton = page.getByTestId('variables-pane-button')
@ -145,17 +140,16 @@ sketch001 = startSketchAt([-0, -0])
}) })
await expect( await expect(
page.locator('.pretty-json-container >> text=sketch001') page.locator('.pretty-json-container >> text=sketch001')
).toBeVisible() ).toBeVisible() })
})
test('re-executes', async ({ page }) => { test('re-executes', async ({ page, homePage }) => { const u = await getUtils(page)
const u = await getUtils(page)
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem('persistCode', `myVar = 5`) localStorage.setItem('persistCode', `myVar = 5`)
}) })
await page.setViewportSize({ width: 1000, height: 500 }) await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
const variablesTabButton = page.getByTestId('variables-pane-button') const variablesTabButton = page.getByTestId('variables-pane-button')
await variablesTabButton.click() await variablesTabButton.click()
@ -172,10 +166,8 @@ sketch001 = startSketchAt([-0, -0])
await expect( await expect(
page.locator('.pretty-json-container >> text=myVar:67') page.locator('.pretty-json-container >> text=myVar:67')
).toBeVisible() ).toBeVisible() })
}) test('ProgramMemory can be serialised', async ({ page, homePage }) => { const u = await getUtils(page)
test('ProgramMemory can be serialised', async ({ page }) => {
const u = await getUtils(page)
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
@ -193,13 +185,14 @@ sketch001 = startSketchAt([-0, -0])
}, %)` }, %)`
) )
}) })
await page.setViewportSize({ width: 1000, height: 500 }) await page.setBodyDimensions({ width: 1000, height: 500 })
const messages: string[] = [] const messages: string[] = []
// Listen for all console events and push the message text to an array // Listen for all console events and push the message text to an array
page.on('console', (message) => messages.push(message.text())) page.on('console', (message) => messages.push(message.text()))
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
// wait for execution done // wait for execution done
await u.openDebugPanel() await u.openDebugPanel()
@ -210,22 +203,19 @@ sketch001 = startSketchAt([-0, -0])
messages.forEach((message) => { messages.forEach((message) => {
expect(message).not.toContain(forbiddenMessage) expect(message).not.toContain(forbiddenMessage)
}) })
}) }) })
})
test('ensure the Zoo logo is not a link in browser app', async ({ page }) => { // Not relevant to us anymore, or at least for the time being.
const u = await getUtils(page) test.skip('ensure the Zoo logo is not a link in browser app', 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 u.waitForPageLoad()
const zooLogo = page.locator('[data-testid="app-logo"]') const zooLogo = page.locator('[data-testid="app-logo"]')
// Make sure it's not a link // Make sure it's not a link
await expect(zooLogo).not.toHaveAttribute('href') await expect(zooLogo).not.toHaveAttribute('href') })
})
test( test('Position _ Is Out Of Range... regression test', { tag: ['@skipWin'] }, async ({ context, page, homePage }) => { // SKip on windows, its being weird.
'Position _ Is Out Of Range... regression test',
{ tag: ['@skipWin'] },
async ({ page }) => {
// SKip on windows, its being weird.
test.skip( test.skip(
process.platform === 'win32', process.platform === 'win32',
'This test is being weird on windows' 'This test is being weird on windows'
@ -233,8 +223,8 @@ sketch001 = startSketchAt([-0, -0])
const u = await getUtils(page) const u = await getUtils(page)
// const PUR = 400 / 37.5 //pixeltoUnitRatio // const PUR = 400 / 37.5 //pixeltoUnitRatio
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await page.addInitScript(async () => { await context.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`exampleSketch = startSketchOn("XZ") `exampleSketch = startSketchOn("XZ")
@ -250,8 +240,10 @@ sketch001 = startSketchAt([-0, -0])
}) })
await expect(async () => { await expect(async () => {
await page.goto('/')
await homePage.goToModelingScene()
await u.waitForPageLoad() await u.waitForPageLoad()
// error in guter // error in guter
await expect(page.locator('.cm-lint-marker-error')).toBeVisible({ await expect(page.locator('.cm-lint-marker-error')).toBeVisible({
timeout: 1_000, timeout: 1_000,
@ -300,14 +292,9 @@ sketch001 = startSketchAt([-0, -0])
thing: "blah"`) thing: "blah"`)
await expect(page.locator('.cm-lint-marker-error')).toBeVisible() await expect(page.locator('.cm-lint-marker-error')).toBeVisible() })
}
)
test('when engine fails export we handle the failure and alert the user', async ({ test('when engine fails export we handle the failure and alert the user', async ({ page, homePage }) => { const u = await getUtils(page)
page,
}) => {
const u = await getUtils(page)
await page.addInitScript( await page.addInitScript(
async ({ code }) => { async ({ code }) => {
localStorage.setItem('persistCode', code) localStorage.setItem('persistCode', code)
@ -316,9 +303,10 @@ sketch001 = startSketchAt([-0, -0])
{ code: TEST_CODE_TRIGGER_ENGINE_EXPORT_ERROR } { code: TEST_CODE_TRIGGER_ENGINE_EXPORT_ERROR }
) )
await page.setViewportSize({ width: 1000, height: 500 }) await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
// wait for execution done // wait for execution done
await u.openDebugPanel() await u.openDebugPanel()
@ -374,7 +362,6 @@ sketch001 = startSketchAt([-0, -0])
// wait for execution done // wait for execution done
await u.openDebugPanel() await u.openDebugPanel()
await u.clearCommandLogs()
await u.expectCmdLog('[data-message-type="execution-done"]') await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel() await u.closeDebugPanel()
@ -403,13 +390,8 @@ sketch001 = startSketchAt([-0, -0])
await expect(engineErrorToastMessage).not.toBeVisible() await expect(engineErrorToastMessage).not.toBeVisible()
const successToastMessage = page.getByText(`Exported successfully`) const successToastMessage = page.getByText(`Exported successfully`)
await expect(successToastMessage).toBeVisible() await expect(successToastMessage).toBeVisible() })
}) test('ensure you can not export while an export is already going', { tag: ['@skipLinux', '@skipWin'] }, async ({ page, homePage }) => { // This is being weird on ubuntu and windows.
test(
'ensure you can not export while an export is already going',
{ tag: ['@skipLinux', '@skipWin'] },
async ({ page }) => {
// This is being weird on ubuntu and windows.
test.skip( test.skip(
// eslint-disable-next-line jest/valid-title // eslint-disable-next-line jest/valid-title
process.platform === 'linux' || process.platform === 'win32', process.platform === 'linux' || process.platform === 'win32',
@ -428,9 +410,10 @@ sketch001 = startSketchAt([-0, -0])
} }
) )
await page.setViewportSize({ width: 1000, height: 500 }) await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
// wait for execution done // wait for execution done
await u.openDebugPanel() await u.openDebugPanel()
@ -493,27 +476,22 @@ sketch001 = startSketchAt([-0, -0])
]) ])
await expect(successToastMessage).toBeVisible() await expect(successToastMessage).toBeVisible()
}) }) })
}
)
test( test(
`Network health indicator only appears in modeling view`, `Network health indicator only appears in modeling view`,
{ tag: '@electron' }, { tag: '@electron' },
async ({ browserName: _ }, testInfo) => { async ({ context, page }, testInfo) => {
const { electronApp, page } = await setupElectron({ await context.folderSetupFn(async (dir) => {
testInfo, const bracketDir = path.join(dir, 'bracket')
folderSetupFn: async (dir) => {
const bracketDir = join(dir, 'bracket')
await fsp.mkdir(bracketDir, { recursive: true }) await fsp.mkdir(bracketDir, { recursive: true })
await fsp.copyFile( await fsp.copyFile(
executorInputPath('focusrite_scarlett_mounting_braket.kcl'), executorInputPath('focusrite_scarlett_mounting_braket.kcl'),
join(bracketDir, 'main.kcl') path.join(bracketDir, 'main.kcl')
) )
},
}) })
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
const u = await getUtils(page) const u = await getUtils(page)
// Locators // Locators
@ -539,18 +517,13 @@ sketch001 = startSketchAt([-0, -0])
await u.waitForPageLoad() await u.waitForPageLoad()
await expect(networkHealthIndicator).toContainText('Connected') await expect(networkHealthIndicator).toContainText('Connected')
}) })
await electronApp.close()
} }
) )
test(`View gizmo stays visible even when zoomed out all the way`, async ({ test(`View gizmo stays visible even when zoomed out all the way`, async ({ page, homePage }) => { const u = await getUtils(page)
page,
}) => {
const u = await getUtils(page)
// Constants and locators // Constants and locators
const planeColor: [number, number, number] = [161, 220, 155] const planeColor: [number, number, number] = [170, 220, 170]
const bgColor: [number, number, number] = [27, 27, 27] const bgColor: [number, number, number] = [27, 27, 27]
const middlePixelIsColor = async (color: [number, number, number]) => { const middlePixelIsColor = async (color: [number, number, number]) => {
return u.getGreatestPixDiff({ x: 600, y: 250 }, color) return u.getGreatestPixDiff({ x: 600, y: 250 }, color)
@ -561,8 +534,9 @@ sketch001 = startSketchAt([-0, -0])
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem('persistCode', '') localStorage.setItem('persistCode', '')
}) })
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await u.closeKclCodePanel() await u.closeKclCodePanel()
}) })
@ -596,8 +570,7 @@ sketch001 = startSketchAt([-0, -0])
await test.step(`Check that the gizmo is still visible`, async () => { await test.step(`Check that the gizmo is still visible`, async () => {
await expect(gizmo).toBeVisible() await expect(gizmo).toBeVisible()
}) }) })
})
}) })
async function clickExportButton(page: Page) { async function clickExportButton(page: Page) {