//! Structural validation for `.github/workflows/bfld-mqtt-integration.yml`.
//! Same pattern as iter-30's HA blueprint tests: embed via `include_str!`,
//! string-check the key fields. Avoids adding a serde_yaml dep just to lint
//! a CI workflow.

#![cfg(feature = "std")]

const WORKFLOW: &str = include_str!(
    "../../../../.github/workflows/bfld-mqtt-integration.yml"
);

#[test]
fn workflow_declares_mosquitto_service_container() {
    assert!(
        WORKFLOW.contains("image: eclipse-mosquitto:2"),
        "workflow must declare eclipse-mosquitto:2 as a service container",
    );
    assert!(
        WORKFLOW.contains("- 1883:1883"),
        "workflow must expose port 1883 from the mosquitto service",
    );
}

#[test]
fn workflow_exports_broker_env_for_iter_24_and_29_tests() {
    assert!(
        WORKFLOW.contains("BFLD_MQTT_BROKER: tcp://localhost:1883"),
        "BFLD_MQTT_BROKER env var must point at the service container so the \
         iter-24 mosquitto_integration test exits skip mode",
    );
}

#[test]
fn workflow_runs_three_cargo_test_invocations() {
    // Regression guard for the default + no-default-features + mqtt matrix.
    // Each one catches a different class of bug:
    //   --no-default-features: catches std-feature leakage
    //   default:               catches the everyday surface
    //   --features mqtt:       catches the live-broker integration path
    assert!(WORKFLOW.contains("cargo test -p wifi-densepose-bfld --no-default-features"));
    assert!(WORKFLOW.contains("cargo test -p wifi-densepose-bfld"));
    assert!(WORKFLOW.contains("cargo test -p wifi-densepose-bfld --features mqtt"));
}

#[test]
fn workflow_waits_for_mosquitto_readiness_before_testing() {
    assert!(
        WORKFLOW.contains("nc -z localhost 1883"),
        "workflow must port-poll for mosquitto readiness — a service container \
         can take a few seconds to bind even with healthcheck",
    );
}

#[test]
fn workflow_uses_health_check_on_the_service() {
    assert!(
        WORKFLOW.contains("--health-cmd"),
        "service container should declare a health-check for stable startup",
    );
    assert!(
        WORKFLOW.contains("mosquitto_pub"),
        "health-check should attempt a real publish, not just process liveness",
    );
}

#[test]
fn workflow_only_triggers_on_bfld_paths() {
    assert!(
        WORKFLOW.contains("v2/crates/wifi-densepose-bfld/**"),
        "path filter must scope the workflow to BFLD changes, not run on every push",
    );
}

#[test]
fn workflow_pins_runner_to_ubuntu_latest_for_docker_service_support() {
    assert!(
        WORKFLOW.contains("runs-on: ubuntu-latest"),
        "GitHub Actions Docker service containers require linux; macOS and \
         Windows runners don't support `services:`.",
    );
}

#[test]
fn workflow_has_timeout_guard() {
    // The integration tests have 10-second recv timeouts but the matrix runs
    // three cargo invocations + cache + warmup; a top-level timeout-minutes
    // guards against a stuck broker or rumqttc handshake hanging the runner.
    assert!(
        WORKFLOW.contains("timeout-minutes:"),
        "workflow must declare a top-level timeout-minutes to bound runner cost",
    );
}
