Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
edouardparis committed Mar 25, 2024
1 parent dff854a commit 2988660
Show file tree
Hide file tree
Showing 7 changed files with 124 additions and 18 deletions.
11 changes: 6 additions & 5 deletions gui/src/app/state/receive.rs
Original file line number Diff line number Diff line change
Expand Up @@ -350,15 +350,16 @@ mod tests {
client::{Lianad, Request},
model::*,
},
utils::{mock::Daemon, sandbox::Sandbox},
utils::{
mock::{mock_wallet, Daemon},
sandbox::Sandbox,
},
};

use liana::{descriptors::LianaDescriptor, miniscript::bitcoin::Address};
use liana::miniscript::bitcoin::Address;
use serde_json::json;
use std::str::FromStr;

const DESC: &str = "wsh(or_d(multi(2,[ffd63c8d/48'/1'/0'/2']tpubDExA3EC3iAsPxPhFn4j6gMiVup6V2eH3qKyk69RcTc9TTNRfFYVPad8bJD5FCHVQxyBT4izKsvr7Btd2R4xmQ1hZkvsqGBaeE82J71uTK4N/<0;1>/*,[de6eb005/48'/1'/0'/2']tpubDFGuYfS2JwiUSEXiQuNGdT3R7WTDhbaE6jbUhgYSSdhmfQcSx7ZntMPPv7nrkvAqjpj3jX9wbhSGMeKVao4qAzhbNyBi7iQmv5xxQk6H6jz/<0;1>/*),and_v(v:pkh([ffd63c8d/48'/1'/0'/2']tpubDExA3EC3iAsPxPhFn4j6gMiVup6V2eH3qKyk69RcTc9TTNRfFYVPad8bJD5FCHVQxyBT4izKsvr7Btd2R4xmQ1hZkvsqGBaeE82J71uTK4N/<2;3>/*),older(3))))#p9ax3xxp";

#[tokio::test]
async fn test_receive_panel() {
let addr =
Expand All @@ -372,7 +373,7 @@ mod tests {
ChildNumber::from_normal_idx(0).unwrap()
))),
)]);
let wallet = Arc::new(Wallet::new(LianaDescriptor::from_str(DESC).unwrap()));
let wallet = Arc::new(mock_wallet());
let sandbox: Sandbox<ReceivePanel> =
Sandbox::new(ReceivePanel::new(PathBuf::new(), wallet.clone()));
let client = Arc::new(Lianad::new(daemon.run()));
Expand Down
68 changes: 61 additions & 7 deletions gui/src/app/state/transactions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ use std::{
collections::{HashMap, HashSet},
convert::TryInto,
sync::Arc,
time::{SystemTime, UNIX_EPOCH},
};

use iced::Command;
Expand All @@ -25,6 +24,7 @@ use crate::{
wallet::Wallet,
},
daemon::model,
time,
};

