|
| 1 | +use soroban_sdk::{testutils::Address as _, Address, Env}; |
| 2 | + |
| 3 | +use crate::balance::read_balance; |
| 4 | +use crate::contract::VeritixToken; |
| 5 | +use crate::dispute::{get_dispute, open_dispute, resolve_dispute, DisputeStatus}; |
| 6 | +use crate::escrow::{create_escrow, get_escrow}; |
| 7 | + |
| 8 | +fn setup_env() -> Env { |
| 9 | + let e = Env::default(); |
| 10 | + e.mock_all_auths(); |
| 11 | + e |
| 12 | +} |
| 13 | + |
| 14 | +fn setup_escrow(e: &Env, contract_id: &Address) -> (Address, Address, u32) { |
| 15 | + let depositor = Address::generate(e); |
| 16 | + let beneficiary = Address::generate(e); |
| 17 | + let amount = 1_000i128; |
| 18 | + let mut escrow_id = 0u32; |
| 19 | + e.as_contract(contract_id, || { |
| 20 | + crate::balance::receive_balance(e, depositor.clone(), amount); |
| 21 | + escrow_id = create_escrow(e, depositor.clone(), beneficiary.clone(), amount); |
| 22 | + }); |
| 23 | + (depositor, beneficiary, escrow_id) |
| 24 | +} |
| 25 | + |
| 26 | +#[test] |
| 27 | +fn test_open_dispute_stores_record() { |
| 28 | + let e = setup_env(); |
| 29 | + let contract_id = e.register_contract(None, VeritixToken); |
| 30 | + let resolver = Address::generate(&e); |
| 31 | + let (depositor, _beneficiary, escrow_id) = setup_escrow(&e, &contract_id); |
| 32 | + |
| 33 | + e.as_contract(&contract_id, || { |
| 34 | + let dispute_id = open_dispute(&e, depositor.clone(), escrow_id, resolver.clone()); |
| 35 | + let record = get_dispute(&e, dispute_id); |
| 36 | + assert_eq!(record.escrow_id, escrow_id); |
| 37 | + assert_eq!(record.claimant, depositor); |
| 38 | + assert_eq!(record.resolver, resolver); |
| 39 | + assert_eq!(record.status, DisputeStatus::Open); |
| 40 | + }); |
| 41 | +} |
| 42 | + |
| 43 | +#[test] |
| 44 | +fn test_resolve_dispute_for_beneficiary() { |
| 45 | + let e = setup_env(); |
| 46 | + let contract_id = e.register_contract(None, VeritixToken); |
| 47 | + let resolver = Address::generate(&e); |
| 48 | + let (_depositor, beneficiary, escrow_id) = setup_escrow(&e, &contract_id); |
| 49 | + |
| 50 | + e.as_contract(&contract_id, || { |
| 51 | + let dispute_id = |
| 52 | + open_dispute(&e, beneficiary.clone(), escrow_id, resolver.clone()); |
| 53 | + resolve_dispute(&e, resolver.clone(), dispute_id, true); |
| 54 | + |
| 55 | + let record = get_dispute(&e, dispute_id); |
| 56 | + assert_eq!(record.status, DisputeStatus::ResolvedForBeneficiary); |
| 57 | + |
| 58 | + let escrow = get_escrow(&e, escrow_id); |
| 59 | + assert!(escrow.released); |
| 60 | + |
| 61 | + assert_eq!(read_balance(&e, beneficiary.clone()), 1_000); |
| 62 | + }); |
| 63 | +} |
| 64 | + |
| 65 | +#[test] |
| 66 | +fn test_resolve_dispute_for_depositor() { |
| 67 | + let e = setup_env(); |
| 68 | + let contract_id = e.register_contract(None, VeritixToken); |
| 69 | + let resolver = Address::generate(&e); |
| 70 | + let (depositor, _beneficiary, escrow_id) = setup_escrow(&e, &contract_id); |
| 71 | + |
| 72 | + e.as_contract(&contract_id, || { |
| 73 | + let dispute_id = |
| 74 | + open_dispute(&e, depositor.clone(), escrow_id, resolver.clone()); |
| 75 | + resolve_dispute(&e, resolver.clone(), dispute_id, false); |
| 76 | + |
| 77 | + let record = get_dispute(&e, dispute_id); |
| 78 | + assert_eq!(record.status, DisputeStatus::ResolvedForDepositor); |
| 79 | + |
| 80 | + let escrow = get_escrow(&e, escrow_id); |
| 81 | + assert!(escrow.refunded); |
| 82 | + |
| 83 | + assert_eq!(read_balance(&e, depositor.clone()), 1_000); |
| 84 | + }); |
| 85 | +} |
| 86 | + |
| 87 | +#[test] |
| 88 | +#[should_panic(expected = "UnauthorizedResolver")] |
| 89 | +fn test_resolve_dispute_wrong_resolver_panics() { |
| 90 | + let e = setup_env(); |
| 91 | + let contract_id = e.register_contract(None, VeritixToken); |
| 92 | + let resolver = Address::generate(&e); |
| 93 | + let impostor = Address::generate(&e); |
| 94 | + let (depositor, _beneficiary, escrow_id) = setup_escrow(&e, &contract_id); |
| 95 | + |
| 96 | + e.as_contract(&contract_id, || { |
| 97 | + let dispute_id = open_dispute(&e, depositor.clone(), escrow_id, resolver.clone()); |
| 98 | + resolve_dispute(&e, impostor.clone(), dispute_id, true); |
| 99 | + }); |
| 100 | +} |
| 101 | + |
| 102 | +#[test] |
| 103 | +#[should_panic(expected = "AlreadyResolved")] |
| 104 | +fn test_double_resolve_panics() { |
| 105 | + let e = setup_env(); |
| 106 | + let contract_id = e.register_contract(None, VeritixToken); |
| 107 | + let resolver = Address::generate(&e); |
| 108 | + let (depositor, _beneficiary, escrow_id) = setup_escrow(&e, &contract_id); |
| 109 | + |
| 110 | + e.as_contract(&contract_id, || { |
| 111 | + let dispute_id = open_dispute(&e, depositor.clone(), escrow_id, resolver.clone()); |
| 112 | + resolve_dispute(&e, resolver.clone(), dispute_id, true); |
| 113 | + resolve_dispute(&e, resolver.clone(), dispute_id, false); |
| 114 | + }); |
| 115 | +} |
| 116 | + |
| 117 | +#[test] |
| 118 | +#[should_panic(expected = "InvalidState")] |
| 119 | +fn test_open_dispute_on_settled_escrow_panics() { |
| 120 | + let e = setup_env(); |
| 121 | + let contract_id = e.register_contract(None, VeritixToken); |
| 122 | + let resolver = Address::generate(&e); |
| 123 | + let (_depositor, beneficiary, escrow_id) = setup_escrow(&e, &contract_id); |
| 124 | + |
| 125 | + e.as_contract(&contract_id, || { |
| 126 | + crate::escrow::release_escrow(&e, beneficiary.clone(), escrow_id); |
| 127 | + open_dispute(&e, beneficiary.clone(), escrow_id, resolver.clone()); |
| 128 | + }); |
| 129 | +} |
0 commit comments