From 4950f74fad5122d07baff1efba6cdddbf877d90f Mon Sep 17 00:00:00 2001 From: Ragnor Comerford Date: Wed, 3 Jun 2026 17:34:06 +0200 Subject: [PATCH] test(server): server must reject remote graph entries (red) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit omnigraph-server serves embedded graphs only (RFC-002 §3); a graph with `server:` or a remote `http(s)://` `uri:` must be refused at config load. These four boot tests (multi `server:`, multi remote `uri:`, single positional URI, single named remote via server.graph) are RED today: load_server_settings returns Ok for a remote entry — it builds a `Single`/`Multi { uri: "https://…" }` and only fails later at `Omnigraph::open`. The next commit gates this. --- crates/omnigraph-server/tests/server.rs | 74 +++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/crates/omnigraph-server/tests/server.rs b/crates/omnigraph-server/tests/server.rs index f474c8e..cb9dca9 100644 --- a/crates/omnigraph-server/tests/server.rs +++ b/crates/omnigraph-server/tests/server.rs @@ -5890,6 +5890,80 @@ graphs: assert!(err.to_string().contains("no graph to serve")); } + // omnigraph-server serves embedded graphs only (RFC-002 §3) — a remote + // entry (`server:` set, or a remote `http(s)://` `uri:`) must be refused at + // config load, not opened. RED today: `load_server_settings` accepts these + // and only fails later at `Omnigraph::open`. + + #[test] + fn multi_mode_rejects_server_entry() { + let temp = tempfile::tempdir().unwrap(); + let config_path = temp.path().join("omnigraph.yaml"); + fs::write( + &config_path, + "servers:\n prod:\n endpoint: https://og.internal:8080\n\ + graphs:\n g:\n server: prod\n alpha:\n uri: /tmp/alpha.omni\n", + ) + .unwrap(); + let err = load_server_settings(Some(&config_path), None, None, None, true).unwrap_err(); + let msg = err.to_string(); + assert!( + msg.contains("'g'") && msg.contains("embedded"), + "remote `server:` entry must be rejected, naming the graph: {msg}" + ); + } + + #[test] + fn multi_mode_rejects_remote_uri_entry() { + let temp = tempfile::tempdir().unwrap(); + let config_path = temp.path().join("omnigraph.yaml"); + fs::write( + &config_path, + "graphs:\n g:\n uri: https://host:8080\n alpha:\n uri: /tmp/alpha.omni\n", + ) + .unwrap(); + let err = load_server_settings(Some(&config_path), None, None, None, true).unwrap_err(); + let msg = err.to_string(); + assert!( + msg.contains("'g'") && msg.contains("embedded"), + "remote `uri:` entry must be rejected, naming the graph: {msg}" + ); + } + + #[test] + fn single_mode_rejects_positional_remote_uri() { + let err = load_server_settings( + None, + Some("https://host:8080".to_string()), + None, + None, + true, + ) + .unwrap_err(); + assert!( + err.to_string().contains("embedded"), + "a remote positional URI must be rejected: {err}" + ); + } + + #[test] + fn single_mode_rejects_named_remote_graph() { + let temp = tempfile::tempdir().unwrap(); + let config_path = temp.path().join("omnigraph.yaml"); + fs::write( + &config_path, + "servers:\n prod:\n endpoint: https://og.internal:8080\n\ + graphs:\n g:\n server: prod\nserver:\n graph: g\n", + ) + .unwrap(); + let err = load_server_settings(Some(&config_path), None, None, None, true).unwrap_err(); + let msg = err.to_string(); + assert!( + msg.contains("'g'") && msg.contains("embedded"), + "a named remote graph (server.graph) must be rejected: {msg}" + ); + } + /// `--config` + `` together: URI wins → Single (the CLI URI /// takes precedence over the config's graphs map). #[test]