use std::collections::HashMap;
use chrono::{TimeZone, Utc};
use crate::app::App;
use crate::aws::{
AppVersion, CwAlarm, EnvInstanceCounts, Environment, Event as EbEvent, Instance, QueueStats,
WorkerQueues,
};
fn fixture_now() -> chrono::DateTime<chrono::Utc> {
Utc.with_ymd_and_hms(2026, 5, 24, 14, 30, 0).unwrap()
}
fn envs() -> Vec<Environment> {
let now = fixture_now();
let mk =
|name: &str, tier: &str, status: &str, health: &str, version: &str, minutes_ago: i64| {
Environment {
name: name.into(),
application: "ledgerly".into(),
status: status.into(),
health: health.into(),
platform: "Node.js 20 running on 64bit Amazon Linux 2023".into(),
solution_stack: "64bit Amazon Linux 2023 v6.1.0 running Node.js 20".into(),
tier: tier.into(),
cname: format!("{name}.us-east-1.elasticbeanstalk.com"),
version_label: version.into(),
arn: Some(format!(
"arn:aws:elasticbeanstalk:us-east-1:123456789012:environment/ledgerly/{name}"
)),
updated: Some(now - chrono::Duration::minutes(minutes_ago)),
id: Some(format!(
"e-{:08x}",
name.bytes()
.fold(0u32, |a, b| a.wrapping_add(b as u32) ^ a.rotate_left(5))
)),
region: Some("us-east-1".into()),
}
};
vec![
mk(
"ledgerly-prod-api",
"Web",
"Ready",
"Green",
"build-823",
47,
),
mk(
"ledgerly-prod-worker",
"Worker",
"Ready",
"Green",
"build-823",
47,
),
mk(
"ledgerly-batch",
"Worker",
"Ready",
"Yellow",
"build-820",
192,
),
mk(
"ledgerly-canary-api",
"Web",
"Updating",
"Green",
"build-825",
2,
),
mk(
"ledgerly-staging-api",
"Web",
"Ready",
"Red",
"build-825",
12,
),
mk(
"ledgerly-staging-worker",
"Worker",
"Ready",
"Green",
"build-823",
47,
),
mk(
"ledgerly-dev-api",
"Web",
"Ready",
"Grey",
"build-825",
1440,
),
]
}
pub fn events_for_env(env_name: &str) -> Vec<EbEvent> {
events().into_iter().filter(|e| e.env == env_name).collect()
}
pub fn canned_ssm_session(instance_id: &str) -> String {
let session_id = format!("tom-demo-{}", &instance_id[2..10.min(instance_id.len())]);
let mut lines = Vec::<String>::new();
let push = |lines: &mut Vec<String>, s: &str| {
lines.push(s.to_string());
};
push(
&mut lines,
&format!("Starting session with SessionId: {session_id}"),
);
push(&mut lines, "");
push(&mut lines, "sh-4.2$ uptime");
push(
&mut lines,
" 14:30:15 up 3 days, 4:22, 1 user, load average: 0.42, 0.38, 0.31",
);
push(&mut lines, "sh-4.2$ tail -3 /var/log/eb-engine/health.log");
push(&mut lines, "2026-05-24T14:27:42Z [WARN] 5xx rate 12.7%");
push(
&mut lines,
"2026-05-24T14:28:55Z [ERROR] health Yellow → Red",
);
push(&mut lines, "sh-4.2$ ");
lines.join("\r\n")
}
pub fn alarms_for_env(env_name: &str) -> Vec<CwAlarm> {
alarms()
.into_iter()
.filter(|a| a.name.starts_with(env_name))
.collect()
}
pub fn deploys_for_app(app_name: &str) -> Vec<AppVersion> {
if app_name != "ledgerly" {
return Vec::new();
}
let now = fixture_now();
let mk = |label: &str, desc: &str, ago_min: i64| AppVersion {
label: label.into(),
description: desc.into(),
created: Some(now - chrono::Duration::minutes(ago_min)),
};
vec![
mk("build-825", "feat: new dashboard widget", 12),
mk("build-823", "fix: backoff on 429 from upstream", 47),
mk("build-820", "chore: bump otel-collector", 192),
mk("build-817", "perf: cache HEAD on hot path", 1500),
mk("build-814", "feat: add reconciler retry policy", 4320),
]
}
pub fn worker_queues_for_env(env_name: &str) -> WorkerQueues {
match env_name {
"ledgerly-batch" => WorkerQueues {
main_url: Some(
"https://sqs.us-east-1.amazonaws.com/123456789012/ledgerly-batch".into(),
),
dlq_url: Some(
"https://sqs.us-east-1.amazonaws.com/123456789012/ledgerly-batch-dlq".into(),
),
main_stats: Some(QueueStats {
visible: 7,
in_flight: 3,
delayed: 0,
}),
dlq_stats: Some(QueueStats {
visible: 12,
in_flight: 0,
delayed: 0,
}),
},
"ledgerly-prod-worker" => WorkerQueues {
main_url: Some(
"https://sqs.us-east-1.amazonaws.com/123456789012/ledgerly-prod-worker".into(),
),
dlq_url: Some(
"https://sqs.us-east-1.amazonaws.com/123456789012/ledgerly-prod-worker-dlq".into(),
),
main_stats: Some(QueueStats {
visible: 4,
in_flight: 2,
delayed: 0,
}),
dlq_stats: Some(QueueStats::default()),
},
"ledgerly-staging-worker" => WorkerQueues {
main_url: Some(
"https://sqs.us-east-1.amazonaws.com/123456789012/ledgerly-staging-worker".into(),
),
dlq_url: Some(
"https://sqs.us-east-1.amazonaws.com/123456789012/ledgerly-staging-worker-dlq"
.into(),
),
main_stats: Some(QueueStats::default()),
dlq_stats: Some(QueueStats::default()),
},
_ => WorkerQueues::default(),
}
}
pub fn instances_for(env_name: &str) -> Vec<Instance> {
let now = fixture_now();
let mk = |id: &str, health: &str, color: &str, az: &str, ago_min: i64| Instance {
id: id.into(),
health: health.into(),
color: color.into(),
causes: Vec::new(),
instance_type: "t3.medium".into(),
availability_zone: az.into(),
launched_at: Some(now - chrono::Duration::minutes(ago_min)),
};
match env_name {
"ledgerly-staging-api" => vec![
mk("i-0abc123def456789a", "Severe", "Red", "us-east-1a", 84),
mk("i-0bcd234ef567890ab", "Ok", "Green", "us-east-1b", 84),
],
"ledgerly-batch" => vec![
mk(
"i-0cde345f6789012bc",
"Warning",
"Yellow",
"us-east-1a",
240,
),
mk("i-0def4567890123cde", "Ok", "Green", "us-east-1b", 240),
],
"ledgerly-prod-api" => vec![
mk("i-0ef56789012345def", "Ok", "Green", "us-east-1a", 1500),
mk("i-0f6789012345678ef", "Ok", "Green", "us-east-1b", 1500),
mk("i-01234567890abcdef", "Ok", "Green", "us-east-1c", 1500),
],
"ledgerly-prod-worker" => vec![
mk("i-0234567890abcdef0", "Ok", "Green", "us-east-1a", 1500),
mk("i-03456789012abcdef", "Ok", "Green", "us-east-1b", 1500),
],
"ledgerly-staging-worker" => vec![
mk("i-04567890abcdef012", "Ok", "Green", "us-east-1a", 84),
mk("i-05678901abcdef234", "Ok", "Green", "us-east-1b", 84),
],
"ledgerly-canary-api" => vec![
mk("i-067890abcdef34567", "Pending", "Grey", "us-east-1a", 2),
],
_ => Vec::new(),
}
}
fn events() -> Vec<EbEvent> {
let now = fixture_now();
let mk = |env: &str, msg: &str, sev: &str, version: Option<&str>, ago: i64| EbEvent {
at: Some(now - chrono::Duration::minutes(ago)),
env: env.into(),
application: "ledgerly".into(),
message: msg.into(),
severity: sev.into(),
version_label: version.map(String::from),
};
vec![
mk(
"ledgerly-staging-api",
"Environment health has transitioned from Yellow to Red. Application running 95% of the time. 50% of the requests are erroring with HTTP 4xx.",
"ERROR",
None,
8,
),
mk(
"ledgerly-staging-api",
"Environment health has transitioned from Green to Yellow. Application running 99% of the time.",
"WARN",
None,
10,
),
mk(
"ledgerly-canary-api",
"Environment update is starting. Deploying new version to instance(s).",
"INFO",
Some("build-825"),
2,
),
mk(
"ledgerly-staging-api",
"New application version deployed.",
"INFO",
Some("build-825"),
12,
),
mk(
"ledgerly-staging-api",
"Environment update completed successfully.",
"INFO",
Some("build-823"),
240,
),
mk(
"ledgerly-prod-api",
"Environment update completed successfully.",
"INFO",
Some("build-823"),
48,
),
mk(
"ledgerly-batch",
"Environment update completed successfully.",
"INFO",
Some("build-820"),
193,
),
]
}
fn alarms() -> Vec<CwAlarm> {
vec![
CwAlarm {
name: "ledgerly-staging-api-4xx-elevated".into(),
state: "ALARM".into(),
state_reason:
"Threshold Crossed: 1 datapoint [120.0 (24/05/26 14:25:00)] was greater than the threshold (50.0)."
.into(),
metric_name: "ApplicationRequests4xx".into(),
namespace: "AWS/ElasticBeanstalk".into(),
},
CwAlarm {
name: "ledgerly-batch-dlq-depth".into(),
state: "ALARM".into(),
state_reason: "Threshold Crossed: 1 out of the last 1 datapoints [12.0] was greater than the threshold (5.0).".into(),
metric_name: "ApproximateNumberOfMessagesVisible".into(),
namespace: "AWS/SQS".into(),
},
CwAlarm {
name: "ledgerly-prod-api-p99-latency".into(),
state: "OK".into(),
state_reason: "Threshold Crossed: 1 out of the last 1 datapoints [0.42] was not greater than the threshold (1.0).".into(),
metric_name: "ApplicationLatencyP99".into(),
namespace: "AWS/ElasticBeanstalk".into(),
},
]
}
fn instance_counts() -> HashMap<String, EnvInstanceCounts> {
let mut out = HashMap::new();
let put =
|out: &mut HashMap<String, EnvInstanceCounts>, name: &str, healthy: i32, total: i32| {
out.insert(name.to_string(), EnvInstanceCounts { healthy, total });
};
put(&mut out, "ledgerly-prod-api", 3, 3);
put(&mut out, "ledgerly-prod-worker", 2, 2);
put(&mut out, "ledgerly-batch", 1, 2);
put(&mut out, "ledgerly-canary-api", 0, 1);
put(&mut out, "ledgerly-staging-api", 1, 2);
put(&mut out, "ledgerly-staging-worker", 2, 2);
put(&mut out, "ledgerly-dev-api", 0, 0);
out
}
fn worker_dlq_depths() -> HashMap<String, i64> {
let mut out = HashMap::new();
out.insert("ledgerly-batch".to_string(), 12);
out
}
fn costs() -> HashMap<String, f64> {
let mut out = HashMap::new();
out.insert("ledgerly-prod-api".into(), 612.0);
out.insert("ledgerly-prod-worker".into(), 184.0);
out.insert("ledgerly-batch".into(), 96.0);
out.insert("ledgerly-canary-api".into(), 42.0);
out.insert("ledgerly-staging-api".into(), 38.0);
out.insert("ledgerly-staging-worker".into(), 28.0);
out.insert("ledgerly-dev-api".into(), 11.0);
out
}
pub fn install(app: &mut App) {
app.environments = envs();
app.event_panel.events = events();
app.worker_dlq_depths = worker_dlq_depths();
app.env_instance_counts = instance_counts();
app.cost_enabled = true;
app.costs = costs();
app.costs_fetched_at = Some(fixture_now());
app.context.account_id = Some("123456789012".into());
app.context.profile = Some("ledgerly-demo".into());
app.context.caller_arn = Some("arn:aws:iam::123456789012:user/demo-operator".into());
app.last_refresh = Some(fixture_now());
app.rebuild_view();
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fixture_contains_one_of_every_health_tier() {
let envs = envs();
let healths: std::collections::BTreeSet<&str> =
envs.iter().map(|e| e.health.as_str()).collect();
assert!(healths.contains("Green"), "missing Green");
assert!(healths.contains("Yellow"), "missing Yellow");
assert!(healths.contains("Red"), "missing Red");
assert!(
envs.iter().any(|e| e.status == "Updating"),
"no Updating env"
);
}
#[test]
fn fixture_dlq_env_has_messages() {
let dlqs = worker_dlq_depths();
assert!(
dlqs.get("ledgerly-batch").copied().unwrap_or(0) > 0,
"ledgerly-batch DLQ should be non-empty"
);
}
#[test]
fn fixture_red_env_has_an_alarm_and_a_health_event() {
assert!(events()
.iter()
.any(|e| e.env == "ledgerly-staging-api" && e.severity == "ERROR"));
assert!(alarms()
.iter()
.any(|a| a.name.starts_with("ledgerly-staging-api") && a.state == "ALARM"));
}
#[test]
fn fixture_cost_buckets_span_green_muted_red() {
let c = costs();
assert!(c.values().any(|v| *v < 50.0), "missing green-bucket cost");
assert!(
c.values().any(|v| *v >= 50.0 && *v < 500.0),
"missing muted-bucket cost"
);
assert!(c.values().any(|v| *v >= 500.0), "missing red-bucket cost");
}
}