mod common;

use common::run_lua;
use wiremock::matchers::{method, path};
use wiremock::{Mock, MockServer, ResponseTemplate};

#[tokio::test]
async fn test_openbao_alias_loads() {
    let script = r#"
        local bao = require("assay.openbao")
        assert.not_nil(bao)
        assert.not_nil(bao.client)
    "#;
    run_lua(script).await.unwrap();
}

#[tokio::test]
async fn test_openbao_alias_matches_vault() {
    let script = r#"
        local vault = require("assay.hashicorp.vault")
        local bao = require("assay.openbao")
        if vault ~= bao then
            error("openbao module should be the same table as vault module")
        end
    "#;
    run_lua(script).await.unwrap();
}

#[tokio::test]
async fn test_openbao_alias_client_works() {
    let server = MockServer::start().await;
    Mock::given(method("GET"))
        .and(path("/v1/secret/data/test"))
        .respond_with(ResponseTemplate::new(200).set_body_json(serde_json::json!({
            "data": {"data": {"key": "value"}}
        })))
        .mount(&server)
        .await;

    let script = format!(
        r#"
        local bao = require("assay.openbao")
        local c = bao.client("{}", "test-token")
        local data = c.kv:get("secret", "test")
        assert.eq(data.data.key, "value")
        "#,
        server.uri()
    );
    run_lua(&script).await.unwrap();
}
