From e772f692d5519ebca5cc5b71bcd71e1d910efd9b Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Fri, 29 Apr 2022 11:42:15 +0200 Subject: [PATCH] test: add additional forge create test --- cli/tests/it/create.rs | 74 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 6 deletions(-) diff --git a/cli/tests/it/create.rs b/cli/tests/it/create.rs index ff5b0f39db09..067074c952f8 100644 --- a/cli/tests/it/create.rs +++ b/cli/tests/it/create.rs @@ -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()], @@ -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, mut prj: TestProject, mut cmd: TestCommand) { +/// configures the `TestProject` with the given closure and calls the `forge create` command +fn create_on_chain( + info: Option, + 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()) @@ -67,6 +124,11 @@ fn create_on_chain(info: Option, 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)); });