* Move all tests over to electron * Pass the correct param to playwright-electron.sh * Add shebang to script and add macos-14-large as a target * Get sketch-tests.spec.ts passing in electron * Try out 4 workers * Got testing-segment-overlays passing * Pass testing-selections.spec.ts * Go back to fix up sketch-tests test * Pass various.spec.ts, by far the hardest one * Pass can-sketch-on-all-planes... with ease * Pass command bar tests * fmt * Completely fix code mirror text navigating for tests * Pass debug pane tests * Pass desktop export tests * Pass editor tests * Pass file tree tests * Pass onboarding tests * Corrected a fixme in file-tree.spec! * Painfully fix hardcoded coordinates in point-click.spec * Pass machine.spec tests * Pass projects, fought hard with filechooser * Pass regresion-tests.spec tests * Pass network and connection tests * Pass camera-movement.spec tests * Extreme time eaten by gizmo test fixes. All passing now. * Merge main (tests changed x_x) and pass all constraints.spec tests (pain) * Pass another painful spec suite: testing-settings * Pass perspective-toggle, interesting note * Pass samples loading tests * Pass app header tests * Pass text-to-cad tests * Pass segment-overlays (minor ache) and ability to switch to web if needed :) * Fix a ton of syntax changes and deflake 2 more tests (pain) * Correct all tsc errors * Remove to-electron script * Add an f-ton of shit because playwright doesnt want S P R E A D * Try CI again * Stop snapshots of exports (already test in e2e) * Fix flake in double click editor * Hopefully help CI flake * Fixmes, fixmes everywhere * One more fixme to settings * Skip another code pane flake * Port jess's projects.spec tests * fixup * Reuse electron window; difficult task * Rebased and refixed * Remove duplicate cases * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest-8-cores) * Reduce the workers to something CI can handle * Lower it further, we need to think about the others * Update package.json Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> * Update package.json Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> * Fix the last tests and tsc errors * Timeout to 120 and windows-2022-16core * Fix windows runner detection, enable concurrency temporarily * Hopefully this time fix windows runner detection * Comment out Vector, add back removed camera test code * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: macos-14-large) * A snapshot a day keeps the bugs away! 📷🐛 (OS: macos-14-large) * Fix camera tests again * Massively deflake a whole class of tests * A snapshot a day keeps the bugs away! 📷🐛 (OS: macos-14-large) * A snapshot a day keeps the bugs away! 📷🐛 (OS: macos-14-large) * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest-8-cores) * Try new CI and fix small onboarding test * Derp * No github tuning * Try mac * Add back all the OS * Lord, hallow be thy name * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-latest-8-cores) * One last try with window-16-cores * Trigger CI * Try AWS Windows runner * Passing on windows locally with a few skips * Skip more win tests, add back all three oses * A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-16-cores) * Add two more fixmes * 2 more fixmes * skip segment overlays on win32 * Another fixme * Trigger CI * Trigger CI * Quick clean up * Move all tests over to electron * Pass the correct param to playwright-electron.sh * Add shebang to script and add macos-14-large as a target * Get sketch-tests.spec.ts passing in electron * Try out 4 workers * Got testing-segment-overlays passing * Pass testing-selections.spec.ts * Go back to fix up sketch-tests test * Pass various.spec.ts, by far the hardest one * Pass can-sketch-on-all-planes... with ease * Pass command bar tests * fmt * Completely fix code mirror text navigating for tests * Pass debug pane tests * Pass desktop export tests * Pass editor tests * Pass file tree tests * Pass onboarding tests * Corrected a fixme in file-tree.spec! * Painfully fix hardcoded coordinates in point-click.spec * Pass machine.spec tests * Pass projects, fought hard with filechooser * Pass regresion-tests.spec tests * Pass network and connection tests * Pass camera-movement.spec tests * Extreme time eaten by gizmo test fixes. All passing now. * Merge main (tests changed x_x) and pass all constraints.spec tests (pain) * Pass another painful spec suite: testing-settings * Pass perspective-toggle, interesting note * Pass samples loading tests * Pass app header tests * Pass text-to-cad tests * Pass segment-overlays (minor ache) and ability to switch to web if needed :) * Fix a ton of syntax changes and deflake 2 more tests (pain) * Correct all tsc errors * Remove to-electron script * Add an f-ton of shit because playwright doesnt want S P R E A D * Try CI again * Stop snapshots of exports (already test in e2e) * Fix flake in double click editor * Hopefully help CI flake * Fixmes, fixmes everywhere * One more fixme to settings * Skip another code pane flake * Port jess's projects.spec tests * fixup * Reuse electron window; difficult task * Rebased and refixed * Remove duplicate cases * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest-8-cores) * Reduce the workers to something CI can handle * Lower it further, we need to think about the others * Update package.json Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> * Update package.json Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> * Fix the last tests and tsc errors * Timeout to 120 and windows-2022-16core * Fix windows runner detection, enable concurrency temporarily * Hopefully this time fix windows runner detection * Comment out Vector, add back removed camera test code * A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: macos-14-large) * A snapshot a day keeps the bugs away! 📷🐛 (OS: macos-14-large) * Fix camera tests again * Massively deflake a whole class of tests * A snapshot a day keeps the bugs away! 📷🐛 (OS: macos-14-large) * A snapshot a day keeps the bugs away! 📷🐛 (OS: macos-14-large) * Try new CI and fix small onboarding test * Derp * No github tuning * Try mac * Add back all the OS * Lord, hallow be thy name * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-latest-8-cores) * Try AWS Windows runner * Passing on windows locally with a few skips * Trigger CI * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * fmt, tsc, lint * Enable two fixmes again * Fix lint, codespell, fmt * Fix lint * Don't run e2e on draft, add back concurrency, clean up * One last windows skip --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> Co-authored-by: Pierre Jacquier <pierre@zoo.dev>
		
			
				
	
	
		
			188 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { test, expect } from './zoo-test'
 | 
						|
