atagen

jelq

public

an http based roguelike rpg about jelqing

Star0
Watch0
3ac624339c982c4129228c05cb5332f4597fc3f7
1
ssh://brewery@pls.lobotomise.me:33/atagen/jelq.git

Blame: src/tests/meta.rs

8b8e83329a1datagen2026-10-12 12:01 UTC1
use super::*;
8b8e83329a1datagen2026-10-12 12:01 UTC2
8b8e83329a1datagen2026-10-12 12:01 UTC3
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC4
async fn forged_ruler_cookies_are_lies() {
8b8e83329a1datagen2026-10-12 12:01 UTC5
    let forged = send(
8b8e83329a1datagen2026-10-12 12:01 UTC6
        &app(),
8b8e83329a1datagen2026-10-12 12:01 UTC7
        "GET",
8b8e83329a1datagen2026-10-12 12:01 UTC8
        "/leaderboard?sort=content-length",
8b8e83329a1datagen2026-10-12 12:01 UTC9
        &[("cookie", "ruler=1")],
8b8e83329a1datagen2026-10-12 12:01 UTC10
        "",
8b8e83329a1datagen2026-10-12 12:01 UTC11
    )
8b8e83329a1datagen2026-10-12 12:01 UTC12
    .await;
8b8e83329a1datagen2026-10-12 12:01 UTC13
    assert_eq!(forged.status(), StatusCode::BAD_REQUEST);
8b8e83329a1datagen2026-10-12 12:01 UTC14
}
8b8e83329a1datagen2026-10-12 12:01 UTC15
8b8e83329a1datagen2026-10-12 12:01 UTC16
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC17
async fn listings_never_reveal_the_private_id() {
8b8e83329a1datagen2026-10-12 12:01 UTC18
    let app = app();
8b8e83329a1datagen2026-10-12 12:01 UTC19
    let created = send(&app, "POST", "/runs", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC20
    let location = header(&created, "location").to_owned();
8b8e83329a1datagen2026-10-12 12:01 UTC21
    let board = text(send(&app, "GET", "/leaderboard", &[], "").await).await;
8b8e83329a1datagen2026-10-12 12:01 UTC22
    let private = location.trim_start_matches("/runs/");
8b8e83329a1datagen2026-10-12 12:01 UTC23
    assert!(!board.contains(private));
8b8e83329a1datagen2026-10-12 12:01 UTC24
    let entry: Value = serde_json::from_str(&board).unwrap();
8b8e83329a1datagen2026-10-12 12:01 UTC25
    let public = entry["entries"][0]["public_id"].as_str().unwrap();
8b8e83329a1datagen2026-10-12 12:01 UTC26
    let guess = send(&app, "DELETE", &format!("/runs/{public}"), &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC27
    assert_eq!(guess.status(), StatusCode::NOT_FOUND);
8b8e83329a1datagen2026-10-12 12:01 UTC28
}
8b8e83329a1datagen2026-10-12 12:01 UTC29
8b8e83329a1datagen2026-10-12 12:01 UTC30
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC31
async fn seeded_runs_are_unranked() {
8b8e83329a1datagen2026-10-12 12:01 UTC32
    let app = app();
8b8e83329a1datagen2026-10-12 12:01 UTC33
    send(&app, "POST", "/runs?seed=7", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC34
    let board = json(send(&app, "GET", "/leaderboard", &[], "").await).await;
8b8e83329a1datagen2026-10-12 12:01 UTC35
    assert_eq!(board["entries"].as_array().unwrap().len(), 0);
8b8e83329a1datagen2026-10-12 12:01 UTC36
    let all = json(send(&app, "GET", "/leaderboard?seeded=include", &[], "").await).await;
8b8e83329a1datagen2026-10-12 12:01 UTC37
    assert_eq!(all["entries"][0]["ranked"], false);
8b8e83329a1datagen2026-10-12 12:01 UTC38
}
8b8e83329a1datagen2026-10-12 12:01 UTC39
8b8e83329a1datagen2026-10-12 12:01 UTC40
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC41
async fn idle_runs_are_evicted_and_the_server_has_a_limit() {
8b8e83329a1datagen2026-10-12 12:01 UTC42
    let state = Arc::new(
8b8e83329a1datagen2026-10-12 12:01 UTC43
        AppState::new(Config {
8b8e83329a1datagen2026-10-12 12:01 UTC44
            idle_ttl: Duration::ZERO,
8b8e83329a1datagen2026-10-12 12:01 UTC45
            ..Config::default()
8b8e83329a1datagen2026-10-12 12:01 UTC46
        })
8b8e83329a1datagen2026-10-12 12:01 UTC47
        .unwrap(),
8b8e83329a1datagen2026-10-12 12:01 UTC48
    );
8b8e83329a1datagen2026-10-12 12:01 UTC49
    let forgetful = router(Arc::clone(&state));
8b8e83329a1datagen2026-10-12 12:01 UTC50
    let first = send(&forgetful, "POST", "/runs", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC51
    let location = header(&first, "location").to_owned();
8b8e83329a1datagen2026-10-12 12:01 UTC52
    state.sweep(std::time::Instant::now()).unwrap();
8b8e83329a1datagen2026-10-12 12:01 UTC53
    let gone = send(&forgetful, "GET", &location, &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC54
    assert_eq!(gone.status(), StatusCode::NOT_FOUND);
8b8e83329a1datagen2026-10-12 12:01 UTC55
    let board = json(send(&forgetful, "GET", "/leaderboard", &[], "").await).await;
8b8e83329a1datagen2026-10-12 12:01 UTC56
    assert_eq!(
8b8e83329a1datagen2026-10-12 12:01 UTC57
        board["entries"][0]["status"], "alive",
8b8e83329a1datagen2026-10-12 12:01 UTC58
        "a swept run keeps its place on the leaderboard"
8b8e83329a1datagen2026-10-12 12:01 UTC59
    );
8b8e83329a1datagen2026-10-12 12:01 UTC60
8b8e83329a1datagen2026-10-12 12:01 UTC61
    let tiny = crate::app(Config {
8b8e83329a1datagen2026-10-12 12:01 UTC62
        max_runs: 1,
8b8e83329a1datagen2026-10-12 12:01 UTC63
        ..Config::default()
8b8e83329a1datagen2026-10-12 12:01 UTC64
    })
8b8e83329a1datagen2026-10-12 12:01 UTC65
    .unwrap();
8b8e83329a1datagen2026-10-12 12:01 UTC66
    send(&tiny, "POST", "/runs", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC67
    let full = send(&tiny, "POST", "/runs", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC68
    assert_eq!(full.status(), StatusCode::SERVICE_UNAVAILABLE);
8b8e83329a1datagen2026-10-12 12:01 UTC69
}
8b8e83329a1datagen2026-10-12 12:01 UTC70
8b8e83329a1datagen2026-10-12 12:01 UTC71
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC72
async fn shame_from_two_runs_adds_up() {
8b8e83329a1datagen2026-10-12 12:01 UTC73
    let state = Arc::new(AppState::default());
8b8e83329a1datagen2026-10-12 12:01 UTC74
    state.insert(Run::new("cafebabe".into(), "cafe".into(), SEED));
8b8e83329a1datagen2026-10-12 12:01 UTC75
    state.insert(Run::new("deadbeef".into(), "dead".into(), 7));
8b8e83329a1datagen2026-10-12 12:01 UTC76
    let app = router(state);
8b8e83329a1datagen2026-10-12 12:01 UTC77
    let first = send(&app, "TRACE", "/runs/cafebabe", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC78
    assert_eq!(header(&first, "x-shame"), "1");
8b8e83329a1datagen2026-10-12 12:01 UTC79
    let cookie = header(&first, "set-cookie")
8b8e83329a1datagen2026-10-12 12:01 UTC80
        .split(';')
8b8e83329a1datagen2026-10-12 12:01 UTC81
        .next()
8b8e83329a1datagen2026-10-12 12:01 UTC82
        .unwrap()
8b8e83329a1datagen2026-10-12 12:01 UTC83
        .to_owned();
8b8e83329a1datagen2026-10-12 12:01 UTC84
    let second = send(&app, "TRACE", "/runs/deadbeef", &[("cookie", &cookie)], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC85
    assert_eq!(header(&second, "x-shame"), "2");
8b8e83329a1datagen2026-10-12 12:01 UTC86
}
8b8e83329a1datagen2026-10-12 12:01 UTC87
8b8e83329a1datagen2026-10-12 12:01 UTC88
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC89
async fn the_root_negotiates() {
8b8e83329a1datagen2026-10-12 12:01 UTC90
    let app = app();
8b8e83329a1datagen2026-10-12 12:01 UTC91
    let browser = send(&app, "GET", "/", &[("accept", "text/html,*/*")], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC92
    assert_eq!(browser.status(), StatusCode::SEE_OTHER);
8b8e83329a1datagen2026-10-12 12:01 UTC93
    assert_eq!(header(&browser, "location"), "/ui/");
8b8e83329a1datagen2026-10-12 12:01 UTC94
    let curl = send(&app, "GET", "/", &[("accept", "*/*")], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC95
    assert_eq!(json(curl).await["ui"], "/ui/");
8b8e83329a1datagen2026-10-12 12:01 UTC96
    let page = send(&app, "GET", "/ui/", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC97
    assert_eq!(page.status(), StatusCode::OK);
8b8e83329a1datagen2026-10-12 12:01 UTC98
}
8b8e83329a1datagen2026-10-12 12:01 UTC99
8b8e83329a1datagen2026-10-12 12:01 UTC100
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC101
async fn the_ui_replays_what_browsers_cannot_send() {
8b8e83329a1datagen2026-10-12 12:01 UTC102
    let app = app();
8b8e83329a1datagen2026-10-12 12:01 UTC103
    let envelope =
8b8e83329a1datagen2026-10-12 12:01 UTC104
        r#"{"method": "TRACE", "path": "/graveyard", "headers": [["X-Confession", "I did it"]]}"#;
8b8e83329a1datagen2026-10-12 12:01 UTC105
    let traced = json(send(&app, "POST", "/ui/send", &[], envelope).await).await;
8b8e83329a1datagen2026-10-12 12:01 UTC106
    assert_eq!(traced["status"], 405);
8b8e83329a1datagen2026-10-12 12:01 UTC107
    let envelope = r#"{"method": "GET", "path": "/", "headers": [["Accept", "text/html"]]}"#;
8b8e83329a1datagen2026-10-12 12:01 UTC108
    let redirected = json(send(&app, "POST", "/ui/send", &[], envelope).await).await;
8b8e83329a1datagen2026-10-12 12:01 UTC109
    assert_eq!(redirected["status"], 303);
8b8e83329a1datagen2026-10-12 12:01 UTC110
    assert_eq!(redirected["reason"], "See Other");
8b8e83329a1datagen2026-10-12 12:01 UTC111
}
8b8e83329a1datagen2026-10-12 12:01 UTC112
8b8e83329a1datagen2026-10-12 12:01 UTC113
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC114
async fn the_ui_decodes_gzip_for_display() {
8b8e83329a1datagen2026-10-12 12:01 UTC115
    let app = seeded_with(Floor::Bedroom, |run| run.items.kit.ring = true);
8b8e83329a1datagen2026-10-12 12:01 UTC116
    let envelope =
8b8e83329a1datagen2026-10-12 12:01 UTC117
        r#"{"method": "GET", "path": "/runs/cafebabe", "headers": [["Accept-Encoding", "gzip"]]}"#;
8b8e83329a1datagen2026-10-12 12:01 UTC118
    let shown = json(send(&app, "POST", "/ui/send", &[], envelope).await).await;
8b8e83329a1datagen2026-10-12 12:01 UTC119
    assert!(
8b8e83329a1datagen2026-10-12 12:01 UTC120
        shown["body"]
8b8e83329a1datagen2026-10-12 12:01 UTC121
            .as_str()
8b8e83329a1datagen2026-10-12 12:01 UTC122
            .unwrap()
8b8e83329a1datagen2026-10-12 12:01 UTC123
            .contains("\"public_id\":\"cafe\"")
8b8e83329a1datagen2026-10-12 12:01 UTC124
    );
8b8e83329a1datagen2026-10-12 12:01 UTC125
    let encoding = shown["headers"]
8b8e83329a1datagen2026-10-12 12:01 UTC126
        .as_array()
8b8e83329a1datagen2026-10-12 12:01 UTC127
        .unwrap()
8b8e83329a1datagen2026-10-12 12:01 UTC128
        .iter()
8b8e83329a1datagen2026-10-12 12:01 UTC129
        .any(|h| h[0] == "content-encoding" && h[1] == "gzip");
8b8e83329a1datagen2026-10-12 12:01 UTC130
    assert!(encoding);
8b8e83329a1datagen2026-10-12 12:01 UTC131
}
8b8e83329a1datagen2026-10-12 12:01 UTC132
8b8e83329a1datagen2026-10-12 12:01 UTC133
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC134
async fn the_default_locale_is_british() {
8b8e83329a1datagen2026-10-12 12:01 UTC135
    let Harness { app, .. } = harness(Floor::Nans, SEED, |_| {});
8b8e83329a1datagen2026-10-12 12:01 UTC136
    let floor = send(&app, "GET", "/runs/cafebabe/floor", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC137
    assert_eq!(header(&floor, "content-language"), "en-GB");
8b8e83329a1datagen2026-10-12 12:01 UTC138
    assert!(header(&floor, "vary").contains("Accept-Language"));
8b8e83329a1datagen2026-10-12 12:01 UTC139
    assert_eq!(json(floor).await["name"], "Nan's house at Christmas");
8b8e83329a1datagen2026-10-12 12:01 UTC140
}
8b8e83329a1datagen2026-10-12 12:01 UTC141
8b8e83329a1datagen2026-10-12 12:01 UTC142
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC143
async fn a_full_server_buries_the_dead_to_make_room() {
8b8e83329a1datagen2026-10-12 12:01 UTC144
    let app = crate::app(Config {
8b8e83329a1datagen2026-10-12 12:01 UTC145
        max_runs: 1,
8b8e83329a1datagen2026-10-12 12:01 UTC146
        ..Config::default()
8b8e83329a1datagen2026-10-12 12:01 UTC147
    })
8b8e83329a1datagen2026-10-12 12:01 UTC148
    .unwrap();
8b8e83329a1datagen2026-10-12 12:01 UTC149
    let first = send(&app, "POST", "/runs", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC150
    let location = header(&first, "location").to_owned();
8b8e83329a1datagen2026-10-12 12:01 UTC151
    let full = send(&app, "POST", "/runs", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC152
    assert_eq!(full.status(), StatusCode::SERVICE_UNAVAILABLE);
8b8e83329a1datagen2026-10-12 12:01 UTC153
    send(&app, "DELETE", &location, &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC154
    let second = send(&app, "POST", "/runs", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC155
    assert_eq!(second.status(), StatusCode::CREATED);
8b8e83329a1datagen2026-10-12 12:01 UTC156
}
8b8e83329a1datagen2026-10-12 12:01 UTC157
8b8e83329a1datagen2026-10-12 12:01 UTC158
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC159
async fn the_forum_respects_volume() {
8b8e83329a1datagen2026-10-12 12:01 UTC160
    let state = Arc::new(AppState::default());
8b8e83329a1datagen2026-10-12 12:01 UTC161
    for (id, length, girth) in [("slim", 7.0, 4.0), ("stout", 5.0, 5.5)] {
8b8e83329a1datagen2026-10-12 12:01 UTC162
        let mut run = Run::new(id.into(), id.into(), 1);
8b8e83329a1datagen2026-10-12 12:01 UTC163
        run.body.length = length;
8b8e83329a1datagen2026-10-12 12:01 UTC164
        run.body.girth = girth;
8b8e83329a1datagen2026-10-12 12:01 UTC165
        state.insert(run);
8b8e83329a1datagen2026-10-12 12:01 UTC166
    }
8b8e83329a1datagen2026-10-12 12:01 UTC167
    let app = router(state);
8b8e83329a1datagen2026-10-12 12:01 UTC168
    let board = json(
8b8e83329a1datagen2026-10-12 12:01 UTC169
        send(
8b8e83329a1datagen2026-10-12 12:01 UTC170
            &app,
8b8e83329a1datagen2026-10-12 12:01 UTC171
            "GET",
8b8e83329a1datagen2026-10-12 12:01 UTC172
            "/leaderboard?sort=volume&seeded=include",
8b8e83329a1datagen2026-10-12 12:01 UTC173
            &[],
8b8e83329a1datagen2026-10-12 12:01 UTC174
            "",
8b8e83329a1datagen2026-10-12 12:01 UTC175
        )
8b8e83329a1datagen2026-10-12 12:01 UTC176
        .await,
8b8e83329a1datagen2026-10-12 12:01 UTC177
    )
8b8e83329a1datagen2026-10-12 12:01 UTC178
    .await;
8b8e83329a1datagen2026-10-12 12:01 UTC179
    assert_eq!(board["entries"][0]["public_id"], "stout");
8b8e83329a1datagen2026-10-12 12:01 UTC180
    assert!(board["entries"][0]["volume"].as_f64().unwrap() > 0.0);
8b8e83329a1datagen2026-10-12 12:01 UTC181
}
8b8e83329a1datagen2026-10-12 12:01 UTC182
8b8e83329a1datagen2026-10-12 12:01 UTC183
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC184
async fn the_dead_outlive_the_server() {
8b8e83329a1datagen2026-10-12 12:01 UTC185
    let path = std::env::temp_dir().join(format!("jelqd-{}.sqlite", std::process::id()));
8b8e83329a1datagen2026-10-12 12:01 UTC186
    let config = || Config {
8b8e83329a1datagen2026-10-12 12:01 UTC187
        db: Some(path.clone()),
8b8e83329a1datagen2026-10-12 12:01 UTC188
        ..Config::default()
8b8e83329a1datagen2026-10-12 12:01 UTC189
    };
8b8e83329a1datagen2026-10-12 12:01 UTC190
    let first = crate::app(config()).unwrap();
8b8e83329a1datagen2026-10-12 12:01 UTC191
    let created = send(&first, "POST", "/runs", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC192
    let location = header(&created, "location").to_owned();
8b8e83329a1datagen2026-10-12 12:01 UTC193
    send(&first, "DELETE", &location, &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC194
    drop(first);
8b8e83329a1datagen2026-10-12 12:01 UTC195
8b8e83329a1datagen2026-10-12 12:01 UTC196
    let second = crate::app(config()).unwrap();
8b8e83329a1datagen2026-10-12 12:01 UTC197
    let gone = send(&second, "GET", &location, &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC198
    assert_eq!(gone.status(), StatusCode::GONE);
8b8e83329a1datagen2026-10-12 12:01 UTC199
    let graveyard = json(send(&second, "GET", "/graveyard", &[], "").await).await;
8b8e83329a1datagen2026-10-12 12:01 UTC200
    assert_eq!(graveyard["runs"].as_array().unwrap().len(), 1);
8b8e83329a1datagen2026-10-12 12:01 UTC201
    let board = json(send(&second, "GET", "/leaderboard", &[], "").await).await;
8b8e83329a1datagen2026-10-12 12:01 UTC202
    assert_eq!(board["entries"][0]["status"], "gone");
8b8e83329a1datagen2026-10-12 12:01 UTC203
    for suffix in ["", "-wal", "-shm"] {
8b8e83329a1datagen2026-10-12 12:01 UTC204
        let _ = std::fs::remove_file(format!("{}{suffix}", path.display()));
8b8e83329a1datagen2026-10-12 12:01 UTC205
    }
8b8e83329a1datagen2026-10-12 12:01 UTC206
}
8b8e83329a1datagen2026-10-12 12:01 UTC207
8b8e83329a1datagen2026-10-12 12:01 UTC208
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC209
async fn the_graveyard_pages_by_fifty() {
8b8e83329a1datagen2026-10-12 12:01 UTC210
    let app = app();
8b8e83329a1datagen2026-10-12 12:01 UTC211
    for _ in 0..51 {
8b8e83329a1datagen2026-10-12 12:01 UTC212
        let created = send(&app, "POST", "/runs", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC213
        let location = header(&created, "location").to_owned();
8b8e83329a1datagen2026-10-12 12:01 UTC214
        send(&app, "DELETE", &location, &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC215
    }
8b8e83329a1datagen2026-10-12 12:01 UTC216
    let first = send(&app, "GET", "/graveyard", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC217
    assert!(header(&first, "link").contains("page=2>; rel=\"next\""));
8b8e83329a1datagen2026-10-12 12:01 UTC218
    assert_eq!(json(first).await["runs"].as_array().unwrap().len(), 50);
8b8e83329a1datagen2026-10-12 12:01 UTC219
    let second = send(&app, "GET", "/graveyard?page=2", &[], "").await;
8b8e83329a1datagen2026-10-12 12:01 UTC220
    assert!(header(&second, "link").contains("page=1>; rel=\"prev\""));
8b8e83329a1datagen2026-10-12 12:01 UTC221
    assert_eq!(json(second).await["runs"].as_array().unwrap().len(), 1);
8b8e83329a1datagen2026-10-12 12:01 UTC222
}
8b8e83329a1datagen2026-10-12 12:01 UTC223
8b8e83329a1datagen2026-10-12 12:01 UTC224
#[tokio::test]
8b8e83329a1datagen2026-10-12 12:01 UTC225
async fn a_prescribed_run_outlives_the_server() {
8b8e83329a1datagen2026-10-12 12:01 UTC226
    let path = std::env::temp_dir().join(format!("jelqd-prescribed-{}.sqlite", std::process::id()));
8b8e83329a1datagen2026-10-12 12:01 UTC227
    let config = || Config {
8b8e83329a1datagen2026-10-12 12:01 UTC228
        db: Some(path.clone()),
8b8e83329a1datagen2026-10-12 12:01 UTC229
        ..Config::default()
8b8e83329a1datagen2026-10-12 12:01 UTC230
    };
8b8e83329a1datagen2026-10-12 12:01 UTC231
    let state = Arc::new(AppState::new(config()).unwrap());
8b8e83329a1datagen2026-10-12 12:01 UTC232
    let mut run = Run::new("cafebabe".into(), "cafe".into(), SEED);
8b8e83329a1datagen2026-10-12 12:01 UTC233
    run.floor = Floor::Clinic;
8b8e83329a1datagen2026-10-12 12:01 UTC234
    state.insert(run);
8b8e83329a1datagen2026-10-12 12:01 UTC235
    let first = router(state);
8b8e83329a1datagen2026-10-12 12:01 UTC236
    send(
8b8e83329a1datagen2026-10-12 12:01 UTC237
        &first,
8b8e83329a1datagen2026-10-12 12:01 UTC238
        "GET",
8b8e83329a1datagen2026-10-12 12:01 UTC239
        "/runs/cafebabe/diagnosis",
8b8e83329a1datagen2026-10-12 12:01 UTC240
        &[("authorization", "Bearer honesty")],
8b8e83329a1datagen2026-10-12 12:01 UTC241
        "",
8b8e83329a1datagen2026-10-12 12:01 UTC242
    )
8b8e83329a1datagen2026-10-12 12:01 UTC243
    .await;
8b8e83329a1datagen2026-10-12 12:01 UTC244
    drop(first);
8b8e83329a1datagen2026-10-12 12:01 UTC245
8b8e83329a1datagen2026-10-12 12:01 UTC246
    let second = crate::app(config()).unwrap();
8b8e83329a1datagen2026-10-12 12:01 UTC247
    let board = json(send(&second, "GET", "/leaderboard?seeded=include", &[], "").await).await;
8b8e83329a1datagen2026-10-12 12:01 UTC248
    assert_eq!(board["entries"][0]["status"], "prescribed");
8b8e83329a1datagen2026-10-12 12:01 UTC249
    for suffix in ["", "-wal", "-shm"] {
8b8e83329a1datagen2026-10-12 12:01 UTC250
        let _ = std::fs::remove_file(format!("{}{suffix}", path.display()));
8b8e83329a1datagen2026-10-12 12:01 UTC251
    }
8b8e83329a1datagen2026-10-12 12:01 UTC252
}