switchgear_testing/
services.rs1use std::env;
2
3pub const SKIP_INTEGRATION_TESTS_ENV: &str = "SWGR_SKIP_INTEGRATION_TESTS";
4
5#[derive(Debug)]
6pub struct IntegrationTestServices {
7 postgres: Option<String>,
8 mysql: Option<String>,
9 lightning: Option<LightningIntegrationTestServices>,
10}
11
12#[derive(Debug, Clone)]
13pub struct LightningIntegrationTestServices {
14 pub credentials: String,
15 pub cln: String,
16 pub lnd: String,
17}
18
19impl IntegrationTestServices {
20 pub fn create() -> anyhow::Result<Self> {
21 let _ = dotenvy::dotenv();
22
23 let postgres = match Self::env_or_panic("POSTGRES_PORT") {
24 None => None,
25 Some(port) => {
26 let port = port.parse::<u16>()?;
27 Self::env_or_panic("POSTGRES_HOSTNAME").map(|s| format!("{s}:{port}"))
28 }
29 };
30
31 let mysql = match Self::env_or_panic("MYSQL_PORT") {
32 None => None,
33 Some(port) => {
34 let port = port.parse::<u16>()?;
35 Self::env_or_panic("MYSQL_HOSTNAME").map(|s| format!("{s}:{port}"))
36 }
37 };
38
39 let credentials = match Self::env_or_panic("CREDENTIALS_SERVER_PORT") {
40 None => None,
41 Some(port) => {
42 let port = port.parse::<u16>()?;
43 Self::env_or_panic("CREDENTIALS_SERVER_HOSTNAME")
44 .map(|s| format!("http://{s}:{port}/credentials.tar.gz"))
45 }
46 };
47
48 let cln = match Self::env_or_panic("CLN_PORT") {
49 None => None,
50 Some(port) => {
51 let port = port.parse::<u16>()?;
52 Self::env_or_panic("CLN_HOSTNAME").map(|s| format!("{s}:{port}"))
53 }
54 };
55
56 let lnd = match Self::env_or_panic("LND_PORT") {
57 None => None,
58 Some(port) => {
59 let port = port.parse::<u16>()?;
60 Self::env_or_panic("LND_HOSTNAME").map(|s| format!("{s}:{port}"))
61 }
62 };
63
64 let lightning = match (credentials, cln, lnd) {
65 (Some(credentials), Some(cln), Some(lnd)) => Some(LightningIntegrationTestServices {
66 credentials,
67 cln,
68 lnd,
69 }),
70 _ => None,
71 };
72
73 Ok(Self {
74 postgres,
75 mysql,
76 lightning,
77 })
78 }
79
80 fn env_or_panic(config_env: &str) -> Option<String> {
81 if env::var(SKIP_INTEGRATION_TESTS_ENV).is_ok_and(|s| s.to_lowercase() == "true") {
82 eprintln!("⚠️ WARNING: {SKIP_INTEGRATION_TESTS_ENV} is true, skipping integration tests for {config_env}");
83 return None;
84 }
85
86 match env::var(config_env) {
87 Ok(r) => Some(r),
88 Err(_) => {
89 panic!(
90 "
91
92❌❌❌ ERROR ❌❌❌
93
94Do one of:
95
96CONFIGURE INTEGRATION TEST ENVIRONMENT
97
98* configure integration tests - see testing/README.md
99* set env {config_env} to configure the service
100
101- or -
102
103SKIP INTEGRATION TESTS
104
105* set env {SKIP_INTEGRATION_TESTS_ENV}=true
106
107❌❌❌ ERROR ❌❌❌
108
109"
110 );
111 }
112 }
113 }
114
115 pub fn postgres(&self) -> Option<&String> {
116 self.postgres.as_ref()
117 }
118
119 pub fn mysql(&self) -> Option<&String> {
120 self.mysql.as_ref()
121 }
122
123 pub fn lightning(&self) -> Option<&LightningIntegrationTestServices> {
124 self.lightning.as_ref()
125 }
126}