import path from 'path'
 | 
						|
import {
 | 
						|
  getUtils,
 | 
						|
  executorInputPath,
 | 
						|
  getPlaywrightDownloadDir,
 | 
						|
} from './test-utils'
 | 
						|
import fsp from 'fs/promises'
 | 
						|
 | 
						|
test(
 | 
						|
  'export works on the first try',
 | 
						|
  { tag: '@electron' },
 | 
						|
  async ({ page, context }, testInfo) => {
 | 
						|
    await context.folderSetupFn(async (dir) => {
 | 
						|
      const bracketDir = path.join(dir, 'bracket')
 | 
						|
      await Promise.all([fsp.mkdir(bracketDir, { recursive: true })])
 | 
						|
      await Promise.all([
 | 
						|
        fsp.copyFile(
 | 
						|
          executorInputPath('router-template-slate.kcl'),
 | 
						|
          path.join(bracketDir, 'other.kcl')
 | 
						|
        ),
 | 
						|
        fsp.copyFile(
 | 
						|
          executorInputPath('focusrite_scarlett_mounting_braket.kcl'),
 | 
						|
          path.join(bracketDir, 'main.kcl')
 | 
						|
        ),
 | 
						|
      ])
 | 
						|
    })
 | 
						|
    await page.setBodyDimensions({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    page.on('console', console.log)
 | 
						|
 | 
						|
    await test.step('on open of project', async () => {
 | 
						|
      await expect(page.getByText(`bracket`)).toBeVisible()
 | 
						|
 | 
						|
      // open the project
 | 
						|
      await page.getByText(`bracket`).click()
 | 
						|
 | 
						|
      // expect zero errors in guter
 | 
						|
      await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible()
 | 
						|
 | 
						|
      // export the model
 | 
						|
      const exportButton = page.getByTestId('export-pane-button')
 | 
						|
      await expect(exportButton).toBeVisible()
 | 
						|
 | 
						|
      // Wait for the model to finish loading
 | 
						|
      const modelStateIndicator = page.getByTestId(
 | 
						|
        'model-state-indicator-execution-done'
 | 
						|
      )
 | 
						|
      await expect(modelStateIndicator).toBeVisible({ timeout: 60000 })
 | 
						|
 | 
						|
      const gltfOption = page.getByText('glTF')
 | 
						|
      const submitButton = page.getByText('Confirm Export')
 | 
						|
      const exportingToastMessage = page.getByText(`Exporting...`)
 | 
						|
      const errorToastMessage = page.getByText(`Error while exporting`)
 | 
						|
      const engineErrorToastMessage = page.getByText(`Nothing to export`)
 | 
						|
      const alreadyExportingToastMessage = page.getByText(`Already exporting`)
 | 
						|
      // The open file's name is `main.kcl`, so the export file name should be `main.gltf`
 | 
						|
      const exportFileName = `main.gltf`
 | 
						|
 | 
						|
      // Click the export button
 | 
						|
      await exportButton.click()
 | 
						|
 | 
						|
      await expect(gltfOption).toBeVisible()
 | 
						|
      await expect(page.getByText('STL')).toBeVisible()
 | 
						|
 | 
						|
      await page.keyboard.press('Enter')
 | 
						|
 | 
						|
      // Click the checkbox
 | 
						|
      await expect(submitButton).toBeVisible()
 | 
						|
 | 
						|
      await page.waitForTimeout(500)
 | 
						|
 | 
						|
      await page.keyboard.press('Enter')
 | 
						|
 | 
						|
      // Find the toast.
 | 
						|
      // Look out for the toast message
 | 
						|
      await expect(exportingToastMessage).toBeVisible()
 | 
						|
      await expect(alreadyExportingToastMessage).not.toBeVisible()
 | 
						|
 | 
						|
      // Expect it to succeed.
 | 
						|
      await expect(errorToastMessage).not.toBeVisible()
 | 
						|
      await expect(engineErrorToastMessage).not.toBeVisible()
 | 
						|
 | 
						|
      const successToastMessage = page.getByText(`Exported successfully`)
 | 
						|
      await expect(successToastMessage).toBeVisible()
 | 
						|
      await expect(exportingToastMessage).not.toBeVisible()
 | 
						|
 | 
						|
      const firstFileFullPath = path.resolve(
 | 
						|
        getPlaywrightDownloadDir(page),
 | 
						|
        exportFileName
 | 
						|
      )
 | 
						|
      await test.step('Check the export size', async () => {
 | 
						|
        await expect
 | 
						|
          .poll(
 | 
						|
            async () => {
 | 
						|
              try {
 | 
						|
                const outputGltf = await fsp.readFile(firstFileFullPath)
 | 
						|
                return outputGltf.byteLength
 | 
						|
              } catch (e) {
 | 
						|
                return 0
 | 
						|
              }
 | 
						|
            },
 | 
						|
            { timeout: 15_000 }
 | 
						|
          )
 | 
						|
          .toBeGreaterThan(300_000)
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    await test.step('on open of file in file pane', async () => {
 | 
						|
      const u = await getUtils(page)
 | 
						|
      await u.openFilePanel()
 | 
						|
 | 
						|
      const otherKclButton = page.getByRole('button', { name: 'other.kcl' })
 | 
						|
 | 
						|
      // Click the file
 | 
						|
      await otherKclButton.click()
 | 
						|
 | 
						|
      // Close the file pane
 | 
						|
      await u.closeFilePanel()
 | 
						|
 | 
						|
      // wait for it to finish executing (todo: make this more robust)
 | 
						|
      await page.waitForTimeout(1000)
 | 
						|
      // expect zero errors in guter
 | 
						|
      await expect(page.locator('.cm-lint-marker-error')).not.toBeVisible()
 | 
						|
 | 
						|
      // export the model
 | 
						|
      const exportButton = page.getByTestId('export-pane-button')
 | 
						|
      await expect(exportButton).toBeVisible()
 | 
						|
 | 
						|
      const gltfOption = page.getByText('glTF')
 | 
						|
      const submitButton = page.getByText('Confirm Export')
 | 
						|
      const exportingToastMessage = page.getByText(`Exporting...`)
 | 
						|
      const errorToastMessage = page.getByText(`Error while exporting`)
 | 
						|
      const engineErrorToastMessage = page.getByText(`Nothing to export`)
 | 
						|
      const alreadyExportingToastMessage = page.getByText(`Already exporting`)
 | 
						|
      // The open file's name is `other.kcl`, so the export file name should be `other.gltf`
 | 
						|
      const exportFileName = `other.gltf`
 | 
						|
 | 
						|
      // Click the export button
 | 
						|
      await exportButton.click()
 | 
						|
 | 
						|
      await expect(gltfOption).toBeVisible()
 | 
						|
      await expect(page.getByText('STL')).toBeVisible()
 | 
						|
 | 
						|
      await page.keyboard.press('Enter')
 | 
						|
 | 
						|
      // Click the checkbox
 | 
						|
      await expect(submitButton).toBeVisible()
 | 
						|
 | 
						|
      await page.keyboard.press('Enter')
 | 
						|
 | 
						|
      // Find the toast.
 | 
						|
      // Look out for the toast message
 | 
						|
      await expect(exportingToastMessage).toBeVisible()
 | 
						|
 | 
						|
      const successToastMessage = page.getByText(`Exported successfully`)
 | 
						|
      await test.step('Check the success toast message shows and nothing else', async () =>
 | 
						|
        Promise.all([
 | 
						|
          expect(alreadyExportingToastMessage).not.toBeVisible(),
 | 
						|
          expect(errorToastMessage).not.toBeVisible(),
 | 
						|
          expect(engineErrorToastMessage).not.toBeVisible(),
 | 
						|
          expect(successToastMessage).toBeVisible(),
 | 
						|
          expect(exportingToastMessage).not.toBeVisible(),
 | 
						|
        ]))
 | 
						|
 | 
						|
      const secondFileFullPath = path.resolve(
 | 
						|
        getPlaywrightDownloadDir(page),
 | 
						|
        exportFileName
 | 
						|
      )
 | 
						|
      await test.step('Check the export size', async () => {
 | 
						|
        await expect
 | 
						|
          .poll(
 | 
						|
            async () => {
 | 
						|
              try {
 | 
						|
                const outputGltf = await fsp.readFile(secondFileFullPath)
 | 
						|
                return outputGltf.byteLength
 | 
						|
              } catch (e) {
 | 
						|
                return 0
 | 
						|
              }
 | 
						|
            },
 | 
						|
            { timeout: 15_000 }
 | 
						|
          )
 | 
						|
          .toBeGreaterThan(100_000)
 | 
						|
      })
 | 
						|
    })
 | 
						|
  }
 | 
						|
)
 |