2025-04-04 08:39:02 -05:00
import { throwTronAppMissing } from '@e2e/playwright/lib/electron-helpers'
2025-04-25 10:49:22 -04:00
2025-04-01 23:54:26 -07:00
import { expect , test } from '@e2e/playwright/zoo-test'
2025-03-26 13:03:44 -05:00
/ * *
* Not all menu actions are tested . Some are default electron menu actions .
* Test file menu actions that trigger something in the frontend
* /
2025-04-24 20:50:26 -04:00
test . describe (
'Native file menu' ,
{ tag : [ '@electron' , '@macos' , '@windows' ] } ,
( ) = > {
test . skip ( ) // TODO: Reimplement native file menu tests
test . describe ( 'Home page' , ( ) = > {
test . describe ( 'File role' , ( ) = > {
test ( 'Home.File.Create project' , async ( { tronApp , cmdBar , page } ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
return false
}
const newProject = app . applicationMenu . getMenuItemById (
'File.Create project'
)
if ( ! newProject ) return false
newProject . click ( )
return true
} )
)
. toBe ( true )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actualArgument = await cmdBar . cmdBarElement
. getByTestId ( 'cmd-bar-arg-value' )
. inputValue ( )
const expectedArgument = 'untitled'
expect ( actualArgument ) . toBe ( expectedArgument )
} )
test ( 'Home.File.Open project' , async ( { tronApp , cmdBar , page } ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) return false
const openProject =
app . applicationMenu . getMenuItemById ( 'File.Open project' )
if ( ! openProject ) {
return false
}
openProject . click ( )
return true
} )
)
. toBe ( true )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Open project'
expect ( actual ) . toBe ( expected )
} )
test ( 'Home.File.Preferences.User settings' , async ( {
tronApp ,
cmdBar ,
page ,
} ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
console . log ( app )
if ( ! app || ! app . applicationMenu ) {
return false
}
const userSettings = app . applicationMenu . getMenuItemById (
'File.Preferences.User settings'
)
if ( ! userSettings ) return false
userSettings . click ( )
return true
} )
)
. toBe ( true )
const settings = page . getByTestId ( 'settings-dialog-panel' )
await expect ( settings ) . toBeVisible ( )
// You are viewing the user tab
const actualText = settings . getByText (
'The overall appearance of the app'
)
await expect ( actualText ) . toBeVisible ( )
} )
test ( 'Home.File.Preferences.Keybindings' , async ( {
tronApp ,
cmdBar ,
page ,
} ) = > {
if ( ! tronApp ) {
fail ( )
}
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) return false
const keybindings = app . applicationMenu . getMenuItemById (
'File.Preferences.Keybindings'
)
if ( ! keybindings ) {
return false
}
keybindings . click ( )
return true
} )
)
. toBe ( true )
const settings = page . getByTestId ( 'settings-dialog-panel' )
await expect ( settings ) . toBeVisible ( )
// You are viewing the keybindings tab
const enterSketchMode = settings . locator ( '#enter-sketch-mode' )
await expect ( enterSketchMode ) . toBeVisible ( )
} )
test ( 'Home.File.Preferences.User default units' , async ( {
tronApp ,
cmdBar ,
page ,
} ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
return false
}
const menu = app . applicationMenu . getMenuItemById (
'File.Preferences.User default units'
)
if ( ! menu ) return false
menu . click ( )
return true
} )
)
. toBe ( true )
const settings = page . getByTestId ( 'settings-dialog-panel' )
await expect ( settings ) . toBeVisible ( )
const defaultUnit = settings . locator ( '#defaultUnit' )
await expect ( defaultUnit ) . toBeVisible ( )
} )
test ( 'Home.File.Preferences.Theme' , async ( {
tronApp ,
cmdBar ,
page ,
} ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) return false
const menu = app . applicationMenu . getMenuItemById (
'File.Preferences.Theme'
)
if ( ! menu ) {
return false
}
menu . click ( )
return true
} )
)
. toBe ( true )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Settings · app · theme'
expect ( actual ) . toBe ( expected )
} )
test ( 'Home.File.Preferences.Theme color' , async ( {
tronApp ,
cmdBar ,
page ,
} ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
return false
}
const menu = app . applicationMenu . getMenuItemById (
'File.Preferences.Theme color'
)
if ( ! menu ) return false
menu . click ( )
return true
} )
)
. toBe ( true )
const settings = page . getByTestId ( 'settings-dialog-panel' )
await expect ( settings ) . toBeVisible ( )
const defaultUnit = settings . locator ( '#themeColor' )
await expect ( defaultUnit ) . toBeVisible ( )
} )
test ( 'Home.File.Preferences.Sign out' , async ( {
tronApp ,
cmdBar ,
page ,
} ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) return false
const menu =
app . applicationMenu . getMenuItemById ( 'File.Sign out' )
if ( ! menu ) {
return false
}
// FIXME: Add back when you can actually sign out
// menu.click()
return true
} )
)
. toBe ( true )
// FIXME: When signing out during E2E the page is not bound correctly.
// It cannot find the button
// const signIn = page.getByTestId('sign-in-button')
// await expect(signIn).toBeVisible()
} )
2025-03-26 13:03:44 -05:00
} )
2025-04-04 08:39:02 -05:00
2025-04-24 20:50:26 -04:00
test . describe ( 'Edit role' , ( ) = > {
test ( 'Home.Edit.Rename project' , async ( { tronApp , cmdBar , page } ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
return false
}
const menu = app . applicationMenu . getMenuItemById (
'Edit.Rename project'
)
if ( ! menu ) return false
menu . click ( )
return true
} )
)
. toBe ( true )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Rename project'
expect ( actual ) . toBe ( expected )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Home.Edit.Delete project' , async ( { tronApp , cmdBar , page } ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) return false
const menu = app . applicationMenu . getMenuItemById (
'Edit.Delete project'
)
if ( ! menu ) {
return false
}
menu . click ( )
return true
} )
)
. toBe ( true )
// Check the placeholder project name exists
const actual = async ( ) = >
cmdBar . cmdBarElement . getByTestId ( 'command-name' ) . textContent ( )
const expected = 'Delete project'
await expect . poll ( async ( ) = > await actual ( ) ) . toBe ( expected )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Home.Edit.Change project directory' , async ( {
tronApp ,
cmdBar ,
page ,
} ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
return false
}
const menu = app . applicationMenu . getMenuItemById (
'Edit.Change project directory'
)
if ( ! menu ) return false
menu . click ( )
return true
} )
)
. toBe ( true )
const settings = page . getByTestId ( 'settings-dialog-panel' )
await expect ( settings ) . toBeVisible ( )
const projectDirectory = settings . locator ( '#projectDirectory' )
await expect ( projectDirectory ) . toBeVisible ( )
2025-04-04 08:39:02 -05:00
} )
} )
2025-04-24 20:50:26 -04:00
test . describe ( 'View role' , ( ) = > {
test ( 'Home.View.Command Palette...' , async ( {
tronApp ,
cmdBar ,
page ,
} ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) return false
const menu = app . applicationMenu . getMenuItemById (
'View.Command Palette...'
)
if ( ! menu ) {
return false
}
menu . click ( )
return true
} )
)
. toBe ( true )
// Check the placeholder project name exists
const actual = cmdBar . cmdBarElement . getByTestId ( 'cmd-bar-search' )
await expect ( actual ) . toBeVisible ( )
2025-04-04 08:39:02 -05:00
} )
} )
2025-04-24 20:50:26 -04:00
test . describe ( 'Help role' , ( ) = > {
test ( 'Home.Help.Show all commands' , async ( {
tronApp ,
cmdBar ,
page ,
} ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
return false
}
const menu = app . applicationMenu . getMenuItemById (
'Help.Show all commands'
)
if ( ! menu ) return false
menu . click ( )
return true
} )
)
. toBe ( true )
// Check the placeholder project name exists
const actual = cmdBar . cmdBarElement . getByTestId ( 'cmd-bar-search' )
await expect ( actual ) . toBeVisible ( )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Home.Help.KCL code samples' , async ( {
tronApp ,
cmdBar ,
page ,
} ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) return false
const menu = app . applicationMenu . getMenuItemById (
'Help.KCL code samples'
)
if ( ! menu ) {
return false
}
return true
} )
)
. toBe ( true )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Home.Help.Report a bug' , async ( { tronApp , cmdBar , page } ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
return false
}
const menu =
app . applicationMenu . getMenuItemById ( 'Help.Report a bug' )
if ( ! menu ) return false
menu . click ( )
return true
} )
)
. toBe ( true )
// Core dump and refresh magic number timeout
await page . waitForTimeout ( 7000 )
const actual = page . getByText (
2025-05-01 14:51:12 -04:00
'No projects found, ready to make your first one?'
2025-04-24 20:50:26 -04:00
)
await expect ( actual ) . toBeVisible ( )
} )
2025-05-02 15:54:49 -04:00
test ( 'Home.Help.Replay onboarding tutorial' , async ( {
2025-04-24 20:50:26 -04:00
tronApp ,
cmdBar ,
page ,
} ) = > {
if ( ! tronApp ) fail ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) return false
const menu = app . applicationMenu . getMenuItemById (
2025-05-02 15:54:49 -04:00
'Help.Replay onboarding tutorial'
2025-04-24 20:50:26 -04:00
)
if ( ! menu ) {
return false
}
menu . click ( )
return true
} )
)
. toBe ( true )
const actual = page . getByText (
` This is a hardware design tool that lets you edit visually, with code, or both. It's powered by the KittyCAD Design API, the first API created for anyone to build hardware design tools. `
)
await expect ( actual ) . toBeVisible ( )
2025-04-04 08:39:02 -05:00
} )
} )
} )
2025-04-24 20:50:26 -04:00
test . describe ( 'Modeling page' , ( ) = > {
test . describe ( 'File Role' , ( ) = > {
test ( 'Modeling.File.Create project' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) fail ( )
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) fail ( )
const newProject = app . applicationMenu . getMenuItemById (
'File.Create project'
)
if ( ! newProject ) fail ( )
newProject . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actualArgument = await cmdBar . cmdBarElement
. getByTestId ( 'cmd-bar-arg-value' )
. inputValue ( )
const expectedArgument = 'untitled'
expect ( actualArgument ) . toBe ( expectedArgument )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.File.Open project' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const openProject =
app . applicationMenu . getMenuItemById ( 'File.Open project' )
if ( ! openProject ) {
throw new Error ( 'File.Open project' )
}
openProject . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Open project'
expect ( actual ) . toBe ( expected )
2025-04-04 08:39:02 -05:00
} )
[Feature]: Load external model becomes Add file to project, global application add file to project with home page update. (#6506)
* chore: saving off skeleton
* fix: saving skeleton
* chore: skeleton for loading projects from project directory path
* chore: cleaning up useless state transition to be an on event direct to action state
* fix: new structure for web vs desktop vs react machine provider code
* chore: saving off skeleton
* fix: skeleton logic for react? going to move it from a string to obj.string
* fix: trying to prevent error element unmount on global react components. This is bricking JS state
* fix: we are so back
* chore: implemented navigating to specfic KCL file
* chore: implementing renaming project
* chore: deleting project
* fix: auto fixes
* fix: old debug/testing file oops
* chore: generic create new file
* chore: skeleton for web create file provide
* chore: basic machine vitest... need to figure out how to get window.electron implemented in vitest?
* chore: save off progress before deleting other project implementation, a few missing features still
* chore: trying a different init skeleton? most likely will migrate
* chore: first attempt of purging projects context provider
* chore: enabling toast for some machine state
* chore: enabling more toast success and error
* chore: writing read write state to the system io based on the project path
* fix: tsc fixes
* fix: use file system watcher, navigate to project after creation via the requestProjectName
* chore: open project command, hooks vs snapshot context helpers
* chore: implemented open and create project for e2e testing. They are hard coded in poor spot for now.
* fix: codespell fixes
* chore: implementing more project commands
* chore: PR improvements for root.tsx
* chore: leaving comment about new Router.tsx layout
* fix: removing debugging code
* fix: rewriting component for readability
* fix: improving web initialization
* chore: implementing import file from url which is not actually that?
* fix: clearing search params on import file from url
* fix: fixed two e2e tests, forgot needsReview when making new command
* fix: fixing some import from url business logic to pass e2e tests
* chore: script for diffing circular deps +/-
* fix: formatting
* fix: massive fix for circular depsga!
* fix: trying to fix some errors and auto fmt
* fix: updating deps
* fix: removing debugging code
* fix: big clean up
* fix: more deletion
* fix: tsc cleanup
* fix: TSC TSC TSC TSC!
* fix: typo fix
* fix: clear query params on web only, desktop not required
* fix: removing unused code
* fmt
* Bring back `trap` removed in merge
* Use explicit types instead of `any`s on arg configs
* Add project commands directly to command palette
* fix: deleting debugging code, from PR review
* fix: this got added back(?)
* fix: using referred type
* fix: more PR clean up
* fix: big block comment for xstate architecture decision
* fix: more pr comment fixes
* fix: saving off logic, need a big cleanup because I hacked it together to get a POC
* fix: extra business?
* fix: merge conflict just added them back why dude
* fix: more PR comments
* fix: big ciruclar deps fix, commandBarActor in appActor
* chore: writing e2e test, still need to fix 3 bugs
* chore: adding more scenarios
* fix: formatting
* fix: fixing tsc errors
* chore: deleting the old text to cad and using the new application level one, almost there
* fix: prompt to edit works
* fix: large push to get 1 text to cad command... the usage is a little buggy with delete and navigate within /file
* fix: settings for highlight edges now works
* chore: adding another e2e test
* fix: cleaning up e2e tests and writing more of them
* fix: tsc type
* chore: more e2e improvements, unique project name in text to cad
* chore: e2e tests should be good to go
* fix: gotcha comment
* fix: enabled web t2c, codespell fixes
* fix: fixing merge conflcits??
* feat: implemented load external for kcl samples
* feat: load external model from disk
* fix: trying to delete old stuff
* fix: all command trigger locations now have defaults for current project
* fix: gotcha comment for the future
* chore: hiding import file from url command, two separate commands for 3d and kcl file adding
* chore: commands are now add file to project, 3rd iteration
* fix: t2c in file menu fixed
* chore: updating file menu for new global actions
* fix: auto fixes
* fix: the command bar arg flow for web add kcl file seems backwards?
* chore: updated home layout, added create from kcl sample button
* chore: remapping some menu actions
* fix: fixing open dialog copy
* fix: an e2e test
* fix: fixed e2e tests
* fix: fixed e2e tests
* fix: auto fixes
* fix: pr clean up
* fix: removing console log
* fix: PR updates
* fix: the reviewed stage boolean required the expected state to change. Also I progressed the command bar too soon
* fix: no idea how this passed locally yesterday? I removed the {dir} unused but I need the function's logic but not the return value...
* fix: should be good to go?
---------
Co-authored-by: Frank Noirot <frankjohnson1993@gmail.com>
2025-04-29 13:04:45 -05:00
test ( 'Modeling.File.Add file to project' , async ( {
2025-04-24 20:50:26 -04:00
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const openProject = app . applicationMenu . getMenuItemById (
[Feature]: Load external model becomes Add file to project, global application add file to project with home page update. (#6506)
* chore: saving off skeleton
* fix: saving skeleton
* chore: skeleton for loading projects from project directory path
* chore: cleaning up useless state transition to be an on event direct to action state
* fix: new structure for web vs desktop vs react machine provider code
* chore: saving off skeleton
* fix: skeleton logic for react? going to move it from a string to obj.string
* fix: trying to prevent error element unmount on global react components. This is bricking JS state
* fix: we are so back
* chore: implemented navigating to specfic KCL file
* chore: implementing renaming project
* chore: deleting project
* fix: auto fixes
* fix: old debug/testing file oops
* chore: generic create new file
* chore: skeleton for web create file provide
* chore: basic machine vitest... need to figure out how to get window.electron implemented in vitest?
* chore: save off progress before deleting other project implementation, a few missing features still
* chore: trying a different init skeleton? most likely will migrate
* chore: first attempt of purging projects context provider
* chore: enabling toast for some machine state
* chore: enabling more toast success and error
* chore: writing read write state to the system io based on the project path
* fix: tsc fixes
* fix: use file system watcher, navigate to project after creation via the requestProjectName
* chore: open project command, hooks vs snapshot context helpers
* chore: implemented open and create project for e2e testing. They are hard coded in poor spot for now.
* fix: codespell fixes
* chore: implementing more project commands
* chore: PR improvements for root.tsx
* chore: leaving comment about new Router.tsx layout
* fix: removing debugging code
* fix: rewriting component for readability
* fix: improving web initialization
* chore: implementing import file from url which is not actually that?
* fix: clearing search params on import file from url
* fix: fixed two e2e tests, forgot needsReview when making new command
* fix: fixing some import from url business logic to pass e2e tests
* chore: script for diffing circular deps +/-
* fix: formatting
* fix: massive fix for circular depsga!
* fix: trying to fix some errors and auto fmt
* fix: updating deps
* fix: removing debugging code
* fix: big clean up
* fix: more deletion
* fix: tsc cleanup
* fix: TSC TSC TSC TSC!
* fix: typo fix
* fix: clear query params on web only, desktop not required
* fix: removing unused code
* fmt
* Bring back `trap` removed in merge
* Use explicit types instead of `any`s on arg configs
* Add project commands directly to command palette
* fix: deleting debugging code, from PR review
* fix: this got added back(?)
* fix: using referred type
* fix: more PR clean up
* fix: big block comment for xstate architecture decision
* fix: more pr comment fixes
* fix: saving off logic, need a big cleanup because I hacked it together to get a POC
* fix: extra business?
* fix: merge conflict just added them back why dude
* fix: more PR comments
* fix: big ciruclar deps fix, commandBarActor in appActor
* chore: writing e2e test, still need to fix 3 bugs
* chore: adding more scenarios
* fix: formatting
* fix: fixing tsc errors
* chore: deleting the old text to cad and using the new application level one, almost there
* fix: prompt to edit works
* fix: large push to get 1 text to cad command... the usage is a little buggy with delete and navigate within /file
* fix: settings for highlight edges now works
* chore: adding another e2e test
* fix: cleaning up e2e tests and writing more of them
* fix: tsc type
* chore: more e2e improvements, unique project name in text to cad
* chore: e2e tests should be good to go
* fix: gotcha comment
* fix: enabled web t2c, codespell fixes
* fix: fixing merge conflcits??
* feat: implemented load external for kcl samples
* feat: load external model from disk
* fix: trying to delete old stuff
* fix: all command trigger locations now have defaults for current project
* fix: gotcha comment for the future
* chore: hiding import file from url command, two separate commands for 3d and kcl file adding
* chore: commands are now add file to project, 3rd iteration
* fix: t2c in file menu fixed
* chore: updating file menu for new global actions
* fix: auto fixes
* fix: the command bar arg flow for web add kcl file seems backwards?
* chore: updated home layout, added create from kcl sample button
* chore: remapping some menu actions
* fix: fixing open dialog copy
* fix: an e2e test
* fix: fixed e2e tests
* fix: fixed e2e tests
* fix: auto fixes
* fix: pr clean up
* fix: removing console log
* fix: PR updates
* fix: the reviewed stage boolean required the expected state to change. Also I progressed the command bar too soon
* fix: no idea how this passed locally yesterday? I removed the {dir} unused but I need the function's logic but not the return value...
* fix: should be good to go?
---------
Co-authored-by: Frank Noirot <frankjohnson1993@gmail.com>
2025-04-29 13:04:45 -05:00
'File.Add file to project'
2025-04-24 20:50:26 -04:00
)
if ( ! openProject ) {
[Feature]: Load external model becomes Add file to project, global application add file to project with home page update. (#6506)
* chore: saving off skeleton
* fix: saving skeleton
* chore: skeleton for loading projects from project directory path
* chore: cleaning up useless state transition to be an on event direct to action state
* fix: new structure for web vs desktop vs react machine provider code
* chore: saving off skeleton
* fix: skeleton logic for react? going to move it from a string to obj.string
* fix: trying to prevent error element unmount on global react components. This is bricking JS state
* fix: we are so back
* chore: implemented navigating to specfic KCL file
* chore: implementing renaming project
* chore: deleting project
* fix: auto fixes
* fix: old debug/testing file oops
* chore: generic create new file
* chore: skeleton for web create file provide
* chore: basic machine vitest... need to figure out how to get window.electron implemented in vitest?
* chore: save off progress before deleting other project implementation, a few missing features still
* chore: trying a different init skeleton? most likely will migrate
* chore: first attempt of purging projects context provider
* chore: enabling toast for some machine state
* chore: enabling more toast success and error
* chore: writing read write state to the system io based on the project path
* fix: tsc fixes
* fix: use file system watcher, navigate to project after creation via the requestProjectName
* chore: open project command, hooks vs snapshot context helpers
* chore: implemented open and create project for e2e testing. They are hard coded in poor spot for now.
* fix: codespell fixes
* chore: implementing more project commands
* chore: PR improvements for root.tsx
* chore: leaving comment about new Router.tsx layout
* fix: removing debugging code
* fix: rewriting component for readability
* fix: improving web initialization
* chore: implementing import file from url which is not actually that?
* fix: clearing search params on import file from url
* fix: fixed two e2e tests, forgot needsReview when making new command
* fix: fixing some import from url business logic to pass e2e tests
* chore: script for diffing circular deps +/-
* fix: formatting
* fix: massive fix for circular depsga!
* fix: trying to fix some errors and auto fmt
* fix: updating deps
* fix: removing debugging code
* fix: big clean up
* fix: more deletion
* fix: tsc cleanup
* fix: TSC TSC TSC TSC!
* fix: typo fix
* fix: clear query params on web only, desktop not required
* fix: removing unused code
* fmt
* Bring back `trap` removed in merge
* Use explicit types instead of `any`s on arg configs
* Add project commands directly to command palette
* fix: deleting debugging code, from PR review
* fix: this got added back(?)
* fix: using referred type
* fix: more PR clean up
* fix: big block comment for xstate architecture decision
* fix: more pr comment fixes
* fix: saving off logic, need a big cleanup because I hacked it together to get a POC
* fix: extra business?
* fix: merge conflict just added them back why dude
* fix: more PR comments
* fix: big ciruclar deps fix, commandBarActor in appActor
* chore: writing e2e test, still need to fix 3 bugs
* chore: adding more scenarios
* fix: formatting
* fix: fixing tsc errors
* chore: deleting the old text to cad and using the new application level one, almost there
* fix: prompt to edit works
* fix: large push to get 1 text to cad command... the usage is a little buggy with delete and navigate within /file
* fix: settings for highlight edges now works
* chore: adding another e2e test
* fix: cleaning up e2e tests and writing more of them
* fix: tsc type
* chore: more e2e improvements, unique project name in text to cad
* chore: e2e tests should be good to go
* fix: gotcha comment
* fix: enabled web t2c, codespell fixes
* fix: fixing merge conflcits??
* feat: implemented load external for kcl samples
* feat: load external model from disk
* fix: trying to delete old stuff
* fix: all command trigger locations now have defaults for current project
* fix: gotcha comment for the future
* chore: hiding import file from url command, two separate commands for 3d and kcl file adding
* chore: commands are now add file to project, 3rd iteration
* fix: t2c in file menu fixed
* chore: updating file menu for new global actions
* fix: auto fixes
* fix: the command bar arg flow for web add kcl file seems backwards?
* chore: updated home layout, added create from kcl sample button
* chore: remapping some menu actions
* fix: fixing open dialog copy
* fix: an e2e test
* fix: fixed e2e tests
* fix: fixed e2e tests
* fix: auto fixes
* fix: pr clean up
* fix: removing console log
* fix: PR updates
* fix: the reviewed stage boolean required the expected state to change. Also I progressed the command bar too soon
* fix: no idea how this passed locally yesterday? I removed the {dir} unused but I need the function's logic but not the return value...
* fix: should be good to go?
---------
Co-authored-by: Frank Noirot <frankjohnson1993@gmail.com>
2025-04-29 13:04:45 -05:00
throw new Error ( 'File.Add file to project' )
2025-04-24 20:50:26 -04:00
}
openProject . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
[Feature]: Load external model becomes Add file to project, global application add file to project with home page update. (#6506)
* chore: saving off skeleton
* fix: saving skeleton
* chore: skeleton for loading projects from project directory path
* chore: cleaning up useless state transition to be an on event direct to action state
* fix: new structure for web vs desktop vs react machine provider code
* chore: saving off skeleton
* fix: skeleton logic for react? going to move it from a string to obj.string
* fix: trying to prevent error element unmount on global react components. This is bricking JS state
* fix: we are so back
* chore: implemented navigating to specfic KCL file
* chore: implementing renaming project
* chore: deleting project
* fix: auto fixes
* fix: old debug/testing file oops
* chore: generic create new file
* chore: skeleton for web create file provide
* chore: basic machine vitest... need to figure out how to get window.electron implemented in vitest?
* chore: save off progress before deleting other project implementation, a few missing features still
* chore: trying a different init skeleton? most likely will migrate
* chore: first attempt of purging projects context provider
* chore: enabling toast for some machine state
* chore: enabling more toast success and error
* chore: writing read write state to the system io based on the project path
* fix: tsc fixes
* fix: use file system watcher, navigate to project after creation via the requestProjectName
* chore: open project command, hooks vs snapshot context helpers
* chore: implemented open and create project for e2e testing. They are hard coded in poor spot for now.
* fix: codespell fixes
* chore: implementing more project commands
* chore: PR improvements for root.tsx
* chore: leaving comment about new Router.tsx layout
* fix: removing debugging code
* fix: rewriting component for readability
* fix: improving web initialization
* chore: implementing import file from url which is not actually that?
* fix: clearing search params on import file from url
* fix: fixed two e2e tests, forgot needsReview when making new command
* fix: fixing some import from url business logic to pass e2e tests
* chore: script for diffing circular deps +/-
* fix: formatting
* fix: massive fix for circular depsga!
* fix: trying to fix some errors and auto fmt
* fix: updating deps
* fix: removing debugging code
* fix: big clean up
* fix: more deletion
* fix: tsc cleanup
* fix: TSC TSC TSC TSC!
* fix: typo fix
* fix: clear query params on web only, desktop not required
* fix: removing unused code
* fmt
* Bring back `trap` removed in merge
* Use explicit types instead of `any`s on arg configs
* Add project commands directly to command palette
* fix: deleting debugging code, from PR review
* fix: this got added back(?)
* fix: using referred type
* fix: more PR clean up
* fix: big block comment for xstate architecture decision
* fix: more pr comment fixes
* fix: saving off logic, need a big cleanup because I hacked it together to get a POC
* fix: extra business?
* fix: merge conflict just added them back why dude
* fix: more PR comments
* fix: big ciruclar deps fix, commandBarActor in appActor
* chore: writing e2e test, still need to fix 3 bugs
* chore: adding more scenarios
* fix: formatting
* fix: fixing tsc errors
* chore: deleting the old text to cad and using the new application level one, almost there
* fix: prompt to edit works
* fix: large push to get 1 text to cad command... the usage is a little buggy with delete and navigate within /file
* fix: settings for highlight edges now works
* chore: adding another e2e test
* fix: cleaning up e2e tests and writing more of them
* fix: tsc type
* chore: more e2e improvements, unique project name in text to cad
* chore: e2e tests should be good to go
* fix: gotcha comment
* fix: enabled web t2c, codespell fixes
* fix: fixing merge conflcits??
* feat: implemented load external for kcl samples
* feat: load external model from disk
* fix: trying to delete old stuff
* fix: all command trigger locations now have defaults for current project
* fix: gotcha comment for the future
* chore: hiding import file from url command, two separate commands for 3d and kcl file adding
* chore: commands are now add file to project, 3rd iteration
* fix: t2c in file menu fixed
* chore: updating file menu for new global actions
* fix: auto fixes
* fix: the command bar arg flow for web add kcl file seems backwards?
* chore: updated home layout, added create from kcl sample button
* chore: remapping some menu actions
* fix: fixing open dialog copy
* fix: an e2e test
* fix: fixed e2e tests
* fix: fixed e2e tests
* fix: auto fixes
* fix: pr clean up
* fix: removing console log
* fix: PR updates
* fix: the reviewed stage boolean required the expected state to change. Also I progressed the command bar too soon
* fix: no idea how this passed locally yesterday? I removed the {dir} unused but I need the function's logic but not the return value...
* fix: should be good to go?
---------
Co-authored-by: Frank Noirot <frankjohnson1993@gmail.com>
2025-04-29 13:04:45 -05:00
const expected = 'Add file to project'
2025-04-24 20:50:26 -04:00
expect ( actual ) . toBe ( expected )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.File.Export current part' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const openProject = app . applicationMenu . getMenuItemById (
'File.Export current part'
)
if ( ! openProject ) {
throw new Error ( 'File.Export current part' )
}
openProject . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Export'
expect ( actual ) . toBe ( expected )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.File.Share part via Zoo link' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const openProject = app . applicationMenu . getMenuItemById (
'File.Share part via Zoo link'
)
if ( ! openProject ) {
throw new Error ( 'File.Share part via Zoo link' )
}
openProject . click ( )
} )
const textToCheck =
'Link copied to clipboard. Anyone who clicks this link will get a copy of this file. Share carefully!'
// Check if text appears anywhere in the page
const isTextVisible = page . getByText ( textToCheck )
await expect ( isTextVisible ) . toBeVisible ( { timeout : 10000 } )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.File.Preferences.Project settings' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const openProject = app . applicationMenu . getMenuItemById (
'File.Preferences.Project settings'
)
if ( ! openProject ) {
throw new Error ( 'File.Preferences.Project settings' )
}
openProject . click ( )
} )
const settings = page . getByTestId ( 'settings-dialog-panel' )
await expect ( settings ) . toBeVisible ( )
// You are viewing the user tab
const actualText = settings . getByText (
'The hue of the primary theme color for the app'
)
await expect ( actualText ) . toBeVisible ( )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.File.Preferences.User settings' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const userSettings = app . applicationMenu . getMenuItemById (
'File.Preferences.User settings'
)
if ( ! userSettings ) {
throw new Error ( 'File.Preferences.User settings' )
}
userSettings . click ( )
} )
const settings = page . getByTestId ( 'settings-dialog-panel' )
await expect ( settings ) . toBeVisible ( )
// You are viewing the user tab
const actualText = settings . getByText (
'The overall appearance of the app'
)
await expect ( actualText ) . toBeVisible ( )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.File.Preferences.Keybindings' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const keybindings = app . applicationMenu . getMenuItemById (
'File.Preferences.Keybindings'
)
if ( ! keybindings ) {
throw new Error ( 'File.Preferences.Keybindings' )
}
keybindings . click ( )
} )
const settings = page . getByTestId ( 'settings-dialog-panel' )
await expect ( settings ) . toBeVisible ( )
// You are viewing the keybindings tab
const enterSketchMode = settings . locator ( '#enter-sketch-mode' )
await expect ( enterSketchMode ) . toBeVisible ( )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.File.Preferences.User default units' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'File.Preferences.User default units'
)
if ( ! menu ) {
throw new Error ( 'File.Preferences.User default units' )
}
menu . click ( )
} )
const settings = page . getByTestId ( 'settings-dialog-panel' )
await expect ( settings ) . toBeVisible ( )
const defaultUnit = settings . locator ( '#defaultUnit' )
await expect ( defaultUnit ) . toBeVisible ( )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.File.Preferences.Theme' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'File.Preferences.Theme'
)
if ( ! menu ) {
throw new Error ( 'File.Preferences.Theme' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Settings · app · theme'
expect ( actual ) . toBe ( expected )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.File.Preferences.Theme color' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'File.Preferences.Theme color'
)
if ( ! menu ) {
throw new Error ( 'File.Preferences.Theme color' )
}
menu . click ( )
} )
const settings = page . getByTestId ( 'settings-dialog-panel' )
await expect ( settings ) . toBeVisible ( )
const defaultUnit = settings . locator ( '#themeColor' )
await expect ( defaultUnit ) . toBeVisible ( )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.File.Preferences.Sign out' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu =
app . applicationMenu . getMenuItemById ( 'File.Sign out' )
if ( ! menu ) {
throw new Error ( 'File.Sign out' )
}
// FIXME: Add back when you can actually sign out
// menu.click()
return true
} )
)
. toBe ( true )
// FIXME: When signing out during E2E the page is not bound correctly.
// It cannot find the button
// const signIn = page.getByTestId('sign-in-button')
// await expect(signIn).toBeVisible()
2025-04-04 08:39:02 -05:00
} )
} )
2025-04-24 20:50:26 -04:00
test . describe ( 'Edit role' , ( ) = > {
test ( 'Modeling.Edit.Modify with Zoo Text-To-CAD' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Edit.Modify with Zoo Text-To-CAD'
)
if ( ! menu ) {
throw new Error ( 'Edit.Modify with Zoo Text-To-CAD' )
}
menu . click ( )
} )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Prompt-to-edit'
expect ( actual ) . toBe ( expected )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.Edit.Edit parameter' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Edit.Edit parameter'
)
if ( ! menu ) {
throw new Error ( 'Edit.Edit parameter' )
}
menu . click ( )
} )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Edit parameter'
expect ( actual ) . toBe ( expected )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.Edit.Format code' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById ( 'Edit.Format code' )
if ( ! menu ) {
throw new Error ( 'Edit.Format code' )
}
// NO OP: Do not test that the code mirror will actually format the code.
// The format code happens, there is no UI.
// The actual business logic to test this feature should be in another E2E test.
// menu.click()
} )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.Edit.Rename project' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Edit.Rename project'
)
if ( ! menu ) {
throw new Error ( 'Edit.Rename project' )
}
menu . click ( )
} )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Rename project'
expect ( actual ) . toBe ( expected )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.Edit.Delete project' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Edit.Delete project'
)
if ( ! menu ) {
throw new Error ( 'Edit.Delete project' )
}
menu . click ( )
} )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Delete project'
expect ( actual ) . toBe ( expected )
} )
test ( 'Modeling.Edit.Change project directory' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Edit.Change project directory'
)
if ( ! menu ) {
throw new Error ( 'Edit.Change project directory' )
}
menu . click ( )
} )
const settings = page . getByTestId ( 'settings-dialog-panel' )
await expect ( settings ) . toBeVisible ( )
const projectDirectory = settings . locator ( '#projectDirectory' )
await expect ( projectDirectory ) . toBeVisible ( )
2025-04-04 08:39:02 -05:00
} )
} )
2025-04-24 20:50:26 -04:00
test . describe ( 'View role' , ( ) = > {
test ( 'Modeling.View.Command Palette...' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Command Palette...'
)
if ( ! menu ) {
throw new Error ( 'View.Command Palette...' )
}
menu . click ( )
} )
// Check the placeholder project name exists
const actual = cmdBar . cmdBarElement . getByTestId ( 'cmd-bar-search' )
await expect ( actual ) . toBeVisible ( )
} )
test ( 'Modeling.View.Orthographic view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Orthographic view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
const textToCheck =
'Set camera projection to "orthographic" as a user default'
// Check if text appears anywhere in the page
const isTextVisible = page . getByText ( textToCheck )
await expect ( isTextVisible ) . toBeVisible ( { timeout : 10000 } )
} )
test ( 'Modeling.View.Perspective view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Perspective view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
const textToCheck =
'Set camera projection to "perspective" as a user default'
// Check if text appears anywhere in the page
const isTextVisible = page . getByText ( textToCheck )
await expect ( isTextVisible ) . toBeVisible ( { timeout : 10000 } )
} )
test ( 'Modeling.View.Standard views.Right view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Standard views.Right view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
// menu.click()
} )
// TODO: Make all of these screenshot E2E tests.
// Wait for camera to move
// await page.waitForTimeout(5000)
// const locator = page.getByTestId('gizmo').locator('canvas')
// const image = await locator.screenshot({ path: 'Modeling.View.Standard-views.Right-view.png' });
// expect(image).toMatchSnapshot('Modeling.View.Standard-views.Right-view')
} )
test ( 'Modeling.View.Standard views.Back view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Standard views.Back view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
// menu.click()
} )
} )
test ( 'Modeling.View.Standard views.Top view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Standard views.Top view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
// menu.click()
} )
} )
test ( 'Modeling.View.Standard views.Left view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Standard views.Left view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
// menu.click()
} )
} )
test ( 'Modeling.View.Standard views.Front view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Standard views.Front view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
// menu.click()
} )
} )
test ( 'Modeling.View.Standard views.Bottom view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Standard views.Bottom view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
// menu.click()
} )
} )
test ( 'Modeling.View.Standard views.Reset view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Standard views.Reset view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
// menu.click()
} )
} )
test ( 'Modeling.View.Standard views.Center view on selection' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Standard views.Center view on selection'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
// menu.click()
} )
} )
test ( 'Modeling.View.Standard views.Refresh' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Standard views.Refresh'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
// menu.click()
} )
} )
test ( 'Modeling.View.Named views.Create named view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Named views.Create named view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Create named view'
expect ( actual ) . toBe ( expected )
} )
test ( 'Modeling.View.Named views.Load named view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Named views.Load named view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Load named view'
expect ( actual ) . toBe ( expected )
} )
test ( 'Modeling.View.Named views.Delete named view' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Named views.Delete named view'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Delete named view'
expect ( actual ) . toBe ( expected )
} )
test ( 'Modeling.View.Panes.Feature tree' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Panes.Feature tree'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
const button = page . getByTestId ( 'feature-tree-pane-button' )
const isPressed = await button . getAttribute ( 'aria-pressed' )
expect ( isPressed ) . toBe ( 'true' )
} )
test ( 'Modeling.View.Panes.KCL code' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Panes.KCL code'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
const button = page . getByTestId ( 'code-pane-button' )
const isPressed = await button . getAttribute ( 'aria-pressed' )
expect ( isPressed ) . toBe ( 'true' )
} )
test ( 'Modeling.View.Panes.Project files' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Panes.Project files'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
const button = page . getByTestId ( 'files-pane-button' )
const isPressed = await button . getAttribute ( 'aria-pressed' )
expect ( isPressed ) . toBe ( 'true' )
} )
test ( 'Modeling.View.Panes.Variables' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'View.Panes.Variables'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
const button = page . getByTestId ( 'variables-pane-button' )
const isPressed = await button . getAttribute ( 'aria-pressed' )
expect ( isPressed ) . toBe ( 'true' )
} )
test ( 'Modeling.View.Panes.Logs' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById ( 'View.Panes.Logs' )
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
const button = page . getByTestId ( 'logs-pane-button' )
const isPressed = await button . getAttribute ( 'aria-pressed' )
expect ( isPressed ) . toBe ( 'true' )
} )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test . describe ( 'Design role' , ( ) = > {
// TODO Start sketch
test ( 'Modeling.Design.Create an offset plane' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Create an offset plane'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Offset plane'
expect ( actual ) . toBe ( expected )
} )
test ( 'Modeling.Design.Create a helix' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Create a helix'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Helix'
expect ( actual ) . toBe ( expected )
} )
test ( 'Modeling.Design.Create a parameter' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Create a parameter'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Create parameter'
expect ( actual ) . toBe ( expected )
} )
2025-04-04 08:39:02 -05:00
2025-04-24 20:50:26 -04:00
test ( 'Modeling.Design.Create an additive feature.Extrude' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Create an additive feature.Extrude'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Extrude'
expect ( actual ) . toBe ( expected )
} )
test ( 'Modeling.Design.Create an additive feature.Revolve' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Create an additive feature.Revolve'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Revolve'
expect ( actual ) . toBe ( expected )
} )
test ( 'Modeling.Design.Create an additive feature.Sweep' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Create an additive feature.Sweep'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Sweep'
expect ( actual ) . toBe ( expected )
} )
test ( 'Modeling.Design.Create an additive feature.Loft' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Create an additive feature.Loft'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Loft'
expect ( actual ) . toBe ( expected )
} )
test ( 'Modeling.Design.Apply modification feature.Fillet' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Apply modification feature.Fillet'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Fillet'
expect ( actual ) . toBe ( expected )
} )
test ( 'Modeling.Design.Apply modification feature.Chamfer' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Apply modification feature.Chamfer'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Chamfer'
expect ( actual ) . toBe ( expected )
} )
2025-04-04 08:39:02 -05:00
2025-04-24 20:50:26 -04:00
test ( 'Modeling.Design.Apply modification feature.Shell' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Apply modification feature.Shell'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Shell'
expect ( actual ) . toBe ( expected )
} )
2025-04-04 08:39:02 -05:00
2025-04-24 20:50:26 -04:00
test ( 'Modeling.Design.Insert from project file' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . settled ( cmdBar )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const openProject = app . applicationMenu . getMenuItemById (
'Design.Insert from project file'
)
if ( ! openProject ) {
throw new Error ( 'Design.Insert from project file' )
}
openProject . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Insert'
expect ( actual ) . toBe ( expected )
} )
2025-04-14 14:53:01 -04:00
2025-04-24 20:50:26 -04:00
test ( 'Modeling.Design.Create with Zoo Text-To-CAD' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Create with Zoo Text-To-CAD'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Text-to-CAD'
expect ( actual ) . toBe ( expected )
} )
2025-04-04 08:39:02 -05:00
2025-04-24 20:50:26 -04:00
test ( 'Modeling.Design.Modify with Zoo Text-To-CAD' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) {
throw new Error ( 'app or app.applicationMenu is missing' )
}
const menu = app . applicationMenu . getMenuItemById (
'Design.Modify with Zoo Text-To-CAD'
)
if ( ! menu ) {
throw new Error ( 'menu missing' )
}
menu . click ( )
} )
// Check that the command bar is opened
await expect ( cmdBar . cmdBarElement ) . toBeVisible ( )
// Check the placeholder project name exists
const actual = await cmdBar . cmdBarElement
. getByTestId ( 'command-name' )
. textContent ( )
const expected = 'Prompt-to-edit'
expect ( actual ) . toBe ( expected )
2025-04-04 08:39:02 -05:00
} )
} )
2025-04-24 20:50:26 -04:00
test . describe ( 'Help role' , ( ) = > {
test ( 'Modeling.Help.Show all commands' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) fail ( )
const menu = app . applicationMenu . getMenuItemById (
'Help.Show all commands'
)
if ( ! menu ) fail ( )
menu . click ( )
} )
// Check the placeholder project name exists
const actual = cmdBar . cmdBarElement . getByTestId ( 'cmd-bar-search' )
await expect ( actual ) . toBeVisible ( )
2025-04-04 08:39:02 -05:00
} )
2025-04-24 20:50:26 -04:00
test ( 'Modeling.Help.KCL code samples' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) fail ( )
const menu = app . applicationMenu . getMenuItemById (
'Help.KCL code samples'
)
if ( ! menu ) fail ( )
} )
} )
test ( 'Modeling.Help.Report a bug' , async ( {
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
toolbar ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await expect
. poll (
async ( ) = >
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) return false
const menu =
app . applicationMenu . getMenuItemById ( 'Help.Report a bug' )
if ( ! menu ) return false
menu . click ( )
return true
} )
)
. toBe ( true )
// Core dump and refresh magic number timeout
await scene . connectionEstablished ( )
await expect ( toolbar . startSketchBtn ) . toBeVisible ( )
} )
2025-05-02 15:54:49 -04:00
test ( 'Modeling.Help.Replay onboarding tutorial' , async ( {
2025-04-24 20:50:26 -04:00
tronApp ,
cmdBar ,
page ,
homePage ,
scene ,
} ) = > {
if ( ! tronApp ) {
throwTronAppMissing ( )
return
}
await homePage . goToModelingScene ( )
await scene . connectionEstablished ( )
// Run electron snippet to find the Menu!
await page . waitForTimeout ( 100 ) // wait for createModelingPageMenu() to run
await tronApp . electron . evaluate ( async ( { app } ) = > {
if ( ! app || ! app . applicationMenu ) fail ( )
const menu = app . applicationMenu . getMenuItemById (
2025-05-02 15:54:49 -04:00
'Help.Replay onboarding tutorial'
2025-04-24 20:50:26 -04:00
)
if ( ! menu ) fail ( )
menu . click ( )
} )
const actual = page . getByText (
` This is a hardware design tool that lets you edit visually, with code, or both. It's powered by the KittyCAD Design API, the first API created for anyone to build hardware design tools. `
)
await expect ( actual ) . toBeVisible ( )
2025-03-26 13:03:44 -05:00
} )
} )
} )
2025-04-24 20:50:26 -04:00
}
)