Merge pull request #5239 from ethereum/desktoptestmd
MD file for writing desktop testspull/5259/head
commit
2e54df67b2
@ -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() |
||||
``` |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in new issue