summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-26 21:47:19 +0100
committertv <tv@krebsco.de>2026-10-26 21:47:19 +0100
commit7135c860db4169bfc9a06838cf637350ef68c0c0 (patch)
treed56586fbccd09bab873fbdfad3d64597c4ef0bed
parent95ce9e83c5aed221ddc7c32d0dbb6086a78b8f0c (diff)
add supervised mycelium settings test
-rw-r--r--src/config/mod.rs53
1 files changed, 37 insertions, 16 deletions
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