-
Notifications
You must be signed in to change notification settings - Fork 32
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
feat(test): migrate unit tests to the new motsu layout #423
base: main
Are you sure you want to change the base?
Conversation
…ontract-deployment
✅ Deploy Preview for contracts-stylus canceled.
|
contracts/src/utils/context.rs
Outdated
#[cfg(test)] | ||
pub fn msg_sender() -> Address { | ||
motsu::prelude::Context::current() | ||
.get_msg_sender() | ||
.expect("msg_sender should be set") | ||
} | ||
|
||
/// Returns the address of the message sender. | ||
#[cfg(not(test))] | ||
pub fn msg_sender() -> Address { | ||
msg::sender() | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here is an example how msg_sender
mock can be declared. This design is not perfect since motsu users should implement this mock for their own library manually or through macro.
Calling stylus sdk api msg::sender()
won't work inside a test without mock due to this limitation.
contracts/src/token/erc721/mod.rs
Outdated
#[motsu::test] | ||
fn on_erc721_received( | ||
erc721: Contract<Erc721>, | ||
receiver: Contract<Erc721ReceiverMock>, | ||
) { | ||
let alice = Account::random(); | ||
let token_id = random_token_id(); | ||
erc721 | ||
.sender(alice) | ||
._safe_mint(receiver.address(), token_id, vec![0, 1, 2, 3].into()) | ||
.unwrap(); | ||
|
||
let received_token_id = receiver.sender(alice).received_token_id(); | ||
|
||
assert_eq!(received_token_id, token_id); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overall the test case for Erc721Receiver
can look like this
…ontract-deployment # Conflicts: # Cargo.lock # contracts/src/finance/vesting_wallet.rs # contracts/src/token/erc1155/mod.rs # lib/motsu-proc/src/test.rs # lib/motsu/Cargo.toml # lib/motsu/src/context.rs # lib/motsu/src/lib.rs # lib/motsu/src/prelude.rs # lib/motsu/src/shims.rs
contracts/Cargo.toml
Outdated
keccak-const.workspace = true | ||
openzeppelin-stylus-proc.workspace = true | ||
|
||
[dev-dependencies] | ||
alloy-primitives = { workspace = true, features = ["arbitrary"] } | ||
motsu.workspace = true | ||
rand.workspace = true | ||
stylus-sdk.workspace = true |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
stylus-sdk is listed both in dependencies
and in dev-dependencies
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since OL agreed to have a default feature for ENABLING hostio caching, now we should write stylus-sdk = { version = "0.7.0", default-features = false }
on the workspace level, and stylus-sdk = { workspace = true, default-features = true }
for [dependencies]
. Because we need this caching for wasm compiled contracts, but can not run motsu tests with it.
And use it without default features for unit tests [dev-dependencies]
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would better add a feature for disabling caching (not enabling). It would be more simple
contracts/src/access/control.rs
Outdated
@@ -41,6 +41,8 @@ | |||
//! accounts that have been granted it. We recommend using | |||
//! `AccessControlDefaultAdminRules` to enforce additional security measures for | |||
//! this role. | |||
use alloc::vec::Vec; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why are we adding this import?
pub use token::IErc20; | ||
mod token { | ||
#![allow(missing_docs)] | ||
#![cfg_attr(coverage_nightly, coverage(off))] | ||
stylus_sdk::stylus_proc::sol_interface! { | ||
/// Interface of the ERC-20 token. | ||
interface IErc20 { | ||
function balanceOf(address account) external view returns (uint256); | ||
} | ||
sol_interface! { | ||
/// Interface of the ERC-20 token. | ||
#[allow(missing_docs)] | ||
interface IErc20 { | ||
function balanceOf(address account) external view returns (uint256); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Won't coverage be reduced by including this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeap. It will be reduced, currently the simplest way to compile it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It doesn't compile if you do:
pub use token::IErc20;
mod token {
#![allow(missing_docs)]
#![cfg_attr(coverage_nightly, coverage(off))]
stylus_sdk::prelude::sol_interface! {
/// Interface of the ERC-20 token.
interface IErc20 {
function balanceOf(address account) external view returns (uint256);
}
}
}
? 😮
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IErc20
now made private. So it will de-sugar to struct IErc20
, instead of pub struct IErc20
. And visibility level will be just module wise
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
May be try to change it again in stylus sdk.. pr
@qalisander should we close PR in this repo, since another one is open on the |
…ontract-deployment # Conflicts: # Cargo.lock # Cargo.toml # contracts/src/finance/vesting_wallet.rs # contracts/src/token/erc1155/extensions/metadata_uri.rs # contracts/src/token/erc1155/extensions/uri_storage.rs # contracts/src/token/erc1155/mod.rs # contracts/src/token/erc1155/receiver.rs # contracts/src/token/erc20/extensions/permit.rs # contracts/src/token/erc721/extensions/burnable.rs # contracts/src/token/erc721/extensions/consecutive.rs # contracts/src/token/erc721/extensions/enumerable.rs # contracts/src/token/erc721/extensions/uri_storage.rs # contracts/src/token/erc721/mod.rs # examples/erc20-permit/tests/erc20permit.rs
…ontract-deployment
@0xNeshi I'll keep migration to the new unit-test layout within this pr |
This pr contains migration of unit test to the new layout of motsu unit tests, that will be introduced in OpenZeppelin/stylus-test-helpers#8 and OpenZeppelin/stylus-test-helpers#12
PR Checklist