use crate::AzureDevOpsPersonalAccessToken;
use crate::AzureRestResource;
use cloud_terrastodon_azure_types::AzureAccessToken;
use cloud_terrastodon_azure_types::AzureTenantId;
use cloud_terrastodon_command::CommandBuilder;
use cloud_terrastodon_command::CommandKind;
use cloud_terrastodon_command::FromCommandOutput;
pub async fn fetch_azure_access_token<T: FromCommandOutput>(
tenant: Option<AzureTenantId>,
resource: AzureRestResource,
) -> eyre::Result<AzureAccessToken<T>> {
let mut cmd = CommandBuilder::new(CommandKind::AzureCLI);
cmd.args(["account", "get-access-token", "--output", "json"]);
if let Some(tenant) = tenant {
let tenant = tenant.to_string();
cmd.args(["--tenant", tenant.as_str()]);
}
resource.apply_access_token_args(&mut cmd);
cmd.run::<AzureAccessToken<T>>().await
}
pub async fn fetch_azure_devops_personal_access_token()
-> eyre::Result<AzureAccessToken<AzureDevOpsPersonalAccessToken>> {
fetch_azure_access_token(None, AzureRestResource::AzureDevOps).await
}
#[cfg(test)]
mod test {
use crate::azure_access_token::fetch_azure_devops_personal_access_token;
use crate::create_azure_devops_rest_client;
use serde_json::Value;
#[tokio::test]
pub async fn it_works_profiles() -> eyre::Result<()> {
let url = "https://app.vssps.visualstudio.com/_apis/profile/profiles/me?api-version=6.0";
let pat = fetch_azure_devops_personal_access_token()
.await?
.access_token;
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(())
}
#[tokio::test]
#[ignore] pub async fn it_works_projects() -> eyre::Result<()> {
let url = "https://dev.azure.com/aafc/_apis/projects?api-version=7.1";
let pat = fetch_azure_devops_personal_access_token()
.await?
.access_token;
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.as_u16(),
status.canonical_reason()
);
let parsed = serde_json::from_str::<Value>(&content)?;
assert!(parsed.is_object());
Ok(())
}
}