mod common;
use common::IgnitionMock;
use ignition_core::actions::version::version;
use ignition_core::client::GatewayApi;
use ignition_core::config::{Credential, Secret};
use ignition_core::session::Session;
fn info_body() -> serde_json::Value {
serde_json::json!({ "ignitionVersion": "8.3.6 (b2026042713)" })
}
fn headers_debug(request: &wiremock::Request) -> String {
format!("{:?}", request.headers).to_lowercase()
}
async fn mount_info(mock: &IgnitionMock, expected: u64) -> wiremock::MockGuard {
wiremock::Mock::given(wiremock::matchers::method("GET"))
.and(wiremock::matchers::path("/data/api/v1/gateway-info"))
.respond_with(wiremock::ResponseTemplate::new(200).set_body_json(info_body()))
.expect(expected)
.mount_as_scoped(&mock.server)
.await
}
#[tokio::test]
async fn for_url_carries_url_credential_and_tolerates_none() {
let mock = IgnitionMock::start().await;
let guard = mount_info(&mock, 2).await;
let url: url::Url = mock.uri().parse().expect("mock uri parses");
let session = Session::for_url(
url,
Some(Credential::Token(Secret::new("rig-token"))),
false,
)
.expect("for_url builds");
assert_eq!(session.profile_name(), "", "rig sessions carry no profile");
let info = session.gateway_info().await.expect("token rig answers");
assert_eq!(info.ignition_version, "8.3.6 (b2026042713)");
let url: url::Url = mock.uri().parse().expect("mock uri parses");
let session = Session::for_url(url, None, false).expect("for_url builds");
let info = session
.gateway_info()
.await
.expect("headerless rig answers");
assert_eq!(info.ignition_version, "8.3.6 (b2026042713)");
let requests = guard.received_requests().await;
assert_eq!(requests.len(), 2, "both rig requests arrived");
let headers = headers_debug(&requests[0]);
assert!(
headers.contains("x-ignition-api-token"),
"the explicit credential must ride the token header: {headers}"
);
assert!(
!headers.contains("authorization"),
"token credential never doubles as basic: {headers}"
);
let headers = headers_debug(&requests[1]);
assert!(
!headers.contains("x-ignition-api-token") && !headers.contains("authorization"),
"no-secret rig client must be header-less: {headers}"
);
}
#[tokio::test]
async fn session_handle_feeds_free_fn_actions_unchanged() {
let mock = IgnitionMock::start().await;
let guard = mount_info(&mock, 3).await;
let url: url::Url = mock.uri().parse().expect("mock uri parses");
let session = Session::for_url(
url,
Some(Credential::Token(Secret::new("rig-token"))),
false,
)
.expect("for_url builds");
let result = version(Some(&*session), "test-version")
.await
.expect("version");
assert_eq!(result.cli_version, "test-version");
let info = result.gateway.expect("gateway info reached the action");
assert_eq!(info.ignition_version, "8.3.6 (b2026042713)");
let result = version(Some(session.api()), "test-version")
.await
.expect("version");
assert!(result.gateway.is_some());
let handle = session.api_handle();
let result = version(Some(&*handle), "test-version")
.await
.expect("version");
assert!(result.gateway.is_some());
assert_eq!(
guard.received_requests().await.len(),
3,
"every handle shape reached the wire unchanged"
);
}