113
crates/cuddle-release/tests/common/mod.rs
Normal file
113
crates/cuddle-release/tests/common/mod.rs
Normal file
@@ -0,0 +1,113 @@
|
||||
use cuddle_release::ui::{DynUi, Ui};
|
||||
|
||||
use std::{
|
||||
io::Write,
|
||||
sync::{Arc, Mutex},
|
||||
};
|
||||
|
||||
struct BufferInner {
|
||||
pub stdout: Vec<u8>,
|
||||
pub stderr: Vec<u8>,
|
||||
}
|
||||
|
||||
impl BufferInner {
|
||||
fn write_str(&mut self, content: &str) {
|
||||
write!(&mut self.stdout, "{}", content).unwrap();
|
||||
}
|
||||
|
||||
fn write_err_str(&mut self, content: &str) {
|
||||
write!(&mut self.stderr, "{}", content).unwrap();
|
||||
}
|
||||
|
||||
fn write_str_ln(&mut self, content: &str) {
|
||||
writeln!(&mut self.stdout, "{}", content).unwrap();
|
||||
}
|
||||
|
||||
fn write_err_str_ln(&mut self, content: &str) {
|
||||
writeln!(&mut self.stderr, "{}", content).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct BufferUi {
|
||||
inner: Arc<Mutex<BufferInner>>,
|
||||
}
|
||||
|
||||
impl BufferUi {
|
||||
pub fn get_stdout(&self) -> String {
|
||||
let inner = self.inner.lock().unwrap();
|
||||
let output = std::str::from_utf8(&inner.stdout).unwrap();
|
||||
|
||||
output.to_string()
|
||||
}
|
||||
|
||||
pub fn get_stderr(&self) -> String {
|
||||
let inner = self.inner.lock().unwrap();
|
||||
let output = std::str::from_utf8(&inner.stderr).unwrap();
|
||||
|
||||
output.to_string()
|
||||
}
|
||||
|
||||
pub fn get_output(&self) -> (String, String) {
|
||||
let inner = self.inner.lock().unwrap();
|
||||
let stdout = std::str::from_utf8(&inner.stdout).unwrap();
|
||||
let stderr = std::str::from_utf8(&inner.stderr).unwrap();
|
||||
|
||||
(stdout.to_string(), stderr.to_string())
|
||||
}
|
||||
}
|
||||
|
||||
impl Ui for BufferUi {
|
||||
fn write_str(&self, content: &str) {
|
||||
let mut inner = self.inner.lock().unwrap();
|
||||
print!("{}", content);
|
||||
inner.write_str(content)
|
||||
}
|
||||
|
||||
fn write_err_str(&self, content: &str) {
|
||||
let mut inner = self.inner.lock().unwrap();
|
||||
eprint!("{}", content);
|
||||
inner.write_err_str(content)
|
||||
}
|
||||
|
||||
fn write_str_ln(&self, content: &str) {
|
||||
let mut inner = self.inner.lock().unwrap();
|
||||
println!("{}", content);
|
||||
inner.write_str_ln(content)
|
||||
}
|
||||
|
||||
fn write_err_str_ln(&self, content: &str) {
|
||||
let mut inner = self.inner.lock().unwrap();
|
||||
eprintln!("{}", content);
|
||||
inner.write_err_str_ln(content)
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for BufferInner {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
stdout: Vec::new(),
|
||||
stderr: Vec::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for BufferUi {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
inner: Arc::new(Mutex::new(BufferInner::default())),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<BufferUi> for DynUi {
|
||||
fn from(value: BufferUi) -> Self {
|
||||
Box::new(value)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&BufferUi> for DynUi {
|
||||
fn from(value: &BufferUi) -> Self {
|
||||
value.clone().into()
|
||||
}
|
||||
}
|
83
crates/cuddle-release/tests/config.rs
Normal file
83
crates/cuddle-release/tests/config.rs
Normal file
@@ -0,0 +1,83 @@
|
||||
pub mod common;
|
||||
|
||||
use std::path::PathBuf;
|
||||
|
||||
use common::BufferUi;
|
||||
use cuddle_release::command::Command;
|
||||
use tracing_test::traced_test;
|
||||
|
||||
fn get_base_args<'a>() -> Vec<&'a str> {
|
||||
vec!["cuddle-please", "config", "list"]
|
||||
}
|
||||
|
||||
fn assert_output(ui: &BufferUi, expected_stdout: &str, expected_stderr: &str) {
|
||||
let (stdout, stderr) = ui.get_output();
|
||||
|
||||
assert_eq!(expected_stdout, &stdout);
|
||||
assert_eq!(expected_stderr, &stderr);
|
||||
}
|
||||
|
||||
fn get_test_data_path(item: &str) -> PathBuf {
|
||||
std::env::current_dir()
|
||||
.ok()
|
||||
.map(|p| p.join("testdata").join(item))
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[traced_test]
|
||||
fn test_config_from_current_dir() {
|
||||
let args = get_base_args();
|
||||
let ui = &BufferUi::default();
|
||||
let current_dir = get_test_data_path("cuddle-embed");
|
||||
|
||||
Command::new_from_args(Some(ui), args.into_iter())
|
||||
.execute(Some(¤t_dir))
|
||||
.unwrap();
|
||||
|
||||
assert_output(ui, "cuddle-config\n", "");
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[traced_test]
|
||||
fn test_config_from_source_dir() {
|
||||
let mut args = get_base_args();
|
||||
let ui = &BufferUi::default();
|
||||
let current_dir = get_test_data_path("cuddle-embed");
|
||||
args.push("--source");
|
||||
args.push(current_dir.to_str().unwrap());
|
||||
|
||||
Command::new_from_args(Some(ui), args.into_iter())
|
||||
.execute(None)
|
||||
.unwrap();
|
||||
|
||||
assert_output(ui, "cuddle-config\n", "");
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[traced_test]
|
||||
fn test_config_from_stdin() {
|
||||
let mut args = get_base_args();
|
||||
let ui = &BufferUi::default();
|
||||
let current_dir = get_test_data_path("cuddle-embed");
|
||||
args.push("--source");
|
||||
args.push(current_dir.to_str().unwrap());
|
||||
args.push("--config-stdin");
|
||||
|
||||
Command::new_from_args_with_stdin(Some(ui), args.into_iter(), || Ok("please".into()))
|
||||
.execute(None)
|
||||
.unwrap();
|
||||
|
||||
assert_output(ui, "cuddle-config\n", "");
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[traced_test]
|
||||
fn test_config_fails_when_not_path_is_set() {
|
||||
let args = get_base_args();
|
||||
let ui = &BufferUi::default();
|
||||
|
||||
let res = Command::new_from_args(Some(ui), args.into_iter()).execute(None);
|
||||
|
||||
assert!(res.is_err())
|
||||
}
|
Reference in New Issue
Block a user