Skip to content

Commit 42709fa

Browse files
author
dj8yf0μl
committed
test: integration tests for self-updates
1 parent a7b7086 commit 42709fa

File tree

8 files changed

+201
-5088
lines changed

8 files changed

+201
-5088
lines changed

contracts/Cargo.lock

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contracts/basic-updates/update/tests/workspaces.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use rstest::{fixture, rstest};
22
use std::fs;
33

4-
use near_workspaces::{network::Sandbox, types::NearToken, Account, Contract, Worker};
4+
use near_workspaces::{types::NearToken, Account, Contract};
55
use serde_json::json;
66

77
use near_sdk::{json_types::U128, AccountId};
@@ -10,8 +10,6 @@ const ONE_TENTH_NEAR: NearToken = NearToken::from_millinear(100);
1010
const NINE_HUNDREDTH_NEAR: NearToken = NearToken::from_millinear(90);
1111

1212
struct Common {
13-
#[allow(unused)]
14-
sandbox: Worker<Sandbox>,
1513
contract: Contract,
1614
alice: Account,
1715
guest_book: Account,
@@ -55,7 +53,6 @@ async fn base_contract() -> Common {
5553
assert!(alice_first_message_outcome.is_success());
5654

5755
Common {
58-
sandbox,
5956
contract,
6057
alice,
6158
guest_book: guest_book_account,

contracts/self-updates/update/Cargo.toml

+7
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,10 @@ crate-type = ["cdylib"]
99

1010
[dependencies]
1111
near-sdk = { version = "5.0.0", features = ["legacy"] }
12+
13+
[dev-dependencies]
14+
near-sdk = { version = "5.0.0" }
15+
near-workspaces = { version = "0.10.0", features = ["unstable"] }
16+
tokio = { version = "1.12.0", features = ["full"] }
17+
serde_json = "1"
18+
rstest = "0.18.2"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
use std::fs;
2+
3+
use near_sdk::json_types::U128;
4+
use near_sdk::{AccountId, Gas};
5+
use near_workspaces::types::NearToken;
6+
use near_workspaces::Account;
7+
use near_workspaces::Contract;
8+
use rstest::{fixture, rstest};
9+
use serde_json::json;
10+
11+
const ONE_TENTH_NEAR: NearToken = NearToken::from_millinear(100);
12+
const NINE_HUNDREDTH_NEAR: NearToken = NearToken::from_millinear(90);
13+
14+
struct Common {
15+
contract: Contract,
16+
alice: Account,
17+
bob: Account,
18+
guest_book: Account,
19+
}
20+
21+
#[fixture]
22+
async fn base_contract() -> Common {
23+
let sandbox = near_workspaces::sandbox().await.unwrap();
24+
25+
fs::create_dir_all("../../target/near/self_base").unwrap();
26+
let contract_wasm = near_workspaces::compile_project("../base").await.unwrap();
27+
28+
let alice = sandbox.dev_create_account().await.unwrap();
29+
let guest_book_account = sandbox.dev_create_account().await.unwrap();
30+
31+
let contract = guest_book_account
32+
.deploy(&contract_wasm)
33+
.await
34+
.unwrap()
35+
.into_result()
36+
.unwrap();
37+
38+
let guest_book_init_outcome = guest_book_account
39+
.call(contract.id(), "init")
40+
.args_json(json!({"manager": alice.id().to_string() }))
41+
.transact()
42+
.await
43+
.unwrap();
44+
45+
assert!(guest_book_init_outcome.is_success());
46+
47+
let bob = sandbox.dev_create_account().await.unwrap();
48+
49+
let bob_first_message_outcome = bob
50+
.call(contract.id(), "add_message")
51+
.args_json(json!({"text": "hello"}))
52+
.deposit(NINE_HUNDREDTH_NEAR)
53+
.transact()
54+
.await
55+
.unwrap();
56+
57+
assert!(bob_first_message_outcome.is_success());
58+
59+
let alice_first_message_outcome = alice
60+
.call(contract.id(), "add_message")
61+
.args_json(json!({"text": "bye"}))
62+
.deposit(ONE_TENTH_NEAR)
63+
.transact()
64+
.await
65+
.unwrap();
66+
67+
assert!(alice_first_message_outcome.is_success());
68+
69+
Common {
70+
contract,
71+
alice,
72+
bob,
73+
guest_book: guest_book_account,
74+
}
75+
}
76+
77+
#[rstest]
78+
#[tokio::test]
79+
async fn test_self_updates_base_contract_returns(
80+
#[future] base_contract: Common,
81+
) -> Result<(), Box<dyn std::error::Error>> {
82+
let base_contract = base_contract.await;
83+
84+
#[derive(near_sdk::serde::Deserialize, Debug, PartialEq, Eq)]
85+
#[serde(crate = "near_sdk::serde")]
86+
pub struct PostedMessage {
87+
pub premium: bool,
88+
pub sender: AccountId,
89+
pub text: String,
90+
}
91+
let messages_vec: Vec<PostedMessage> = base_contract
92+
.contract
93+
.view("get_messages")
94+
.args_json(json!({}))
95+
.await?
96+
.json()?;
97+
98+
assert_eq!(
99+
messages_vec,
100+
vec![
101+
PostedMessage {
102+
premium: false,
103+
sender: base_contract.bob.id().clone(),
104+
text: "hello".to_string(),
105+
},
106+
PostedMessage {
107+
premium: true,
108+
sender: base_contract.alice.id().clone(),
109+
text: "bye".to_string(),
110+
},
111+
]
112+
);
113+
114+
let payments_vec: Vec<U128> = base_contract
115+
.contract
116+
.view("get_payments")
117+
.args_json(json!({}))
118+
.await?
119+
.json()?;
120+
121+
assert_eq!(
122+
payments_vec,
123+
vec![
124+
U128(NINE_HUNDREDTH_NEAR.as_yoctonear()),
125+
U128(ONE_TENTH_NEAR.as_yoctonear())
126+
]
127+
);
128+
129+
Ok(())
130+
}
131+
132+
#[rstest]
133+
#[tokio::test]
134+
async fn test_self_updates_update_by_manager(
135+
#[future] base_contract: Common,
136+
) -> Result<(), Box<dyn std::error::Error>> {
137+
let base_contract = base_contract.await;
138+
139+
fs::create_dir_all("../../target/near/self_update").unwrap();
140+
let updated_contract_wasm = near_workspaces::compile_project("./").await.unwrap();
141+
142+
let manager_update_call_outcome = base_contract
143+
.alice
144+
.call(base_contract.guest_book.id(), "update_contract")
145+
.args(updated_contract_wasm)
146+
.gas(Gas::from_tgas(300))
147+
.transact()
148+
.await
149+
.unwrap();
150+
151+
assert!(manager_update_call_outcome.is_success());
152+
153+
let contract = base_contract.contract;
154+
155+
#[derive(near_sdk::serde::Deserialize, Debug, PartialEq, Eq)]
156+
#[serde(crate = "near_sdk::serde")]
157+
pub struct PostedMessage {
158+
pub payment: NearToken,
159+
pub premium: bool,
160+
pub sender: AccountId,
161+
pub text: String,
162+
}
163+
let messages_vec: Vec<PostedMessage> = contract
164+
.view("get_messages")
165+
.args_json(json!({}))
166+
.await?
167+
.json()?;
168+
assert_eq!(
169+
messages_vec,
170+
vec![
171+
PostedMessage {
172+
payment: NINE_HUNDREDTH_NEAR,
173+
premium: false,
174+
sender: base_contract.bob.id().clone(),
175+
text: "hello".to_string(),
176+
},
177+
PostedMessage {
178+
payment: ONE_TENTH_NEAR,
179+
premium: true,
180+
sender: base_contract.alice.id().clone(),
181+
text: "bye".to_string(),
182+
},
183+
]
184+
);
185+
let get_payments_result = contract.view("get_payments").args_json(json!({})).await;
186+
187+
assert!(get_payments_result.is_err());
188+
Ok(())
189+
}

integration-tests/ava.config.cjs

-9
This file was deleted.

0 commit comments

Comments
 (0)