a73x

tests/server_behavior_test.rs

Ref:   Size: 5.1 KiB

mod common;

use common::ServerHarness;

#[test]
fn issue_created_locally_and_pushed_renders_in_server_ui() {
    let harness = ServerHarness::new("behavior-issues");

    harness.push_head();

    let issue_id = harness.work_repo().issue_open("My first bug");
    harness.push_collab_refs();

    let list_page = harness.get_ok(&format!("/{}/issues", harness.repo_name()));
    assert!(list_page.body.contains("My first bug"));
    assert!(list_page.body.contains("open"));

    let detail_page = harness.get_ok(&format!("/{}/issues/{}", harness.repo_name(), issue_id));
    assert!(detail_page.body.contains("My first bug"));
    assert!(detail_page.body.contains("Alice"));
    assert!(detail_page.body.contains("open"));
}

#[test]
fn pushed_repository_content_renders_across_repo_http_pages() {
    let harness = ServerHarness::new("behavior-pages");

    let commit_oid = harness.work_repo().commit_file(
        "src/lib.rs",
        "pub fn answer() -> u32 {\n    42\n}\n",
        "add source file",
    );
    let issue_id = harness.work_repo().issue_open("Server issue");
    let patch_id = harness.work_repo().patch_create("Server patch");

    harness.push_head();
    harness.push_collab_refs();

    let repo_list = harness.get_ok("/");
    assert!(repo_list.body.contains(harness.repo_name()));

    let overview = harness.get_ok(&format!("/{}", harness.repo_name()));
    assert!(overview.body.contains("Server issue"));
    assert!(overview.body.contains("Server patch"));
    assert!(overview.body.contains("add source file"));

    let commits = harness.get_ok(&format!("/{}/commits", harness.repo_name()));
    assert!(commits.body.contains("add source file"));
    assert!(commits.body.contains("main"));

    let diff = harness.get_ok(&format!("/{}/diff/{}", harness.repo_name(), commit_oid));
    assert!(diff.body.contains("add source file"));
    assert!(diff.body.contains("src/lib.rs"));
    assert!(diff.body.contains("answer"));

    let tree = harness.get_ok(&format!("/{}/tree", harness.repo_name()));
    assert!(tree.body.contains("src/"));

    let blob = harness.get_ok(&format!("/{}/blob/main/src/lib.rs", harness.repo_name()));
    assert!(blob.body.contains("src/lib.rs"));
    assert!(blob.body.contains("answer"));

    let patches = harness.get_ok(&format!("/{}/patches", harness.repo_name()));
    assert!(patches.body.contains("Server patch"));
    assert!(patches.body.contains("open"));

    let patch_detail = harness.get_ok(&format!("/{}/patches/{}", harness.repo_name(), patch_id));
    assert!(patch_detail.body.contains("Server patch"));
    assert!(patch_detail.body.contains("Alice"));
    assert!(patch_detail.body.contains("main"));

    let issues = harness.get_ok(&format!("/{}/issues", harness.repo_name()));
    assert!(issues.body.contains("Server issue"));
    assert!(issues.body.contains("open"));

    let issue_detail = harness.get_ok(&format!("/{}/issues/{}", harness.repo_name(), issue_id));
    assert!(issue_detail.body.contains("Server issue"));
    assert!(issue_detail.body.contains("Alice"));
    assert!(issue_detail.body.contains("open"));
}

#[test]
fn missing_repository_and_missing_objects_return_not_found() {
    let harness = ServerHarness::new("behavior-not-found");

    harness.push_head();

    let missing_repo = harness.get("/missing-repo");
    assert!(missing_repo.status_line.contains("404"));
    assert!(missing_repo.body.contains("missing-repo"));
    assert!(missing_repo.body.contains("not found"));

    let missing_issue = harness.get(&format!("/{}/issues/missing-issue", harness.repo_name()));
    assert!(missing_issue.status_line.contains("404"));
    assert!(missing_issue.body.contains("missing-issue"));
    assert!(missing_issue.body.contains("not found"));

    let missing_blob = harness.get(&format!("/{}/blob/main/src/missing.rs", harness.repo_name()));
    assert!(missing_blob.status_line.contains("404"));
    assert!(missing_blob.body.contains("src/missing.rs"));
    assert!(missing_blob.body.contains("not found"));
}

#[test]
fn readme_md_renders_on_repo_overview_page() {
    let harness = ServerHarness::new("behavior-readme");

    harness.work_repo().commit_file(
        "README.md",
        "# Hello World\n\nA short description with a [link](https://example.com).\n",
        "add README",
    );
    harness.push_head();

    let overview = harness.get_ok(&format!("/{}", harness.repo_name()));
    assert!(overview.body.contains("<h1>Hello World</h1>"), "missing h1: {}", overview.body);
    assert!(overview.body.contains("href=\"https://example.com\""));
    // Sanity: the new card wrapper exists.
    assert!(overview.body.contains("class=\"readme-body\""));
}

#[test]
fn missing_readme_does_not_break_overview_page() {
    let harness = ServerHarness::new("behavior-no-readme");

    harness.work_repo().commit_file(
        "src/lib.rs",
        "pub fn x() {}\n",
        "add lib",
    );
    harness.push_head();

    let overview = harness.get_ok(&format!("/{}", harness.repo_name()));
    assert!(!overview.body.contains("class=\"readme-body\""));
    // The rest of the page still renders.
    assert!(overview.body.contains("Open Patches") || overview.body.contains("Recent Commits"));
}