diff --git a/crates/picloud-cli/tests/enabled.rs b/crates/picloud-cli/tests/enabled.rs index ef37477..a0041f1 100644 --- a/crates/picloud-cli/tests/enabled.rs +++ b/crates/picloud-cli/tests/enabled.rs @@ -61,6 +61,70 @@ fn disabling_a_script_makes_it_uninvocable_then_reenable() { ); } +#[ignore = "needs DATABASE_URL pointing at a running Postgres"] +#[test] +fn disabling_a_route_makes_it_404_then_reenable() { + let Some(fx) = common::fixture_or_skip() else { + return; + }; + let env = common::admin_env(fx); + let slug = common::unique_slug("enbl-route"); + common::pic_as(&env) + .args(["apps", "create", &slug]) + .assert() + .success(); + let _guard = AppGuard::new(&env.url, &env.token, &slug); + + // The app must claim a Host before its routes are reachable (two-phase + // dispatch: Host → app → route). A unique strict host avoids colliding + // with other tests' instance-global claims. + let host = format!("{slug}.test"); + common::pic_as(&env) + .args(["apps", "domains", "add", &slug, &host]) + .assert() + .success(); + + let dir = TempDir::new().unwrap(); + fs::create_dir_all(dir.path().join("scripts")).unwrap(); + fs::write(dir.path().join("scripts/hello.rhai"), "\"hi\"").unwrap(); + let manifest_path = dir.path().join("picloud.toml"); + let manifest = |enabled_line: &str| { + format!( + "[app]\nslug = \"{slug}\"\nname = \"EnabledRoute\"\n\n\ + [[scripts]]\nname = \"hello\"\nfile = \"scripts/hello.rhai\"\n\n\ + [[routes]]\nscript = \"hello\"\nmethod = \"GET\"\n\ + host_kind = \"any\"\npath_kind = \"exact\"\npath = \"/hello\"\n{enabled_line}" + ) + }; + + // Active → the route serves. + fs::write(&manifest_path, manifest("")).unwrap(); + apply(&env, &manifest_path); + assert_eq!( + route_status(&env, &host, "/hello"), + 200, + "active route serves" + ); + + // Disabled → 404, indistinguishable from absent. + fs::write(&manifest_path, manifest("enabled = false\n")).unwrap(); + apply(&env, &manifest_path); + assert_eq!( + route_status(&env, &host, "/hello"), + 404, + "disabled route must 404" + ); + + // Re-enabled → serves again. + fs::write(&manifest_path, manifest("enabled = true\n")).unwrap(); + apply(&env, &manifest_path); + assert_eq!( + route_status(&env, &host, "/hello"), + 200, + "re-enabled route serves" + ); +} + fn apply(env: &common::TestEnv, manifest_path: &Path) { common::pic_as(env) .args(["apply", "--file"]) @@ -69,6 +133,19 @@ fn apply(env: &common::TestEnv, manifest_path: &Path) { .success(); } +/// GET a user route under an explicit `Host` (the claimed domain) and return +/// the HTTP status code. +fn route_status(env: &common::TestEnv, host: &str, path: &str) -> u16 { + let client = reqwest::blocking::Client::new(); + client + .get(format!("{}{path}", env.url)) + .header(reqwest::header::HOST, host) + .send() + .unwrap() + .status() + .as_u16() +} + /// Resolve a script's id via the admin API (the manifest carries no ids). fn script_id(env: &common::TestEnv, slug: &str, name: &str) -> String { let client = reqwest::blocking::Client::new();