mirror of https://github.com/embarklabs/embark.git
fix(@embark/tests): Tests exiting early
Tests were exiting early and Mocha was reporting an exit code of 0. This allowed CI to complete as if the tests were successful. Change `compiler:contracts` event request to `compiler:contracts:compile` and update documentation. Because the `compiler:contracts` event didn’t exist, this test was silently failing. Update the `TestEvents` mock object to allow passing of parameters to an event that is not a callback. Add unit tests to test for contracts loaded via node_modules. 1. This PR contains a change where any contracts loaded from node_modules will be imported in to `.embark/contracts/node_modules`. Previously, these contracts were loaded in to `.embark/node_modules` (with the `/contracts`).
This commit is contained in:
parent
ad26533f4a
commit
acd1d72f2d
|
@ -170,8 +170,9 @@ export function getExternalContractUrl(file: string, providerUrl: string) {
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const match = url.match(
|
const urlToMatch = providerUrl && providerUrl.includes("localhost") ? url.replace(providerUrl, "") : url;
|
||||||
/\.[a-z]+\/([-a-zA-Z0-9@:%_+.~#?&\/=]+)/,
|
const match = urlToMatch.match(
|
||||||
|
/(?:\.[a-z]+|localhost:[0-9]+)\/([-a-zA-Z0-9@:%_+.~#?&\/=]+)/,
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
filePath: HTTP_CONTRACTS_DIRECTORY + (match !== null ? match[1] : ''),
|
filePath: HTTP_CONTRACTS_DIRECTORY + (match !== null ? match[1] : ''),
|
||||||
|
|
|
@ -72,7 +72,7 @@ const buildNewFile = (file: File, importPath: string) => {
|
||||||
// imported from node_modules, ie import "@aragon/os/contracts/acl/ACL.sol"
|
// imported from node_modules, ie import "@aragon/os/contracts/acl/ACL.sol"
|
||||||
if (isUnresolvedNodeModule(importPath)) {
|
if (isUnresolvedNodeModule(importPath)) {
|
||||||
from = resolve(importPath);
|
from = resolve(importPath);
|
||||||
to = importPath.includes(dappPath(".embark")) ? importPath : dappPath(".embark", "node_modules", importPath);
|
to = importPath.includes(dappPath(".embark")) ? importPath : dappPath(".embark", "contracts", "node_modules", importPath);
|
||||||
if (from !== to) {
|
if (from !== to) {
|
||||||
fs.copySync(from, to);
|
fs.copySync(from, to);
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,6 +182,7 @@
|
||||||
"embark-solo": "^5.0.0-alpha.2",
|
"embark-solo": "^5.0.0-alpha.2",
|
||||||
"embark-test-contract-0": "0.0.2",
|
"embark-test-contract-0": "0.0.2",
|
||||||
"embark-test-contract-1": "0.0.1",
|
"embark-test-contract-1": "0.0.1",
|
||||||
|
"embark-testing": "^5.0.0-alpha.1",
|
||||||
"eslint": "5.7.0",
|
"eslint": "5.7.0",
|
||||||
"npm-run-all": "4.1.5",
|
"npm-run-all": "4.1.5",
|
||||||
"nyc": "13.1.0",
|
"nyc": "13.1.0",
|
||||||
|
|
|
@ -19,6 +19,9 @@ describe('embark.Config', function () {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"client": "geth",
|
"client": "geth",
|
||||||
"proxy": true,
|
"proxy": true,
|
||||||
|
"clientConfig": {
|
||||||
|
"miningMode": "dev"
|
||||||
|
},
|
||||||
"datadir": ".embark/myenv/datadir",
|
"datadir": ".embark/myenv/datadir",
|
||||||
"rpcHost": "localhost",
|
"rpcHost": "localhost",
|
||||||
"rpcPort": 8545,
|
"rpcPort": 8545,
|
||||||
|
@ -53,6 +56,9 @@ describe('embark.Config', function () {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"client": "geth",
|
"client": "geth",
|
||||||
"proxy": true,
|
"proxy": true,
|
||||||
|
"clientConfig": {
|
||||||
|
"miningMode": "dev"
|
||||||
|
},
|
||||||
"datadir": ".embark/unitenv/datadir",
|
"datadir": ".embark/unitenv/datadir",
|
||||||
"rpcHost": "localhost",
|
"rpcHost": "localhost",
|
||||||
"rpcPort": 8545,
|
"rpcPort": 8545,
|
||||||
|
@ -103,6 +109,9 @@ describe('embark.Config', function () {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"client": "geth",
|
"client": "geth",
|
||||||
"proxy": true,
|
"proxy": true,
|
||||||
|
"clientConfig": {
|
||||||
|
"miningMode": "dev"
|
||||||
|
},
|
||||||
"datadir": ".embark/unitlessenv/datadir",
|
"datadir": ".embark/unitlessenv/datadir",
|
||||||
"rpcHost": "localhost",
|
"rpcHost": "localhost",
|
||||||
"rpcPort": 8545,
|
"rpcPort": 8545,
|
||||||
|
@ -153,6 +162,9 @@ describe('embark.Config', function () {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"client": "geth",
|
"client": "geth",
|
||||||
"proxy": true,
|
"proxy": true,
|
||||||
|
"clientConfig": {
|
||||||
|
"miningMode": "dev"
|
||||||
|
},
|
||||||
"datadir": ".embark/extNetwork/datadir",
|
"datadir": ".embark/extNetwork/datadir",
|
||||||
"rpcHost": "localhost",
|
"rpcHost": "localhost",
|
||||||
"rpcPort": 8545,
|
"rpcPort": 8545,
|
||||||
|
@ -172,7 +184,6 @@ describe('embark.Config', function () {
|
||||||
"nodiscover": true,
|
"nodiscover": true,
|
||||||
"maxpeers": 0,
|
"maxpeers": 0,
|
||||||
"simulatorBlocktime": 0,
|
"simulatorBlocktime": 0,
|
||||||
"miningMode": "dev",
|
|
||||||
"targetGasLimit": 8000000,
|
"targetGasLimit": 8000000,
|
||||||
"endpoint": "http://mynetwork.com"
|
"endpoint": "http://mynetwork.com"
|
||||||
};
|
};
|
||||||
|
@ -195,7 +206,7 @@ describe('embark.Config', function () {
|
||||||
config.loadContractsConfigFile();
|
config.loadContractsConfigFile();
|
||||||
let expectedConfig = {
|
let expectedConfig = {
|
||||||
versions: {solc: '0.5.0'},
|
versions: {solc: '0.5.0'},
|
||||||
dappConnection: ['$WEB3', 'localhost:8545'],
|
dappConnection: ['$WEB3', 'ws://localhost:8546', 'localhost:8545'],
|
||||||
dappAutoEnable: true,
|
dappAutoEnable: true,
|
||||||
"gas": "400000",
|
"gas": "400000",
|
||||||
"strategy": "implicit",
|
"strategy": "implicit",
|
||||||
|
@ -217,7 +228,7 @@ describe('embark.Config', function () {
|
||||||
it('should replace occurrences of `0x0` with full zero addresses', () => {
|
it('should replace occurrences of `0x0` with full zero addresses', () => {
|
||||||
let expectedConfig = {
|
let expectedConfig = {
|
||||||
versions: {solc: '0.5.0'},
|
versions: {solc: '0.5.0'},
|
||||||
dappConnection: ['$WEB3', 'localhost:8545'],
|
dappConnection: ['$WEB3', 'ws://localhost:8546', 'localhost:8545'],
|
||||||
dappAutoEnable: true,
|
dappAutoEnable: true,
|
||||||
"gas": "auto",
|
"gas": "auto",
|
||||||
"strategy": "implicit",
|
"strategy": "implicit",
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,7 +1,5 @@
|
||||||
pragma solidity ^0.5.0;
|
pragma solidity ^0.5.0;
|
||||||
|
|
||||||
import "embark-test-contract-0/recursive_test_3.sol";
|
|
||||||
|
|
||||||
contract SimpleStorageRecursive2 {
|
contract SimpleStorageRecursive2 {
|
||||||
uint public storedData;
|
uint public storedData;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
pragma solidity ^0.5.0;
|
||||||
|
|
||||||
|
import "embark-test-contract-0/recursive_test_3.sol";
|
||||||
|
|
||||||
|
contract SimpleStorageRecursiveNodeModules {
|
||||||
|
uint public storedData;
|
||||||
|
|
||||||
|
constructor(uint initialValue) public {
|
||||||
|
storedData = initialValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
function set(uint x) public {
|
||||||
|
storedData = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
function get() public view returns (uint retVal) {
|
||||||
|
return storedData;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,21 +1,32 @@
|
||||||
/*globals describe, it*/
|
/*globals describe, it, before*/
|
||||||
const { dappPath, File, joinPath, setUpEnv, Types } = require('embark-utils');
|
const { dappPath, File, joinPath, setUpEnv, Types } = require('embark-utils');
|
||||||
const { expect } = require("chai");
|
const { expect } = require("chai");
|
||||||
const fs = require("fs-extra");
|
const fs = require("fs-extra");
|
||||||
|
const { HttpMockServer } = require("embark-testing");
|
||||||
|
|
||||||
setUpEnv(joinPath(__dirname, '../../'));
|
setUpEnv(joinPath(__dirname, '../../'));
|
||||||
|
|
||||||
|
let connectionString;
|
||||||
|
|
||||||
describe('embark.File', function () {
|
describe('embark.File', function () {
|
||||||
describe('Read file contents', function () {
|
describe('Read file contents', function () {
|
||||||
|
before('set up mock HTTP server', async () => {
|
||||||
|
const server = new HttpMockServer.default();
|
||||||
|
connectionString = await server.init();
|
||||||
|
server.addRoute({
|
||||||
|
path: "/simple_storage.sol",
|
||||||
|
result: "great success!"
|
||||||
|
});
|
||||||
|
});
|
||||||
it('should be able to download a file when type is "http"', async () => {
|
it('should be able to download a file when type is "http"', async () => {
|
||||||
const file = new File({externalUrl: 'https://raw.githubusercontent.com/embark-framework/embark/master/dapps/tests/app/app/contracts/simple_storage.sol', type: Types.http});
|
const file = new File({ externalUrl: `${connectionString}/simple_storage.sol`, type: Types.http });
|
||||||
const content = await file.content;
|
const content = await file.content;
|
||||||
|
|
||||||
expect(content).to.be.ok; //eslint-disable-line
|
expect(content).to.equal("great success!"); //eslint-disable-line
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to read a file when type is "dappFile"', async () => {
|
it('should be able to read a file when type is "dappFile"', async () => {
|
||||||
const file = new File({path: dappPath('contracts/recursive_test_0.sol'), type: Types.dappFile});
|
const file = new File({ path: dappPath('contracts/recursive_test_0.sol'), type: Types.dappFile });
|
||||||
const content = await file.content;
|
const content = await file.content;
|
||||||
|
|
||||||
const contentFromFileSystem = fs.readFileSync(dappPath("contracts/recursive_test_0.sol")).toString();
|
const contentFromFileSystem = fs.readFileSync(dappPath("contracts/recursive_test_0.sol")).toString();
|
||||||
|
@ -23,14 +34,16 @@ describe('embark.File', function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to execute a resolver when type is "custom"', async () => {
|
it('should be able to execute a resolver when type is "custom"', async () => {
|
||||||
const file = new File({path: dappPath('contracts/recursive_test_0.sol'), type: Types.custom, resolver: (callback) => {
|
const file = new File({
|
||||||
|
path: dappPath('contracts/recursive_test_0.sol'), type: Types.custom, resolver: (callback) => {
|
||||||
callback("test");
|
callback("test");
|
||||||
}});
|
}
|
||||||
|
});
|
||||||
expect(await file.content).to.equal("test");
|
expect(await file.content).to.equal("test");
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to read a file when type is "embarkInternal"', async () => {
|
it('should be able to read a file when type is "embarkInternal"', async () => {
|
||||||
const file = new File({path: 'test/contracts/recursive_test_0.sol', type: Types.embarkInternal});
|
const file = new File({ path: 'test/contracts/recursive_test_0.sol', type: Types.embarkInternal });
|
||||||
const content = await file.content;
|
const content = await file.content;
|
||||||
|
|
||||||
const contentFromFileSystem = fs.readFileSync(dappPath("contracts/recursive_test_0.sol")).toString();
|
const contentFromFileSystem = fs.readFileSync(dappPath("contracts/recursive_test_0.sol")).toString();
|
||||||
|
|
|
@ -59,7 +59,7 @@ describe('embark.Compiler', function() {
|
||||||
const compiler = new Compiler(embarkObject, {plugins: plugins});
|
const compiler = new Compiler(embarkObject, {plugins: plugins});
|
||||||
|
|
||||||
it("should return aggregated result", (done) => {
|
it("should return aggregated result", (done) => {
|
||||||
events.request("compiler:contracts", [
|
events.request("compiler:contracts:compile", [
|
||||||
readFile('contracts/simple_storage.sol'),
|
readFile('contracts/simple_storage.sol'),
|
||||||
readFile('contracts/token.sol'),
|
readFile('contracts/token.sol'),
|
||||||
readFile('contracts/erc20.vy')
|
readFile('contracts/erc20.vy')
|
||||||
|
|
|
@ -1,15 +1,82 @@
|
||||||
/*globals describe, it, before*/
|
/*globals describe, it, before*/
|
||||||
const { dappPath, File, Types, prepareForCompilation } = require('embark-utils');
|
const { dappPath, File, Types, prepareForCompilation } = require('embark-utils');
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const {expect} = require("chai");
|
const { expect } = require("chai");
|
||||||
const fsNode = require("fs");
|
const fsNode = require("fs");
|
||||||
|
const { HttpMockServer } = require("embark-testing");
|
||||||
|
|
||||||
let file, content;
|
let file, content, connectionString;
|
||||||
|
const routes = [
|
||||||
|
{
|
||||||
|
path: "/recursive_test_0.sol",
|
||||||
|
result: `pragma solidity ^0.5.0;
|
||||||
|
|
||||||
|
import "./recursive_test_1.sol";
|
||||||
|
|
||||||
|
contract SimpleStorageRecursive0 {
|
||||||
|
uint public storedData;
|
||||||
|
|
||||||
|
constructor (uint initialValue) public {
|
||||||
|
storedData = initialValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
function set(uint x) public {
|
||||||
|
storedData = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
function get() public view returns (uint retVal) {
|
||||||
|
return storedData;
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/recursive_test_1.sol",
|
||||||
|
result: `pragma solidity ^0.5.0;
|
||||||
|
|
||||||
|
import "./recursive_test_2.sol";
|
||||||
|
|
||||||
|
contract SimpleStorageRecursive1 {
|
||||||
|
uint public storedData;
|
||||||
|
|
||||||
|
constructor(uint initialValue) public {
|
||||||
|
storedData = initialValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
function set(uint x) public {
|
||||||
|
storedData = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
function get() public view returns (uint retVal) {
|
||||||
|
return storedData;
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/recursive_test_2.sol",
|
||||||
|
result: `pragma solidity ^0.5.0;
|
||||||
|
|
||||||
|
contract SimpleStorageRecursive2 {
|
||||||
|
uint public storedData;
|
||||||
|
|
||||||
|
constructor(uint initialValue) public {
|
||||||
|
storedData = initialValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
function set(uint x) public {
|
||||||
|
storedData = x;
|
||||||
|
}
|
||||||
|
|
||||||
|
function get() public view returns (uint retVal) {
|
||||||
|
return storedData;
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
describe('embark.RemapImports', function () {
|
describe('embark.RemapImports', function () {
|
||||||
describe('Import remappings from local file', function () {
|
describe('Import remappings from local file', function () {
|
||||||
before('do the remappings', async () => {
|
before('do the remappings', async () => {
|
||||||
file = new File({path: 'contracts/recursive_test_0.sol', type: Types.dappFile});
|
file = new File({ path: 'contracts/recursive_test_0.sol', type: Types.dappFile });
|
||||||
content = await prepareForCompilation(file);
|
content = await prepareForCompilation(file);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -22,14 +89,6 @@ describe('embark.RemapImports', function () {
|
||||||
prefix: "./recursive_test_2.sol",
|
prefix: "./recursive_test_2.sol",
|
||||||
target: path.normalize(dappPath(".embark/contracts/recursive_test_2.sol"))
|
target: path.normalize(dappPath(".embark/contracts/recursive_test_2.sol"))
|
||||||
});
|
});
|
||||||
expect(file.importRemappings[2]).to.deep.equal({
|
|
||||||
prefix: "embark-test-contract-0/recursive_test_3.sol",
|
|
||||||
target: path.normalize(dappPath(".embark/node_modules/embark-test-contract-0/recursive_test_3.sol"))
|
|
||||||
});
|
|
||||||
expect(file.importRemappings[3]).to.deep.equal({
|
|
||||||
prefix: "embark-test-contract-1/recursive_test_4.sol",
|
|
||||||
target: path.normalize(dappPath(".embark/node_modules/embark-test-contract-1/recursive_test_4.sol"))
|
|
||||||
});
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -45,14 +104,6 @@ describe('embark.RemapImports', function () {
|
||||||
expect(contractFromFilesystem).to.not.contain("./recursive_test_2.sol");
|
expect(contractFromFilesystem).to.not.contain("./recursive_test_2.sol");
|
||||||
expect(contractFromFilesystem).to.contain(path.normalize(".embark/contracts/recursive_test_2.sol").replace(/\\/g, "/"));
|
expect(contractFromFilesystem).to.contain(path.normalize(".embark/contracts/recursive_test_2.sol").replace(/\\/g, "/"));
|
||||||
|
|
||||||
contractFromFilesystem = fsNode.readFileSync(dappPath(".embark/contracts/recursive_test_2.sol")).toString();
|
|
||||||
expect(contractFromFilesystem).to.not.contain("import \"embark-test-contract-0/recursive_test_3.sol\"");
|
|
||||||
expect(contractFromFilesystem).to.contain(`import "${path.normalize(dappPath(".embark/node_modules/embark-test-contract-0/recursive_test_3.sol")).replace(/\\/g, "/")}"`);
|
|
||||||
|
|
||||||
contractFromFilesystem = fsNode.readFileSync(dappPath(".embark/node_modules/embark-test-contract-0/recursive_test_3.sol")).toString();
|
|
||||||
expect(contractFromFilesystem).to.not.contain("import \"embark-test-contract-1/recursive_test_4.sol\"");
|
|
||||||
expect(contractFromFilesystem).to.contain(`import "${path.normalize(dappPath(".embark/node_modules/embark-test-contract-1/recursive_test_4.sol")).replace(/\\/g, "/")}"`);
|
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -60,41 +111,72 @@ describe('embark.RemapImports', function () {
|
||||||
|
|
||||||
describe('Import remappings from external URL', function () {
|
describe('Import remappings from external URL', function () {
|
||||||
before('do the external HTTP contract remappings', async () => {
|
before('do the external HTTP contract remappings', async () => {
|
||||||
file = new File({externalUrl: 'https://github.com/embark-framework/embark/master/packages/embark/src/test/contracts/recursive_test_0.sol', type: Types.http});
|
const server = new HttpMockServer.default();
|
||||||
|
connectionString = await server.init();
|
||||||
|
routes.forEach(route => {
|
||||||
|
server.addRoute(route);
|
||||||
|
});
|
||||||
|
file = new File({ externalUrl: `${connectionString}/recursive_test_0.sol`, type: Types.http });
|
||||||
content = await prepareForCompilation(file);
|
content = await prepareForCompilation(file);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should find and add remappings for all recursive imports", (done) => {
|
it("should find and add remappings for all recursive imports", (done) => {
|
||||||
expect(file.importRemappings[0]).to.deep.equal({
|
expect(file.importRemappings[0]).to.deep.equal({
|
||||||
prefix: "./recursive_test_1.sol",
|
prefix: "./recursive_test_1.sol",
|
||||||
target: path.normalize(dappPath(".embark/contracts/embark-framework/embark/master/packages/embark/src/test/contracts/recursive_test_1.sol"))
|
target: path.normalize(dappPath(".embark/contracts/recursive_test_1.sol"))
|
||||||
});
|
});
|
||||||
expect(file.importRemappings[1]).to.deep.equal({
|
expect(file.importRemappings[1]).to.deep.equal({
|
||||||
prefix: "./recursive_test_2.sol",
|
prefix: "./recursive_test_2.sol",
|
||||||
target: path.normalize(dappPath(".embark/contracts/embark-framework/embark/master/packages/embark/src/test/contracts/recursive_test_2.sol"))
|
target: path.normalize(dappPath(".embark/contracts/recursive_test_2.sol"))
|
||||||
});
|
|
||||||
expect(file.importRemappings[2]).to.deep.equal({
|
|
||||||
prefix: "embark-test-contract-0/recursive_test_3.sol",
|
|
||||||
target: path.normalize(dappPath(".embark/contracts/embark-framework/embark/master/packages/embark/src/test/contracts/embark-test-contract-0/recursive_test_3.sol"))
|
|
||||||
});
|
});
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should update the contract content to use the remapped imports", function (done) {
|
it("should update the contract content to use the remapped imports", function (done) {
|
||||||
expect(content).to.not.contain("./recursive_test_1.sol");
|
expect(content).to.not.contain("./recursive_test_1.sol");
|
||||||
expect(content).to.contain(path.normalize(".embark/contracts/embark-framework/embark/master/packages/embark/src/test/contracts/recursive_test_1.sol").replace(/\\/g, "/"));
|
expect(content).to.contain(path.normalize(".embark/contracts/recursive_test_1.sol").replace(/\\/g, "/"));
|
||||||
|
|
||||||
let contractFromFilesystem = fsNode.readFileSync(dappPath(".embark/contracts/embark-framework/embark/master/packages/embark/src/test/contracts/recursive_test_0.sol")).toString();
|
let contractFromFilesystem = fsNode.readFileSync(dappPath(".embark/contracts/recursive_test_0.sol")).toString();
|
||||||
expect(contractFromFilesystem).to.not.contain("./recursive_test_1.sol");
|
expect(contractFromFilesystem).to.not.contain("./recursive_test_1.sol");
|
||||||
expect(contractFromFilesystem).to.contain(path.normalize(".embark/contracts/embark-framework/embark/master/packages/embark/src/test/contracts/recursive_test_1.sol").replace(/\\/g, "/"));
|
expect(contractFromFilesystem).to.contain(path.normalize(".embark/contracts/recursive_test_1.sol").replace(/\\/g, "/"));
|
||||||
|
|
||||||
contractFromFilesystem = fsNode.readFileSync(dappPath(".embark/contracts/embark-framework/embark/master/packages/embark/src/test/contracts/recursive_test_1.sol")).toString();
|
contractFromFilesystem = fsNode.readFileSync(dappPath(".embark/contracts/recursive_test_1.sol")).toString();
|
||||||
expect(contractFromFilesystem).to.not.contain("./recursive_test_2.sol");
|
expect(contractFromFilesystem).to.not.contain("./recursive_test_2.sol");
|
||||||
expect(contractFromFilesystem).to.contain(path.normalize(".embark/contracts/embark-framework/embark/master/packages/embark/src/test/contracts/recursive_test_2.sol").replace(/\\/g, "/"));
|
expect(contractFromFilesystem).to.contain(path.normalize(".embark/contracts/recursive_test_2.sol").replace(/\\/g, "/"));
|
||||||
|
|
||||||
contractFromFilesystem = fsNode.readFileSync(dappPath(".embark/contracts/embark-framework/embark/master/packages/embark/src/test/contracts/recursive_test_2.sol")).toString();
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Import remappings from node_modules', function () {
|
||||||
|
before('do the node_modules contract remappings', async () => {
|
||||||
|
file = new File({ path: 'contracts/recursive_test_node_modules.sol', type: Types.dappFile });
|
||||||
|
content = await prepareForCompilation(file);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should find and add remappings for all recursive imports", (done) => {
|
||||||
|
expect(file.importRemappings[0]).to.deep.equal({
|
||||||
|
prefix: "embark-test-contract-0/recursive_test_3.sol",
|
||||||
|
target: path.normalize(dappPath(".embark/contracts/node_modules/embark-test-contract-0/recursive_test_3.sol"))
|
||||||
|
});
|
||||||
|
expect(file.importRemappings[1]).to.deep.equal({
|
||||||
|
prefix: "embark-test-contract-1/recursive_test_4.sol",
|
||||||
|
target: path.normalize(dappPath(".embark/contracts/node_modules/embark-test-contract-1/recursive_test_4.sol"))
|
||||||
|
});
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should update the contract content to use the remapped imports", function (done) {
|
||||||
|
expect(content).to.not.contain("./embark-test-contract-0/recursive_test_3.sol");
|
||||||
|
expect(content).to.contain(path.normalize(".embark/contracts/node_modules/embark-test-contract-0/recursive_test_3.sol").replace(/\\/g, "/"));
|
||||||
|
|
||||||
|
let contractFromFilesystem = fsNode.readFileSync(dappPath(".embark/contracts/recursive_test_node_modules.sol")).toString();
|
||||||
expect(contractFromFilesystem).to.not.contain("import \"embark-test-contract-0/recursive_test_3.sol\"");
|
expect(contractFromFilesystem).to.not.contain("import \"embark-test-contract-0/recursive_test_3.sol\"");
|
||||||
expect(contractFromFilesystem).to.contain(`import "${path.normalize(dappPath(".embark/contracts/embark-framework/embark/master/packages/embark/src/test/contracts/embark-test-contract-0/recursive_test_3.sol")).replace(/\\/g, "/")}"`);
|
expect(contractFromFilesystem).to.contain(`import "${path.normalize(dappPath(".embark/contracts/node_modules/embark-test-contract-0/recursive_test_3.sol")).replace(/\\/g, "/")}"`);
|
||||||
|
|
||||||
|
contractFromFilesystem = fsNode.readFileSync(dappPath(".embark/contracts/node_modules/embark-test-contract-0/recursive_test_3.sol")).toString();
|
||||||
|
expect(contractFromFilesystem).to.not.contain("import \"embark-test-contract-1/recursive_test_4.sol\"");
|
||||||
|
expect(contractFromFilesystem).to.contain(`import "${path.normalize(dappPath(".embark/contracts/node_modules/embark-test-contract-1/recursive_test_4.sol")).replace(/\\/g, "/")}"`);
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
|
@ -16,7 +16,9 @@ let generateApiObject = function() {
|
||||||
|
|
||||||
var TestEvents = {
|
var TestEvents = {
|
||||||
request: (cmd, cb) => {
|
request: (cmd, cb) => {
|
||||||
|
if (typeof cb === "function") {
|
||||||
cb(solcVersion);
|
cb(solcVersion);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
emit: (_ev, _data) => {}
|
emit: (_ev, _data) => {}
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,14 +2,16 @@
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const sinon = require('sinon');
|
const sinon = require('sinon');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
import { ProcessLauncher, TestLogger } from 'embark-core';
|
import { ProcessLauncher, TestLogger, Events } from 'embark-core';
|
||||||
|
|
||||||
let logger = new TestLogger({});
|
let logger = new TestLogger({});
|
||||||
|
|
||||||
|
const events = new Events();
|
||||||
|
|
||||||
let embarkObj = {
|
let embarkObj = {
|
||||||
logger: logger,
|
logger: logger,
|
||||||
registerAPICall: () => {}
|
registerAPICall: () => {}
|
||||||
}
|
};
|
||||||
|
|
||||||
describe('ProcessWrapper', () => {
|
describe('ProcessWrapper', () => {
|
||||||
let processLauncher;
|
let processLauncher;
|
||||||
|
@ -19,7 +21,8 @@ describe('ProcessWrapper', () => {
|
||||||
processLauncher = new ProcessLauncher({
|
processLauncher = new ProcessLauncher({
|
||||||
embark: embarkObj,
|
embark: embarkObj,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
modulePath: path.join(__dirname, 'test.js')
|
modulePath: path.join(__dirname, 'test.js'),
|
||||||
|
events
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ returns the aggregated compilation result.
|
||||||
|
|
||||||
## API
|
## API
|
||||||
|
|
||||||
**command: `compiler:contracts`**
|
**command: `compiler:contracts:compile`**
|
||||||
|
|
||||||
arguments:
|
arguments:
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ example:
|
||||||
import { File } from 'src/lib/core/file.js';
|
import { File } from 'src/lib/core/file.js';
|
||||||
const contractFiles = [(new File({path: "simplestorage.sol", type: "custom", resolver: (cb) => { return cb(".. contract code...") }}))];
|
const contractFiles = [(new File({path: "simplestorage.sol", type: "custom", resolver: (cb) => { return cb(".. contract code...") }}))];
|
||||||
|
|
||||||
embark.events.request("compiler:contracts", contractFiles, {}, (err, compiledObject) => {
|
embark.events.request("compiler:contracts:compile", contractFiles, {}, (err, compiledObject) => {
|
||||||
})
|
})
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
|
@ -31,17 +31,23 @@
|
||||||
"_build": "npm run solo -- build",
|
"_build": "npm run solo -- build",
|
||||||
"ci": "npm run qa",
|
"ci": "npm run qa",
|
||||||
"clean": "npm run reset",
|
"clean": "npm run reset",
|
||||||
"lint": "eslint src/",
|
"lint": "npm-run-all lint:*",
|
||||||
"qa": "npm-run-all lint _build",
|
"lint:js": "eslint src/",
|
||||||
|
"lint:ts": "tslint -c tslint.json \"src/**/*.ts\"",
|
||||||
|
"qa": "npm-run-all lint typecheck _build",
|
||||||
"reset": "npx rimraf dist embark-*.tgz package",
|
"reset": "npx rimraf dist embark-*.tgz package",
|
||||||
"solo": "embark-solo",
|
"solo": "embark-solo",
|
||||||
"test": "jest"
|
"typecheck": "tsc",
|
||||||
|
"test": "jest",
|
||||||
|
"watch": "run-p watch:*",
|
||||||
|
"watch:typecheck": "npm run typecheck -- --preserveWatchOutput --watch"
|
||||||
},
|
},
|
||||||
"eslintConfig": {
|
"eslintConfig": {
|
||||||
"extends": "../../../.eslintrc.json"
|
"extends": "../../../.eslintrc.json"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime-corejs3": "7.7.4",
|
"@babel/runtime-corejs3": "7.7.4",
|
||||||
|
"async": "2.6.1",
|
||||||
"core-js": "3.4.3",
|
"core-js": "3.4.3",
|
||||||
"refute": "1.0.2",
|
"refute": "1.0.2",
|
||||||
"sinon": "7.4.2"
|
"sinon": "7.4.2"
|
||||||
|
@ -55,7 +61,9 @@
|
||||||
"jest": "24.9.0",
|
"jest": "24.9.0",
|
||||||
"lodash.clonedeep": "4.5.0",
|
"lodash.clonedeep": "4.5.0",
|
||||||
"npm-run-all": "4.1.5",
|
"npm-run-all": "4.1.5",
|
||||||
"rimraf": "2.6.3"
|
"rimraf": "2.6.3",
|
||||||
|
"tslint": "5.16.0",
|
||||||
|
"typescript": "3.6.3"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"collectCoverage": true,
|
"collectCoverage": true,
|
||||||
|
|
|
@ -0,0 +1,95 @@
|
||||||
|
import { string } from "prop-types";
|
||||||
|
|
||||||
|
import http from "http";
|
||||||
|
import net from "net";
|
||||||
|
import { waterfall } from "async";
|
||||||
|
import { promisify } from 'util';
|
||||||
|
|
||||||
|
enum Method {
|
||||||
|
GET,
|
||||||
|
POST
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Route {
|
||||||
|
path: string;
|
||||||
|
result: string;
|
||||||
|
statusCode: number;
|
||||||
|
method?: Method;
|
||||||
|
}
|
||||||
|
export default class HttpMockServer {
|
||||||
|
private routes: Route[] = [];
|
||||||
|
private server: http.Server;
|
||||||
|
private sock: net.Server;
|
||||||
|
private connectionString: string = "";
|
||||||
|
constructor() {
|
||||||
|
this.sock = net.createServer();
|
||||||
|
this.server = http.createServer(this.handleRequestWrapper.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
public init() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let port;
|
||||||
|
waterfall([
|
||||||
|
cb => { this.sock.listen(0, cb); },
|
||||||
|
cb => {
|
||||||
|
const address = this.sock.address() as net.AddressInfo;
|
||||||
|
if (!address) {
|
||||||
|
cb("Could not get an address from the socket");
|
||||||
|
}
|
||||||
|
port = address.port;
|
||||||
|
cb();
|
||||||
|
},
|
||||||
|
cb => { this.sock.close(cb); },
|
||||||
|
cb => { this.server.listen(port, '127.0.0.1', () => cb()); }
|
||||||
|
], (err) => {
|
||||||
|
if (err) {
|
||||||
|
return reject(err);
|
||||||
|
}
|
||||||
|
this.connectionString = `http://localhost:${port}`;
|
||||||
|
resolve(this.connectionString);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private handleRequestWrapper(req: http.IncomingMessage, res: http.ServerResponse) {
|
||||||
|
let body = '';
|
||||||
|
req.on('data', chunk => {
|
||||||
|
body += chunk.toString();
|
||||||
|
});
|
||||||
|
req.on('end', () => {
|
||||||
|
let jsonBody = {};
|
||||||
|
if (body) {
|
||||||
|
jsonBody = JSON.parse(body);
|
||||||
|
}
|
||||||
|
this.handleRequest(req.url, jsonBody, res);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected handleRequest(path: string | undefined = "", req: object, res: http.ServerResponse) {
|
||||||
|
const route = this.routes[path];
|
||||||
|
if (!route) {
|
||||||
|
res.statusCode = 404;
|
||||||
|
return res.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
res.writeHead(route.statusCode, {
|
||||||
|
'Content-Length': Buffer.byteLength(route.result),
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
});
|
||||||
|
res.end(route.result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public addRoute(route: Route) {
|
||||||
|
if (!route.statusCode) {
|
||||||
|
route.statusCode = 200;
|
||||||
|
}
|
||||||
|
if (!route.method) {
|
||||||
|
route.method = Method.GET;
|
||||||
|
}
|
||||||
|
this.routes[route.path] = route;
|
||||||
|
}
|
||||||
|
|
||||||
|
public teardown() {
|
||||||
|
this.routes = [];
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
const Embark = require('./embark');
|
const Embark = require('./embark');
|
||||||
const Events = require('./events');
|
const Events = require('./events');
|
||||||
const Plugins = require('./plugin');
|
const Plugins = require('./plugin');
|
||||||
|
const HttpMockServer = require('./httpServer');
|
||||||
|
|
||||||
const fakeEmbark = (config) => {
|
const fakeEmbark = (config) => {
|
||||||
const events = new Events();
|
const events = new Events();
|
||||||
|
@ -17,6 +18,7 @@ module.exports = {
|
||||||
Embark,
|
Embark,
|
||||||
Events,
|
Events,
|
||||||
Plugins,
|
Plugins,
|
||||||
|
HttpMockServer,
|
||||||
|
|
||||||
fakeEmbark
|
fakeEmbark
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"extends": "../../../tsconfig.json",
|
||||||
|
"include": ["src/**/*"]
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"extends": "../../../tslint.json"
|
||||||
|
}
|
Loading…
Reference in New Issue