diff --git a/apps/remixdesktop/TEST.md b/apps/remixdesktop/TEST.md new file mode 100644 index 0000000000..3258a119b2 --- /dev/null +++ b/apps/remixdesktop/TEST.md @@ -0,0 +1,124 @@ +# How run and write tests for Remix Desktop + + +### Basic procedure of local testing + +- create a release executable of desktop +- run local remix-ide +- run the test + +### Executables + +Testing runs through nightwatch that treats an electron application as a special version of chrome, which it is. It basically calls the executable which is built by the ./rundist.bash script which creates executables based on the current channel configuration package.json, ie "version": "1.0.8-insiders" + +Executables are stored in the ./release directory. Without that executable you cannot run tests. You cannot call tests on local development instance that is launched by yarn start:dev. You need to create an exec first. + +This is done by running ./rundist.bash + +Normally when you would do a 'real' release you would package remix IDE into the distributable but for local e2e this not necessary because it will use the remix IDE that is being served. + + +``` + switch (type) { + case 'Windows_NT': + binaryPath = `./release/win-unpacked/Remix-Desktop-${channel}.exe`; + break; + case 'Darwin': + binaryPath = arch === 'x64' ? + `release/mac/Remix-Desktop-${channel}.app/Contents/MacOS/Remix-Desktop-${channel}` : + `release/mac-arm64/Remix-Desktop-${channel}.app/Contents/MacOS/Remix-Desktop-${channel}`; + break; + case 'Linux': + binaryPath = "release/linux-unpacked/remixdesktop"; + break; +``` + +### Local testing + +In order to facilitate local testing nightwatch will boot the executable with the --e2e-local flag when running locally ( so outside of CIRCLE CI ). This means the electron app with load the local running Remix IDE. + +So to start testing locally +- run the IDE with 'yarn serve' as you would normally do. +- build your release. You will always need to this when the Desktop app itself changes its code. + - ./rundist.bash +- in apps/remixdesktop: + - yarn build:e2e + - run the test you want, refer to the actual JS that is build, not the TS, ie + yarn test --test ./build-e2e/remixdesktop/test/tests/app/compiler.test.js + +### Hot reload on local tests + +When Remix IDE changes the electron window that is open will hot reload just like a browser. But when you change electron code you need to rebuild the release. + +### Filesystem & native dialogs + +Because you cannot access anything outside of the chrome context with nightwatch, like filesystem dialogs, the filesystem plugin in electron behaves different when it comes to e2e. + +These functions have been replaced with special versions: +``` +selectFolder +openFolder +openFolderInSameWindow +``` + +Basically when the app tries to open a folder where your 'workspace' is located it creates a random directory if you haven't specified a specific dir: +``` + const randomdir = path.join(os.homedir(), 'remix-tests' + Date.now().toString()) +``` +So that means when the test loads a template it will put the contents of it in a random dir. + +When you know which directory you need to open you can call it on the window in the test: +``` + browser.executeAsync(function (dir, done) { + (window as any).electronAPI.openFolderInSameWindow(dir + '/hello_foundry/').then(done) + }, [dir], () => { + console.log('done window opened') + }) +``` + +You can see this behavior in action too when using +``` +yarn start:dev --e2e-local +``` + +### Window handling + +The electron app always starts in a mode where there is no 'workspace'. You need to open one and that creates a new window unless you call openFolderInSameWindow. + +When you open a folder which is not in the same window, so ie you load a template electron creates a new window, so you need to switch to it: + +``` +.windowHandles(function (result) { + console.log(result.value) + browser.switchWindow(result.value[1]) +``` + +### OS filtering + +Remember tests will run on Machine OS instances, you will need to filter tests that use certain features of an OS + +``` +module.exports = { + ...process.platform.startsWith('win')?{}:tests +} +``` + +### hiding tooltips + +Always use this, it avoids trouble: +``` +rowser.hideToolTips() +``` + + + + + + + + + + + + + diff --git a/apps/remixdesktop/test/nighwatch.app.ts b/apps/remixdesktop/test/nighwatch.app.ts index 77ff0f9b7f..ee439cccf7 100644 --- a/apps/remixdesktop/test/nighwatch.app.ts +++ b/apps/remixdesktop/test/nighwatch.app.ts @@ -29,9 +29,6 @@ if (version.includes('beta')) { channel = 'Insiders'; } -// Determine if running on CircleCI or locally with --e2e-local -const isLocalE2E = process.argv.includes('--e2e-local') && !process.env.CIRCLECI; - module.exports = { src_folders: ['build-e2e/remixdesktop/test/tests/app'], output_folder: './reports/tests',