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