|
|
@@ -25,7 +25,7 @@ fn external() -> AccountId {
|
|
|
|
|
|
fn make_account(id: i64, policy: AccountPolicy) -> Account {
|
|
|
Account {
|
|
|
- id: AccountId::new(id),
|
|
|
+ id: AccountRef::main(AccountId::new(id)),
|
|
|
version: 1,
|
|
|
policy,
|
|
|
flags: AccountFlags::empty(),
|
|
|
@@ -115,11 +115,17 @@ async fn deposit_creates_balanced_postings() {
|
|
|
deposit(&ledger, account(1), usd(), Cent::from(100), external()).await;
|
|
|
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(100)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&external(), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(external()), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(-100)
|
|
|
);
|
|
|
}
|
|
|
@@ -136,15 +142,24 @@ async fn pay_with_change() {
|
|
|
pay(&ledger, account(1), account(2), usd(), Cent::from(50)).await;
|
|
|
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(50)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(2), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(2)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(50)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&external(), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(external()), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(-100)
|
|
|
);
|
|
|
}
|
|
|
@@ -162,19 +177,31 @@ async fn multi_hop_transfer() {
|
|
|
pay(&ledger, account(2), account(3), usd(), Cent::from(20)).await;
|
|
|
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(50)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(2), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(2)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(30)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(3), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(3)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(20)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&external(), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(external()), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(-100)
|
|
|
);
|
|
|
}
|
|
|
@@ -191,11 +218,17 @@ async fn withdrawal_reduces_external_liability() {
|
|
|
withdraw(&ledger, account(1), usd(), Cent::from(50), external()).await;
|
|
|
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(50)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&external(), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(external()), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(-50)
|
|
|
);
|
|
|
}
|
|
|
@@ -214,15 +247,24 @@ async fn full_round_trip() {
|
|
|
withdraw(&ledger, account(1), usd(), Cent::from(40), external()).await;
|
|
|
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::ZERO
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(2), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(2)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::ZERO
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&external(), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(external()), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::ZERO
|
|
|
);
|
|
|
}
|
|
|
@@ -238,13 +280,13 @@ async fn idempotent_commit() {
|
|
|
let envelope = EnvelopeBuilder::new()
|
|
|
.creates(vec![
|
|
|
NewPosting {
|
|
|
- owner: account(1),
|
|
|
+ owner: AccountRef::main(account(1)),
|
|
|
asset: usd(),
|
|
|
value: Cent::from(100),
|
|
|
payer: None,
|
|
|
},
|
|
|
NewPosting {
|
|
|
- owner: external(),
|
|
|
+ owner: AccountRef::main(external()),
|
|
|
asset: usd(),
|
|
|
value: Cent::from(-100),
|
|
|
payer: None,
|
|
|
@@ -258,7 +300,10 @@ async fn idempotent_commit() {
|
|
|
assert_eq!(r1.transfer_id, r2.transfer_id);
|
|
|
// Balance should only be 100, not 200 (second commit was a no-op)
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(100)
|
|
|
);
|
|
|
}
|
|
|
@@ -280,7 +325,10 @@ async fn overdraft_rejected() {
|
|
|
assert!(result.is_err());
|
|
|
// Balance unchanged
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(50)
|
|
|
);
|
|
|
}
|
|
|
@@ -297,11 +345,17 @@ async fn reverse_restores_balances() {
|
|
|
let pay_receipt = pay(&ledger, account(1), account(2), usd(), Cent::from(60)).await;
|
|
|
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(40)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(2), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(2)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(60)
|
|
|
);
|
|
|
|
|
|
@@ -309,11 +363,17 @@ async fn reverse_restores_balances() {
|
|
|
ledger.reverse(&pay_receipt.transfer_id).await.unwrap();
|
|
|
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(100)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(2), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(2)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::ZERO
|
|
|
);
|
|
|
}
|
|
|
@@ -356,26 +416,41 @@ async fn multi_asset_independent_balances() {
|
|
|
deposit(&ledger, account(1), eur(), Cent::from(200), external()).await;
|
|
|
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(100)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &eur()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &eur())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(200)
|
|
|
);
|
|
|
|
|
|
pay(&ledger, account(1), account(2), usd(), Cent::from(30)).await;
|
|
|
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(70)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &eur()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &eur())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(200)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(2), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(2)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(30)
|
|
|
);
|
|
|
}
|
|
|
@@ -410,12 +485,17 @@ async fn fx_trade_via_market_account() {
|
|
|
// Build the atomic envelope manually since it spans two assets
|
|
|
let a1_usd_postings = ledger
|
|
|
.store()
|
|
|
- .get_postings_by_account(&account(1), Some(&usd()), Some(PostingStatus::Active))
|
|
|
+ .get_postings_by_account(&account(1), None, Some(&usd()), Some(PostingStatus::Active))
|
|
|
.await
|
|
|
.unwrap();
|
|
|
let fx_eur_postings = ledger
|
|
|
.store()
|
|
|
- .get_postings_by_account(&account(50), Some(&eur()), Some(PostingStatus::Active))
|
|
|
+ .get_postings_by_account(
|
|
|
+ &account(50),
|
|
|
+ None,
|
|
|
+ Some(&eur()),
|
|
|
+ Some(PostingStatus::Active),
|
|
|
+ )
|
|
|
.await
|
|
|
.unwrap();
|
|
|
|
|
|
@@ -423,16 +503,16 @@ async fn fx_trade_via_market_account() {
|
|
|
.consumes(vec![a1_usd_postings[0].id, fx_eur_postings[0].id])
|
|
|
.creates(vec![
|
|
|
NewPosting {
|
|
|
- owner: account(50),
|
|
|
+ owner: AccountRef::main(account(50)),
|
|
|
asset: usd(),
|
|
|
value: Cent::from(100),
|
|
|
- payer: Some(account(1)),
|
|
|
+ payer: Some(AccountRef::main(account(1))),
|
|
|
},
|
|
|
NewPosting {
|
|
|
- owner: account(1),
|
|
|
+ owner: AccountRef::main(account(1)),
|
|
|
asset: eur(),
|
|
|
value: Cent::from(92),
|
|
|
- payer: Some(account(50)),
|
|
|
+ payer: Some(AccountRef::main(account(50))),
|
|
|
},
|
|
|
])
|
|
|
.build();
|
|
|
@@ -441,19 +521,31 @@ async fn fx_trade_via_market_account() {
|
|
|
|
|
|
// Verify
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::ZERO
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &eur()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &eur())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(92)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(50), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(50)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(100)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(50), &eur()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(50)), &eur())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::ZERO
|
|
|
);
|
|
|
}
|
|
|
@@ -467,7 +559,7 @@ async fn freeze_blocks_transfers() {
|
|
|
let ledger = setup_ledger().await;
|
|
|
|
|
|
deposit(&ledger, account(1), usd(), Cent::from(100), external()).await;
|
|
|
- ledger.freeze(&account(1)).await.unwrap();
|
|
|
+ ledger.freeze(&AccountRef::main(account(1))).await.unwrap();
|
|
|
|
|
|
// Paying from a frozen account should fail
|
|
|
let transfer = TransferBuilder::new()
|
|
|
@@ -477,7 +569,10 @@ async fn freeze_blocks_transfers() {
|
|
|
assert!(result.is_err());
|
|
|
// Balance unchanged
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(100)
|
|
|
);
|
|
|
}
|
|
|
@@ -487,13 +582,19 @@ async fn unfreeze_re_enables_transfers() {
|
|
|
let ledger = setup_ledger().await;
|
|
|
|
|
|
deposit(&ledger, account(1), usd(), Cent::from(100), external()).await;
|
|
|
- ledger.freeze(&account(1)).await.unwrap();
|
|
|
- ledger.unfreeze(&account(1)).await.unwrap();
|
|
|
+ ledger.freeze(&AccountRef::main(account(1))).await.unwrap();
|
|
|
+ ledger
|
|
|
+ .unfreeze(&AccountRef::main(account(1)))
|
|
|
+ .await
|
|
|
+ .unwrap();
|
|
|
|
|
|
// Should work again
|
|
|
pay(&ledger, account(1), account(2), usd(), Cent::from(50)).await;
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(50)
|
|
|
);
|
|
|
}
|
|
|
@@ -503,7 +604,7 @@ async fn close_account_with_zero_balance() {
|
|
|
let ledger = setup_ledger().await;
|
|
|
|
|
|
// Account 3 has never transacted -- zero balance, no postings
|
|
|
- ledger.close(&account(3)).await.unwrap();
|
|
|
+ ledger.close(&AccountRef::main(account(3))).await.unwrap();
|
|
|
|
|
|
// Closed account rejects deposits
|
|
|
let transfer = TransferBuilder::new()
|
|
|
@@ -521,11 +622,14 @@ async fn close_account_with_balance_rejected() {
|
|
|
deposit(&ledger, account(1), usd(), Cent::from(100), external()).await;
|
|
|
|
|
|
// Should fail -- account still has active postings
|
|
|
- let result = ledger.close(&account(1)).await;
|
|
|
+ let result = ledger.close(&AccountRef::main(account(1))).await;
|
|
|
assert!(result.is_err());
|
|
|
// Balance unchanged
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(100)
|
|
|
);
|
|
|
}
|
|
|
@@ -539,7 +643,7 @@ async fn close_rejects_reserved_postings() {
|
|
|
// Reserve the account's only posting (a transfer in flight): Active → PendingInactive.
|
|
|
let postings = ledger
|
|
|
.store()
|
|
|
- .get_postings_by_account(&account(1), Some(&usd()), Some(PostingStatus::Active))
|
|
|
+ .get_postings_by_account(&account(1), None, Some(&usd()), Some(PostingStatus::Active))
|
|
|
.await
|
|
|
.unwrap();
|
|
|
ledger
|
|
|
@@ -549,7 +653,7 @@ async fn close_rejects_reserved_postings() {
|
|
|
.unwrap();
|
|
|
|
|
|
// Close must reject: the posting is live (PendingInactive), not Inactive.
|
|
|
- let result = ledger.close(&account(1)).await;
|
|
|
+ let result = ledger.close(&AccountRef::main(account(1))).await;
|
|
|
assert!(result.is_err());
|
|
|
}
|
|
|
|
|
|
@@ -557,9 +661,9 @@ async fn close_rejects_reserved_postings() {
|
|
|
async fn freeze_closed_account_rejected() {
|
|
|
let ledger = setup_ledger().await;
|
|
|
|
|
|
- ledger.close(&account(3)).await.unwrap();
|
|
|
+ ledger.close(&AccountRef::main(account(3))).await.unwrap();
|
|
|
|
|
|
- let result = ledger.freeze(&account(3)).await;
|
|
|
+ let result = ledger.freeze(&AccountRef::main(account(3))).await;
|
|
|
assert!(result.is_err());
|
|
|
}
|
|
|
|
|
|
@@ -575,11 +679,11 @@ async fn history_returns_transfers_for_account() {
|
|
|
pay(&ledger, account(1), account(2), usd(), Cent::from(40)).await;
|
|
|
deposit(&ledger, account(2), usd(), Cent::from(50), external()).await;
|
|
|
|
|
|
- let h1 = ledger.history(&account(1)).await.unwrap();
|
|
|
+ let h1 = ledger.history(&AccountRef::main(account(1))).await.unwrap();
|
|
|
// account(1) was in the deposit and the pay
|
|
|
assert_eq!(h1.len(), 2);
|
|
|
|
|
|
- let h2 = ledger.history(&account(2)).await.unwrap();
|
|
|
+ let h2 = ledger.history(&AccountRef::main(account(2))).await.unwrap();
|
|
|
// account(2) was in the pay and a second deposit
|
|
|
assert_eq!(h2.len(), 2);
|
|
|
}
|
|
|
@@ -591,7 +695,10 @@ async fn postings_returns_all_postings() {
|
|
|
deposit(&ledger, account(1), usd(), Cent::from(100), external()).await;
|
|
|
pay(&ledger, account(1), account(2), usd(), Cent::from(60)).await;
|
|
|
|
|
|
- let posts = ledger.postings(&account(1)).await.unwrap();
|
|
|
+ let posts = ledger
|
|
|
+ .postings(&AccountRef::main(account(1)))
|
|
|
+ .await
|
|
|
+ .unwrap();
|
|
|
// Original 100 posting (now consumed) + 40 change posting (active)
|
|
|
assert_eq!(posts.len(), 2);
|
|
|
|
|
|
@@ -613,8 +720,11 @@ async fn list_accounts_returns_all() {
|
|
|
async fn get_account_by_id() {
|
|
|
let ledger = setup_ledger().await;
|
|
|
|
|
|
- let acc = ledger.get_account(&account(1)).await.unwrap();
|
|
|
- assert_eq!(acc.id, account(1));
|
|
|
+ let acc = ledger
|
|
|
+ .get_account(&AccountRef::main(account(1)))
|
|
|
+ .await
|
|
|
+ .unwrap();
|
|
|
+ assert_eq!(acc.id, AccountRef::main(account(1)));
|
|
|
assert_eq!(acc.policy, AccountPolicy::NoOverdraft);
|
|
|
}
|
|
|
|
|
|
@@ -622,7 +732,7 @@ async fn get_account_by_id() {
|
|
|
async fn get_account_not_found() {
|
|
|
let ledger = setup_ledger().await;
|
|
|
|
|
|
- let result = ledger.get_account(&account(999)).await;
|
|
|
+ let result = ledger.get_account(&AccountRef::main(account(999))).await;
|
|
|
assert!(result.is_err());
|
|
|
}
|
|
|
|
|
|
@@ -635,20 +745,32 @@ async fn account_history_tracks_versions() {
|
|
|
let ledger = setup_ledger().await;
|
|
|
|
|
|
// Version 1: created
|
|
|
- let history = ledger.account_history(&account(1)).await.unwrap();
|
|
|
+ let history = ledger
|
|
|
+ .account_history(&AccountRef::main(account(1)))
|
|
|
+ .await
|
|
|
+ .unwrap();
|
|
|
assert_eq!(history.len(), 1);
|
|
|
assert_eq!(history[0].version, 1);
|
|
|
|
|
|
// Version 2: frozen
|
|
|
- ledger.freeze(&account(1)).await.unwrap();
|
|
|
- let history = ledger.account_history(&account(1)).await.unwrap();
|
|
|
+ ledger.freeze(&AccountRef::main(account(1))).await.unwrap();
|
|
|
+ let history = ledger
|
|
|
+ .account_history(&AccountRef::main(account(1)))
|
|
|
+ .await
|
|
|
+ .unwrap();
|
|
|
assert_eq!(history.len(), 2);
|
|
|
assert_eq!(history[1].version, 2);
|
|
|
assert!(history[1].is_frozen());
|
|
|
|
|
|
// Version 3: unfrozen
|
|
|
- ledger.unfreeze(&account(1)).await.unwrap();
|
|
|
- let history = ledger.account_history(&account(1)).await.unwrap();
|
|
|
+ ledger
|
|
|
+ .unfreeze(&AccountRef::main(account(1)))
|
|
|
+ .await
|
|
|
+ .unwrap();
|
|
|
+ let history = ledger
|
|
|
+ .account_history(&AccountRef::main(account(1)))
|
|
|
+ .await
|
|
|
+ .unwrap();
|
|
|
assert_eq!(history.len(), 3);
|
|
|
assert_eq!(history[2].version, 3);
|
|
|
assert!(!history[2].is_frozen());
|
|
|
@@ -660,12 +782,18 @@ async fn store_never_compacts() {
|
|
|
|
|
|
// Freeze and unfreeze multiple times
|
|
|
for _ in 0..5 {
|
|
|
- ledger.freeze(&account(1)).await.unwrap();
|
|
|
- ledger.unfreeze(&account(1)).await.unwrap();
|
|
|
+ ledger.freeze(&AccountRef::main(account(1))).await.unwrap();
|
|
|
+ ledger
|
|
|
+ .unfreeze(&AccountRef::main(account(1)))
|
|
|
+ .await
|
|
|
+ .unwrap();
|
|
|
}
|
|
|
|
|
|
// All 11 versions preserved (1 creation + 10 mutations)
|
|
|
- let history = ledger.account_history(&account(1)).await.unwrap();
|
|
|
+ let history = ledger
|
|
|
+ .account_history(&AccountRef::main(account(1)))
|
|
|
+ .await
|
|
|
+ .unwrap();
|
|
|
assert_eq!(history.len(), 11);
|
|
|
// Versions are monotonically increasing
|
|
|
for (i, acc) in history.iter().enumerate() {
|
|
|
@@ -680,7 +808,7 @@ async fn transfer_records_account_snapshots() {
|
|
|
deposit(&ledger, account(1), usd(), Cent::from(100), external()).await;
|
|
|
|
|
|
// The envelope should have account_snapshots populated by the resolve step
|
|
|
- let transfers = ledger.history(&account(1)).await.unwrap();
|
|
|
+ let transfers = ledger.history(&AccountRef::main(account(1))).await.unwrap();
|
|
|
assert_eq!(transfers.len(), 1);
|
|
|
assert!(!transfers[0].envelope.account_snapshots().is_empty());
|
|
|
}
|
|
|
@@ -690,23 +818,26 @@ async fn stale_snapshot_rejected() {
|
|
|
let ledger = setup_ledger().await;
|
|
|
|
|
|
// Get current snapshot for account(1)
|
|
|
- let acc1 = ledger.get_account(&account(1)).await.unwrap();
|
|
|
+ let acc1 = ledger
|
|
|
+ .get_account(&AccountRef::main(account(1)))
|
|
|
+ .await
|
|
|
+ .unwrap();
|
|
|
let stale_snapshot = kuatia_core::account_snapshot_id(&acc1);
|
|
|
|
|
|
// Freeze account(1) -- changes its snapshot hash
|
|
|
- ledger.freeze(&account(1)).await.unwrap();
|
|
|
+ ledger.freeze(&AccountRef::main(account(1))).await.unwrap();
|
|
|
|
|
|
// Build an envelope with the stale snapshot
|
|
|
let envelope = EnvelopeBuilder::new()
|
|
|
.creates(vec![
|
|
|
NewPosting {
|
|
|
- owner: account(1),
|
|
|
+ owner: AccountRef::main(account(1)),
|
|
|
asset: usd(),
|
|
|
value: Cent::from(100),
|
|
|
payer: None,
|
|
|
},
|
|
|
NewPosting {
|
|
|
- owner: external(),
|
|
|
+ owner: AccountRef::main(external()),
|
|
|
asset: usd(),
|
|
|
value: Cent::from(-100),
|
|
|
payer: None,
|
|
|
@@ -767,18 +898,29 @@ async fn capped_overdraft_creates_negative_posting() {
|
|
|
pay(&ledger, account(10), account(2), usd(), Cent::from(100)).await;
|
|
|
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(10), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(10)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(-50)
|
|
|
);
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(2), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(2)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(100)
|
|
|
);
|
|
|
|
|
|
// A negative posting now backs the overdraft.
|
|
|
let postings = ledger
|
|
|
.store()
|
|
|
- .get_postings_by_account(&account(10), Some(&usd()), Some(PostingStatus::Active))
|
|
|
+ .get_postings_by_account(
|
|
|
+ &account(10),
|
|
|
+ None,
|
|
|
+ Some(&usd()),
|
|
|
+ Some(PostingStatus::Active),
|
|
|
+ )
|
|
|
.await
|
|
|
.unwrap();
|
|
|
assert!(postings.iter().any(|p| p.value == Cent::from(-50)));
|
|
|
@@ -811,7 +953,10 @@ async fn capped_overdraft_respects_floor() {
|
|
|
.build();
|
|
|
assert!(ledger.commit(transfer).await.is_err());
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(10), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(10)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::ZERO
|
|
|
);
|
|
|
}
|
|
|
@@ -841,7 +986,10 @@ async fn uncapped_overdraft_allows_arbitrary_negative() {
|
|
|
)
|
|
|
.await;
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(10), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(10)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(-1_000_000)
|
|
|
);
|
|
|
}
|
|
|
@@ -869,7 +1017,10 @@ async fn book_policy_rejects_disallowed_asset() {
|
|
|
.build();
|
|
|
assert!(ledger.commit(transfer).await.is_err());
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(100)
|
|
|
);
|
|
|
}
|
|
|
@@ -885,7 +1036,10 @@ async fn transfer_in_missing_named_book_is_rejected() {
|
|
|
.build();
|
|
|
assert!(ledger.commit(transfer).await.is_err());
|
|
|
assert_eq!(
|
|
|
- ledger.balance(&account(1), &usd()).await.unwrap(),
|
|
|
+ ledger
|
|
|
+ .balance(&AccountRef::main(account(1)), &usd())
|
|
|
+ .await
|
|
|
+ .unwrap(),
|
|
|
Cent::from(100)
|
|
|
);
|
|
|
}
|