1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
use Arc;
use async_trait;
use Method;
use crate;
use ;
pub
// Tests disabled: LN Markets disabled API v2 on Mar 31 2026, so live-endpoint tests can no longer
// pass. Kept for reference.
/*
#[cfg(test)]
mod tests {
use std::{env, sync::Arc, time::Instant};
use dotenv::dotenv;
use crate::shared::rest::lnm::rate_limit::RateLimiter;
use super::super::super::config::RestClientConfig;
use super::*;
fn init_repository_from_env(rate_limiter: Option<RateLimiter>) -> LnmUserRepository {
dotenv().ok();
let domain =
env::var("LNM_API_DOMAIN").expect("LNM_API_DOMAIN environment variable must be set");
let key = env::var("LNM_API_V2_KEY").expect("LNM_API_KEY environment variable must be set");
let secret =
env::var("LNM_API_V2_SECRET").expect("LNM_API_SECRET environment variable must be set");
let passphrase = env::var("LNM_API_V2_PASSPHRASE")
.expect("LNM_API_V2_PASSPHRASE environment variable must be set");
let base = LnmRestBase::with_credentials(
RestClientConfig::default().timeout(),
domain,
key,
passphrase,
SignatureGeneratorV2::new(secret),
rate_limiter,
)
.expect("must create `LnmApiBase`");
LnmUserRepository::new(base)
}
async fn test_get_user(repo: &LnmUserRepository) -> User {
repo.get_user().await.expect("must get user")
}
#[tokio::test]
#[ignore]
async fn test_api() {
let repo = init_repository_from_env(None);
let _ = test_get_user(&repo).await;
}
// Fires 65 concurrent `get_user` requests through a rate-limited client.
// NOTE: As of Feb 2026, LNM seems to tolerate up to 120 req/min for this endpoint.
//
// The rate limiter paces authenticated requests at 60 req/min, in line with official doc limit.
#[tokio::test]
#[ignore]
async fn test_v2_rate_limiter_prevents_auth_429() {
let config = RestClientConfig::default();
let rate_limiter = RateLimiter::from(&config);
let repo = Arc::new(init_repository_from_env(Some(rate_limiter)));
let total_requests = 65;
let mut handles = Vec::with_capacity(total_requests);
let start = Instant::now();
for i in 0..total_requests {
let repo = repo.clone();
handles.push(tokio::spawn(async move {
let result = repo.get_user().await;
(i, result)
}));
}
let mut successes = 0;
let mut failures = Vec::new();
for handle in handles {
let (i, result) = handle.await.expect("task must not panic");
match result {
Ok(_) => successes += 1,
Err(e) => failures.push((i, e)),
}
}
let elapsed = start.elapsed();
println!("\n{total_requests} concurrent requests completed in {elapsed:?}");
println!(" successes: {successes}");
println!(" failures: {}", failures.len());
for (i, err) in &failures {
println!(" request #{i} failed: {err}");
}
assert!(
failures.is_empty(),
"rate limiter should prevent all 429 errors, but {}/{total_requests} requests failed",
failures.len(),
);
}
}
*/