blob: 7a3839e92547858094695beca17ef7989835ace8 [file] [log] [blame]
use crate::cli::common::{IggyCmdCommand, IggyCmdTestCase};
use assert_cmd::assert::Assert;
use async_trait::async_trait;
use iggy::cli::system::session::ServerSession;
use iggy::client::Client;
use iggy::utils::personal_access_token_expiry::PersonalAccessTokenExpiry;
use predicates::str::diff;
#[derive(Debug)]
pub enum TestLoginCmdType {
Success,
SuccessWithTimeout(u64),
AlreadyLoggedIn,
AlreadyLoggedInWithToken,
}
#[derive(Debug)]
pub(super) struct TestLoginCmd {
server_address: String,
login_type: TestLoginCmdType,
}
impl TestLoginCmd {
pub(super) fn new(server_address: String, login_type: TestLoginCmdType) -> Self {
Self {
server_address,
login_type,
}
}
}
#[async_trait]
impl IggyCmdTestCase for TestLoginCmd {
async fn prepare_server_state(&mut self, client: &dyn Client) {
let login_session = ServerSession::new(self.server_address.clone());
match self.login_type {
TestLoginCmdType::Success | TestLoginCmdType::SuccessWithTimeout(_) => {
assert!(!login_session.is_active());
let pats = client.get_personal_access_tokens().await.unwrap();
assert_eq!(pats.len(), 0);
}
TestLoginCmdType::AlreadyLoggedIn => {
assert!(login_session.is_active());
let pats = client.get_personal_access_tokens().await.unwrap();
assert_eq!(pats.len(), 1);
}
TestLoginCmdType::AlreadyLoggedInWithToken => {
// Local keyring must be empty
assert!(!login_session.is_active());
let pat = client
.create_personal_access_token(
&login_session.get_token_name(),
PersonalAccessTokenExpiry::NeverExpire,
)
.await;
assert!(pat.is_ok());
}
}
}
fn get_command(&self) -> IggyCmdCommand {
let command = IggyCmdCommand::new().with_cli_credentials().arg("login");
if let TestLoginCmdType::SuccessWithTimeout(timeout) = self.login_type {
command.arg(format!("{timeout}s"))
} else {
command
}
}
fn verify_command(&self, command_state: Assert) {
match self.login_type {
TestLoginCmdType::Success
| TestLoginCmdType::AlreadyLoggedInWithToken
| TestLoginCmdType::SuccessWithTimeout(_) => {
command_state.success().stdout(diff(format!(
"Executing login command\nSuccessfully logged into Iggy server {}\n",
self.server_address
)));
}
TestLoginCmdType::AlreadyLoggedIn => {
command_state.success().stdout(diff(format!(
"Executing login command\nAlready logged into Iggy server {}\n",
self.server_address
)));
}
}
}
async fn verify_server_state(&self, client: &dyn Client) {
let login_session = ServerSession::new(self.server_address.clone());
assert!(login_session.is_active());
let pats = client.get_personal_access_tokens().await.unwrap();
assert_eq!(pats.len(), 1);
assert_eq!(pats[0].name, login_session.get_token_name());
}
}