68 lines
2.6 KiB
Rust
68 lines
2.6 KiB
Rust
use super::{database::ERROR, package::packages};
|
|
|
|
mod tasks;
|
|
|
|
fn checked(
|
|
app: &str,
|
|
job: &str,
|
|
api: &str,
|
|
) -> Result<dever::compiler::model::Program, dever::syntax::diagnostic::Diagnostic> {
|
|
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());
|
|
}
|