fusible 0.20.0

Electronic linter: a fuse that blows to block firmware code generation
use std::path::Path;

use super::pipeline::{execute_pipeline, revision};
use super::server::route_path;
use super::watcher::is_relevant_change;

#[test]
fn pipeline_runs_on_valid_circuit_json() {
    let (payload, source) = execute_pipeline(Path::new("examples/circuit.json"));
    assert!(!payload.fuse_blown);
    assert!(payload.diagnostics.is_empty());
    assert!(payload.circuit_json.is_some());
    assert_eq!(payload.revision, revision(&source.unwrap()));
}

#[test]
fn pipeline_flags_blown_fuse_on_floating_net() {
    let (payload, _) = execute_pipeline(Path::new("examples/circuit-floating.json"));
    assert!(payload.fuse_blown);
    assert!(!payload.diagnostics.is_empty());
    assert!(payload
        .diagnostics
        .iter()
        .any(|d| d.rule == "unconnected_net"));
}

#[test]
fn pipeline_handles_missing_file_gracefully() {
    let (payload, source) = execute_pipeline(Path::new("nonexistent.json"));
    assert!(payload.fuse_blown);
    assert_eq!(payload.diagnostics[0].rule, "source_error");
    assert!(payload.revision.is_empty());
    assert!(source.is_none());
}

#[test]
fn watcher_filter_ignores_only_paths_inside_watch_dir() {
    let root = Path::new("/home/me/.config/target/dist/board");
    assert!(is_relevant_change(root, &root.join("index.tsx")));
    assert!(is_relevant_change(root, &root.join("lib/part.ts")));
    assert!(!is_relevant_change(
        root,
        &root.join("node_modules/x/index.ts")
    ));
    assert!(!is_relevant_change(root, &root.join("dist/index.js")));
    assert!(!is_relevant_change(root, &root.join("target/x.ts")));
    assert!(!is_relevant_change(root, &root.join(".hidden/a.tsx")));
    assert!(!is_relevant_change(root, &root.join("circuit.json")));
    assert!(!is_relevant_change(root, &root.join("notes.md")));
}

#[test]
fn route_path_strips_query_strings() {
    assert_eq!(route_path("/api/mechanical?rev=abc"), "/api/mechanical");
    assert_eq!(
        route_path("/api/mechanical.glb?t=1&x=2"),
        "/api/mechanical.glb"
    );
    assert_eq!(route_path("/?"), "/");
    assert_eq!(route_path("/events"), "/events");
}