use std::io;
use std::sync::Mutex;
use crate::auth::login::{BrowserLauncher, CodeReceiver, Pacer};
#[derive(Default)]
pub struct FakeBrowserLauncher {
opened: Mutex<Vec<String>>,
}
impl FakeBrowserLauncher {
pub fn new() -> Self {
FakeBrowserLauncher::default()
}
pub fn opened(&self) -> Vec<String> {
self.opened
.lock()
.ok()
.map(|o| o.to_vec())
.unwrap_or_default()
}
}
impl BrowserLauncher for FakeBrowserLauncher {
fn open(&self, url: &str) -> io::Result<()> {
if let Ok(mut opened) = self.opened.lock() {
opened.push(url.to_owned());
}
Ok(())
}
}
pub struct FakeCodeReceiver {
port: u16,
query: String,
}
impl FakeCodeReceiver {
pub fn new(port: u16, query: impl Into<String>) -> Self {
FakeCodeReceiver {
port,
query: query.into(),
}
}
}
impl CodeReceiver for FakeCodeReceiver {
fn bind(&self, port: Option<u16>) -> io::Result<u16> {
Ok(port.unwrap_or(self.port))
}
fn await_query(&self) -> io::Result<String> {
Ok(self.query.clone())
}
}
#[derive(Default)]
pub struct FakePacer {
waited: Mutex<Vec<u64>>,
}
impl FakePacer {
pub fn new() -> Self {
FakePacer::default()
}
pub fn waited(&self) -> Vec<u64> {
self.waited
.lock()
.ok()
.map(|w| w.to_vec())
.unwrap_or_default()
}
}
impl Pacer for FakePacer {
fn wait(&self, secs: u64) {
if let Ok(mut waited) = self.waited.lock() {
waited.push(secs);
}
}
}