parent
4347dbe778
commit
af250b0a4d
@ -0,0 +1,49 @@ |
||||
import { NightwatchBrowser } from "nightwatch" |
||||
|
||||
const EventEmitter = require('events') |
||||
|
||||
class RemoveFile extends EventEmitter { |
||||
command (this: NightwatchBrowser, path: string): NightwatchBrowser { |
||||
this.api.perform((done) => { |
||||
removeFile(this.api, path, () => { |
||||
done() |
||||
this.emit('complete') |
||||
}) |
||||
}) |
||||
return this |
||||
} |
||||
} |
||||
|
||||
function removeFile (browser: NightwatchBrowser, path: string, done: VoidFunction) { |
||||
browser.execute(function (path) { |
||||
function contextMenuClick (element) { |
||||
const evt = element.ownerDocument.createEvent('MouseEvents') |
||||
const RIGHT_CLICK_BUTTON_CODE = 2 // the same for FF and IE
|
||||
|
||||
evt.initMouseEvent('contextmenu', true, true, |
||||
element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, |
||||
false, false, false, RIGHT_CLICK_BUTTON_CODE, null) |
||||
if (Object.prototype.hasOwnProperty.call(document, 'createEventObject')) { |
||||
// dispatch for IE
|
||||
return element.fireEvent('onclick', evt) |
||||
} else { |
||||
// dispatch for firefox + others
|
||||
return !element.dispatchEvent(evt) |
||||
} |
||||
} |
||||
contextMenuClick(document.querySelector('[data-path="' + path + '"]')) |
||||
}, [path], function () { |
||||
browser |
||||
.waitForElementVisible('#menuitemdelete', 2000) |
||||
.click('#menuitemdelete') |
||||
.pause(500) |
||||
.waitForElementVisible('#modal-footer-ok', 2000) |
||||
.click('#modal-footer-ok') |
||||
.waitForElementNotPresent('[data-path="' + path + '"]') |
||||
.perform(() => { |
||||
done() |
||||
}) |
||||
}) |
||||
} |
||||
|
||||
module.exports = RemoveFile |
@ -0,0 +1,14 @@ |
||||
import { NightwatchBrowser } from 'nightwatch' |
||||
import EventEmitter from "events" |
||||
|
||||
class TestEditorValue extends EventEmitter { |
||||
command (this: NightwatchBrowser, testvalue: string): NightwatchBrowser { |
||||
this.api.getEditorValue((value) => { |
||||
this.api.assert.equal(testvalue, value) |
||||
this.emit('complete') |
||||
}) |
||||
return this |
||||
} |
||||
} |
||||
|
||||
module.exports = TestEditorValue |
@ -0,0 +1,141 @@ |
||||
'use strict' |
||||
import { NightwatchBrowser } from "nightwatch" |
||||
import init from '../helpers/init' |
||||
import sauce from './sauce' |
||||
|
||||
const assetsTestContract = `import "./contract.sol";
|
||||
contract Assets { |
||||
uint[] proposals; |
||||
function add(uint8 _numProposals) public { |
||||
proposals.length = _numProposals; |
||||
} |
||||
} |
||||
` |
||||
|
||||
const gmbhTestContract = `contract gmbh {
|
||||
uint[] proposals; |
||||
function register(uint8 _numProposals) public { |
||||
proposals.length = _numProposals; |
||||
} |
||||
} |
||||
` |
||||
const sources = [ |
||||
{ |
||||
'localhost/folder1/contract2.sol': {content: 'contract test2 { function get () public returns (uint) { return 11; }}'} |
||||
}, |
||||
{ |
||||
'localhost/src/gmbh/company.sol': {content: assetsTestContract} |
||||
}, |
||||
{ |
||||
'localhost/src/gmbh/company.sol': {content: assetsTestContract}, |
||||
'localhost/src/gmbh/contract.sol': {content: gmbhTestContract} |
||||
}, |
||||
{ |
||||
'browser/test_import_node_modules.sol': {content: 'import "openzeppelin-solidity/contracts/math/SafeMath.sol";'} |
||||
}, |
||||
{ |
||||
'browser/test_import_node_modules_with_github_import.sol': {content: 'import "openzeppelin-solidity/contracts/sample.sol";'} |
||||
} |
||||
] |
||||
|
||||
module.exports = { |
||||
before: function (browser, done) { |
||||
init(browser, done) |
||||
}, |
||||
|
||||
'@sources': function () { |
||||
return sources |
||||
}, |
||||
|
||||
'Remixd': function (browser) { |
||||
runTests(browser) |
||||
}, |
||||
'Import from node_modules ': function (browser) { |
||||
/* |
||||
when a relative import is used (i.e import "openzeppelin-solidity/contracts/math/SafeMath.sol") |
||||
remix (as well as truffle) try to resolve it against the node_modules and installed_contracts folder. |
||||
*/ |
||||
|
||||
browser.waitForElementVisible('#icon-panel', 2000) |
||||
.clickLaunchIcon('fileExplorers') |
||||
.addFile('test_import_node_modules.sol', sources[3]['browser/test_import_node_modules.sol']) |
||||
.clickLaunchIcon('solidity') |
||||
.testContracts('test_import_node_modules.sol', sources[3]['browser/test_import_node_modules.sol'], ['SafeMath']) |
||||
}, |
||||
'Import from node_modules and reference a github import': function (browser) { |
||||
browser.waitForElementVisible('#icon-panel', 2000) |
||||
.clickLaunchIcon('fileExplorers') |
||||
.addFile('test_import_node_modules_with_github_import.sol', sources[4]['browser/test_import_node_modules_with_github_import.sol']) |
||||
.clickLaunchIcon('solidity') |
||||
.setSolidityCompilerVersion('soljson-v0.6.2+commit.bacdbe57.js') // open-zeppelin moved to pragma ^0.6.0
|
||||
.testContracts('test_import_node_modules_with_github_import.sol', sources[4]['browser/test_import_node_modules_with_github_import.sol'], ['ERC20', 'test11']) |
||||
.clickLaunchIcon('pluginManager') |
||||
.scrollAndClick('#pluginManager article[id="remixPluginManagerListItem_remixd"] button') |
||||
.end() |
||||
}, |
||||
tearDown: sauce |
||||
} |
||||
|
||||
function runTests (browser: NightwatchBrowser) { |
||||
const browserName = browser.options.desiredCapabilities.browserName |
||||
if (browserName === 'safari' || browserName === 'internet explorer') { |
||||
console.log('do not run remixd test for ' + browserName + ': sauce labs doesn\'t seems to handle websocket') |
||||
browser.end() |
||||
return |
||||
} |
||||
|
||||
browser |
||||
.waitForElementVisible('#icon-panel', 2000) |
||||
.clickLaunchIcon('fileExplorers') |
||||
.clickLaunchIcon('pluginManager') |
||||
.scrollAndClick('#pluginManager article[id="remixPluginManagerListItem_remixd"] button') |
||||
.waitForElementVisible('#modal-footer-ok', 2000) |
||||
.pause(2000) |
||||
.click('#modal-footer-ok') |
||||
.clickLaunchIcon('fileExplorers') |
||||
.waitForElementVisible('[data-path="localhost/folder1"]') |
||||
.click('[data-path="localhost/folder1"]') |
||||
.waitForElementVisible('[data-path="localhost/contract1.sol"]') |
||||
.assert.containsText('[data-path="localhost/contract1.sol"]', 'contract1.sol') |
||||
.assert.containsText('[data-path="localhost/contract2.sol"]', 'contract2.sol') |
||||
.waitForElementVisible('[data-path="localhost/folder1/contract1.sol"]') |
||||
.assert.containsText('[data-path="localhost/folder1/cont ract1.sol"]', 'contract1.sol') |
||||
.assert.containsText('[data-path="localhost/folder1/contract2.sol"]', 'contract2.sol') // load and test sub folder
|
||||
.click('[data-path="localhost/folder1/contract2.sol"]') |
||||
.click('[data-path="localhost/folder1/contract1.sol"]') // open localhost/folder1/contract1.sol
|
||||
.pause(1000) |
||||
.testEditorValue('contract test1 { function get () returns (uint) { return 10; }}') // check the content and replace by another
|
||||
.setEditorValue('contract test1Changed { function get () returns (uint) { return 10; }}') |
||||
.testEditorValue('contract test1Changed { function get () returns (uint) { return 10; }}') |
||||
.setEditorValue('contract test1 { function get () returns (uint) { return 10; }}') |
||||
.click('[data-path="localhost/folder1/contract_' + browserName + '.sol"]') // rename a file and check
|
||||
.pause(1000) |
||||
.renameFile('localhost/folder1/contract_' + browserName + '.sol', 'renamed_contract_' + browserName + '.sol', 'localhost/folder1/renamed_contract_' + browserName + '.sol') |
||||
.pause(1000) |
||||
.removeFile('localhost/folder1/contract_' + browserName + '_toremove.sol') |
||||
.perform(function (done) { |
||||
testImportFromRemixd(browser, () => { done() }) |
||||
}) |
||||
.clickLaunchIcon('fileExplorers') |
||||
.waitForElementVisible('[data-path="localhost/folder1"]') |
||||
.click('[data-path="localhost/folder1"]') |
||||
.click('[data-path="localhost/folder1"]') // click twice because remixd does not return nested folder details after update
|
||||
.waitForElementVisible('[data-path="localhost/folder1/contract1.sol"]') |
||||
.waitForElementVisible('[data-path="localhost/folder1/renamed_contract_' + browserName + '.sol"]') // check if renamed file is preset
|
||||
.waitForElementNotPresent('[data-path="localhost/folder1/contract_' + browserName + '.sol"]') // check if renamed (old) file is not present
|
||||
.waitForElementNotPresent('[data-path="localhost/folder1/contract_' + browserName + '_toremove.sol"]') // check if removed (old) file is not present
|
||||
.click('[data-path="localhost/folder1/renamed_contract_' + browserName + '.sol"]') |
||||
} |
||||
|
||||
function testImportFromRemixd (browser: NightwatchBrowser, callback: VoidFunction) { |
||||
browser |
||||
.waitForElementVisible('[data-path="localhost/src"]', 100000) |
||||
.click('[data-path="localhost/src"]') |
||||
.waitForElementVisible('[data-path="localhost/src/gmbh"]', 100000) |
||||
.click('[data-path="localhost/src/gmbh"]') |
||||
.waitForElementVisible('[data-path="localhost/src/gmbh/company.sol"]', 100000) |
||||
.click('[data-path="localhost/src/gmbh/company.sol"]') |
||||
.pause(1000) |
||||
.verifyContracts(['Assets', 'gmbh']) |
||||
.perform(() => { callback() }) |
||||
} |
Loading…
Reference in new issue