From 39e2316b4526f9eaa687c26680180cd26f9565cb Mon Sep 17 00:00:00 2001 From: Vladas <146100@gmail.com> Date: Mon, 12 Feb 2024 14:33:08 +0200 Subject: [PATCH] feat: contract call as future in integration tests --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- integration-tests/src/callback_attack.rs | 4 ++-- integration-tests/src/defer.rs | 8 ++------ integration-tests/src/formula.rs | 3 +-- integration-tests/src/lib.rs | 6 ++---- integration-tests/src/measure/record_batch.rs | 4 +++- integration-tests/src/mint.rs | 15 +++++---------- integration-tests/src/prepare.rs | 12 ++---------- integration-tests/src/transfer.rs | 15 ++++----------- res/sweat.wasm | Bin 221048 -> 221048 bytes 11 files changed, 25 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 25f8e1a..3faff27 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1772,7 +1772,7 @@ dependencies = [ [[package]] name = "integration-trait" version = "0.1.0" -source = "git+https://github.com/sweatco/integration-utils.git?rev=26876acf2c93e29463a83e550ff408f4cf404bd6#26876acf2c93e29463a83e550ff408f4cf404bd6" +source = "git+https://github.com/sweatco/integration-utils.git?rev=e3e186319ec84d9ff92c67bb6a807eaf3f2d0977#e3e186319ec84d9ff92c67bb6a807eaf3f2d0977" dependencies = [ "proc-macro2", "quote", @@ -1782,7 +1782,7 @@ dependencies = [ [[package]] name = "integration-utils" version = "0.1.0" -source = "git+https://github.com/sweatco/integration-utils.git?rev=26876acf2c93e29463a83e550ff408f4cf404bd6#26876acf2c93e29463a83e550ff408f4cf404bd6" +source = "git+https://github.com/sweatco/integration-utils.git?rev=e3e186319ec84d9ff92c67bb6a807eaf3f2d0977#e3e186319ec84d9ff92c67bb6a807eaf3f2d0977" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index 9f7810f..135469d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ near-workspaces = "0.10.0" near-sdk = { git = "https://github.com/sweatco/near-sdk-rs", rev = "8c48b26cc48d969c1e5f3162141fe9c824fccecd" } near-contract-standards = { git = "https://github.com/sweatco/near-sdk-rs", rev = "8c48b26cc48d969c1e5f3162141fe9c824fccecd" } -integration-trait = { git = "https://github.com/sweatco/integration-utils.git", rev = "26876acf2c93e29463a83e550ff408f4cf404bd6" } -integration-utils = { git = "https://github.com/sweatco/integration-utils.git", rev = "26876acf2c93e29463a83e550ff408f4cf404bd6" } +integration-trait = { git = "https://github.com/sweatco/integration-utils.git", rev = "e3e186319ec84d9ff92c67bb6a807eaf3f2d0977" } +integration-utils = { git = "https://github.com/sweatco/integration-utils.git", rev = "e3e186319ec84d9ff92c67bb6a807eaf3f2d0977" } sweat-model = { path = "model" } diff --git a/integration-tests/src/callback_attack.rs b/integration-tests/src/callback_attack.rs index 2979744..2ad734d 100644 --- a/integration-tests/src/callback_attack.rs +++ b/integration-tests/src/callback_attack.rs @@ -16,7 +16,7 @@ async fn test_call_on_record_in_callback() -> anyhow::Result<()> { let alice = context.alice().await?; - let alice_balance_before_attack = context.ft_contract().ft_balance_of(alice.to_near()).call().await?; + let alice_balance_before_attack = context.ft_contract().ft_balance_of(alice.to_near()).await?; let ft_contract_id = context.ft_contract().account(); let target_amount = U128(1_000_000); @@ -33,7 +33,7 @@ async fn test_call_on_record_in_callback() -> anyhow::Result<()> { assert!(result.has_panic("Method on_record is private")); - let alice_balance_after_attack = context.ft_contract().ft_balance_of(alice.to_near()).call().await?; + let alice_balance_after_attack = context.ft_contract().ft_balance_of(alice.to_near()).await?; assert_eq!(alice_balance_before_attack, alice_balance_after_attack); Ok(()) diff --git a/integration-tests/src/defer.rs b/integration-tests/src/defer.rs index ec031b0..5a8df3f 100644 --- a/integration-tests/src/defer.rs +++ b/integration-tests/src/defer.rs @@ -19,7 +19,6 @@ async fn test_defer() -> anyhow::Result<()> { let holder_balance = context .ft_contract() .ft_balance_of(claim_contract_account.clone()) - .call() .await?; assert_eq!(holder_balance.0, 0); @@ -27,7 +26,6 @@ async fn test_defer() -> anyhow::Result<()> { let (total_fee, total_for_user) = context .ft_contract() .calculate_payout_with_fee_for_batch(BATCH_SIZE, CLAIM_AMOUNT) - .call() .await?; let batch: Vec<_> = (0..BATCH_SIZE).map(|_| (alice.to_near(), CLAIM_AMOUNT)).collect(); @@ -36,19 +34,17 @@ async fn test_defer() -> anyhow::Result<()> { .ft_contract() .defer_batch(batch, claim_contract_account.clone()) .with_user(&oracle) - .call() .await?; - let alice_balance = context.ft_contract().ft_balance_of(alice.to_near()).call().await?; + let alice_balance = context.ft_contract().ft_balance_of(alice.to_near()).await?; assert_eq!(0, alice_balance.0); let claim_contract_balance = context .ft_contract() .ft_balance_of(claim_contract_account.clone()) - .call() .await?; - let oracle_balance = context.ft_contract().ft_balance_of(oracle.to_near()).call().await?; + let oracle_balance = context.ft_contract().ft_balance_of(oracle.to_near()).await?; assert_eq!(oracle_balance, total_fee); assert_eq!(claim_contract_balance, total_for_user); diff --git a/integration-tests/src/formula.rs b/integration-tests/src/formula.rs index bcce2a5..f2abed6 100644 --- a/integration-tests/src/formula.rs +++ b/integration-tests/src/formula.rs @@ -12,7 +12,7 @@ async fn test_formula() -> Result<()> { let oracle = context.oracle().await?; - let steps = context.ft_contract().get_steps_since_tge().call().await?; + let steps = context.ft_contract().get_steps_since_tge().await?; assert_eq!(0, steps.0); @@ -43,7 +43,6 @@ async fn test_formula() -> Result<()> { .ft_contract() .formula(U64(tge), steps) .with_user(&oracle) - .call() .await? .0; diff --git a/integration-tests/src/lib.rs b/integration-tests/src/lib.rs index bf20162..e6d078b 100644 --- a/integration-tests/src/lib.rs +++ b/integration-tests/src/lib.rs @@ -24,18 +24,17 @@ async fn happy_flow() -> anyhow::Result<()> { assert_eq!( 99999995378125008, - context.ft_contract().formula(100_000.into(), 100).call().await?.0 + context.ft_contract().formula(100_000.into(), 100).await?.0 ); context .ft_contract() .tge_mint(&alice.to_near(), 100_000_000.into()) - .call() .await?; assert_eq!( 100_000_000, - context.ft_contract().ft_balance_of(alice.to_near()).call().await?.0 + context.ft_contract().ft_balance_of(alice.to_near()).await?.0 ); context @@ -45,7 +44,6 @@ async fn happy_flow() -> anyhow::Result<()> { context.claim_contract().as_account().to_near(), ) .with_user(&oracle) - .call() .await?; Ok(()) diff --git a/integration-tests/src/measure/record_batch.rs b/integration-tests/src/measure/record_batch.rs index dbf74b2..0f081f7 100644 --- a/integration-tests/src/measure/record_batch.rs +++ b/integration-tests/src/measure/record_batch.rs @@ -1,5 +1,7 @@ #![cfg(test)] +use std::future::IntoFuture; + use anyhow::Result; use integration_utils::measure::outcome_storage::OutcomeStorage; use near_workspaces::types::Gas; @@ -28,7 +30,7 @@ async fn measure_record_batch() -> Result { .ft_contract() .record_batch(Default::default()) .with_user(&oracle) - .call(), + .into_future(), ) .await?; diff --git a/integration-tests/src/mint.rs b/integration-tests/src/mint.rs index 748f41a..512a6d2 100644 --- a/integration-tests/src/mint.rs +++ b/integration-tests/src/mint.rs @@ -13,32 +13,27 @@ async fn test_mint() -> anyhow::Result<()> { let user = context.alice().await?; let oracle = context.oracle().await?; - let result = context.ft_contract().get_steps_since_tge().call().await?; + let result = context.ft_contract().get_steps_since_tge().await?; assert_eq!(result, U64(0)); - let result = context - .ft_contract() - .formula(U64(0), TARGET_STEPS_SINCE_TGE) - .call() - .await?; + let result = context.ft_contract().formula(U64(0), TARGET_STEPS_SINCE_TGE).await?; assert_eq!(result, U128(TARGET_BALANCE)); context .ft_contract() .record_batch(vec![(user.to_near(), 10_000u32)]) .with_user(&oracle) - .call() .await?; let target_payout = Payout::from(TARGET_BALANCE); - let result = context.ft_contract().ft_balance_of(oracle.to_near()).call().await?; + let result = context.ft_contract().ft_balance_of(oracle.to_near()).await?; assert_eq!(result, U128(target_payout.fee)); - let result = context.ft_contract().ft_balance_of(user.to_near()).call().await?; + let result = context.ft_contract().ft_balance_of(user.to_near()).await?; assert_eq!(result, U128(target_payout.amount_for_user)); - let result = context.ft_contract().get_steps_since_tge().call().await?; + let result = context.ft_contract().get_steps_since_tge().await?; assert_eq!(result, U64(TARGET_STEPS_SINCE_TGE as u64)); Ok(()) diff --git a/integration-tests/src/prepare.rs b/integration-tests/src/prepare.rs index a68af7a..430dccc 100644 --- a/integration-tests/src/prepare.rs +++ b/integration-tests/src/prepare.rs @@ -68,31 +68,24 @@ pub async fn prepare_contract() -> Result { let long = context.long_account_name().await?; let token_account_id = context.ft_contract().contract.as_account().to_near(); - context - .ft_contract() - .new(".u.sweat.testnet".to_string().into()) - .call() - .await?; + context.ft_contract().new(".u.sweat.testnet".to_string().into()).await?; context .ft_contract() .storage_deposit(oracle.to_near().into(), None) - .call() .await?; context .ft_contract() .storage_deposit(alice.to_near().into(), None) - .call() .await?; context .ft_contract() .storage_deposit(long.to_near().into(), None) - .call() .await?; - context.ft_contract().add_oracle(&oracle.to_near()).call().await?; + context.ft_contract().add_oracle(&oracle.to_near()).await?; let claim_contract_result = context .claim_contract() @@ -127,7 +120,6 @@ pub async fn prepare_contract() -> Result { context .ft_contract() .storage_deposit(context.claim_contract().as_account().to_near().into(), None) - .call() .await?; Ok(context) diff --git a/integration-tests/src/transfer.rs b/integration-tests/src/transfer.rs index 1a994c6..87e9e78 100644 --- a/integration-tests/src/transfer.rs +++ b/integration-tests/src/transfer.rs @@ -15,7 +15,6 @@ async fn test_transfer() -> anyhow::Result<()> { .ft_contract() .record_batch(vec![(alice.to_near(), 10_000)]) .with_user(&oracle) - .call() .await?; // This will fail because storage is not registered for this new account @@ -23,18 +22,13 @@ async fn test_transfer() -> anyhow::Result<()> { .ft_contract() .ft_transfer(bob.to_near(), U128(9499999991723028480), None) .with_user(&alice) - .call() .await; assert!(res.is_err()); - let res = context - .ft_contract() - .storage_deposit(Some(bob.to_near()), None) - .call() - .await; + let res = context.ft_contract().storage_deposit(Some(bob.to_near()), None).await; assert!(res.is_ok()); - let alice_balance = context.ft_contract().ft_balance_of(alice.to_near()).call().await?; + let alice_balance = context.ft_contract().ft_balance_of(alice.to_near()).await?; assert_ne!(U128(0), alice_balance); // Transfer all tokens from alice to new account @@ -42,13 +36,12 @@ async fn test_transfer() -> anyhow::Result<()> { .ft_contract() .ft_transfer(bob.to_near(), alice_balance, None) .with_user(&alice) - .call() .await?; - let alice_balance_updated = context.ft_contract().ft_balance_of(alice.to_near()).call().await?; + let alice_balance_updated = context.ft_contract().ft_balance_of(alice.to_near()).await?; assert_eq!(U128(0), alice_balance_updated); - let bob_balance = context.ft_contract().ft_balance_of(bob.to_near()).call().await?; + let bob_balance = context.ft_contract().ft_balance_of(bob.to_near()).await?; assert_eq!(alice_balance, bob_balance); Ok(()) diff --git a/res/sweat.wasm b/res/sweat.wasm index 2c9a9c46d97a17588220ff1c51fced37a708a0c6..c459d82439d46ec0bc867c293b8f66d3a25b21ef 100755 GIT binary patch delta 17034 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 W|5Etx?Re~90d*L0oYy39&Cl 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