diff --git a/package.json b/package.json index 56d94c86a8..d023f34f3e 100644 --- a/package.json +++ b/package.json @@ -187,6 +187,7 @@ "nightwatch_local_editor": "nightwatch ./test-browser/tests/editor.test.js --config nightwatch.js --env chrome ", "nightwatch_local_compiler": "nightwatch ./test-browser/tests/compiler_api.test.js --config nightwatch.js --env chrome ", "nightwatch_local_txListener": "nightwatch ./test-browser/tests/txListener.test.js --config nightwatch.js --env chrome ", + "nightwatch_local_fileManager": "nightwatch ./test-browser/tests/fileManager_api.test.js --config nightwatch.js --env chrome ", "nightwatch_local_runAndDeploy": "nightwatch ./test-browser/tests/runAndDeploy.js --config nightwatch.js --env chrome-runAndDeploy ", "onchange": "onchange build/app.js -- npm-run-all lint", "prepublish": "mkdirp build; npm-run-all -ls downloadsolc_root build", diff --git a/src/app/files/fileManager.js b/src/app/files/fileManager.js index fe74117a3a..6699179c06 100644 --- a/src/app/files/fileManager.js +++ b/src/app/files/fileManager.js @@ -23,7 +23,7 @@ const profile = { icon: 'assets/img/fileManager.webp', permission: true, version: packageJson.version, - methods: ['file', 'exists', 'open', 'writeFile', 'readFile', 'copyFile', 'rename', 'readdir', 'remove', 'getCurrentFile', 'getFile', 'getFolder', 'setFile', 'switchFile'], + methods: ['file', 'exists', 'open', 'writeFile', 'readFile', 'copyFile', 'rename', 'mkdir', 'readdir', 'remove', 'getCurrentFile', 'getFile', 'getFolder', 'setFile', 'switchFile'], kind: 'file-system' } const errorMsg = { @@ -194,10 +194,24 @@ class FileManager extends Plugin { * @returns {void} */ async rename (oldPath, newPath) { - await this.__handleExists(oldPath, `Cannot rename ${oldPath}`) + await this._handleExists(oldPath, `Cannot rename ${oldPath}`) const isFile = await this.isFile(oldPath) + const newPathExists = await this.exists(newPath) + const provider = this.fileProviderOf(oldPath) - this.fileRenamedEvent(oldPath, newPath, !isFile) + if (isFile) { + if (newPathExists) { + modalDialogCustom.alert('File already exists.') + return + } + return provider.rename(oldPath, newPath, false) + } else { + if (newPathExists) { + modalDialogCustom.alert('Folder already exists.') + return + } + return provider.rename(oldPath, newPath, true) + } } /** diff --git a/test-browser/tests/fileManager_api.test.js b/test-browser/tests/fileManager_api.test.js new file mode 100644 index 0000000000..681d354d2b --- /dev/null +++ b/test-browser/tests/fileManager_api.test.js @@ -0,0 +1,190 @@ +'use strict' +var init = require('../helpers/init') +var sauce = require('./sauce') + +module.exports = { + before: function (browser, done) { + init(browser, done) + }, + + 'Should execute `file` api from file manager external api': function (browser) { + browser + .addFile('file.js', { content: executeFile }) + .executeScript(`remix.exeCurrent()`) + .pause(2000) + .journalLastChildIncludes('browser/file.js') + }, + + 'Should execute `exists` api from file manager external api': function (browser) { + browser + .addFile('exists.js', { content: executeExists }) + .executeScript(`remix.exeCurrent()`) + .pause(2000) + .journalChildIncludes('browser/exists.js true') + .journalChildIncludes('browser/non-exists.js false') + }, + + 'Should execute `open` api from file manager external api': function (browser) { + browser + .addFile('open.js', { content: executeOpen }) + .executeScript(`remix.exeCurrent()`) + .pause(2000) + .journalLastChildIncludes('browser/3_Ballot.sol') + }, + + 'Should execute `writeFile` api from file manager external api': function (browser) { + browser + .addFile('writeFile.js', { content: executeWriteFile }) + .executeScript(`remix.exeCurrent()`) + .pause(2000) + .openFile('browser/new_contract.sol') + .assert.containsText('[data-id="editorInput"]', 'pragma solidity ^0.6.0') + }, + + 'Should execute `readFile` api from file manager external api': function (browser) { + browser + .addFile('readFile.js', { content: executeReadFile }) + .executeScript(`remix.exeCurrent()`) + .pause(2000) + .journalLastChildIncludes('pragma solidity ^0.6.0') + }, + + 'Should execute `copyFile` api from file manager external api': function (browser) { + browser + .addFile('copyFile.js', { content: executeCopyFile }) + .executeScript(`remix.exeCurrent()`) + .pause(2000) + .journalLastChildIncludes('pragma solidity >=0.2.0 <0.7.0;') + }, + + 'Should execute `rename` api from file manager external api': function (browser) { + browser + .addFile('renameFile.js', { content: executeRename }) + .executeScript(`remix.exeCurrent()`) + .pause(2000) + .waitForElementPresent('[data-id="treeViewLibrowser/old_contract.sol"]') + }, + + 'Should execute `mkdir` api from file manager external api': function (browser) { + browser + .addFile('mkdirFile.js', { content: executeMkdir }) + .executeScript(`remix.exeCurrent()`) + .pause(2000) + .waitForElementPresent('[data-id="treeViewLibrowser/Test_Folder"]') + }, + + 'Should execute `readdir` api from file manager external api': function (browser) { + browser + .addFile('readdirFile.js', { content: executeReaddir }) + .executeScript(`remix.exeCurrent()`) + .pause(2000) + .journalLastChildIncludes('Test_Folder isDirectory true') + }, + + 'Should execute `remove` api from file manager external api': function (browser) { + browser + .addFile('removeFile.js', { content: executeRemove }) + .executeScript(`remix.exeCurrent()`) + .pause(2000) + .waitForElementNotVisible('[data-id="treeViewLibrowser/old_contract.sol"]') + .end() + }, + + tearDown: sauce +} + +const executeFile = ` + const run = async () => { + const result = await remix.call('fileManager', 'file') + + console.log(result) + } + + run() +` + +const executeExists = ` + const run = async () => { + const result1 = await remix.call('fileManager', 'exists', 'browser/exists.js') + const result2 = await remix.call('fileManager', 'exists', 'browser/non-exists.js') + + console.log('browser/exists.js ' + result1) + console.log('browser/non-exists.js ' + result2) + } + + run() +` + +const executeOpen = ` + const run = async () => { + await remix.call('fileManager', 'open', 'browser/3_Ballot.sol') + const result = await remix.call('fileManager', 'file') + + console.log(result) + } + + run() +` + +const executeWriteFile = ` + const run = async () => { + await remix.call('fileManager', 'writeFile', 'browser/new_contract.sol', 'pragma solidity ^0.6.0') + } + + run() +` + +const executeReadFile = ` + const run = async () => { + const result = await remix.call('fileManager', 'readFile', 'browser/new_contract.sol') + + console.log(result) + } + + run() +` + +const executeCopyFile = ` + const run = async () => { + await remix.call('fileManager', 'copyFile', 'browser/basic.sol', 'browser/new_contract.sol') + const result = await remix.call('fileManager', 'readFile', 'browser/new_contract.sol') + + console.log(result) + } + + run() +` + +const executeRename = ` + const run = async () => { + await remix.call('fileManager', 'rename', 'browser/new_contract.sol', 'browser/old_contract.sol') + } + + run() +` + +const executeMkdir = ` + const run = async () => { + await remix.call('fileManager', 'mkdir', 'browser/Test_Folder/') + } + + run() +` + +const executeReaddir = ` + const run = async () => { + const result = await remix.call('fileManager', 'readdir', 'browser/') + + console.log('Test_Folder isDirectory ', result["Test_Folder"].isDirectory) + } + + run() +` + +const executeRemove = ` + const run = async () => { + await remix.call('fileManager', 'remove', 'browser/old_contract.sol') + } + + run() +`