Skip to content

Commit fbf263e

Browse files
committed
test(compile): move and edit tests for compile command
1 parent 175a606 commit fbf263e

File tree

3 files changed

+81
-90
lines changed

3 files changed

+81
-90
lines changed

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ tokio = { version = "1", features = ["full"] }
2323
cli-table = "0.5.0"
2424
tracing = "0.1.41"
2525
tracing-subscriber = "0.3.20"
26+
shlex = { version = "1.3.0" }
2627

2728
# Optional dependencies
2829
bdk_bitcoind_rpc = { version = "0.21.0", features = ["std"], optional = true }
2930
bdk_electrum = { version = "0.23.0", optional = true }
3031
bdk_esplora = { version = "0.22.1", features = ["async-https", "tokio"], optional = true }
3132
bdk_kyoto = { version = "0.15.1", optional = true }
3233
bdk_redb = { version = "0.1.0", optional = true }
33-
shlex = { version = "1.3.0", optional = true }
3434
payjoin = { version = "1.0.0-rc.1", features = ["v1", "v2", "io", "_test-utils"], optional = true}
3535
reqwest = { version = "0.12.23", default-features = false, optional = true }
3636
url = { version = "2.5.4", optional = true }
@@ -39,7 +39,7 @@ url = { version = "2.5.4", optional = true }
3939
default = ["repl", "sqlite"]
4040

4141
# To use the app in a REPL mode
42-
repl = ["shlex"]
42+
repl = []
4343

4444
# Available database options
4545
sqlite = ["bdk_wallet/rusqlite"]
@@ -60,3 +60,4 @@ verify = []
6060
# Extra utility tools
6161
# Compile policies
6262
compiler = []
63+

src/handlers.rs

Lines changed: 0 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,92 +1450,4 @@ mod test {
14501450
let full_signed_psbt = Psbt::from_str("cHNidP8BAIkBAAAAASWJHzxzyVORV/C3lAynKHVVL7+Rw7/Jj8U9fuvD24olAAAAAAD+////AiBOAAAAAAAAIgAgLzY9yE4jzTFJnHtTjkc+rFAtJ9NB7ENFQ1xLYoKsI1cfqgKVAAAAACIAIFsbWgDeLGU8EA+RGwBDIbcv4gaGG0tbEIhDvwXXa/E7LwEAAAABALUCAAAAAAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////BALLAAD/////AgD5ApUAAAAAIgAgWxtaAN4sZTwQD5EbAEMhty/iBoYbS1sQiEO/Bddr8TsAAAAAAAAAACZqJKohqe3i9hw/cdHe/T+pmd+jaVN1XGkGiXmZYrSL69g2l06M+QEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQErAPkClQAAAAAiACBbG1oA3ixlPBAPkRsAQyG3L+IGhhtLWxCIQ78F12vxOwEFR1IhA/JV2U/0pXW+iP49QcsYilEvkZEd4phmDM8nV8wC+MeDIQLKhV/gEZYmlsQXnsL5/Uqv5Y8O31tmWW1LQqIBkiqzCVKuIgYCyoVf4BGWJpbEF57C+f1Kr+WPDt9bZlltS0KiAZIqswkEboH3lCIGA/JV2U/0pXW+iP49QcsYilEvkZEd4phmDM8nV8wC+MeDBDS6ZSEBBwABCNsEAEgwRQIhAJzT6busDV9h12M/LNquZ17oOHFn7whg90kh9gjSpvshAiBEDu/1EYVD7BqJJzExPhq2CX/Vsap/ULLjfRRo99nEKQFHMEQCIGoFCvJ2zPB7PCpznh4+1jsY03kMie49KPoPDdr7/T9TAiB3jV7wzR9BH11FSbi+8U8gSX95PrBlnp1lOBgTUIUw3QFHUiED8lXZT/Sldb6I/j1ByxiKUS+RkR3imGYMzydXzAL4x4MhAsqFX+ARliaWxBeewvn9Sq/ljw7fW2ZZbUtCogGSKrMJUq4AACICAsqFX+ARliaWxBeewvn9Sq/ljw7fW2ZZbUtCogGSKrMJBG6B95QiAgPyVdlP9KV1voj+PUHLGIpRL5GRHeKYZgzPJ1fMAvjHgwQ0umUhAA==").unwrap();
14511451
assert!(is_final(&full_signed_psbt).is_ok());
14521452
}
1453-
1454-
#[cfg(feature = "compiler")]
1455-
#[test]
1456-
fn test_compile_taproot() {
1457-
use super::{NUMS_UNSPENDABLE_KEY_HEX, handle_compile_subcommand};
1458-
use bdk_wallet::bitcoin::Network;
1459-
1460-
// Expected taproot descriptors with checksums (using NUMS key from constant)
1461-
let expected_pk_a = format!("tr({},pk(A))#a2mlskt0", NUMS_UNSPENDABLE_KEY_HEX);
1462-
let expected_and_ab = format!(
1463-
"tr({},and_v(v:pk(A),pk(B)))#sfplm6kv",
1464-
NUMS_UNSPENDABLE_KEY_HEX
1465-
);
1466-
1467-
// Test simple pk policy compilation to taproot
1468-
let result = handle_compile_subcommand(
1469-
Network::Testnet,
1470-
"pk(A)".to_string(),
1471-
"tr".to_string(),
1472-
false,
1473-
);
1474-
assert!(result.is_ok());
1475-
let json_string = result.unwrap();
1476-
let json_result: serde_json::Value = serde_json::from_str(&json_string).unwrap();
1477-
let descriptor = json_result.get("descriptor").unwrap().as_str().unwrap();
1478-
assert_eq!(descriptor, expected_pk_a);
1479-
1480-
// Test more complex policy
1481-
let result = handle_compile_subcommand(
1482-
Network::Testnet,
1483-
"and(pk(A),pk(B))".to_string(),
1484-
"tr".to_string(),
1485-
false,
1486-
);
1487-
assert!(result.is_ok());
1488-
let json_string = result.unwrap();
1489-
let json_result: serde_json::Value = serde_json::from_str(&json_string).unwrap();
1490-
let descriptor = json_result.get("descriptor").unwrap().as_str().unwrap();
1491-
assert_eq!(descriptor, expected_and_ab);
1492-
}
1493-
1494-
#[cfg(feature = "compiler")]
1495-
#[test]
1496-
fn test_compile_invalid_cases() {
1497-
use super::handle_compile_subcommand;
1498-
use bdk_wallet::bitcoin::Network;
1499-
1500-
// Test invalid policy syntax
1501-
let result = handle_compile_subcommand(
1502-
Network::Testnet,
1503-
"invalid_policy".to_string(),
1504-
"tr".to_string(),
1505-
false,
1506-
);
1507-
assert!(result.is_err());
1508-
1509-
// Test invalid script type
1510-
let result = handle_compile_subcommand(
1511-
Network::Testnet,
1512-
"pk(A)".to_string(),
1513-
"invalid_type".to_string(),
1514-
false,
1515-
);
1516-
assert!(result.is_err());
1517-
1518-
// Test empty policy
1519-
let result =
1520-
handle_compile_subcommand(Network::Testnet, "".to_string(), "tr".to_string(), false);
1521-
assert!(result.is_err());
1522-
1523-
// Test malformed policy with unmatched parentheses
1524-
let result = handle_compile_subcommand(
1525-
Network::Testnet,
1526-
"pk(A".to_string(),
1527-
"tr".to_string(),
1528-
false,
1529-
);
1530-
assert!(result.is_err());
1531-
1532-
// Test policy with unknown function
1533-
let result = handle_compile_subcommand(
1534-
Network::Testnet,
1535-
"unknown_func(A)".to_string(),
1536-
"tr".to_string(),
1537-
false,
1538-
);
1539-
assert!(result.is_err());
1540-
}
15411453
}

tests/compile.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
// Copyright (c) 2020-2025 Bitcoin Dev Kit Developers
2+
//
3+
// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
4+
// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
6+
// You may not use this file except in accordance with one or both of these
7+
// licenses.
8+
9+
//! Compile Command Tests
10+
//!
11+
//! Tests for compile command and subcommands
12+
13+
use std::process::Command;
14+
15+
fn run_cmd(cmd: &str) -> Result<String, String> {
16+
let full_cmd = format!("run --features compiler -- {}", cmd);
17+
let args = shlex::split(&full_cmd).unwrap();
18+
19+
let output = Command::new("cargo")
20+
.args(args)
21+
.env_remove("NETWORK")
22+
.env_remove("DATADIR")
23+
.env_remove("POLICY")
24+
.env_remove("TYPE")
25+
.output()
26+
.unwrap();
27+
28+
let stdout = String::from_utf8_lossy(&output.stdout).to_string();
29+
let stderr = String::from_utf8_lossy(&output.stderr).to_string();
30+
31+
if output.status.success() {
32+
Ok(stdout)
33+
} else {
34+
Err(stderr)
35+
}
36+
}
37+
38+
#[test]
39+
fn test_compile_taproot() {
40+
let stdout = run_cmd(r#"compile "pk(ABC)" -t tr"#).unwrap();
41+
let json: serde_json::Value = serde_json::from_str(&stdout).unwrap();
42+
43+
assert!(json.get("descriptor").is_some());
44+
assert!(json.get("r").is_some());
45+
}
46+
47+
#[test]
48+
fn test_compile_sh() {
49+
let stdout = run_cmd(r#"compile "pk(ABC)" -t sh"#).unwrap();
50+
let json: serde_json::Value = serde_json::from_str(&stdout).unwrap();
51+
52+
assert!(json.get("descriptor").is_some());
53+
assert!(json.get("r").is_none());
54+
}
55+
56+
#[test]
57+
fn test_invalid_cases() {
58+
// Test invalid policy syntax
59+
let stderr = run_cmd(r#"compile "invalid_policy""#).unwrap_err();
60+
assert!(stderr.contains("Miniscript error"));
61+
62+
// Test invalid script type
63+
let stderr = run_cmd(r#"compile "pk(A)" -t invalid_type"#).unwrap_err();
64+
assert!(stderr.contains("error: invalid value 'invalid_type' for '--type <SCRIPT_TYPE>'"));
65+
66+
// Test empty policy
67+
let stderr = run_cmd("compile").unwrap_err();
68+
assert!(stderr.contains("error: the following required arguments were not provided"));
69+
assert!(stderr.contains("<POLICY>"));
70+
71+
// Test malformed policy with unmatched parentheses
72+
let stderr = run_cmd(r#"compile "pk(A""#).unwrap_err();
73+
assert!(stderr.contains("Miniscript error: expected )"));
74+
75+
// Test policy with unknown function
76+
let stderr = run_cmd(r#"compile "unknown_func(A)""#).unwrap_err();
77+
assert!(stderr.contains("Miniscript error: unexpected «unknown_func»"));
78+
}

0 commit comments

Comments
 (0)