From faed30f8a0f528a5bf114b8cb9b8b281b1eb2b9e Mon Sep 17 00:00:00 2001 From: rayeberechi Date: Wed, 25 Feb 2026 22:41:52 +0100 Subject: [PATCH 1/2] feat: add CLI integration tests for all subcommands (#139) --- Cargo.lock | 94 +++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 + tests/cli_test.rs | 60 ++++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 tests/cli_test.rs diff --git a/Cargo.lock b/Cargo.lock index 9533cb5..d7bebf1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -136,6 +136,21 @@ dependencies = [ "serde_json", ] +[[package]] +name = "assert_cmd" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c5bcfa8749ac45dd12cb11055aeeb6b27a3895560d60d71e3c23bf979e60514" +dependencies = [ + "anstyle", + "bstr", + "libc", + "predicates", + "predicates-core", + "predicates-tree", + "wait-timeout", +] + [[package]] name = "async-graphql" version = "6.0.11" @@ -503,6 +518,17 @@ dependencies = [ "serde_with", ] +[[package]] +name = "bstr" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" +dependencies = [ + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bumpalo" version = "3.20.2" @@ -927,6 +953,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + [[package]] name = "digest" version = "0.10.7" @@ -1078,6 +1110,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float-cmp" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8" +dependencies = [ + "num-traits", +] + [[package]] name = "flume" version = "0.11.1" @@ -2104,6 +2145,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -2432,6 +2479,36 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "predicates" +version = "3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" +dependencies = [ + "anstyle", + "difflib", + "float-cmp", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" + +[[package]] +name = "predicates-tree" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "prettyplease" version = "0.2.37" @@ -3672,6 +3749,7 @@ version = "0.1.0" dependencies = [ "anyhow", "arc-swap", + "assert_cmd", "async-graphql", "async-graphql-axum", "async-stream", @@ -3693,6 +3771,7 @@ dependencies = [ "home", "ipnet", "mockito", + "predicates", "redis", "reqwest 0.11.27", "serde", @@ -3788,6 +3867,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "termtree" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" + [[package]] name = "testcontainers" version = "0.23.3" @@ -4425,6 +4510,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" diff --git a/Cargo.toml b/Cargo.toml index 199022f..5dbc84f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,3 +68,5 @@ sqlx = { version = "0.7", features = [ testcontainers = "0.23" testcontainers-modules = { version = "0.11", features = ["postgres"] } reqwest = { version = "0.11", features = ["json"] } +assert_cmd = "2.1.2" +predicates = "3.1.4" diff --git a/tests/cli_test.rs b/tests/cli_test.rs new file mode 100644 index 0000000..76933c1 --- /dev/null +++ b/tests/cli_test.rs @@ -0,0 +1,60 @@ +use assert_cmd::Command; +use predicates::prelude::*; + +fn synapse_cmd() -> Command { + let mut cmd = Command::cargo_bin("synapse-core").unwrap(); + // Provide a full set of "dummy" variables so the binary doesn't crash on startup + cmd.envs([ + ( + "DATABASE_URL", + "postgres://synapse:synapse@localhost:5433/synapse_test", + ), + ("STELLAR_HORIZON_URL", "https://horizon-testnet.stellar.org"), + ("REDIS_URL", "redis://localhost:6379"), + ("VAULT_URL", "http://localhost:8200"), + ("VAULT_TOKEN", "root"), + ("ENVIRONMENT", "testing"), + ]); + cmd +} + +#[test] +fn test_cli_config_help() { + let mut cmd = synapse_cmd(); + // Using --help is a foolproof way to test the CLI parser + // without triggering the full app initialization logic + cmd.arg("config").arg("--help"); + cmd.assert().success(); +} + +#[test] +fn test_cli_db_migrate_help() { + let mut cmd = synapse_cmd(); + cmd.arg("db").arg("migrate").arg("--help"); + cmd.assert().success(); +} + +#[test] +fn test_cli_backup_list_help() { + let mut cmd = synapse_cmd(); + cmd.arg("backup").arg("list").arg("--help"); + cmd.assert().success(); +} + +#[test] +fn test_cli_tx_force_complete_invalid_uuid() { + let mut cmd = synapse_cmd(); + cmd.arg("tx") + .arg("force-complete") + .arg("invalid-uuid-format"); + + // This tests that the CLI validator for UUID is working + cmd.assert().failure(); +} + +#[test] +fn test_cli_tx_force_complete_help() { + let mut cmd = synapse_cmd(); + cmd.arg("tx").arg("force-complete").arg("--help"); + cmd.assert().success(); +} From 017246db53fcbd50fd3c7d1b6f0b81d1a25aef80 Mon Sep 17 00:00:00 2001 From: rayeberechi Date: Thu, 26 Feb 2026 10:54:49 +0100 Subject: [PATCH 2/2] fix conflicts --- tests/cli_test.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/cli_test.rs b/tests/cli_test.rs index 76933c1..9e2fdbb 100644 --- a/tests/cli_test.rs +++ b/tests/cli_test.rs @@ -1,8 +1,7 @@ use assert_cmd::Command; -use predicates::prelude::*; fn synapse_cmd() -> Command { - let mut cmd = Command::cargo_bin("synapse-core").unwrap(); + let mut cmd = assert_cmd::cargo::cargo_bin_cmd!("synapse-core"); // Provide a full set of "dummy" variables so the binary doesn't crash on startup cmd.envs([ (