switchgear_testing/
services.rs

1use 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}