parent
70f402b113
commit
cb1a15bc4e
@ -0,0 +1,6 @@ |
|||||||
|
{ |
||||||
|
"editor.codeActionsOnSave": { |
||||||
|
"source.fixAll.eslint": true |
||||||
|
}, |
||||||
|
"eslint.validate": ["javascript"] |
||||||
|
} |
@ -0,0 +1,11 @@ |
|||||||
|
let os = require("os"); |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
skipJsErrors: true, |
||||||
|
browsers: ['chrome'], |
||||||
|
screenshots: { |
||||||
|
"path": "/tmp/artifacts", |
||||||
|
"takeOnFails": true, |
||||||
|
"pathPattern": "${DATE}_${TIME}/test-${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.png" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,540 @@ |
|||||||
|
import { PluginClient } from '@remixproject/plugin' |
||||||
|
import { customAction } from '@remixproject/plugin-api/lib/file-system/file-panel' |
||||||
|
import { createClient } from '@remixproject/plugin-webview' |
||||||
|
import { BehaviorSubject } from 'rxjs' |
||||||
|
import axios from 'axios' |
||||||
|
|
||||||
|
const simpleContract = `pragma solidity >=0.4.22 <0.7.0;
|
||||||
|
/** |
||||||
|
* @title Storage |
||||||
|
* @dev Store & retreive value in a variable |
||||||
|
*/ |
||||||
|
contract StorageTestUpdateConfiguration { |
||||||
|
uint256 number; |
||||||
|
/** |
||||||
|
* @dev Store value in variable |
||||||
|
* @param num value to store |
||||||
|
*/ |
||||||
|
function store(uint256 num) public { |
||||||
|
number = num; |
||||||
|
} |
||||||
|
/** |
||||||
|
* @dev Return value
|
||||||
|
* @return value of 'number' |
||||||
|
*/ |
||||||
|
function retreive() public view returns (uint256){ |
||||||
|
return number; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
` |
||||||
|
|
||||||
|
export class WorkSpacePlugin extends PluginClient { |
||||||
|
callBackEnabled: boolean = true; |
||||||
|
feedback = new BehaviorSubject<any>(''); |
||||||
|
|
||||||
|
constructor () { |
||||||
|
super() |
||||||
|
console.log('CONSTRUCTOR') |
||||||
|
createClient(this) |
||||||
|
|
||||||
|
this.methods = ['qr', 'dismiss', 'customAction'] |
||||||
|
|
||||||
|
this.onload() |
||||||
|
.then(async (x) => { |
||||||
|
// console.log("client loaded", JSON.stringify(this));
|
||||||
|
try { |
||||||
|
// await this.call("solidityUnitTesting", "testFromSource", "");
|
||||||
|
} catch (e) { |
||||||
|
// console.log("not available");
|
||||||
|
} |
||||||
|
/* |
||||||
|
let acc = await this.call("udapp","getSettings") |
||||||
|
console.log(acc) |
||||||
|
let ac2 = await this.call("udapp","getAccounts") |
||||||
|
console.log(ac2) |
||||||
|
const privateKey = "71975fbf7fe448e004ac7ae54cad0a383c3906055a75468714156a07385e96ce" |
||||||
|
const balance = "0x56BC75E2D63100000" |
||||||
|
let na = await this.call("udapp","createVMAccount",{ privateKey, balance }) |
||||||
|
console.log(na) |
||||||
|
|
||||||
|
this.on('udapp', 'newTransaction', (tx: any) => { |
||||||
|
// Do something
|
||||||
|
console.log("new transaction", tx) |
||||||
|
}) |
||||||
|
|
||||||
|
this.on("solidity","compilationFinished",function(x){ |
||||||
|
console.log("comp fin",x) |
||||||
|
}) |
||||||
|
*/ |
||||||
|
await this.setCallBacks() |
||||||
|
|
||||||
|
this.on( |
||||||
|
'solidity', |
||||||
|
'compilationFinished', |
||||||
|
function (target, source, version, data) { |
||||||
|
console.log('compile finished', target, source, version, data) |
||||||
|
} |
||||||
|
) |
||||||
|
}) |
||||||
|
.catch(async (e) => { |
||||||
|
console.log('ERROR CONNECTING', e) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
async setCallBacks () { |
||||||
|
const cmd: customAction = { |
||||||
|
id: this.name, |
||||||
|
name: 'customAction', |
||||||
|
type: ['file', 'folder'], |
||||||
|
extension: [], |
||||||
|
path: [], |
||||||
|
pattern: [] |
||||||
|
// sticky: true
|
||||||
|
} |
||||||
|
|
||||||
|
const cmd2: customAction = { |
||||||
|
id: this.name, |
||||||
|
name: 'myAction2', |
||||||
|
type: ['file', 'folder'], |
||||||
|
extension: [], |
||||||
|
path: [], |
||||||
|
pattern: [] |
||||||
|
} |
||||||
|
|
||||||
|
this.call('filePanel', 'registerContextMenuItem', cmd) |
||||||
|
this.call('filePanel', 'registerContextMenuItem', cmd2) |
||||||
|
|
||||||
|
console.log('set listeners') |
||||||
|
const me = this |
||||||
|
this.on('fileManager', 'currentFileChanged', function (x) { |
||||||
|
me.setFeedback({ |
||||||
|
event: 'currentFileChanged', |
||||||
|
result: x |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
this.on('filePanel', 'customAction', function (x) { |
||||||
|
console.log('custom ACTION', x) |
||||||
|
}) |
||||||
|
|
||||||
|
this.on('fileManager', 'fileRemoved', function (x) { |
||||||
|
me.setFeedback(`fileRemoved:${x}`) |
||||||
|
}) |
||||||
|
|
||||||
|
this.on( |
||||||
|
'solidity', |
||||||
|
'compilationFinished', |
||||||
|
function (target, source, version, data) { |
||||||
|
console.log('compile finished', target, source, version, data) |
||||||
|
} |
||||||
|
) |
||||||
|
|
||||||
|
this.on('fileManager', 'fileAdded', function (x) { |
||||||
|
console.log('added file', x) |
||||||
|
me.log(x) |
||||||
|
}) |
||||||
|
|
||||||
|
/* this.on("fileExplorers", "createWorkspace", function (x) { |
||||||
|
console.log("ws create", x); |
||||||
|
me.log(x); |
||||||
|
}); |
||||||
|
|
||||||
|
this.on("fileExplorers", "setWorkspace", function (x) { |
||||||
|
console.log("ws set", x); |
||||||
|
me.log(x); |
||||||
|
}); |
||||||
|
|
||||||
|
this.on("fileExplorers", "deleteWorkspace", function (x) { |
||||||
|
console.log("wS DELETE", x); |
||||||
|
me.log(x); |
||||||
|
}); |
||||||
|
|
||||||
|
this.on("fileExplorers", "renameWorkspace", function (x) { |
||||||
|
console.log("wS rn", x); |
||||||
|
me.log(x); |
||||||
|
}); */ |
||||||
|
} |
||||||
|
|
||||||
|
setFeedback (ob: any) { |
||||||
|
this.feedback.next(ob) |
||||||
|
console.log(ob) |
||||||
|
} |
||||||
|
|
||||||
|
async customAction (o:customAction) { |
||||||
|
console.log('custom action called', o) |
||||||
|
} |
||||||
|
|
||||||
|
async log (message: string) { |
||||||
|
// console.log(message)
|
||||||
|
this.call('terminal', 'log', { type: 'info', value: 'Name\r\nAniket' }) |
||||||
|
this.call('terminal', 'log', { type: 'html', value: '<div>test</div><ul><li>test</li></ul>' }) |
||||||
|
} |
||||||
|
|
||||||
|
async changetoinjected () { |
||||||
|
this.call('udapp', 'setEnvironmentMode', 'injected') |
||||||
|
} |
||||||
|
|
||||||
|
async test (p: string) {} |
||||||
|
|
||||||
|
async activate () { |
||||||
|
this.call('manager', 'activatePlugin', 'remixd') |
||||||
|
} |
||||||
|
|
||||||
|
async deactivate () { |
||||||
|
this.call('manager', 'deactivatePlugin', '111') |
||||||
|
} |
||||||
|
|
||||||
|
async getresult () { |
||||||
|
const r = await this.call('solidity', 'getCompilationResult') |
||||||
|
console.log('RESULT', r) |
||||||
|
} |
||||||
|
|
||||||
|
async gitbranches () { |
||||||
|
// let r = await this.call("dGitProvider","branches")
|
||||||
|
// console.log("branches", r)
|
||||||
|
} |
||||||
|
|
||||||
|
async gitbranch (dir: string) { |
||||||
|
// let r = await this.call("dGitProvider","branch",dir)
|
||||||
|
} |
||||||
|
|
||||||
|
async gitcurrentbranch () { |
||||||
|
try { |
||||||
|
const r = await this.call('dGitProvider', 'currentbranch') |
||||||
|
this.setFeedback(r) |
||||||
|
} catch (e) { |
||||||
|
this.setFeedback(e.message) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async gitcheckout (dir: string) { |
||||||
|
// let r = await this.call("dGitProvider","checkout",dir)
|
||||||
|
} |
||||||
|
|
||||||
|
async gitinit (dir: string) { |
||||||
|
// let s = await this.call("fileExplorers","getCurrentWorkspace")
|
||||||
|
// let r = await this.call("dGitProvider","init")
|
||||||
|
} |
||||||
|
|
||||||
|
async gitstatus (dir: string) { |
||||||
|
// let r = await this.call("dGitProvider","status",'HEAD')
|
||||||
|
// console.log("git status ", r)
|
||||||
|
} |
||||||
|
|
||||||
|
async gitadd (dir: string) { |
||||||
|
// let r = await this.call("dGitProvider","add",dir)
|
||||||
|
// console.log("git add ", r)
|
||||||
|
} |
||||||
|
|
||||||
|
async gitremove (dir: string) { |
||||||
|
// let r = await this.call("dGitProvider","rm",dir)
|
||||||
|
// console.log("git rm ", r)
|
||||||
|
} |
||||||
|
|
||||||
|
async gitlog () { |
||||||
|
// let r = await this.call("dGitProvider","log",'HEAD')
|
||||||
|
// console.log("git log ", r)
|
||||||
|
} |
||||||
|
|
||||||
|
async gitcommit () { |
||||||
|
// let r = await this.call("dGitProvider","commit",{})
|
||||||
|
// console.log("git log ", r)
|
||||||
|
} |
||||||
|
|
||||||
|
async gitlsfiles () { |
||||||
|
// let r = await this.call("dGitProvider","lsfiles",'HEAD')
|
||||||
|
// console.log("git log ", r)
|
||||||
|
} |
||||||
|
|
||||||
|
async gitresolveref () { |
||||||
|
// let r = await this.call("dGitProvider","resolveref",'HEAD')
|
||||||
|
// console.log("git resolve ", r)
|
||||||
|
} |
||||||
|
|
||||||
|
async gitreadblob (file: string) { |
||||||
|
// let c = await this.call("dGitProvider","log",'HEAD')
|
||||||
|
// console.log(c[c.length-1].oid)
|
||||||
|
// let r = await this.call("dGitProvider","readblob",{oid:c[c.length-1].oid, filepath:"README.txt"})
|
||||||
|
// console.log("git blob ", r)
|
||||||
|
} |
||||||
|
|
||||||
|
async ipfspush () { |
||||||
|
console.log(await this.call('dGitProvider', 'push')) |
||||||
|
} |
||||||
|
|
||||||
|
async pinatapush () { |
||||||
|
try { |
||||||
|
const r = await this.call('dGitProvider' as any, 'pin', '124def6d9115e0c2c521', '130c1a8b18fd0c77f9ee8c1614146d277c3def661506dbf1c78618325cc53c8b') |
||||||
|
console.log(r) |
||||||
|
} catch (err) { |
||||||
|
console.log(err) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async pinlist () { |
||||||
|
try { |
||||||
|
const r = await this.call('dGitProvider' as any, 'pinList', '124def6d9115e0c2c521', '130c1a8b18fd0c77f9ee8c1614146d277c3def661506dbf1c78618325cc53c8b') |
||||||
|
console.log(r) |
||||||
|
} catch (err) { |
||||||
|
console.log(err) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async ipfspull (cid: string) { |
||||||
|
try { |
||||||
|
await this.call('dGitProvider', 'pull', cid) |
||||||
|
} catch (e) {} |
||||||
|
} |
||||||
|
|
||||||
|
async ipfsConfig () { |
||||||
|
/* try{ |
||||||
|
let r = await this.call("dGitProvider", "setIpfsConfig", { |
||||||
|
host: 'localhost', |
||||||
|
port: 5002, |
||||||
|
protocol: 'http', |
||||||
|
ipfsurl: 'https://ipfsgw.komputing.org/ipfs/' |
||||||
|
}); |
||||||
|
console.log(r) |
||||||
|
}catch(e){ |
||||||
|
console.log(e) |
||||||
|
} */ |
||||||
|
} |
||||||
|
|
||||||
|
async readddir (dir: string) { |
||||||
|
try { |
||||||
|
const files = await this.call('fileManager', 'readdir', dir) |
||||||
|
this.setFeedback(files) |
||||||
|
} catch (e) { |
||||||
|
this.setFeedback(e.message) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async write (dir: string) { |
||||||
|
this.call('fileManager', 'setFile', dir, simpleContract) |
||||||
|
} |
||||||
|
|
||||||
|
async getcurrentfile () { |
||||||
|
try { |
||||||
|
const files = await this.call('fileManager', 'getCurrentFile') |
||||||
|
this.setFeedback(files) |
||||||
|
} catch (e) { |
||||||
|
this.setFeedback(e.message) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async switchfile (dir: string) { |
||||||
|
var files = await this.call('fileManager', 'switchFile', dir) |
||||||
|
} |
||||||
|
|
||||||
|
async zip () { |
||||||
|
const r = await this.call('dGitProvider', 'zip') |
||||||
|
} |
||||||
|
|
||||||
|
async fetch (dir: string) { |
||||||
|
try { |
||||||
|
var files = await fetch(dir) |
||||||
|
console.log(files) |
||||||
|
console.log(files.toString()) |
||||||
|
} catch (e) { |
||||||
|
console.error(e) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async axios (dir: string) { |
||||||
|
try { |
||||||
|
var files = await axios.get(dir) |
||||||
|
console.log(files) |
||||||
|
console.log(files.toString()) |
||||||
|
} catch (e) { |
||||||
|
console.error(e) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async getcompilerconfig () { |
||||||
|
// let config = await this.call("solidity","getCompilerConfig")
|
||||||
|
// console.log(config)
|
||||||
|
} |
||||||
|
|
||||||
|
async getWorkSpace () { |
||||||
|
try { |
||||||
|
const s = await this.call('filePanel' as any, 'getCurrentWorkspace') |
||||||
|
this.setFeedback(s) |
||||||
|
} catch (e) { |
||||||
|
this.setFeedback(e.message) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async getWorkSpaces () { |
||||||
|
// let s = await this.call("fileExplorers","getWorkspaces")
|
||||||
|
// console.log(s)
|
||||||
|
} |
||||||
|
|
||||||
|
async createWorkSpace (name: string) { |
||||||
|
try { |
||||||
|
const s = await this.call('filePanel', 'createWorkspace', name) |
||||||
|
} catch (e) { |
||||||
|
this.setFeedback(e.message) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async importcontent (dir: string) { |
||||||
|
console.log('import content') |
||||||
|
var content = await this.call( |
||||||
|
'contentImport', |
||||||
|
'resolve', |
||||||
|
'ipfs://Qmd1gr9VeQaYNA8wVDq86RwdeMZkfF93JZhhWgfCVewYtc' |
||||||
|
) |
||||||
|
console.log('content', content) |
||||||
|
} |
||||||
|
|
||||||
|
async open (dir: string) { |
||||||
|
await this.call('fileManager', 'open', dir) |
||||||
|
} |
||||||
|
|
||||||
|
async highlight (f: string) { |
||||||
|
this.call( |
||||||
|
'editor', |
||||||
|
'highlight', |
||||||
|
{ |
||||||
|
start: { |
||||||
|
line: 0, |
||||||
|
column: 1 |
||||||
|
}, |
||||||
|
end: { |
||||||
|
line: 1, |
||||||
|
column: 10 |
||||||
|
} |
||||||
|
}, |
||||||
|
f, |
||||||
|
'#ffffff' |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
async addAnnotation (f: string) { |
||||||
|
this.call('editor', 'addAnnotation', { |
||||||
|
row: 1, |
||||||
|
column: 1, |
||||||
|
text: 'annotation', |
||||||
|
type: 'error' |
||||||
|
}) |
||||||
|
this.call('editor', 'addAnnotation', { |
||||||
|
row: 10, |
||||||
|
column: 2, |
||||||
|
text: 'annotation', |
||||||
|
type: 'info' |
||||||
|
}) |
||||||
|
this.call('editor', 'addAnnotation', { |
||||||
|
row: 12, |
||||||
|
column: 1, |
||||||
|
text: 'annotation', |
||||||
|
type: 'warning' |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
async clearAnnotations (f: string) { |
||||||
|
this.call('editor', 'clearAnnotations') |
||||||
|
} |
||||||
|
|
||||||
|
async activatePlugin (f:string) { |
||||||
|
try { |
||||||
|
await this.call('manager', 'activatePlugin', f) |
||||||
|
this.setFeedback(await this.call('manager', 'isActive', f)) |
||||||
|
} catch (e) { |
||||||
|
this.setFeedback(e.message) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async deActivatePlugin (f:string) { |
||||||
|
try { |
||||||
|
await this.call('manager', 'deactivatePlugin', f) |
||||||
|
this.setFeedback(await this.call('manager', 'isActive', f)) |
||||||
|
} catch (e) { |
||||||
|
this.setFeedback(e.message) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async getSettings () { |
||||||
|
try { |
||||||
|
const settings = await this.call('udapp', 'getSettings') |
||||||
|
this.setFeedback(settings) |
||||||
|
} catch (e) { |
||||||
|
this.setFeedback(e.message) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async setSettings () { |
||||||
|
const settings = await this.call('udapp', 'setEnvironmentMode', 'injected') |
||||||
|
await this.getSettings() |
||||||
|
} |
||||||
|
|
||||||
|
async debug (hash:string) { |
||||||
|
const settings = await this.call('remixdprovider' as any, 'debug', hash) |
||||||
|
} |
||||||
|
|
||||||
|
async getAccounts () { |
||||||
|
try { |
||||||
|
const settings = await this.call('udapp', 'getAccounts') |
||||||
|
this.setFeedback(settings) |
||||||
|
} catch (e) { |
||||||
|
this.setFeedback(e.message) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async soltest () { |
||||||
|
const f = `pragma solidity >=0.4.0 <0.7.0;
|
||||||
|
|
||||||
|
contract SimpleStorage { |
||||||
|
uint storedData; |
||||||
|
|
||||||
|
// a public function named set that returns a uint goes here
|
||||||
|
function set(uint _p1) public returns (uint) { |
||||||
|
storedData = _p1; |
||||||
|
} |
||||||
|
|
||||||
|
function get() public view returns (uint) { |
||||||
|
return storedData; |
||||||
|
} |
||||||
|
} |
||||||
|
` |
||||||
|
|
||||||
|
const t = `pragma solidity >=0.4.0 <0.7.0;
|
||||||
|
import "remix_tests.sol"; // this import is automatically injected by Remix.
|
||||||
|
import "./modifyVariable.sol"; |
||||||
|
|
||||||
|
contract test3 { |
||||||
|
|
||||||
|
SimpleStorage storageToTest; |
||||||
|
function beforeAll () public { |
||||||
|
storageToTest = new SimpleStorage(); |
||||||
|
} |
||||||
|
|
||||||
|
function checkSetFunction () public { |
||||||
|
storageToTest.set(12345); |
||||||
|
Assert.equal(storageToTest.get(), uint(12345), "the contract should contain the function set"); |
||||||
|
} |
||||||
|
} |
||||||
|
` |
||||||
|
|
||||||
|
console.log(f) |
||||||
|
console.log(t) |
||||||
|
|
||||||
|
await this.call('fileManager', 'setFile', '/modifyVariable.sol', f) |
||||||
|
await this.call('fileManager', 'switchFile', '/modifyVariable.sol') |
||||||
|
await this.call('fileManager', 'setFile', '/modifyVariable_test.sol', t) |
||||||
|
const result = await this.call( |
||||||
|
'solidityUnitTesting', |
||||||
|
'testFromPath', |
||||||
|
'modifyVariable_test.sol' |
||||||
|
) |
||||||
|
return result.errors |
||||||
|
} |
||||||
|
|
||||||
|
async disableCallBacks () { |
||||||
|
this.callBackEnabled = false |
||||||
|
} |
||||||
|
|
||||||
|
async enableCallBacks () { |
||||||
|
this.callBackEnabled = true |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
import React from 'react' |
||||||
|
import { useBehaviorSubject } from './usesubscribe/index' |
||||||
|
import { client } from './app' |
||||||
|
|
||||||
|
interface loggerProps { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
export const Logger: React.FC<loggerProps> = ({}) => { |
||||||
|
const log = useBehaviorSubject(client.feedback) |
||||||
|
return (<div id='log'>{typeof log === 'string' ? log : JSON.stringify(log)}</div>) |
||||||
|
} |
@ -0,0 +1 @@ |
|||||||
|
export * from './use-observable' |
@ -0,0 +1,32 @@ |
|||||||
|
import { useState, useEffect } from 'react' |
||||||
|
import { Subscribable, BehaviorSubject, Observable, Subject } from 'rxjs' |
||||||
|
|
||||||
|
export const useSubscribable = <T>( |
||||||
|
s: Subscribable<T>, |
||||||
|
defaultValue?: T |
||||||
|
) => { |
||||||
|
const [value, setValue] = useState(defaultValue) |
||||||
|
useEffect( |
||||||
|
() => { |
||||||
|
const subscription = s.subscribe(setValue) |
||||||
|
return () => subscription.unsubscribe() |
||||||
|
}, |
||||||
|
[s] |
||||||
|
) |
||||||
|
return value |
||||||
|
} |
||||||
|
export const useRx = useSubscribable |
||||||
|
|
||||||
|
export const useObservable = <T>( |
||||||
|
o: Observable<T>, |
||||||
|
defaultValue?: T |
||||||
|
) => useSubscribable(o, defaultValue) |
||||||
|
|
||||||
|
export const useSubject = <T>( |
||||||
|
s: Subject<T>, |
||||||
|
defaultValue?: T |
||||||
|
) => useSubscribable(s, defaultValue) |
||||||
|
|
||||||
|
export const useBehaviorSubject = <T>( |
||||||
|
s: BehaviorSubject<T> |
||||||
|
) => useSubscribable(s, s.value) |
@ -0,0 +1,125 @@ |
|||||||
|
import { Selector, RequestLogger, Role } from 'testcafe' |
||||||
|
import { Profile, LocationProfile, ExternalProfile } from '@remixproject/plugin-utils' |
||||||
|
|
||||||
|
const logger = RequestLogger() |
||||||
|
|
||||||
|
const role = Role(process.env.TEST_URL || 'http://localhost:8080', async t => { |
||||||
|
|
||||||
|
}) |
||||||
|
|
||||||
|
fixture`DGIT production tests` |
||||||
|
.page(process.env.TEST_URL || 'http://localhost:8080') |
||||||
|
.beforeEach(async t => { |
||||||
|
|
||||||
|
}) |
||||||
|
const openPlugin = async (t: TestController, plugin: string) => { |
||||||
|
await t.click(`#icon-panel div[plugin="${plugin}"]`) |
||||||
|
} |
||||||
|
|
||||||
|
interface dataIdSelectorInterface extends Selector { |
||||||
|
select(id: string): Promise<any> |
||||||
|
} |
||||||
|
|
||||||
|
const dataIdSelector = async (id:string) => { return Selector(`[data-id="${id}"]`) } |
||||||
|
|
||||||
|
const installPlugin = async (t: TestController, profile: Profile & LocationProfile & ExternalProfile) => { |
||||||
|
await t.click('*[plugin="pluginManager"]') |
||||||
|
.click('*[data-id="pluginManagerComponentPluginSearchButton') |
||||||
|
// cy.get(`*[data-id="pluginManagerLocalPluginModalDialogModalDialogModalTitle-react`).should('be.visible')
|
||||||
|
.typeText('*[data-id="localPluginName', profile.name) |
||||||
|
.typeText('*[data-id="localPluginDisplayName', profile.displayName) |
||||||
|
.typeText('*[data-id="localPluginUrl', profile.url) |
||||||
|
.typeText('*[data-id="localPluginCanActivate', profile.canActivate && profile.canActivate.join(',')) |
||||||
|
.click('*[data-id="pluginManagerLocalPluginModalDialog-modal-footer-ok-react"').click('*[plugin="pluginManager"]') |
||||||
|
} |
||||||
|
|
||||||
|
const expectLogMessage = async (t: TestController, msg: any) => { |
||||||
|
if (typeof msg !== 'string') msg = JSON.stringify(msg) |
||||||
|
const message = await Selector('#log').textContent |
||||||
|
console.log(message) |
||||||
|
await t.expect(message.includes(msg)).ok() |
||||||
|
} |
||||||
|
|
||||||
|
const localPluginData = { |
||||||
|
name: 'localplugin', |
||||||
|
displayName: 'localplugin', |
||||||
|
location: 'sidePanel', |
||||||
|
url: 'http://localhost:2020', |
||||||
|
canActivate: [ |
||||||
|
'dGitProvider,flattener' |
||||||
|
] |
||||||
|
} |
||||||
|
|
||||||
|
test('install plugin', async t => { |
||||||
|
// exists doesn't wait with timeouts, this is a hack but it works, it will wait for buttons to appear
|
||||||
|
// https://testcafe.io/documentation/402829/guides/basic-guides/select-page-elements#selector-timeout
|
||||||
|
await Selector('Button', { timeout: 120000 }).innerText |
||||||
|
if (await Selector('Button').withText('Sure').exists) { |
||||||
|
await t.click(Selector('Button').withText('Sure')) |
||||||
|
} |
||||||
|
await t.click('.introjs-skipbutton') |
||||||
|
await installPlugin(t, localPluginData) |
||||||
|
}) |
||||||
|
|
||||||
|
test.disablePageReloads('switch to plugin', async t => { |
||||||
|
await t |
||||||
|
.click('#verticalIconsKindpluginManager') |
||||||
|
// .click('[data-id="pluginManagerComponentActivateButtondgittest"]')
|
||||||
|
.click('[data-id="verticalIconsKindlocalplugin"]') |
||||||
|
.switchToIframe('#plugin-localplugin') |
||||||
|
}) |
||||||
|
|
||||||
|
test.disablePageReloads('not be able to get current file', async t => { |
||||||
|
await t |
||||||
|
.click(Selector('Button').withText('getcurrentfile')) |
||||||
|
await expectLogMessage(t, 'Error from IDE : Error: No such file or directory No file selected') |
||||||
|
}) |
||||||
|
|
||||||
|
test.disablePageReloads('be able to get current file', async t => { |
||||||
|
await t |
||||||
|
.switchToMainWindow() |
||||||
|
|
||||||
|
await openPlugin(t, 'filePanel') |
||||||
|
await t.click(await dataIdSelector('treeViewLitreeViewItemREADME.txt')) |
||||||
|
await openPlugin(t, localPluginData.name) |
||||||
|
await t.switchToIframe('#plugin-localplugin') |
||||||
|
.click(Selector('Button') |
||||||
|
.withText('getcurrentfile')) |
||||||
|
|
||||||
|
await expectLogMessage(t, 'README.txt') |
||||||
|
}) |
||||||
|
|
||||||
|
test.disablePageReloads('gets the current workspace', async t => { |
||||||
|
await t.click(Selector('Button') |
||||||
|
.withText('get workspace')) |
||||||
|
await expectLogMessage(t, { name: 'default_workspace', isLocalhost: false, absolutePath: '.workspaces/default_workspace' }) |
||||||
|
}) |
||||||
|
|
||||||
|
test.disablePageReloads('creates a workspace', async t => { |
||||||
|
await t.typeText('#payload', 'testing') |
||||||
|
.click(Selector('Button') |
||||||
|
.withText('create workspace')).wait(2000).click(Selector('Button') |
||||||
|
.withText('get workspace')) |
||||||
|
await expectLogMessage(t, { name: 'testing', isLocalhost: false, absolutePath: '.workspaces/testing' }) |
||||||
|
}) |
||||||
|
|
||||||
|
test.disablePageReloads('get file list', async t => { |
||||||
|
await t.typeText('#payload', '/', { replace: true }) |
||||||
|
.click(Selector('Button') |
||||||
|
.withText('readdir')) |
||||||
|
await expectLogMessage(t, { contracts: { isDirectory: true }, scripts: { isDirectory: true }, tests: { isDirectory: true }, 'README.txt': { isDirectory: false } }) |
||||||
|
}) |
||||||
|
|
||||||
|
test.disablePageReloads('open a file', async t => { |
||||||
|
const file = 'contracts/2_Owner.sol' |
||||||
|
await t.typeText('#payload', file, { replace: true }) |
||||||
|
.click(Selector('Button') |
||||||
|
.withText('openfile')) |
||||||
|
|
||||||
|
await expectLogMessage(t, { event: 'currentFileChanged', result: file }) |
||||||
|
|
||||||
|
await t.click(Selector('Button') |
||||||
|
.withText('getcurrentfile')) |
||||||
|
|
||||||
|
await expectLogMessage(t, file) |
||||||
|
}) |
@ -0,0 +1,20 @@ |
|||||||
|
#!/usr/bin/env bash |
||||||
|
|
||||||
|
set -e |
||||||
|
|
||||||
|
BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} |
||||||
|
echo "$BUILD_ID" |
||||||
|
TEST_EXITCODE=0 |
||||||
|
|
||||||
|
npm run serve & |
||||||
|
npx nx serve remix-ide-e2e-src-local-plugin & |
||||||
|
|
||||||
|
sleep 5 |
||||||
|
|
||||||
|
npm run testcafe_local_pluginApi || TEST_EXITCODE=1 |
||||||
|
|
||||||
|
echo "$TEST_EXITCODE" |
||||||
|
if [ "$TEST_EXITCODE" -eq 1 ] |
||||||
|
then |
||||||
|
exit 1 |
||||||
|
fi |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue