Skip to content

Commit

Permalink
feat(@embark/test-runner): introduce artifacts.require API
Browse files Browse the repository at this point in the history
This commit adds a convenience API `artifacts.require(name)` that aims to make
requiring artifacts a little bit more straight forward.

Usage:

```
const SimpleStorage = artifacts.require('SimpleStorage');
const EmbarkJS = artifacts.require('EmbarkJS');
```
  • Loading branch information
0x-r4bbit committed Feb 11, 2020
1 parent e29a93b commit ea7f020
Show file tree
Hide file tree
Showing 21 changed files with 111 additions and 83 deletions.
4 changes: 2 additions & 2 deletions dapps/templates/boilerplate/test/contract_spec.js
@@ -1,6 +1,6 @@
/*global contract, it*/
/*global artifacts, contract, it*/
/*
const SimpleStorage = require('Embark/contracts/SimpleStorage');
const SimpleStorage = artifacts.require('SimpleStorage');
let accounts;
Expand Down
4 changes: 2 additions & 2 deletions dapps/templates/demo/test/simple_storage_spec.js
@@ -1,5 +1,5 @@
/*global contract, config, it, assert, web3*/
const SimpleStorage = require('Embark/contracts/SimpleStorage');
/*global artifacts, contract, config, it, assert, web3*/
const SimpleStorage = artifacts.require('SimpleStorage');

let accounts;

Expand Down
4 changes: 2 additions & 2 deletions dapps/templates/simple/test/contract_spec.js
@@ -1,6 +1,6 @@
/*global contract, it*/
/*global artifacts, contract, it*/
/*
const SimpleStorage = require('Embark/contracts/SimpleStorage');
const SimpleStorage = artifacts.require('SimpleStorage');
let accounts;
Expand Down
6 changes: 3 additions & 3 deletions dapps/tests/app/test/another_storage_spec.js
@@ -1,7 +1,7 @@
/*global contract, config, it, web3*/
/*global artifacts, contract, config, it, web3*/
const assert = require('assert');
const AnotherStorage = require('Embark/contracts/AnotherStorage');
const SimpleStorage = require('Embark/contracts/SimpleStorage');
const AnotherStorage = artifacts.require('AnotherStorage');
const SimpleStorage = artifacts.require('SimpleStorage');

let accounts, defaultAccount;
const numAddresses = 10;
Expand Down
7 changes: 3 additions & 4 deletions dapps/tests/app/test/array_references_spec.js
@@ -1,7 +1,7 @@
/*global contract, config, it, web3*/
/*global artifacts, contract, config, it, web3*/
const assert = require('assert');
const SomeContract = require('Embark/contracts/SomeContract');
const MyToken2 = require('Embark/contracts/MyToken2');
const SomeContract = artifacts.require('SomeContract');
const MyToken2 = artifacts.require('MyToken2');