use crate::daemon::{
Expand Down Expand Up @@ -249,19 +249,18 @@ impl State for TransactionsPanel {
let daemon1 = daemon.clone();
let daemon2 = daemon.clone();
let daemon3 = daemon.clone();
let now: u32 = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs()
.try_into()
.unwrap();

Command::batch(vec![
Command::perform(
async move { daemon3.list_pending_txs().map_err(|e| e.into()) },
Message::PendingTransactions,
),
Command::perform(
async move {
let now: u32 = time::now()
.timestamp()
.try_into()
.expect("i64 conversion to u32 for timestamp");
daemon1
.list_history_txs(0, now, view::home::HISTORY_EVENT_PAGE_SIZE)
.map_err(|e| e.into())
Expand Down Expand Up @@ -460,3 +459,58 @@ async fn rbf(
daemon.update_spend_tx(&psbt)?;
Ok(psbt.unsigned_tx.txid())
}

#[cfg(test)]
mod tests {
use super::*;
use crate::{
app::cache::Cache,
daemon::{
client::{Lianad, Request},
model::*,
},
utils::{
mock::{mock_descriptor, mock_wallet, Daemon},
sandbox::Sandbox,
},
};

use liana::miniscript::bitcoin::Network;

use serde_json::json;

#[tokio::test]
async fn test_transactions_panel() {
let daemon = Daemon::new(vec![
(
Some(json!({"method": "getinfo", "params": Option::<Request>::None})),
Ok(json!(GetInfoResult {
version: "".to_string(),
network: Network::Testnet,
block_height: 1,
sync: 1.0,
rescan_progress: None,
descriptors: GetInfoDescriptors {
main: mock_descriptor()
},
timestamp: 1,
})),
),
(
Some(json!({"method": "listcoins", "params": Option::<Request>::None})),
Ok(json!(ListCoinsResult { coins: Vec::new() })),
),
(
Some(json!({"method": "listcoins", "params": Option::<Request>::None})),
Ok(json!(ListCoinsResult { coins: Vec::new() })),
),
]);
let wallet = Arc::new(mock_wallet());
let sandbox: Sandbox<TransactionsPanel> =
Sandbox::new(TransactionsPanel::new(wallet.clone()));
let client = Arc::new(Lianad::new(daemon.run()));
let sandbox = sandbox.load(client, &Cache::default(), wallet).await;

let _panel = sandbox.state();
}
}
4 changes: 4 additions & 0 deletions gui/src/daemon/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,10 @@ pub trait Daemon: Debug {
}
}

if txids.is_empty() {
return Ok(Vec::new());
}

let txs = self.list_txs(&txids)?.transactions;
let mut txs = txs
.into_iter()
Expand Down
6 changes: 3 additions & 3 deletions gui/src/daemon/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ use std::collections::{HashMap, HashSet};
use liana::descriptors::LianaDescriptor;
pub use liana::{
commands::{
CreateSpendResult, GetAddressResult, GetInfoResult, GetLabelsResult, LabelItem,
ListCoinsEntry, ListCoinsResult, ListSpendEntry, ListSpendResult, ListTransactionsResult,
TransactionInfo,
CreateSpendResult, GetAddressResult, GetInfoDescriptors, GetInfoResult, GetLabelsResult,
LabelItem, ListCoinsEntry, ListCoinsResult, ListSpendEntry, ListSpendResult,
ListTransactionsResult, TransactionInfo,
},
descriptors::{LianaPolicy, PartialSpendInfo, PathSpendInfo},
miniscript::bitcoin::{
Expand Down
1 change: 1 addition & 0 deletions gui/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ pub mod launcher;
pub mod loader;
pub mod logger;
pub mod signer;
pub mod time;
pub mod utils;

use liana::Version;
Expand Down
31 changes: 31 additions & 0 deletions gui/src/time.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
use chrono::prelude::*;

#[cfg(test)]
pub mod mock_time {
use super::*;
use std::cell::RefCell;

thread_local! {
static MOCK_TIME: RefCell<Option<DateTime<Utc>>> = RefCell::new(None);
}

pub fn now() -> DateTime<Utc> {
MOCK_TIME.with(|cell| cell.borrow().as_ref().cloned().unwrap_or_else(Utc::now))
}

pub fn set_mock_time(time: DateTime<Utc>) {
MOCK_TIME.with(|cell| *cell.borrow_mut() = Some(time));
}

pub fn clear_mock_time() {
MOCK_TIME.with(|cell| *cell.borrow_mut() = None);
}
}

#[cfg(test)]
pub use mock_time::now;

#[cfg(not(test))]
pub fn now() -> DateTime<Utc> {
Utc::now()
}
21 changes: 18 additions & 3 deletions gui/src/utils/mock.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
use crate::daemon::{client::Client, DaemonError};
use serde::{de::DeserializeOwned, Serialize};
use serde_json::{json, Value};
use std::fmt::Debug;
use std::str::FromStr;
use std::sync::{
mpsc::{channel, Receiver, Sender},
Mutex,
};
use std::thread;

use liana::descriptors::LianaDescriptor;

use crate::app::wallet::Wallet;
use crate::daemon::{client::Client, DaemonError};
use serde::{de::DeserializeOwned, Serialize};
use serde_json::{json, Value};

type TransportReceiver = Receiver<Result<Value, DaemonError>>;

#[derive(Debug)]
Expand Down Expand Up @@ -75,3 +80,13 @@ impl Daemon {
}
}
}

const DESC: &str = "wsh(or_d(multi(2,[ffd63c8d/48'/1'/0'/2']tpubDExA3EC3iAsPxPhFn4j6gMiVup6V2eH3qKyk69RcTc9TTNRfFYVPad8bJD5FCHVQxyBT4izKsvr7Btd2R4xmQ1hZkvsqGBaeE82J71uTK4N/<0;1>/*,[de6eb005/48'/1'/0'/2']tpubDFGuYfS2JwiUSEXiQuNGdT3R7WTDhbaE6jbUhgYSSdhmfQcSx7ZntMPPv7nrkvAqjpj3jX9wbhSGMeKVao4qAzhbNyBi7iQmv5xxQk6H6jz/<0;1>/*),and_v(v:pkh([ffd63c8d/48'/1'/0'/2']tpubDExA3EC3iAsPxPhFn4j6gMiVup6V2eH3qKyk69RcTc9TTNRfFYVPad8bJD5FCHVQxyBT4izKsvr7Btd2R4xmQ1hZkvsqGBaeE82J71uTK4N/<2;3>/*),older(3))))#p9ax3xxp";

pub fn mock_wallet() -> Wallet {
Wallet::new(mock_descriptor())
}

pub fn mock_descriptor() -> LianaDescriptor {
LianaDescriptor::from_str(DESC).unwrap()
}

0 comments on commit 2988660

Please sign in to comment.