libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

commit 9c975b780060afbc023a433ef53b8726f3d8420b
parent 664956c4f633956fc01e2c20ec30328e414d4556
Author: Antoine A <>
Date:   Tue, 22 Sep 2026 13:32:15 +0200

nexus: add postfinance test

Diffstat:
MCargo.lock | 32++++++++++++++++----------------
Alibeufin-nexus/conf/postfinance.conf | 14++++++++++++++
Mlibeufin-nexus/src/fetch.rs | 182+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 212 insertions(+), 16 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -390,9 +390,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.4.6" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3eb0f42d6c360dc3f8a821f6bf2fdea7f72bfd36b3076eb0e6d1e9e0752fff4" +checksum = "54413ede23c2daf518f35156dfde027feb2374004d63bd497f983c8db9c0e313" dependencies = [ "find-msvc-tools", "jobserver", @@ -1023,9 +1023,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" +checksum = "ef25905e51abafe4dcea6c15fec58c57b601cdbd0ee53d22ea1d3016c587d39b" [[package]] name = "flate2" @@ -1440,9 +1440,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.9" +version = "0.27.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" +checksum = "dfa8e654703247911e29c23fbeaa261834bd9bb74efba2f9acddc37bfb127f53" dependencies = [ "http", "hyper", @@ -1811,7 +1811,7 @@ dependencies = [ "jiff", "pretty_assertions", "prometheus-client", - "rand 0.10.2", + "rand 0.10.3", "regex", "serde", "serde_json", @@ -1844,7 +1844,7 @@ dependencies = [ "jiff", "pdf-writer", "pretty_assertions", - "rand 0.10.2", + "rand 0.10.3", "rcgen", "reqwest", "reqwest-websocket", @@ -1940,9 +1940,9 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.24" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6480ccc157a1389bb2e4891b24751b0f798ba640d22386f23143fbcc89da195a" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" dependencies = [ "bitflags 2.13.2", "libc", @@ -2470,7 +2470,7 @@ dependencies = [ "bytes", "getrandom 0.4.3", "lru-slab", - "rand 0.10.2", + "rand 0.10.3", "rand_pcg", "ring", "rustc-hash", @@ -2541,9 +2541,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" dependencies = [ "chacha20", "getrandom 0.4.3", @@ -3545,7 +3545,7 @@ dependencies = [ "jiff", "listenfd", "prometheus-client", - "rand 0.10.2", + "rand 0.10.3", "regex", "serde", "serde_json", @@ -3579,7 +3579,7 @@ dependencies = [ "indexmap", "jiff", "mimalloc", - "rand 0.10.2", + "rand 0.10.3", "regex", "serde", "serde_json", @@ -4107,7 +4107,7 @@ checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" dependencies = [ "getrandom 0.4.3", "js-sys", - "rand 0.10.2", + "rand 0.10.3", "serde_core", "wasm-bindgen", ] diff --git a/libeufin-nexus/conf/postfinance.conf b/libeufin-nexus/conf/postfinance.conf @@ -0,0 +1,14 @@ +[nexus-ebics] +CURRENCY = CHF +BANK_DIALECT = postfinance + +HOST_ID = PFEBICS +USER_ID = PFC00563 +PARTNER_ID = PFC00563 + +IBAN = CH9289144596463965762 +BIC = POFICHBEXXX +NAME = myname + +[libeufin-nexusdb-postgres] +CONFIG = postgres:///taler_rust_check diff --git a/libeufin-nexus/src/fetch.rs b/libeufin-nexus/src/fetch.rs @@ -1762,4 +1762,186 @@ pub mod test { ) .await; } + + /** PostFinance dialect test */ + #[tokio::test] + async fn postfinance() { + let (db, cfg) = setup_cfg("postfinance.conf").await; + batches( + &db, + &[ + ( + "ZS1PGNTSV0ZNDFAJBBWWB8015G", + &[ + // Legacy notifications use MsgId when EndToEndId is NOTPROVIDED. + gen_init_pay!( + "ZS1PGNTSV0ZNDFAJBBWWB8015G", + "init payment", + amount("CHF:3") + ), + gen_init_pay!( + "POSTFINANCE_NOTIFICATION_BATCH", + "init payment", + amount("CHF:403") + ), + ], + ), + ( + "50820f78-9024-44ff-978d-63a18c", + &[gen_init_pay!( + "50820f78-9024-44ff-978d-63a18c", + "init payment", + amount("CHF:1") + )], + ), + ( + "889d1a80-1267-49bd-8fcc-85701a", + &[gen_init_pay!( + "889d1a80-1267-49bd-8fcc-85701a", + "init payment", + amount("CHF:1") + )], + ), + ( + "4cc61cc7-6230-49c2-b5e2-b40bbb", + &[gen_init_pay!( + "4cc61cc7-6230-49c2-b5e2-b40bbb", + "init payment", + amount("CHF:1") + )], + ), + ( + "EB4D22D428214261B2B3012D2A8CEC36", + &[ + gen_init_pay!( + "POSTFINANCE_STATEMENT_FIRST", + "init payment", + amount("CHF:100") + ), + gen_init_pay!( + "POSTFINANCE_STATEMENT_SECOND", + "init payment", + amount("CHF:306") + ), + ], + ), + ], + ) + .await; + + register( + &db, + &cfg, + "postfinance_camt054.xml", + &OrderDoc::notification, + ) + .await; + register(&db, &cfg, "postfinance_camt053.xml", &OrderDoc::statement).await; + + check( + &db, + &[ + ( + "ZS1PGNTSV0ZNDFAJBBWWB8015G", + success, + &[ + ("ZS1PGNTSV0ZNDFAJBBWWB8015G", success), + ("POSTFINANCE_NOTIFICATION_BATCH", success), + ], + ), + ( + "50820f78-9024-44ff-978d-63a18c", + success, + &[("50820f78-9024-44ff-978d-63a18c", permanent_failure)], + ), + ( + "889d1a80-1267-49bd-8fcc-85701a", + success, + &[("889d1a80-1267-49bd-8fcc-85701a", permanent_failure)], + ), + ( + "4cc61cc7-6230-49c2-b5e2-b40bbb", + success, + &[("4cc61cc7-6230-49c2-b5e2-b40bbb", permanent_failure)], + ), + ( + "EB4D22D428214261B2B3012D2A8CEC36", + success, + &[ + ("POSTFINANCE_STATEMENT_FIRST", success), + ("POSTFINANCE_STATEMENT_SECOND", success), + ], + ), + ], + &[ + tx_in( + ( + Some("62e2b511-7313-4ccd-8d40-c9d8e612cd71"), + None, + Some("231121CH0AZWCR9T"), + ), + "CHF:10", + "CHF:0", + Some("G1XTY6HGWGMVRM7E6XQ4JHJK561ETFDFTJZ7JVGV543XZCB27YBG"), + "2023-12-19", + Some(("CH7389144832588726658", "Mr Test")), + ), + tx_in( + ( + Some("62e2b511-7313-4ccd-8d40-c9d8e612cd72"), + None, + Some("231121CH0AZWCVR1"), + ), + "CHF:2.53", + "CHF:0", + Some("G1XTY6HGWGMVRM7E6XQ4JHJK561ETFDFTJZ7JVGV543XZCB27YB"), + "2023-12-19", + Some(("CH7389144832588726658", "Mr Test")), + ), + ], + &[ + tx_out( + (None, Some("ZS1PGNTSV0ZNDFAJBBWWB8015G"), None), + "CHF:3", + "CHF:0", + None, + "2024-01-15", + None, + ), + tx_out( + (None, Some("POSTFINANCE_NOTIFICATION_BATCH"), None), + "CHF:403", + "CHF:0", + Some("init payment"), + "2024-01-15", + Some(("CH4189144589712575493", "Test")), + ), + tx_out( + (None, Some("POSTFINANCE_STATEMENT_FIRST"), None), + "CHF:100", + "CHF:0", + Some("init payment"), + "2024-08-26", + Some(("CH4189144589712575493", "Test")), + ), + tx_out( + (None, Some("POSTFINANCE_STATEMENT_SECOND"), None), + "CHF:306", + "CHF:0", + Some("init payment"), + "2024-08-26", + Some(("CH4189144589712575493", "Test")), + ), + ], + &[tx_out( + (None, None, None), + "CHF:2.53", + "CHF:0", + Some("bounce 62e2b511-7313-4ccd-8d40-c9d8e612cd72: missing reserve public key"), + "1970-01-01", + Some(("CH7389144832588726658", "Mr Test")), + )], + ) + .await; + } }