use padzapp::api::PadzApi;
use padzapp::commands::{NestingMode, PadzPaths};
use padzapp::model::Scope;
use padzapp::store::bucketed::BucketedStore;
use padzapp::store::mem_backend::MemBackend;
fn strip_ansi(s: &str) -> String {
console::strip_ansi_codes(s).to_string()
}
fn setup() -> PadzApi<BucketedStore<MemBackend>> {
let store = BucketedStore::new(
MemBackend::new(),
MemBackend::new(),
MemBackend::new(),
MemBackend::new(),
);
let paths = PadzPaths {
project: Some(std::path::PathBuf::from(".padz")),
global: std::path::PathBuf::from(".padz"),
};
let mut api = PadzApi::new(store, paths);
api.create_pad(
Scope::Project,
"Groceries".to_string(),
"Milk, Eggs".to_string(),
None,
)
.unwrap();
api.create_pad(
Scope::Project,
"Grocery List".to_string(),
"Bread, Butter".to_string(),
None,
)
.unwrap();
api.create_pad(Scope::Project, "Gold".to_string(), "Au".to_string(), None)
.unwrap();
api
}
#[test]
fn test_referencing_by_index() {
let api = setup();
let res = api
.view_pads(Scope::Project, &["1"], NestingMode::Flat)
.unwrap();
assert_eq!(res.listed_pads.len(), 1);
assert_eq!(res.listed_pads[0].pad.metadata.title, "Gold");
let res = api
.view_pads(Scope::Project, &["3"], NestingMode::Flat)
.unwrap();
assert_eq!(res.listed_pads.len(), 1);
assert_eq!(res.listed_pads[0].pad.metadata.title, "Groceries");
}
#[test]
fn test_referencing_multiple_indexes() {
let api = setup();
let res = api
.view_pads(Scope::Project, &["1", "2"], NestingMode::Flat)
.unwrap();
assert_eq!(res.listed_pads.len(), 2);
}
#[test]
fn test_referencing_by_title_exact() {
let api = setup();
let res = api
.view_pads(Scope::Project, &["Gold"], NestingMode::Flat)
.unwrap();
assert_eq!(res.listed_pads.len(), 1);
assert_eq!(res.listed_pads[0].pad.metadata.title, "Gold");
}
#[test]
fn test_referencing_by_title_partial() {
let api = setup();
let res = api
.view_pads(Scope::Project, &["old"], NestingMode::Flat)
.unwrap();
assert_eq!(res.listed_pads.len(), 1);
assert_eq!(res.listed_pads[0].pad.metadata.title, "Gold");
}
#[test]
fn test_referencing_by_title_multi_word_arg() {
let api = setup();
let res = api
.view_pads(Scope::Project, &["Grocery", "List"], NestingMode::Flat)
.unwrap();
assert_eq!(res.listed_pads.len(), 1);
assert_eq!(res.listed_pads[0].pad.metadata.title, "Grocery List");
}
#[test]
fn test_referencing_ambiguous() {
let api = setup();
let res = api.view_pads(Scope::Project, &["Gro"], NestingMode::Flat);
assert!(res.is_err());
let err = strip_ansi(&res.err().unwrap().to_string());
assert!(err.contains("matches multiple pads"));
assert!(err.contains("Groceries"));
assert!(err.contains("Grocery List"));
}
#[test]
fn test_referencing_mixed_treated_as_title() {
let api = setup();
let res = api.view_pads(Scope::Project, &["1", "Gold"], NestingMode::Flat);
assert!(res.is_err());
let err = res.err().unwrap().to_string();
assert!(err.contains("No pad found matching \"1 Gold\""));
}
#[test]
fn test_referencing_mixed_no_match() {
let api = setup();
let res = api.view_pads(Scope::Project, &["1", "Grocery"], NestingMode::Flat);
assert!(res.is_err());
}
#[test]
fn test_referencing_does_not_match_deleted_titles() {
let store = BucketedStore::new(
MemBackend::new(),
MemBackend::new(),
MemBackend::new(),
MemBackend::new(),
);
let paths = PadzPaths {
project: Some(std::path::PathBuf::from(".padz")),
global: std::path::PathBuf::from(".padz"),
};
let mut api = PadzApi::new(store, paths);
api.create_pad(Scope::Project, "Shared Term Active".into(), "".into(), None)
.unwrap();
api.create_pad(
Scope::Project,
"Shared Term Trashed".into(),
"".into(),
None,
)
.unwrap();
api.delete_pads(Scope::Project, &["1"]).unwrap();
let res = api
.view_pads(Scope::Project, &["Shared"], NestingMode::Flat)
.unwrap();
assert_eq!(res.listed_pads.len(), 1);
assert_eq!(res.listed_pads[0].pad.metadata.title, "Shared Term Active");
}