Add tests and fixtures for full project scenarios (#385)
* Full project tests fixtures for repeated use of evm_revert, * ... and the skipped folders option, * ... and solidity imports with relative paths reaching outside the `contracts/` folder.pull/386/head
parent
826d9d59e8
commit
9ea10859b1
@ -0,0 +1 @@ |
||||
!node_modules |
@ -0,0 +1,3 @@ |
||||
module.exports = { |
||||
silent: process.env.SILENT ? true : false, |
||||
}; |
@ -0,0 +1,10 @@ |
||||
pragma solidity >=0.4.21 <0.6.0; |
||||
|
||||
contract RelativePathImport { |
||||
uint r; |
||||
constructor() public {} |
||||
|
||||
function isRelativePathMethod() public { |
||||
r = 5; |
||||
} |
||||
} |
@ -0,0 +1,23 @@ |
||||
pragma solidity >=0.4.21 <0.6.0; |
||||
|
||||
contract Migrations { |
||||
address public owner; |
||||
uint public last_completed_migration; |
||||
|
||||
constructor() public { |
||||
owner = msg.sender; |
||||
} |
||||
|
||||
modifier restricted() { |
||||
if (msg.sender == owner) _; |
||||
} |
||||
|
||||
function setCompleted(uint completed) public restricted { |
||||
last_completed_migration = completed; |
||||
} |
||||
|
||||
function upgrade(address new_address) public restricted { |
||||
Migrations upgraded = Migrations(new_address); |
||||
upgraded.setCompleted(last_completed_migration); |
||||
} |
||||
} |
@ -0,0 +1,17 @@ |
||||
pragma solidity >=0.4.21 <0.6.0; |
||||
|
||||
import "../assets/RelativePathImport.sol"; |
||||
import "package/NodeModulesImport.sol"; |
||||
|
||||
contract UsesImports is RelativePathImport, NodeModulesImport { |
||||
|
||||
constructor() public {} |
||||
|
||||
function wrapsRelativePathMethod() public { |
||||
isRelativePathMethod(); |
||||
} |
||||
|
||||
function wrapsNodeModulesMethod() public { |
||||
isNodeModulesMethod(); |
||||
} |
||||
} |
@ -0,0 +1,5 @@ |
||||
const Migrations = artifacts.require("Migrations"); |
||||
|
||||
module.exports = function(deployer) { |
||||
deployer.deploy(Migrations); |
||||
}; |
10
test/integration/projects/import-paths/node_modules/package/NodeModulesImport.sol
generated
vendored
10
test/integration/projects/import-paths/node_modules/package/NodeModulesImport.sol
generated
vendored
@ -0,0 +1,10 @@ |
||||
pragma solidity >=0.4.21 <0.6.0; |
||||
|
||||
contract NodeModulesImport { |
||||
uint x; |
||||
constructor() public {} |
||||
|
||||
function isNodeModulesMethod() public { |
||||
x = 5; |
||||
} |
||||
} |
@ -0,0 +1,16 @@ |
||||
var UsesImports = artifacts.require("UsesImports"); |
||||
|
||||
contract("UsesImports", function(accounts) { |
||||
let instance; |
||||
|
||||
before(async () => instance = await UsesImports.new()); |
||||
|
||||
it('uses a method from a relative import', async () => { |
||||
await instance.wrapsRelativePathMethod(); |
||||
}) |
||||
|
||||
it('uses an import from node_modules', async () => { |
||||
await instance.wrapsNodeModulesMethod(); |
||||
}) |
||||
|
||||
}); |
@ -0,0 +1,99 @@ |
||||
/** |
||||
* Use this file to configure your truffle project. It's seeded with some |
||||
* common settings for different networks and features like migrations, |
||||
* compilation and testing. Uncomment the ones you need or modify |
||||
* them to suit your project as necessary. |
||||
* |
||||
* More information about configuration can be found at: |
||||
* |
||||
* truffleframework.com/docs/advanced/configuration |
||||
* |
||||
* To deploy via Infura you'll need a wallet provider (like truffle-hdwallet-provider) |
||||
* to sign your transactions before they're sent to a remote public node. Infura accounts |
||||
* are available for free at: infura.io/register. |
||||
* |
||||
* You'll also need a mnemonic - the twelve word phrase the wallet uses to generate |
||||
* public/private key pairs. If you're publishing your code to GitHub make sure you load this |
||||
* phrase from a file you've .gitignored so it doesn't accidentally become public. |
||||
* |
||||
*/ |
||||
|
||||
// const HDWalletProvider = require('truffle-hdwallet-provider');
|
||||
// const infuraKey = "fj4jll3k.....";
|
||||
//
|
||||
// const fs = require('fs');
|
||||
// const mnemonic = fs.readFileSync(".secret").toString().trim();
|
||||
|
||||
module.exports = { |
||||
/** |
||||
* Networks define how you connect to your ethereum client and let you set the |
||||
* defaults web3 uses to send transactions. If you don't specify one truffle |
||||
* will spin up a development blockchain for you on port 9545 when you |
||||
* run `develop` or `test`. You can ask a truffle command to use a specific |
||||
* network from the command line, e.g |
||||
* |
||||
* $ truffle test --network <network-name> |
||||
*/ |
||||
|
||||
networks: { |
||||
// Useful for testing. The `development` name is special - truffle uses it by default
|
||||
// if it's defined here and no other network is specified at the command line.
|
||||
// You should run a client (like ganache-cli, geth or parity) in a separate terminal
|
||||
// tab if you use this network and you must also set the `host`, `port` and `network_id`
|
||||
// options below to some value.
|
||||
//
|
||||
// development: {
|
||||
// host: "127.0.0.1", // Localhost (default: none)
|
||||
// port: 8545, // Standard Ethereum port (default: none)
|
||||
// network_id: "*", // Any network (default: none)
|
||||
// },
|
||||
|
||||
// Another network with more advanced options...
|
||||
// advanced: {
|
||||
// port: 8777, // Custom port
|
||||
// network_id: 1342, // Custom network
|
||||
// gas: 8500000, // Gas sent with each transaction (default: ~6700000)
|
||||
// gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei)
|
||||
// from: <address>, // Account to send txs from (default: accounts[0])
|
||||
// websockets: true // Enable EventEmitter interface for web3 (default: false)
|
||||
// },
|
||||
|
||||
// Useful for deploying to a public network.
|
||||
// NB: It's important to wrap the provider as a function.
|
||||
// ropsten: {
|
||||
// provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`),
|
||||
// network_id: 3, // Ropsten's id
|
||||
// gas: 5500000, // Ropsten has a lower block limit than mainnet
|
||||
// confirmations: 2, // # of confs to wait between deployments. (default: 0)
|
||||
// timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50)
|
||||
// skipDryRun: true // Skip dry run before migrations? (default: false for public nets )
|
||||
// },
|
||||
|
||||
// Useful for private networks
|
||||
// private: {
|
||||
// provider: () => new HDWalletProvider(mnemonic, `https://network.io`),
|
||||
// network_id: 2111, // This network is yours, in the cloud.
|
||||
// production: true // Treats this network as if it was a public net. (default: false)
|
||||
// }
|
||||
}, |
||||
|
||||
// Set default mocha options here, use special reporters etc.
|
||||
mocha: { |
||||
// timeout: 100000
|
||||
}, |
||||
|
||||
// Configure your compilers
|
||||
compilers: { |
||||
solc: { |
||||
// version: "0.5.1", // Fetch exact version from solc-bin (default: truffle's version)
|
||||
// docker: true, // Use "0.5.1" you've installed locally with docker (default: false)
|
||||
// settings: { // See the solidity docs for advice about optimization and evmVersion
|
||||
// optimizer: {
|
||||
// enabled: false,
|
||||
// runs: 200
|
||||
// },
|
||||
// evmVersion: "byzantium"
|
||||
// }
|
||||
} |
||||
} |
||||
} |
@ -0,0 +1,3 @@ |
||||
module.exports = { |
||||
silent: process.env.SILENT ? true : false, |
||||
}; |
@ -0,0 +1,17 @@ |
||||
pragma solidity ^0.5.0; |
||||
|
||||
|
||||
contract ContractA { |
||||
uint x; |
||||
constructor() public { |
||||
} |
||||
|
||||
function sendFn() public { |
||||
x = 5; |
||||
} |
||||
|
||||
function callFn() public pure returns (uint){ |
||||
uint y = 5; |
||||
return y; |
||||
} |
||||
} |
@ -0,0 +1,17 @@ |
||||
pragma solidity ^0.5.0; |
||||
|
||||
|
||||
contract ContractB { |
||||
uint x; |
||||
constructor() public { |
||||
} |
||||
|
||||
function sendFn() public { |
||||
x = 5; |
||||
} |
||||
|
||||
function callFn() public pure returns (uint){ |
||||
uint y = 5; |
||||
return y; |
||||
} |
||||
} |
@ -0,0 +1,17 @@ |
||||
pragma solidity ^0.5.0; |
||||
|
||||
|
||||
contract ContractC { |
||||
uint x; |
||||
constructor() public { |
||||
} |
||||
|
||||
function sendFn() public { |
||||
x = 5; |
||||
} |
||||
|
||||
function callFn() public pure returns (uint){ |
||||
uint y = 5; |
||||
return y; |
||||
} |
||||
} |
@ -0,0 +1,23 @@ |
||||
pragma solidity >=0.4.21 <0.6.0; |
||||
|
||||
contract Migrations { |
||||
address public owner; |
||||
uint public last_completed_migration; |
||||
|
||||
constructor() public { |
||||
owner = msg.sender; |
||||
} |
||||
|
||||
modifier restricted() { |
||||
if (msg.sender == owner) _; |
||||
} |
||||
|
||||
function setCompleted(uint completed) public restricted { |
||||
last_completed_migration = completed; |
||||
} |
||||
|
||||
function upgrade(address new_address) public restricted { |
||||
Migrations upgraded = Migrations(new_address); |
||||
upgraded.setCompleted(last_completed_migration); |
||||
} |
||||
} |
@ -0,0 +1,5 @@ |
||||
const Migrations = artifacts.require("Migrations"); |
||||
|
||||
module.exports = function(deployer) { |
||||
deployer.deploy(Migrations); |
||||
}; |
@ -0,0 +1,5 @@ |
||||
const ContractA = artifacts.require("ContractA"); |
||||
|
||||
module.exports = function(deployer) { |
||||
deployer.deploy(ContractA); |
||||
}; |
@ -0,0 +1,5 @@ |
||||
const ContractB = artifacts.require("ContractB"); |
||||
|
||||
module.exports = function(deployer) { |
||||
deployer.deploy(ContractB); |
||||
}; |
@ -0,0 +1,5 @@ |
||||
const ContractC = artifacts.require("ContractC"); |
||||
|
||||
module.exports = function(deployer) { |
||||
deployer.deploy(ContractC); |
||||
}; |
@ -0,0 +1,15 @@ |
||||
const ContractA = artifacts.require("ContractA"); |
||||
|
||||
contract("contracta", function(accounts) { |
||||
let instance; |
||||
|
||||
before(async () => instance = await ContractA.deployed()) |
||||
|
||||
it('sends', async function(){ |
||||
await instance.sendFn(); |
||||
}); |
||||
|
||||
it('calls', async function(){ |
||||
await instance.callFn(); |
||||
}) |
||||
}); |
@ -0,0 +1,15 @@ |
||||
const ContractB = artifacts.require("ContractB"); |
||||
|
||||
contract("contractB", function(accounts) { |
||||
let instance; |
||||
|
||||
before(async () => instance = await ContractB.deployed()) |
||||
|
||||
it('sends', async function(){ |
||||
await instance.sendFn(); |
||||
}); |
||||
|
||||
it('calls', async function(){ |
||||
await instance.callFn(); |
||||
}) |
||||
}); |
@ -0,0 +1,20 @@ |
||||
const ContractC = artifacts.require("ContractC"); |
||||
|
||||
contract("contractc", function(accounts) { |
||||
let instance; |
||||
|
||||
before(async () => instance = await ContractC.deployed()) |
||||
|
||||
it('sends', async function(){ |
||||
await instance.sendFn(); |
||||
}); |
||||
|
||||
it('calls', async function(){ |
||||
await instance.callFn(); |
||||
}) |
||||
|
||||
it('sends', async function(){ |
||||
await instance.sendFn(); |
||||
}); |
||||
|
||||
}); |
@ -0,0 +1,99 @@ |
||||
/** |
||||
* Use this file to configure your truffle project. It's seeded with some |
||||
* common settings for different networks and features like migrations, |
||||
* compilation and testing. Uncomment the ones you need or modify |
||||
* them to suit your project as necessary. |
||||
* |
||||
* More information about configuration can be found at: |
||||
* |
||||
* truffleframework.com/docs/advanced/configuration |
||||
* |
||||
* To deploy via Infura you'll need a wallet provider (like truffle-hdwallet-provider) |
||||
* to sign your transactions before they're sent to a remote public node. Infura accounts |
||||
* are available for free at: infura.io/register. |
||||
* |
||||
* You'll also need a mnemonic - the twelve word phrase the wallet uses to generate |
||||
* public/private key pairs. If you're publishing your code to GitHub make sure you load this |
||||
* phrase from a file you've .gitignored so it doesn't accidentally become public. |
||||
* |
||||
*/ |
||||
|
||||
// const HDWalletProvider = require('truffle-hdwallet-provider');
|
||||
// const infuraKey = "fj4jll3k.....";
|
||||
//
|
||||
// const fs = require('fs');
|
||||
// const mnemonic = fs.readFileSync(".secret").toString().trim();
|
||||
|
||||
module.exports = { |
||||
/** |
||||
* Networks define how you connect to your ethereum client and let you set the |
||||
* defaults web3 uses to send transactions. If you don't specify one truffle |
||||
* will spin up a development blockchain for you on port 9545 when you |
||||
* run `develop` or `test`. You can ask a truffle command to use a specific |
||||
* network from the command line, e.g |
||||
* |
||||
* $ truffle test --network <network-name> |
||||
*/ |
||||
|
||||
networks: { |
||||
// Useful for testing. The `development` name is special - truffle uses it by default
|
||||
// if it's defined here and no other network is specified at the command line.
|
||||
// You should run a client (like ganache-cli, geth or parity) in a separate terminal
|
||||
// tab if you use this network and you must also set the `host`, `port` and `network_id`
|
||||
// options below to some value.
|
||||
//
|
||||
// development: {
|
||||
// host: "127.0.0.1", // Localhost (default: none)
|
||||
// port: 8545, // Standard Ethereum port (default: none)
|
||||
// network_id: "*", // Any network (default: none)
|
||||
// },
|
||||
|
||||
// Another network with more advanced options...
|
||||
// advanced: {
|
||||
// port: 8777, // Custom port
|
||||
// network_id: 1342, // Custom network
|
||||
// gas: 8500000, // Gas sent with each transaction (default: ~6700000)
|
||||
// gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei)
|
||||
// from: <address>, // Account to send txs from (default: accounts[0])
|
||||
// websockets: true // Enable EventEmitter interface for web3 (default: false)
|
||||
// },
|
||||
|
||||
// Useful for deploying to a public network.
|
||||
// NB: It's important to wrap the provider as a function.
|
||||
// ropsten: {
|
||||
// provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`),
|
||||
// network_id: 3, // Ropsten's id
|
||||
// gas: 5500000, // Ropsten has a lower block limit than mainnet
|
||||
// confirmations: 2, // # of confs to wait between deployments. (default: 0)
|
||||
// timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50)
|
||||
// skipDryRun: true // Skip dry run before migrations? (default: false for public nets )
|
||||
// },
|
||||
|
||||
// Useful for private networks
|
||||
// private: {
|
||||
// provider: () => new HDWalletProvider(mnemonic, `https://network.io`),
|
||||
// network_id: 2111, // This network is yours, in the cloud.
|
||||
// production: true // Treats this network as if it was a public net. (default: false)
|
||||
// }
|
||||
}, |
||||
|
||||
// Set default mocha options here, use special reporters etc.
|
||||
mocha: { |
||||
// timeout: 100000
|
||||
}, |
||||
|
||||
// Configure your compilers
|
||||
compilers: { |
||||
solc: { |
||||
// version: "0.5.1", // Fetch exact version from solc-bin (default: truffle's version)
|
||||
// docker: true, // Use "0.5.1" you've installed locally with docker (default: false)
|
||||
// settings: { // See the solidity docs for advice about optimization and evmVersion
|
||||
// optimizer: {
|
||||
// enabled: false,
|
||||
// runs: 200
|
||||
// },
|
||||
// evmVersion: "byzantium"
|
||||
// }
|
||||
} |
||||
} |
||||
} |
@ -0,0 +1,4 @@ |
||||
module.exports = { |
||||
silent: process.env.SILENT ? true : false, |
||||
skipFiles: ['skipped-folder'] |
||||
} |
@ -0,0 +1,17 @@ |
||||
pragma solidity ^0.5.0; |
||||
|
||||
|
||||
contract ContractA { |
||||
uint x; |
||||
constructor() public { |
||||
} |
||||
|
||||
function sendFn() public { |
||||
x = 5; |
||||
} |
||||
|
||||
function callFn() public pure returns (uint){ |
||||
uint y = 5; |
||||
return y; |
||||
} |
||||
} |
@ -0,0 +1,23 @@ |
||||
pragma solidity >=0.4.21 <0.6.0; |
||||
|
||||
contract Migrations { |
||||
address public owner; |
||||
uint public last_completed_migration; |
||||
|
||||
constructor() public { |
||||
owner = msg.sender; |
||||
} |
||||
|
||||
modifier restricted() { |
||||
if (msg.sender == owner) _; |
||||
} |
||||
|
||||
function setCompleted(uint completed) public restricted { |
||||
last_completed_migration = completed; |
||||
} |
||||
|
||||
function upgrade(address new_address) public restricted { |
||||
Migrations upgraded = Migrations(new_address); |
||||
upgraded.setCompleted(last_completed_migration); |
||||
} |
||||
} |
@ -0,0 +1,17 @@ |
||||
pragma solidity ^0.5.0; |
||||
|
||||
|
||||
contract ContractB { |
||||
uint x; |
||||
constructor() public { |
||||
} |
||||
|
||||
function sendFn() public { |
||||
x = 5; |
||||
} |
||||
|
||||
function callFn() public pure returns (uint){ |
||||
uint y = 5; |
||||
return y; |
||||
} |
||||
} |
@ -0,0 +1,5 @@ |
||||
const Migrations = artifacts.require("Migrations"); |
||||
|
||||
module.exports = function(deployer) { |
||||
deployer.deploy(Migrations); |
||||
}; |
@ -0,0 +1,29 @@ |
||||
const ContractA = artifacts.require("ContractA"); |
||||
const ContractB = artifacts.require("ContractB"); |
||||
|
||||
contract("contracts", function(accounts) { |
||||
let instanceA; |
||||
let instanceB; |
||||
|
||||
before(async () => { |
||||
instanceA = await ContractA.new(); |
||||
instanceB = await ContractB.new(); |
||||
}); |
||||
|
||||
it('A sends', async function(){ |
||||
await instanceA.sendFn(); |
||||
}); |
||||
|
||||
it('A calls', async function(){ |
||||
await instanceA.callFn(); |
||||
}); |
||||
|
||||
it('B sends', async function(){ |
||||
await instanceB.sendFn(); |
||||
}); |
||||
|
||||
it('B calls', async function(){ |
||||
await instanceB.callFn(); |
||||
}); |
||||
|
||||
}); |
@ -0,0 +1,99 @@ |
||||
/** |
||||
* Use this file to configure your truffle project. It's seeded with some |
||||
* common settings for different networks and features like migrations, |
||||
* compilation and testing. Uncomment the ones you need or modify |
||||
* them to suit your project as necessary. |
||||
* |
||||
* More information about configuration can be found at: |
||||
* |
||||
* truffleframework.com/docs/advanced/configuration |
||||
* |
||||
* To deploy via Infura you'll need a wallet provider (like truffle-hdwallet-provider) |
||||
* to sign your transactions before they're sent to a remote public node. Infura accounts |
||||
* are available for free at: infura.io/register. |
||||
* |
||||
* You'll also need a mnemonic - the twelve word phrase the wallet uses to generate |
||||
* public/private key pairs. If you're publishing your code to GitHub make sure you load this |
||||
* phrase from a file you've .gitignored so it doesn't accidentally become public. |
||||
* |
||||
*/ |
||||
|
||||
// const HDWalletProvider = require('truffle-hdwallet-provider');
|
||||
// const infuraKey = "fj4jll3k.....";
|
||||
//
|
||||
// const fs = require('fs');
|
||||
// const mnemonic = fs.readFileSync(".secret").toString().trim();
|
||||
|
||||
module.exports = { |
||||
/** |
||||
* Networks define how you connect to your ethereum client and let you set the |
||||
* defaults web3 uses to send transactions. If you don't specify one truffle |
||||
* will spin up a development blockchain for you on port 9545 when you |
||||
* run `develop` or `test`. You can ask a truffle command to use a specific |
||||
* network from the command line, e.g |
||||
* |
||||
* $ truffle test --network <network-name> |
||||
*/ |
||||
|
||||
networks: { |
||||
// Useful for testing. The `development` name is special - truffle uses it by default
|
||||
// if it's defined here and no other network is specified at the command line.
|
||||
// You should run a client (like ganache-cli, geth or parity) in a separate terminal
|
||||
// tab if you use this network and you must also set the `host`, `port` and `network_id`
|
||||
// options below to some value.
|
||||
//
|
||||
// development: {
|
||||
// host: "127.0.0.1", // Localhost (default: none)
|
||||
// port: 8545, // Standard Ethereum port (default: none)
|
||||
// network_id: "*", // Any network (default: none)
|
||||
// },
|
||||
|
||||
// Another network with more advanced options...
|
||||
// advanced: {
|
||||
// port: 8777, // Custom port
|
||||
// network_id: 1342, // Custom network
|
||||
// gas: 8500000, // Gas sent with each transaction (default: ~6700000)
|
||||
// gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei)
|
||||
// from: <address>, // Account to send txs from (default: accounts[0])
|
||||
// websockets: true // Enable EventEmitter interface for web3 (default: false)
|
||||
// },
|
||||
|
||||
// Useful for deploying to a public network.
|
||||
// NB: It's important to wrap the provider as a function.
|
||||
// ropsten: {
|
||||
// provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`),
|
||||
// network_id: 3, // Ropsten's id
|
||||
// gas: 5500000, // Ropsten has a lower block limit than mainnet
|
||||
// confirmations: 2, // # of confs to wait between deployments. (default: 0)
|
||||
// timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50)
|
||||
// skipDryRun: true // Skip dry run before migrations? (default: false for public nets )
|
||||
// },
|
||||
|
||||
// Useful for private networks
|
||||
// private: {
|
||||
// provider: () => new HDWalletProvider(mnemonic, `https://network.io`),
|
||||
// network_id: 2111, // This network is yours, in the cloud.
|
||||
// production: true // Treats this network as if it was a public net. (default: false)
|
||||
// }
|
||||
}, |
||||
|
||||
// Set default mocha options here, use special reporters etc.
|
||||
mocha: { |
||||
// timeout: 100000
|
||||
}, |
||||
|
||||
// Configure your compilers
|
||||
compilers: { |
||||
solc: { |
||||
// version: "0.5.1", // Fetch exact version from solc-bin (default: truffle's version)
|
||||
// docker: true, // Use "0.5.1" you've installed locally with docker (default: false)
|
||||
// settings: { // See the solidity docs for advice about optimization and evmVersion
|
||||
// optimizer: {
|
||||
// enabled: false,
|
||||
// runs: 200
|
||||
// },
|
||||
// evmVersion: "byzantium"
|
||||
// }
|
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue