Skip to content

Commit 12ca23d

Browse files
committed
feat: agency
1 parent 29e2099 commit 12ca23d

25 files changed

+492
-33
lines changed

integration-tests/src/client/deferred.rs

+30-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use candid::{Encode, Nat, Principal};
2-
use did::deferred::{Contract, ContractRegistration, DeferredResult, TokenInfo};
2+
use did::deferred::{Agency, Contract, ContractRegistration, DeferredResult, TokenInfo};
33
use did::ID;
44
use dip721::{GenericValue, NftError, TokenIdentifier, TokenMetadata};
55

@@ -21,12 +21,16 @@ impl<'a> DeferredClient<'a> {
2121
Self { env }
2222
}
2323

24-
pub fn register_contract(&self, data: ContractRegistration) -> DeferredResult<ID> {
24+
pub fn register_contract(
25+
&self,
26+
caller: Principal,
27+
data: ContractRegistration,
28+
) -> DeferredResult<ID> {
2529
let contract_id: DeferredResult<ID> = self
2630
.env
2731
.update(
2832
self.env.deferred_id,
29-
admin(),
33+
caller,
3034
"register_contract",
3135
Encode!(&data).unwrap(),
3236
)
@@ -207,4 +211,27 @@ impl<'a> DeferredClient<'a> {
207211
)
208212
.unwrap()
209213
}
214+
215+
pub fn admin_register_agency(&self, wallet: Principal, agency: Agency) {
216+
let _: () = self
217+
.env
218+
.update(
219+
self.env.deferred_id,
220+
admin(),
221+
"admin_register_agency",
222+
Encode!(&wallet, &agency).unwrap(),
223+
)
224+
.unwrap();
225+
}
226+
227+
pub fn remove_agency(&self, wallet: Principal) -> DeferredResult<()> {
228+
self.env
229+
.update(
230+
self.env.deferred_id,
231+
wallet,
232+
"remove_agency",
233+
Encode!(&wallet).unwrap(),
234+
)
235+
.unwrap()
236+
}
210237
}

integration-tests/tests/inspect/deferred.rs

+18-6
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ fn test_should_inspect_update_contract_property() {
9595
};
9696

9797
// call register
98-
let contract_id = client.register_contract(registration_data).unwrap();
98+
let contract_id = client
99+
.register_contract(admin(), registration_data)
100+
.unwrap();
99101
assert!(env
100102
.update::<DeferredResult<()>>(
101103
env.deferred_id,
@@ -154,7 +156,9 @@ fn test_should_inspect_update_contract_property_is_not_authorized() {
154156
};
155157

156158
// call register
157-
let contract_id = client.register_contract(registration_data).unwrap();
159+
let contract_id = client
160+
.register_contract(admin(), registration_data)
161+
.unwrap();
158162
assert!(env
159163
.update::<DeferredResult<()>>(
160164
env.deferred_id,
@@ -199,7 +203,9 @@ fn test_should_inspect_update_contract_property_bad_key() {
199203
};
200204

201205
// call register
202-
let contract_id = client.register_contract(registration_data).unwrap();
206+
let contract_id = client
207+
.register_contract(admin(), registration_data)
208+
.unwrap();
203209
assert!(env
204210
.update::<DeferredResult<()>>(
205211
env.deferred_id,
@@ -238,7 +244,9 @@ fn test_should_inspect_update_contract_buyers() {
238244
};
239245

240246
// call register
241-
let contract_id = client.register_contract(registration_data).unwrap();
247+
let contract_id = client
248+
.register_contract(admin(), registration_data)
249+
.unwrap();
242250
assert!(env
243251
.update::<DeferredResult<()>>(
244252
env.deferred_id,
@@ -288,7 +296,9 @@ fn test_should_inspect_update_contract_buyers_not_seller() {
288296
};
289297

290298
// call register
291-
let contract_id = client.register_contract(registration_data).unwrap();
299+
let contract_id = client
300+
.register_contract(admin(), registration_data)
301+
.unwrap();
292302
assert!(env
293303
.update::<DeferredResult<()>>(
294304
env.deferred_id,
@@ -444,7 +454,9 @@ fn test_should_inspect_burn() {
444454
)],
445455
};
446456

447-
let contract_id = client.register_contract(registration_data).unwrap();
457+
let contract_id = client
458+
.register_contract(admin(), registration_data)
459+
.unwrap();
448460
assert!(client.admin_sign_contract(contract_id.clone()).is_ok());
449461

450462
// transfer token to buyer

integration-tests/tests/use_case/buy_marketplace_nft.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use did::deferred::{ContractRegistration, ContractType, GenericValue, Seller, ID};
22
use icrc::icrc1::account::Account;
3-
use integration_tests::actor::{alice, alice_account, bob, charlie, charlie_account};
3+
use integration_tests::actor::{admin, alice, alice_account, bob, charlie, charlie_account};
44
use integration_tests::client::{DeferredClient, IcrcLedgerClient, MarketplaceClient};
55
use integration_tests::TestEnv;
66
use pretty_assertions::{assert_eq, assert_ne};
@@ -130,7 +130,7 @@ fn setup_contract_marketplace(env: &TestEnv) -> ID {
130130
};
131131
// call register
132132
let contract_id = deferred_client
133-
.register_contract(registration_data)
133+
.register_contract(admin(), registration_data)
134134
.unwrap();
135135
assert_eq!(contract_id, 0_u64);
136136

integration-tests/tests/use_case/increment_contract_value.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use did::deferred::{ContractRegistration, ContractType, GenericValue, Seller};
2-
use integration_tests::actor::alice;
2+
use integration_tests::actor::{admin, alice};
33
use integration_tests::client::DeferredClient;
44
use integration_tests::TestEnv;
55
use pretty_assertions::assert_eq;
@@ -28,7 +28,7 @@ fn test_as_seller_i_can_set_the_contract_buyers() {
2828

2929
// call register
3030
let contract_id = deferred_client
31-
.register_contract(registration_data)
31+
.register_contract(admin(), registration_data)
3232
.unwrap();
3333

3434
// sign contract

integration-tests/tests/use_case/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
mod buy_marketplace_nft;
22
mod icrc2_spend;
33
mod increment_contract_value;
4+
mod register_agency;
45
mod register_contract_buyers;
56
mod register_sell_contract;
67
mod reserve_reward_pool;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
use candid::Nat;
2+
use did::deferred::{Agency, ContractRegistration, ContractType, GenericValue, Seller};
3+
use integration_tests::actor::{alice, bob};
4+
use integration_tests::client::DeferredClient;
5+
use integration_tests::TestEnv;
6+
use pretty_assertions::assert_eq;
7+
8+
#[test]
9+
#[serial_test::serial]
10+
fn test_should_register_agency_and_be_able_to_create_contract() {
11+
let env = TestEnv::init();
12+
let deferred_client = DeferredClient::from(&env);
13+
14+
let registration_data = ContractRegistration {
15+
r#type: ContractType::Sell,
16+
sellers: vec![Seller {
17+
principal: alice(),
18+
quota: 100,
19+
}],
20+
buyers: vec![],
21+
value: 400_000,
22+
currency: "EUR".to_string(),
23+
installments: 400_000 / 100,
24+
properties: vec![(
25+
"contract:address".to_string(),
26+
GenericValue::TextContent("via roma 10".to_string()),
27+
)],
28+
};
29+
30+
// give bob an agency
31+
deferred_client.admin_register_agency(
32+
bob(),
33+
Agency {
34+
name: "Bob's agency".to_string(),
35+
address: "Via Delle Botteghe Scure".to_string(),
36+
city: "Rome".to_string(),
37+
region: "Lazio".to_string(),
38+
zip_code: "00100".to_string(),
39+
country: "Italy".to_string(),
40+
continent: did::deferred::Continent::Europe,
41+
email: "email".to_string(),
42+
website: "website".to_string(),
43+
mobile: "mobile".to_string(),
44+
vat: "vat".to_string(),
45+
agent: "agent".to_string(),
46+
logo: None,
47+
},
48+
);
49+
50+
// call register
51+
let contract_id = deferred_client
52+
.register_contract(bob(), registration_data.clone())
53+
.unwrap();
54+
assert_eq!(contract_id, 0_u64);
55+
56+
// check unsigned contract and signed contracts
57+
let unsigned_contracts = deferred_client.admin_get_unsigned_contracts();
58+
assert_eq!(unsigned_contracts, vec![contract_id.clone()]);
59+
let signed_contract = deferred_client.get_signed_contracts();
60+
assert!(signed_contract.is_empty());
61+
62+
// sign contract
63+
let res = deferred_client.admin_sign_contract(Nat::from(0_u64));
64+
assert!(res.is_ok());
65+
66+
// agency could remove himself
67+
assert!(deferred_client.remove_agency(bob()).is_ok());
68+
}

integration-tests/tests/use_case/register_contract_buyers.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use did::deferred::{ContractRegistration, ContractType, GenericValue, Seller};
2-
use integration_tests::actor::{alice, bob};
2+
use integration_tests::actor::{admin, alice, bob};
33
use integration_tests::client::DeferredClient;
44
use integration_tests::TestEnv;
55
use pretty_assertions::assert_eq;
@@ -28,7 +28,7 @@ fn test_as_seller_i_can_set_the_contract_buyers() {
2828

2929
// call register
3030
let contract_id = deferred_client
31-
.register_contract(registration_data)
31+
.register_contract(admin(), registration_data)
3232
.unwrap();
3333

3434
// sign contract

integration-tests/tests/use_case/register_sell_contract.rs

+25-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use candid::Nat;
2-
use did::deferred::{ContractRegistration, ContractType, GenericValue, Seller};
3-
use integration_tests::actor::{alice, bob};
2+
use did::deferred::{Agency, ContractRegistration, ContractType, GenericValue, Seller};
3+
use integration_tests::actor::{admin, alice, bob};
44
use integration_tests::client::DeferredClient;
55
use integration_tests::TestEnv;
66
use pretty_assertions::assert_eq;
@@ -33,9 +33,27 @@ fn test_as_seller_i_can_register_a_sell_contract() {
3333
)],
3434
};
3535

36+
// register agency for admin
37+
let agency = Agency {
38+
name: "Admin's agency".to_string(),
39+
address: "Via Delle Botteghe Scure".to_string(),
40+
city: "Rome".to_string(),
41+
region: "Lazio".to_string(),
42+
zip_code: "00100".to_string(),
43+
country: "Italy".to_string(),
44+
continent: did::deferred::Continent::Europe,
45+
email: "email".to_string(),
46+
website: "website".to_string(),
47+
mobile: "mobile".to_string(),
48+
vat: "vat".to_string(),
49+
agent: "agent".to_string(),
50+
logo: None,
51+
};
52+
deferred_client.admin_register_agency(admin(), agency.clone());
53+
3654
// call register
3755
let contract_id = deferred_client
38-
.register_contract(registration_data)
56+
.register_contract(admin(), registration_data)
3957
.unwrap();
4058
assert_eq!(contract_id, 0_u64);
4159

@@ -49,6 +67,10 @@ fn test_as_seller_i_can_register_a_sell_contract() {
4967
let res = deferred_client.admin_sign_contract(Nat::from(0_u64));
5068
assert!(res.is_ok());
5169

70+
// get contract
71+
let contract = deferred_client.get_contract(&contract_id).unwrap();
72+
assert_eq!(contract.agency.unwrap(), agency);
73+
5274
// check unsigned contract and signed contracts
5375
let unsigned_contracts = deferred_client.admin_get_unsigned_contracts();
5476
assert!(unsigned_contracts.is_empty());

integration-tests/tests/use_case/reserve_reward_pool.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use candid::Nat;
22
use did::deferred::{ContractRegistration, ContractType, Seller};
33
use dip721::GenericValue;
44
use icrc::icrc1::account::Account;
5-
use integration_tests::actor::alice;
5+
use integration_tests::actor::{admin, alice};
66
use integration_tests::client::{DeferredClient, EkokeClient};
77
use integration_tests::{ekoke_to_picoekoke, TestEnv};
88

@@ -33,7 +33,7 @@ fn test_should_reserve_a_reward_pool_on_ekoke() {
3333

3434
// call register
3535
let contract_id = deferred_client
36-
.register_contract(registration_data)
36+
.register_contract(admin(), registration_data)
3737
.unwrap();
3838
assert_eq!(contract_id, 0_u64);
3939

integration-tests/tests/use_case/update_contract_property.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use did::deferred::{ContractRegistration, ContractType, GenericValue, Seller};
2-
use integration_tests::actor::{alice, bob};
2+
use integration_tests::actor::{admin, alice, bob};
33
use integration_tests::client::DeferredClient;
44
use integration_tests::TestEnv;
55
use pretty_assertions::assert_eq;
@@ -40,7 +40,7 @@ fn test_should_update_contract_property() {
4040

4141
// call register
4242
let contract_id = deferred_client
43-
.register_contract(registration_data)
43+
.register_contract(admin(), registration_data)
4444
.unwrap();
4545

4646
let res = deferred_client.admin_sign_contract(contract_id.clone());

src/declarations/deferred/deferred.did.d.ts

+26
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,21 @@ import type { Principal } from '@dfinity/principal';
22
import type { ActorMethod } from '@dfinity/agent';
33
import type { IDL } from '@dfinity/candid';
44

5+
export interface Agency {
6+
'vat' : string,
7+
'region' : string,
8+
'zip_code' : string,
9+
'country' : string,
10+
'agent' : string,
11+
'city' : string,
12+
'logo' : [] | [string],
13+
'name' : string,
14+
'continent' : Continent,
15+
'email' : string,
16+
'website' : string,
17+
'address' : string,
18+
'mobile' : string,
19+
}
520
export type AllowanceError = { 'AllowanceNotFound' : null } |
621
{ 'BadSpender' : null } |
722
{ 'AllowanceChanged' : null } |
@@ -25,11 +40,19 @@ export type ConfigurationError = { 'AdminsCantBeEmpty' : null } |
2540
{ 'AnonymousAdmin' : null };
2641
export type ConfigurationError_1 = { 'CustodialsCantBeEmpty' : null } |
2742
{ 'AnonymousCustodial' : null };
43+
export type Continent = { 'Africa' : null } |
44+
{ 'Antarctica' : null } |
45+
{ 'Asia' : null } |
46+
{ 'Europe' : null } |
47+
{ 'SouthAmerica' : null } |
48+
{ 'Oceania' : null } |
49+
{ 'NorthAmerica' : null };
2850
export interface Contract {
2951
'id' : bigint,
3052
'value' : bigint,
3153
'type' : ContractType,
3254
'is_signed' : boolean,
55+
'agency' : [] | [Agency],
3356
'properties' : Array<[string, GenericValue]>,
3457
'sellers' : Array<Seller>,
3558
'tokens' : Array<bigint>,
@@ -252,6 +275,7 @@ export type Vec = Array<
252275
>;
253276
export interface _SERVICE {
254277
'admin_get_unsigned_contracts' : ActorMethod<[], Array<bigint>>,
278+
'admin_register_agency' : ActorMethod<[Principal, Agency], undefined>,
255279
'admin_remove_role' : ActorMethod<[Principal, Role], Result>,
256280
'admin_set_ekoke_canister' : ActorMethod<[Principal], undefined>,
257281
'admin_set_marketplace_canister' : ActorMethod<[Principal], undefined>,
@@ -262,6 +286,7 @@ export interface _SERVICE {
262286
'burn' : ActorMethod<[bigint], Result_1>,
263287
'custodians' : ActorMethod<[], Array<Principal>>,
264288
'cycles' : ActorMethod<[], bigint>,
289+
'get_agencies' : ActorMethod<[], Array<Agency>>,
265290
'get_contract' : ActorMethod<[bigint], [] | [Contract]>,
266291
'get_signed_contracts' : ActorMethod<[], Array<bigint>>,
267292
'get_token' : ActorMethod<[bigint], [] | [TokenInfo]>,
@@ -280,6 +305,7 @@ export interface _SERVICE {
280305
'owner_token_identifiers' : ActorMethod<[Principal], Result_4>,
281306
'owner_token_metadata' : ActorMethod<[Principal], Result_5>,
282307
'register_contract' : ActorMethod<[ContractRegistration], Result_6>,
308+
'remove_agency' : ActorMethod<[Principal], Result>,
283309
'seller_increment_contract_value' : ActorMethod<
284310
[bigint, bigint, bigint],
285311
Result

0 commit comments

Comments
 (0)