cloud_terrastodon_credentials 0.35.0

Helpers for getting Azure PAT and stuff for Cloud Terrastodon
use crate::AuthBearerExt;
use reqwest::Client;
use reqwest::ClientBuilder;
use reqwest::header::AUTHORIZATION;
use reqwest::header::HeaderMap;
use reqwest::tls::Version;

pub async fn create_azure_devops_rest_client(token: &impl AuthBearerExt) -> eyre::Result<Client> {
    let client: Client = ClientBuilder::new()
        .default_headers({
            let mut headers = HeaderMap::new();
            headers.insert(AUTHORIZATION, token.as_authorization_header_value());
            headers
        })
        .min_tls_version(Version::TLS_1_2)
        .build()?;
    Ok(client)
}

#[cfg(test)]
mod test {
    use crate::create_azure_devops_rest_client;
    use crate::get_azure_devops_personal_access_token_from_credential_manager;
    use serde_json::Value;

    #[tokio::test]
    pub async fn it_works() -> eyre::Result<()> {
        let url = "https://dev.azure.com/aafc/_apis/projects?api-version=7.1";

        let pat = get_azure_devops_personal_access_token_from_credential_manager().await?;
        let client = create_azure_devops_rest_client(&pat).await?;

        let resp = client.get(url).send().await?;
        let status = resp.status();

        let content = resp.text().await?;

        assert_eq!(200, status.as_u16(), "{:?}", status.canonical_reason());
        let parsed = serde_json::from_str::<Value>(&content)?;
        assert!(parsed.is_object());
        Ok(())
    }
}