use serde_json::json;
mod common;
use common::setup_db;
use azums::jobs::{
timeline::{self, TimelineEvent},
AttemptsRepo, JobsRepo, PoliciesRepo, PolicyDecisionsRepo,
};
#[tokio::test]
async fn timeline_includes_policy_decision_event() {
let Some(pool) = setup_db().await else {
return;
};
let jobs = JobsRepo::new(pool.clone());
let attempts = AttemptsRepo::new(pool.clone());
let policies = PoliciesRepo::new(pool.clone());
let policy_decisions = PolicyDecisionsRepo::new(pool.clone());
policies
.upsert_policy("default", 10_000, 0, 250)
.await
.unwrap();
let job_id = jobs
.enqueue_now("default", "ok_job", json!({"x": 1}))
.await
.unwrap();
let leased = jobs.lease_one_job("default", "worker-1", 10).await.unwrap();
assert!(leased.is_none(), "expected throttle to return None");
let tl = timeline::build_timeline(&jobs, &attempts, &policy_decisions, job_id)
.await
.unwrap()
.expect("job should exist");
let has_policy = tl.story.iter().any(|e| {
matches!(
e,
TimelineEvent::PolicyDecision {
decision,
reason_code,
..
} if decision == "THROTTLED" && reason_code == "IN_FLIGHT_EXCEEDED"
)
});
assert!(
has_policy,
"expected story to include THROTTLED/IN_FLIGHT_EXCEEDED"
);
let rows = policy_decisions.list_for_job(job_id).await.unwrap();
assert_eq!(rows.len(), 1);
assert_eq!(rows[0].decision, "THROTTLED");
assert_eq!(rows[0].reason_code, "IN_FLIGHT_EXCEEDED");
}