From 7135c860db4169bfc9a06838cf637350ef68c0c0 Mon Sep 17 00:00:00 2001 From: tv Date: Mon, 26 Oct 2026 21:47:19 +0100 Subject: add supervised mycelium settings test --- src/config/mod.rs | 53 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 16 deletions(-) (limited to 'src/config/mod.rs') diff --git a/src/config/mod.rs b/src/config/mod.rs index 4222212..5edf78b 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -352,27 +352,32 @@ impl Settings { .and_then(|url| url::Url::parse(url).ok()) } + /// The options only a supervised Mycelium daemon takes, and whether each is set: the + /// other side of `CONFLICTS`' `mycelium-rest-url` (a test keeps them the same). + fn supervised_only(&self) -> [(&'static str, bool); 4] { + [ + ("mycelium-key-file", self.mycelium_key_file.is_some()), + ( + "mycelium-network-key-file", + self.mycelium_network_key_file.is_some(), + ), + ( + "mycelium-network-name", + self.mycelium_network_name.is_some(), + ), + ( + "mycelium-tcp-listen-port", + self.mycelium_tcp_listen_port.is_some(), + ), + ] + } + fn check(&self) -> Result<()> { if let Some(url) = &self.mycelium_rest_url { url::Url::parse(url).with_context(|| format!("mycelium-rest-url {url:?}"))?; } if self.mycelium_rest_url.is_some() { - let supervised_only = [ - ("mycelium-key-file", self.mycelium_key_file.is_some()), - ( - "mycelium-network-key-file", - self.mycelium_network_key_file.is_some(), - ), - ( - "mycelium-network-name", - self.mycelium_network_name.is_some(), - ), - ( - "mycelium-tcp-listen-port", - self.mycelium_tcp_listen_port.is_some(), - ), - ]; - if let Some((name, _)) = supervised_only.iter().find(|(_, set)| *set) { + if let Some((name, _)) = self.supervised_only().iter().find(|(_, set)| *set) { bail!( "{name} is for a supervised Mycelium daemon and can't be combined with mycelium-rest-url" ); @@ -1117,6 +1122,22 @@ mod tests { assert_eq!(from_text(Kind::Flag, "yes").unwrap(), json!(true)); } + /// `Settings::check` and the override rule name the same supervised-only options. + #[test] + fn supervised_only_options_are_the_conflicts() { + let settings = resolve(layer(json!({ "htpasswd": "u" })), Vec::new()) + .unwrap() + .settings; + let names: Vec<&str> = settings + .supervised_only() + .iter() + .map(|(name, _)| *name) + .collect(); + let (rest_url, supervised) = CONFLICTS[0]; + assert_eq!(rest_url, ["mycelium-rest-url"]); + assert_eq!(names, supervised); + } + #[test] fn checks() { assert!(resolve(layer(json!({})), Vec::new()).is_err()); // htpasswd is required -- cgit v1.3.1