summaryrefslogtreecommitdiff
path: root/tests/integration/edge_cases.rs
blob: 248c36fbb607229a7a3d1822dcf2ffc19bc62499 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
use crate::harness::{TestServer, test_config};

#[tokio::test]
async fn path_traversal_rejected() {
    let server = TestServer::start(test_config(tempfile::tempdir().unwrap().keep())).await;

    let traversal_attempts = [
        "../etc/passwd",
        "..%2F..%2Fetc%2Fpasswd",
        "valid-site/../other",
    ];

    for attempt in &traversal_attempts {
        let resp = TestServer::client()
            .post(server.url(attempt))
            .header("Authorization", "Bearer test-token")
            .send()
            .await;

        if let Ok(resp) = resp {
            let status = resp.status().as_u16();
            assert!(
                status == 400 || status == 404,
                "path traversal '{attempt}' should be rejected, got {status}"
            );
        }
    }
}

#[tokio::test]
async fn very_long_site_name_rejected() {
    let server = TestServer::start(test_config(tempfile::tempdir().unwrap().keep())).await;

    let long_name = "a".repeat(1000);
    let resp = TestServer::client()
        .post(server.url(&long_name))
        .header("Authorization", "Bearer test-token")
        .send()
        .await;

    if let Ok(resp) = resp {
        let status = resp.status().as_u16();
        assert!(
            status == 400 || status == 404 || status == 414,
            "long site name should be rejected gracefully, got {status}"
        );
    }
}

#[tokio::test]
async fn service_healthy_after_errors() {
    let server = TestServer::start(test_config(tempfile::tempdir().unwrap().keep())).await;

    // Make requests to non-existent sites (causes 404s in the app)
    for _ in 0..5 {
        let _ = TestServer::client()
            .post(server.url("/nonexistent"))
            .send()
            .await;
    }

    // Server should still be healthy
    let resp = TestServer::client()
        .get(server.url("/health"))
        .send()
        .await
        .unwrap();
    assert_eq!(resp.status().as_u16(), 200);
}