@ -866,3 +866,100 @@ fn ready_filter_bad_format_exits_nonzero() {
"bad filter format on ready should exit non-zero"
) ;
}
// ── done-exclusion default behaviour ──────────────────────────────────────────
/// `nbd list` without any filter excludes done tickets.
#[ test ]
fn list_excludes_done_by_default ( ) {
let env = TestEnv ::new ( ) ;
let todo_id = env . create ( & [ "--title" , "Todo ticket" ] ) ;
let done_id = env . create ( & [ "--title" , "Done ticket" ] ) ;
env . run ( & [ "update" , & done_id , "--status" , "done" ] ) ;
let output = env . run ( & [ "list" , "--json" ] ) ;
assert! ( output . status . success ( ) ) ;
let stdout = String ::from_utf8 ( output . stdout ) . unwrap ( ) ;
let parsed : serde_json ::Value = serde_json ::from_str ( & stdout ) . unwrap ( ) ;
let arr = parsed . as_array ( ) . unwrap ( ) ;
assert_eq! ( arr . len ( ) , 1 , "only the todo ticket should appear" ) ;
assert_eq! ( arr [ 0 ] [ "id" ] , todo_id ) ;
}
/// `nbd list --filter status=done` shows only done tickets.
#[ test ]
fn list_filter_status_done_shows_only_done ( ) {
let env = TestEnv ::new ( ) ;
env . create ( & [ "--title" , "Todo ticket" ] ) ;
let done_id = env . create ( & [ "--title" , "Done ticket" ] ) ;
env . run ( & [ "update" , & done_id , "--status" , "done" ] ) ;
let output = env . run ( & [ "list" , "--filter" , "status=done" , "--json" ] ) ;
assert! ( output . status . success ( ) ) ;
let stdout = String ::from_utf8 ( output . stdout ) . unwrap ( ) ;
let parsed : serde_json ::Value = serde_json ::from_str ( & stdout ) . unwrap ( ) ;
let arr = parsed . as_array ( ) . unwrap ( ) ;
assert_eq! ( arr . len ( ) , 1 , "only the done ticket should appear" ) ;
assert_eq! ( arr [ 0 ] [ "id" ] , done_id ) ;
}
/// `nbd list --filter status=*` includes done tickets.
#[ test ]
fn list_filter_status_wildcard_includes_done ( ) {
let env = TestEnv ::new ( ) ;
env . create ( & [ "--title" , "Todo ticket" ] ) ;
let done_id = env . create ( & [ "--title" , "Done ticket" ] ) ;
env . run ( & [ "update" , & done_id , "--status" , "done" ] ) ;
let output = env . run ( & [ "list" , "--filter" , "status=*" , "--json" ] ) ;
assert! ( output . status . success ( ) ) ;
let stdout = String ::from_utf8 ( output . stdout ) . unwrap ( ) ;
let parsed : serde_json ::Value = serde_json ::from_str ( & stdout ) . unwrap ( ) ;
let arr = parsed . as_array ( ) . unwrap ( ) ;
assert_eq! ( arr . len ( ) , 2 , "both tickets should appear with status=*" ) ;
}
/// `nbd list --filter type=bug` excludes done bug tickets.
#[ test ]
fn list_filter_type_still_excludes_done ( ) {
let env = TestEnv ::new ( ) ;
env . create ( & [ "--title" , "Bug todo" , "--type" , "bug" ] ) ;
let done_bug = env . create ( & [ "--title" , "Bug done" , "--type" , "bug" ] ) ;
env . create ( & [ "--title" , "Task todo" , "--type" , "task" ] ) ;
env . run ( & [ "update" , & done_bug , "--status" , "done" ] ) ;
let output = env . run ( & [ "list" , "--filter" , "type=bug" , "--json" ] ) ;
assert! ( output . status . success ( ) ) ;
let stdout = String ::from_utf8 ( output . stdout ) . unwrap ( ) ;
let parsed : serde_json ::Value = serde_json ::from_str ( & stdout ) . unwrap ( ) ;
let arr = parsed . as_array ( ) . unwrap ( ) ;
assert_eq! ( arr . len ( ) , 1 , "only non-done bug ticket should appear" ) ;
assert_eq! ( arr [ 0 ] [ "title" ] , "Bug todo" ) ;
}
/// `nbd list --filter type=bug --filter status=*` includes all bug tickets.
#[ test ]
fn list_filter_type_and_status_wildcard_includes_done_bugs ( ) {
let env = TestEnv ::new ( ) ;
env . create ( & [ "--title" , "Bug todo" , "--type" , "bug" ] ) ;
let done_bug = env . create ( & [ "--title" , "Bug done" , "--type" , "bug" ] ) ;
env . run ( & [ "update" , & done_bug , "--status" , "done" ] ) ;
let output = env . run ( & [
"list" , "--filter" , "type=bug" , "--filter" , "status=*" , "--json" ,
] ) ;
assert! ( output . status . success ( ) ) ;
let stdout = String ::from_utf8 ( output . stdout ) . unwrap ( ) ;
let parsed : serde_json ::Value = serde_json ::from_str ( & stdout ) . unwrap ( ) ;
let arr = parsed . as_array ( ) . unwrap ( ) ;
assert_eq! (
arr . len ( ) ,
2 ,
"both bug tickets should appear when status=* is set"
) ;
}