commit ef5323bb4967de82b9d01f9aeb6f4f2cc6ac0baa
parent fb890a80115a7f8a0ecfd44adeaa4900f856147b
Author: triesap <tyson@radroots.org>
Date: Fri, 17 Apr 2026 18:44:12 +0000
tests: add the radroots_app launcher source guards
- add desktop source-guard tests that lock the launcher onto localized-copy-only menu and window sources
- register the guard module under the mounted launcher test surface without changing runtime behavior
- run cargo metadata --format-version 1 --no-deps, cargo test, and ./scripts/check.sh from the mounted repo root
- finish the radroots_app ui upgrade validation lane on the upgraded shell
Diffstat:
2 files changed, 64 insertions(+), 0 deletions(-)
diff --git a/crates/launchers/desktop/src/lib.rs b/crates/launchers/desktop/src/lib.rs
@@ -2,6 +2,8 @@
mod app;
mod menus;
+#[cfg(test)]
+mod source_guards;
mod window;
pub fn run() {
diff --git a/crates/launchers/desktop/src/source_guards.rs b/crates/launchers/desktop/src/source_guards.rs
@@ -0,0 +1,62 @@
+use std::collections::BTreeSet;
+
+const ALLOWED_MENU_LITERALS: &[&str] = &["cmd-q"];
+
+const ALLOWED_WINDOW_LITERALS: &[&str] = &[
+ "account-add",
+ "account-admin-console",
+ "account-log-out",
+ "account-more",
+ "home-metadata-scroll",
+ "settings window should open",
+ "settings-allow-relay-connections",
+ "settings-launch-at-login",
+ "settings-manage-media-servers",
+ "settings-nav-about",
+ "settings-nav-accounts",
+ "settings-nav-settings",
+ "settings-panel-scroll",
+ "settings-use-media-servers",
+ "settings-use-nip05",
+];
+
+#[test]
+fn desktop_menu_source_uses_localized_copy_paths() {
+ assert_eq!(
+ extract_string_literals(include_str!("menus.rs")),
+ ALLOWED_MENU_LITERALS.iter().copied().collect::<BTreeSet<_>>()
+ );
+}
+
+#[test]
+fn desktop_window_source_uses_localized_copy_paths() {
+ assert_eq!(
+ extract_string_literals(include_str!("window.rs")),
+ ALLOWED_WINDOW_LITERALS
+ .iter()
+ .copied()
+ .collect::<BTreeSet<_>>()
+ );
+}
+
+fn extract_string_literals(source: &str) -> BTreeSet<&str> {
+ let mut literals = BTreeSet::new();
+ let bytes = source.as_bytes();
+ let mut start = None;
+ let mut escaped = false;
+
+ for (index, byte) in bytes.iter().copied().enumerate() {
+ match (start, byte, escaped) {
+ (None, b'"', _) => start = Some(index + 1),
+ (Some(_), b'\\', false) => escaped = true,
+ (Some(begin), b'"', false) => {
+ literals.insert(&source[begin..index]);
+ start = None;
+ }
+ (Some(_), _, true) => escaped = false,
+ _ => {}
+ }
+ }
+
+ literals
+}