cargo/tests/testsuite/login.rs
Arlo Siemsen 24dac452c5 Improve testing framework for http registries
Improve integration of the http server introduced by the http-registry feature.
Now the same HTTP server is used for serving downloads, the index, and
the API.

This makes it easier to write tests that deal with authentication and
http registries.
2022-06-10 16:51:35 -05:00

93 lines
2.9 KiB
Rust

//! Tests for the `cargo login` command.
use cargo_test_support::install::cargo_home;
use cargo_test_support::registry::RegistryBuilder;
use cargo_test_support::{cargo_process, t};
use std::fs::{self};
use std::path::PathBuf;
use toml_edit::easy as toml;
const TOKEN: &str = "test-token";
const TOKEN2: &str = "test-token2";
const ORIGINAL_TOKEN: &str = "api-token";
fn setup_new_credentials() {
let config = cargo_home().join("credentials");
setup_new_credentials_at(config);
}
fn setup_new_credentials_at(config: PathBuf) {
t!(fs::create_dir_all(config.parent().unwrap()));
t!(fs::write(
&config,
format!(r#"token = "{token}""#, token = ORIGINAL_TOKEN)
));
}
fn check_token(expected_token: &str, registry: Option<&str>) -> bool {
let credentials = cargo_home().join("credentials");
assert!(credentials.is_file());
let contents = fs::read_to_string(&credentials).unwrap();
let toml: toml::Value = contents.parse().unwrap();
let token = match (registry, toml) {
// A registry has been provided, so check that the token exists in a
// table for the registry.
(Some(registry), toml::Value::Table(table)) => table
.get("registries")
.and_then(|registries_table| registries_table.get(registry))
.and_then(|registry_table| match registry_table.get("token") {
Some(&toml::Value::String(ref token)) => Some(token.as_str().to_string()),
_ => None,
}),
// There is no registry provided, so check the global token instead.
(None, toml::Value::Table(table)) => table
.get("registry")
.and_then(|registry_table| registry_table.get("token"))
.and_then(|v| match v {
toml::Value::String(ref token) => Some(token.as_str().to_string()),
_ => None,
}),
_ => None,
};
if let Some(token_val) = token {
token_val == expected_token
} else {
false
}
}
#[cargo_test]
fn registry_credentials() {
let _alternative = RegistryBuilder::new().alternative().build();
let _alternative2 = RegistryBuilder::new()
.alternative_named("alternative2")
.build();
setup_new_credentials();
let reg = "alternative";
cargo_process("login --registry").arg(reg).arg(TOKEN).run();
// Ensure that we have not updated the default token
assert!(check_token(ORIGINAL_TOKEN, None));
// Also ensure that we get the new token for the registry
assert!(check_token(TOKEN, Some(reg)));
let reg2 = "alternative2";
cargo_process("login --registry")
.arg(reg2)
.arg(TOKEN2)
.run();
// Ensure not overwriting 1st alternate registry token with
// 2nd alternate registry token (see rust-lang/cargo#7701).
assert!(check_token(ORIGINAL_TOKEN, None));
assert!(check_token(TOKEN, Some(reg)));
assert!(check_token(TOKEN2, Some(reg2)));
}