Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: add additional forge create test #1456

Merged
merged 1 commit into from
Apr 30, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 68 additions & 6 deletions cli/tests/it/create.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ use std::str::FromStr;
/// purpose of this is _only_ to make sure we can deploy contracts linked against addresses.
///
/// This will create a library `remapping/MyLib.sol:MyLib`
fn setup_with_remapping(prj: &mut TestProject) {
///
/// returns the contract argument for the create command
fn setup_with_simple_remapping(prj: &mut TestProject) -> String {
// explicitly set remapping and libraries
let config = Config {
remappings: vec![Remapping::from_str("remapping/=lib/remapping/").unwrap().into()],
Expand Down Expand Up @@ -52,13 +54,68 @@ library MyLib {
"#,
)
.unwrap();

"src/LinkTest.sol:LinkTest".to_string()
}

fn setup_oracle(prj: &mut TestProject) -> String {
let config = Config {
libraries: vec![format!(
"./src/libraries/ChainlinkTWAP.sol:ChainlinkTWAP:{:?}",
Address::random()
)],
..Default::default()
};
prj.write_config(config);

prj.inner()
.add_source(
"Contract",
r#"
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import {ChainlinkTWAP} from "./libraries/ChainlinkTWAP.sol";
contract Contract {
function getPrice() public view returns (int latest) {
latest = ChainlinkTWAP.getLatestPrice(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
}
}
"#,
)
.unwrap();

prj.inner()
.add_source(
"libraries/ChainlinkTWAP",
r#"
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

library ChainlinkTWAP {
function getLatestPrice(address base) public view returns (int256) {
return 0;
}
}
"#,
)
.unwrap();

"src/Contract.sol:Contract".to_string()
}

fn create_on_chain(info: Option<EnvExternalities>, mut prj: TestProject, mut cmd: TestCommand) {
/// configures the `TestProject` with the given closure and calls the `forge create` command
fn create_on_chain<F>(
info: Option<EnvExternalities>,
mut prj: TestProject,
mut cmd: TestCommand,
f: F,
) where
F: FnOnce(&mut TestProject) -> String,
{
if let Some(info) = info {
setup_with_remapping(&mut prj);
let contract_path = f(&mut prj);
cmd.arg("create");
cmd.args(info.create_args()).arg("src/LinkTest.sol:LinkTest");
cmd.args(info.create_args()).arg(contract_path);

let out = cmd.stdout_lossy();
let _address = utils::parse_deployed_address(out.as_str())
Expand All @@ -67,6 +124,11 @@ fn create_on_chain(info: Option<EnvExternalities>, mut prj: TestProject, mut cmd
}

// tests `forge` create on goerli if correct env vars are set
forgetest!(can_create_on_goerli, |prj: TestProject, cmd: TestCommand| {
create_on_chain(EnvExternalities::goerli(), prj, cmd);
forgetest!(can_create_simple_on_goerli, |prj: TestProject, cmd: TestCommand| {
create_on_chain(EnvExternalities::goerli(), prj, cmd, |prj| setup_with_simple_remapping(prj));
});

// tests `forge` create on goerli if correct env vars are set
forgetest!(can_create_oracle_on_goerli, |prj: TestProject, cmd: TestCommand| {
create_on_chain(EnvExternalities::goerli(), prj, cmd, |prj| setup_oracle(prj));
});