use super::*; const LIVE: &str = "route(request: dever.http.Request, reply: dever.system.HttpReply) () { dever.sse.start(reply, [])\ndever.sse.send(reply, dever.sse.Event { event = \"tick\", data = request.target, id = null, retry_ms = 10 }) }\nmain(listener: dever.system.Listener) () { dever.http.serveLive(route, listener, dever.http.defaultLimits(), dever.http.defaultLiveLimits()) }"; #[test] fn live_static_handler_shapes_effects_and_metadata_are_checked() { let program = linked(LIVE).unwrap(); let main = program .functions .iter() .find(|function| function.signature.name == "main") .unwrap(); assert!( main.signature.effects.network && main.signature.effects.schedule && main.signature.effects.suspend ); for (source, code) in [ (LIVE.replace("reply: dever.system.HttpReply", "reply: dever.system.Socket"), "C005"), (LIVE.replace("dever.sse.start(reply, [])", "dever.io.println(\"blocked\")\ndever.sse.start(reply, [])"), "C013"), ("main(reply: dever.system.HttpReply) (same: Bool) { same = reply == reply }".into(), "C005"), ("main(reply: dever.system.HttpReply) () { lost = result(dever.http.write(reply, dever.bytes.fromText(\"x\"))) }".into(), "C012"), ("main(reply: dever.system.HttpReply) () { dever.system.httpFinish(reply) }".into(), "C006"), ] { let error = linked(&source).unwrap_err(); assert!(error.contains(code), "{source}\n{error}"); } } #[test] fn live_context_keeps_concrete_type_and_rejects_nontransferable_values() { let source = "type Context { prefix: Text }\nroute(request: dever.http.Request, reply: dever.system.HttpReply, context: Context) () { dever.http.start(reply, 200, [])\ndever.http.write(reply, dever.bytes.fromText(context.prefix + request.target)) }\nmain(listener: dever.system.Listener, context: Context) () { dever.system.httpServeLive(route, listener, dever.http.defaultLimits(), dever.http.defaultLiveLimits(), context) }"; linked(source).unwrap(); let error = linked(&source.replace( "context: Context) () { dever.http.start", "context: Text) () { dever.http.start", )) .unwrap_err(); assert!(error.contains("C005"), "{error}"); }