import {NightwatchBrowser} from 'nightwatch' import { ChildProcess, spawn, execSync } from 'child_process' import { homedir } from 'os' const tests = { before: function (browser: NightwatchBrowser, done: VoidFunction) { done() }, open: function (browser: NightwatchBrowser) { browser.waitForElementVisible('*[data-id="openFolderButton"]', 10000).click('*[data-id="openFolderButton"]') }, 'open default template': function (browser: NightwatchBrowser) { browser .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) .waitForElementVisible('button[data-id="landingPageImportFromTemplate"]') .click('button[data-id="landingPageImportFromTemplate"]') .waitForElementPresent('*[data-id="create-remixDefault"]') .scrollAndClick('*[data-id="create-remixDefault"]') .waitForElementVisible('*[data-id="modalDialogCustomPromptTextCreate"]') .waitForElementPresent('[data-id="TemplatesSelectionModalDialogContainer-react"] .modal-ok') .click('[data-id="TemplatesSelectionModalDialogContainer-react"] .modal-ok') .pause(3000) .windowHandles(function (result) { console.log(result.value) browser.switchWindow(result.value[1]) .waitForElementVisible('*[data-id="treeViewLitreeViewItemtests"]') .click('*[data-id="treeViewLitreeViewItemtests"]') .waitForElementVisible('*[data-id="treeViewLitreeViewItemcontracts"]') .click('*[data-id="treeViewLitreeViewItemcontracts"]') .waitForElementVisible('[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]') .openFile('contracts/1_Storage.sol') .waitForElementVisible('*[id="editorView"]', 10000) .getEditorValue((content) => { browser.assert.ok(content.includes('function retrieve() public view returns (uint256){')) }) }) }, 'Should install slither #group6': function (browser: NightwatchBrowser) { browser.perform(async (done) => { await installSlither() done() }) }, 'run slither': function (browser: NightwatchBrowser) { browser .click('[data-id="verticalIconsKindpluginManager"]') .scrollAndClick('[data-id="pluginManagerComponentActivateButtonsolidityStaticAnalysis"]') .clickLaunchIcon('solidity').click('*[data-id="compilerContainerCompileBtn"]') .pause(1000) .clickLaunchIcon('solidityStaticAnalysis') .useXpath() .click('//*[@id="staticAnalysisRunBtn"]') .waitForElementPresent('//*[@id="staticanalysisresult"]', 5000) .waitForElementVisible({ selector: "//*[@data-id='nolibslitherwarnings'][contains(text(), '1')]", locateStrategy: 'xpath', timeout: 5000 }) .waitForElementVisible({ selector: "//div[@data-id='block']/span[contains(text(), '1 warnings found.')]", locateStrategy: 'xpath', timeout: 5000 }) }, after: function (browser: NightwatchBrowser) { browser.end() }, } async function installSlither(): Promise { console.log('installSlither', process.cwd()) try { try { const solcVersion = '0.8.15' console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: requires Python3.6+ (pip3) to be installed on your system`) console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: solc-select will be installed along with Slither to set different solc compiler versions.`) console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: checking pip3 availability ...`) const pip3OP = execSync('pip3 --version') console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: pip3 found: ${pip3OP.toString()}`) console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: installing slither...`) const slitherOP = execSync('pip3 install slither-analyzer') console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: slither installation output: ${slitherOP.toString()}`) console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: installing solc-select...`) const solcSelectOP = execSync('pip3 install solc-select') console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: solc-select installation output: ${solcSelectOP.toString()}`) console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: installing solc ${solcVersion}...`) const solcInstallOP = execSync(`solc-select install ${solcVersion}`) console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: solc installation output: ${solcInstallOP.toString()}`) console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: setting solc version to ${solcVersion}...`) const solcUseOP = execSync(`solc-select use ${solcVersion}`) console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: solc setting installation output: ${solcUseOP.toString()}`) console.log('\x1b[32m%s\x1b[0m', `[Slither Installation]: Slither is ready to use!`) } catch (err) { console.log('\x1b[31m%s\x1b[0m', `[Slither Installation]: Error occurred: ${err}`) } } catch (e) { console.log(e) } } module.exports = { ...process.platform.startsWith('linux')?tests:{} }