config({
contracts: {
Expand Down Expand Up @@ -38,4 +38,3 @@ contract("SomeContract", function() {
});

});

7 changes: 3 additions & 4 deletions dapps/tests/app/test/embarkJS_spec.js
@@ -1,7 +1,7 @@
/*global describe, it, web3, config*/
/*global artifacts, describe, it, web3, config*/
const assert = require('assert');
const SimpleStorage = require('Embark/contracts/SimpleStorage');
const EmbarkJS = require('Embark/EmbarkJS');
const SimpleStorage = artifacts.require('SimpleStorage');
const EmbarkJS = artifacts.require('EmbarkJS');

config({
namesystem: {
Expand Down Expand Up @@ -58,4 +58,3 @@ describe("EmbarkJS functions", function() {
assert.strictEqual(parseInt(result, 10), 100);
});
});

4 changes: 2 additions & 2 deletions dapps/tests/app/test/expiration_spec.js
@@ -1,5 +1,5 @@
/*global contract, config, it, assert, mineAtTimestamp*/
const Expiration = require('Embark/contracts/Expiration');
/*global artifacts, contract, config, it, assert, mineAtTimestamp*/
const Expiration = artifacts.require('Expiration');
const now = Math.floor(new Date().getTime()/1000.0); // Get unix epoch. The getTime method returns the time in milliseconds.

config({
Expand Down
5 changes: 2 additions & 3 deletions dapps/tests/app/test/interface_spec.js
@@ -1,6 +1,6 @@
/*global contract, config, it*/
/*global artifacts, contract, config, it*/
const assert = require('assert');
const AnotherStorage = require('Embark/contracts/AnotherStorage');
const AnotherStorage = artifacts.require('AnotherStorage');

// FIXME this doesn't work and no idea how it ever worked because ERC20 is not defined anywhere
// config({
Expand All @@ -22,4 +22,3 @@ contract("AnotherStorageWithInterface", function() {
assert.strictEqual(result.toString(), '0x0000000000000000000000000000000000000000');
});
});

4 changes: 2 additions & 2 deletions dapps/tests/app/test/lib_test_spec.js
@@ -1,6 +1,6 @@
/*global contract, config, it*/
/*global artifacts, contract, config, it*/
const assert = require('assert');
const Test2 = require('Embark/contracts/Test2');
const Test2 = artifacts.require('Test2');

config({
contracts: {
Expand Down
9 changes: 4 additions & 5 deletions dapps/tests/app/test/namesystem_spec.js
@@ -1,8 +1,8 @@
/*global describe, it, config*/
/*global artifacts, describe, it, config*/
const assert = require('assert');
const MyToken = require('Embark/contracts/MyToken');
const MyToken2 = require('Embark/contracts/MyToken2');
const EmbarkJS = require('Embark/EmbarkJS');
const MyToken = artifacts.require('MyToken');
const MyToken2 = artifacts.require('MyToken2');
const EmbarkJS = artifacts.require('EmbarkJS');

let accounts;

Expand Down Expand Up @@ -55,4 +55,3 @@ describe("ENS functions", function() {
assert.strictEqual(myToken2Name, 'MyToken2.embark.eth');
});
});

6 changes: 3 additions & 3 deletions dapps/tests/app/test/plugin_storage_spec.js
@@ -1,7 +1,7 @@
/*global contract, config, it*/
/*global artifacts, contract, config, it*/
const assert = require('assert');
const PluginStorage = require('Embark/contracts/PluginStorage');
const SimpleStorage = require('Embark/contracts/SimpleStorage');
const PluginStorage = artifacts.require('PluginStorage');
const SimpleStorage = artifacts.require('SimpleStorage');

config({
contracts: {
Expand Down
6 changes: 3 additions & 3 deletions dapps/tests/app/test/simple_storage_deploy_spec.js
@@ -1,6 +1,6 @@
/*global contract, it, assert, before, web3*/
const SimpleStorage = require('Embark/contracts/SimpleStorage');
const {Utils} = require('Embark/EmbarkJS');
/*global artifacts, contract, it, assert, before, web3*/
const SimpleStorage = artifacts.require('SimpleStorage');
const {Utils} = artifacts.require('EmbarkJS');

contract("SimpleStorage Deploy", function () {
let simpleStorageInstance;
Expand Down
4 changes: 2 additions & 2 deletions dapps/tests/app/test/simple_storage_spec.js
@@ -1,7 +1,7 @@
/*global contract, config, it, assert, web3*/
const SimpleStorage = require('Embark/contracts/SimpleStorage');
const SimpleStorage = artifacts.require('SimpleStorage');
let accounts;
const {Utils} = require('Embark/EmbarkJS');
const {Utils} = artifacts.require('EmbarkJS');

config({
contracts: {
Expand Down
14 changes: 7 additions & 7 deletions dapps/tests/app/test/token_spec.js
@@ -1,11 +1,11 @@
/*global describe, config, it, web3*/
/*global artifacts, describe, config, it, web3*/
const assert = require('assert');
const Token = require('Embark/contracts/Token');
const MyToken = require('Embark/contracts/MyToken');
const MyToken2 = require('Embark/contracts/MyToken2');
const AlreadyDeployedToken = require('Embark/contracts/AlreadyDeployedToken');
const Test = require('Embark/contracts/Test');
const SomeContract = require('Embark/contracts/SomeContract');
const Token = artifacts.require('Token');
const MyToken = artifacts.require('MyToken');
const MyToken2 = artifacts.require('MyToken2');
const AlreadyDeployedToken = artifacts.require('AlreadyDeployedToken');
const Test = artifacts.require('Test');
const SomeContract = artifacts.require('SomeContract');

config({
namesystem: {
Expand Down
6 changes: 3 additions & 3 deletions dapps/tests/contracts/test/another_storage_spec.js
@@ -1,7 +1,7 @@
/*global contract, config, it*/
/*global artifacts, contract, config, it*/
const assert = require('assert');
const AnotherStorage = require('Embark/contracts/AnotherStorage');
const SimpleStorage = require('Embark/contracts/SimpleStorage');
const AnotherStorage = artifacts.require('AnotherStorage');
const SimpleStorage = artifacts.require('SimpleStorage');
let accounts;

config({
Expand Down
9 changes: 4 additions & 5 deletions dapps/tests/contracts/test/array_references_spec.js
@@ -1,8 +1,8 @@
/*global contract, config, it*/
/*global artifacts, contract, config, it*/
const assert = require('assert');
const SomeContract = require('Embark/contracts/SomeContract');
const SimpleStorage = require('Embark/contracts/SimpleStorage');
const MyToken2 = require('Embark/contracts/MyToken2');
const SomeContract = artifacts.require('SomeContract');
const SimpleStorage = artifacts.require('SimpleStorage');
const MyToken2 = artifacts.require('MyToken2');

config({
contracts: {
Expand Down Expand Up @@ -42,4 +42,3 @@ contract("SomeContract", function() {
});

});

4 changes: 2 additions & 2 deletions dapps/tests/contracts/test/lib_test_spec.js
@@ -1,6 +1,6 @@
/*global contract, config, it*/
/*global artifacts, contract, config, it*/
const assert = require('assert');
const Test2 = require('Embark/contracts/Test2');
const Test2 = artifacts.require('Test2');

config({
contracts: {
Expand Down
4 changes: 2 additions & 2 deletions dapps/tests/contracts/test/simple_storage_spec.js
@@ -1,6 +1,6 @@
/*global contract, config, it*/
/*global artifacts, contract, config, it*/
const assert = require('assert');
const SimpleStorage = require('Embark/contracts/SimpleStorage');
const SimpleStorage = artifacts.require('SimpleStorage');

config({
contracts: {
Expand Down
12 changes: 6 additions & 6 deletions dapps/tests/contracts/test/token_spec.js
@@ -1,10 +1,10 @@
/*global describe, config, it*/
/*global artifacts, describe, config, it*/
const assert = require('assert');
const Token = require('Embark/contracts/Token');
const MyToken = require('Embark/contracts/MyToken');
const MyToken2 = require('Embark/contracts/MyToken2');
const AlreadyDeployedToken = require('Embark/contracts/AlreadyDeployedToken');
const Test = require('Embark/contracts/Test');
const Token = artifacts.require('Token');
const MyToken = artifacts.require('MyToken');
const MyToken2 = artifacts.require('MyToken2');
const AlreadyDeployedToken = artifacts.require('AlreadyDeployedToken');
const Test = artifacts.require('Test');

config({
contracts: {
Expand Down
1 change: 1 addition & 0 deletions packages/plugins/mocha-tests/package.json
Expand Up @@ -50,6 +50,7 @@
"@babel/runtime-corejs3": "7.7.4",
"@types/async": "3.0.3",
"async": "3.1.0",
"colors": "1.4.0",
"core-js": "3.4.3",
"embark-i18n": "^5.1.1",
"embark-utils": "^5.2.0-nightly.1",
Expand Down
74 changes: 53 additions & 21 deletions packages/plugins/mocha-tests/src/lib/index.js
@@ -1,3 +1,4 @@
import 'colors';
import {__} from 'embark-i18n';

const async = require('async');
Expand Down Expand Up @@ -31,6 +32,31 @@ class MochaTestRunner {
);
}

static originalRequire = require('module').prototype.require;

static requireArtifact(artifactName, compiledContracts) {
if (artifactName === 'EmbarkJS') return EmbarkJS;

const instance = compiledContracts[artifactName];

if (!instance) {
compiledContracts[artifactName] = {};
}

if (!compiledContracts[artifactName].abiDefinition) {
return compiledContracts[artifactName];
}

try {
return Object.setPrototypeOf(
instance,
EmbarkJS.Blockchain.Contract(instance)
);
} catch (e) {
return instance;
}
}

addFile(path) {
if (!this.match(path)) {
throw new Error(`invalid JavaScript test path: ${path}`);
Expand All @@ -49,7 +75,6 @@ class MochaTestRunner {
this.options = options;

const Module = require("module");
const originalRequire = require("module").prototype.require;

let accounts = [];
let compiledContracts = {};
Expand Down Expand Up @@ -185,29 +210,29 @@ class MochaTestRunner {
return seriesCb(null, 0);
}

let testRunner = this;

Module.prototype.require = function(req) {
if (["Embark/EmbarkJS", "EmbarkJS"].includes(req)) {
testRunner.logger.warn(
`${__('WARNING!')} ${__('Use')} ${`artifacts.require('EmbarkJS')`.cyan}, ${__('the syntax').yellow} ${`require('${req}')`.cyan} ${__('has been deprecated and will be removed in future versions').yellow}`
);
return MochaTestRunner.requireArtifact("EmbarkJS");
}

const prefix = "Embark/contracts/";
if (req.startsWith(prefix)) {
const contractClass = req.replace(prefix, "");
const instance = compiledContracts[contractClass];

if (!instance) {
compiledContracts[contractClass] = {};
}
if (!compiledContracts[contractClass].abiDefinition) {
return compiledContracts[contractClass];
}
try {
return Object.setPrototypeOf(instance, EmbarkJS.Blockchain.Contract(instance));
} catch (e) {
return instance;
}
}
if (req === "Embark/EmbarkJS") {
return EmbarkJS;
const artifactName = req.replace(prefix, "");
testRunner.logger.warn(
`${__('WARNING!')} ${__('Use')} ${`artifacts.require('${artifactName}')`.cyan}, ${__('the syntax').yellow} ${`require('${req}')`.cyan} ${__('has been deprecated and will be removed in future versions').yellow}`
);
return MochaTestRunner.requireArtifact(
artifactName,
compiledContracts
);
}

return originalRequire.apply(this, arguments);
return MochaTestRunner.originalRequire.call(this, req);
};

const mocha = new Mocha();
Expand All @@ -222,11 +247,18 @@ class MochaTestRunner {
global.config = config;
});

global.artifacts = {
require: (artifactName) => MochaTestRunner.requireArtifact(
artifactName,
compiledContracts
)
};

mocha.suite.timeout(TEST_TIMEOUT);
mocha.addFile(file);

mocha.run((failures) => {
Module.prototype.require = originalRequire;
Module.prototype.require = MochaTestRunner.originalRequire;
seriesCb(null, failures);
});
});
Expand All @@ -237,7 +269,7 @@ class MochaTestRunner {
}
], (err) => {
this.embark.config.plugins.runActionsForEvent('tests:finished', () => {
Module.prototype.require = originalRequire;
Module.prototype.require = MochaTestRunner.originalRequire;
cb(err);
});

Expand Down

0 comments on commit ea7f020

Please sign in to comment.