use super::{database::ERROR, package::packages}; mod tasks; fn checked( app: &str, job: &str, api: &str, ) -> Result { packages(&[ ("dever.database", ERROR), ("demo.queue.app", app), ("demo.queue.job", job), ("demo.queue.api", api), ]) } const APP: &str = "type Payload { name: Text }\nsubmit(key: Text) (id: Id) { id = dever.job.enqueue(job.publish, Payload { name = key }, key) }\napply(input: Payload) () {}"; const JOB: &str = "database default\njob publish(input: app.Payload) () retry(2) timeout(1000) { app.apply(input) }"; #[test] fn persistent_job_is_a_separate_entry_and_not_a_synchronous_call() { let program = checked(APP, JOB, "cmd submit = app.submit").unwrap(); assert_eq!(program.jobs.len(), 1); let job = &program.jobs[0]; assert_eq!(job.name, "demo.queue.job.publish"); assert!(program.entries().any(|entry| entry == job.function)); assert!( program.functions[program.commands[0].function] .signature .effects .enqueue ); let called = APP.replace( "dever.job.enqueue(job.publish, Payload { name = key }, key)", "job.publish(Payload { name = key })", ); assert!(checked(&called, JOB, "cmd submit = app.submit").is_err()); assert!(checked(APP, JOB, "public post submit = app.submit").is_err()); } #[test] fn job_contract_rejects_bad_policy_payload_effects_and_schedules() { for job in [ JOB.replace("retry(2)", "retry(0)"), JOB.replace("timeout(1000)", "timeout(0)"), JOB.replace("database default\n", ""), JOB.replace("app.apply(input)", "dever.sleep(1)"), format!("{JOB}\nschedule publish = \"* * * * *\""), ] { assert!( checked(APP, &job, "cmd submit = app.submit").is_err(), "{job}" ); } let secret = APP.replace("name: Text", "name: Secret"); assert!(checked(&secret, JOB, "cmd submit = app.submit").is_err()); let app = "run() () {}"; let jobs = "database default\njob cleanup() () retry(1) timeout(100) { app.run() }\nschedule cleanup = \"*/5 * * * *\""; let program = checked(app, jobs, "").unwrap(); assert_eq!(program.schedules.len(), 1); let features = dever::compiler::build::runtime_features(&program, &program.reachable(program.entries())); assert!(features.contains(&"database")); assert_eq!(features.contains(&"postgres"), cfg!(feature = "postgres")); assert!(checked(app, &jobs.replace("*/5", "*/0"), "").is_err()); }