diff --git a/tests/integration/commands/done.rs b/tests/integration/commands/done.rs index 7522257..e71b330 100644 --- a/tests/integration/commands/done.rs +++ b/tests/integration/commands/done.rs @@ -12,6 +12,7 @@ mod when_remove_flag_is_provided; mod when_section_flag_is_provided; mod when_took_flag_is_provided; mod when_unfinished_flag_is_provided; +mod when_update_flag_is_provided; use crate::support::helpers::DoingCmd; diff --git a/tests/integration/commands/done/when_no_argument_is_provided.rs b/tests/integration/commands/done/when_no_argument_is_provided.rs index 8ed7aa5..074b87d 100644 --- a/tests/integration/commands/done/when_no_argument_is_provided.rs +++ b/tests/integration/commands/done/when_no_argument_is_provided.rs @@ -69,7 +69,7 @@ fn it_outputs_status_to_stderr() { } #[test] -fn it_retags_already_done_entry_with_new_timestamp() { +fn it_preserves_an_existing_done_timestamp() { let doing = DoingCmd::new(); fs::write( @@ -87,11 +87,40 @@ fn it_retags_already_done_entry_with_new_timestamp() { .expect("expected entry in doing file"); assert!( - entry_line.contains("@done("), - "expected @done tag on re-tagged entry, got: {entry_line}" + entry_line.contains("@done(2026-03-23 11:00)"), + "expected the original @done timestamp to survive, got: {entry_line}" ); +} + +#[test] +fn it_picks_the_newest_entry_when_the_file_is_ordered_newest_first() { + let doing = DoingCmd::new(); + + fs::write( + doing.doing_file_path(), + "Currently:\n\t- 2009-06-01 18:30 | Newest task\n\t- 2008-06-01 18:30 | Middle task\n\t- 2007-06-01 18:30 | Oldest task\n", + ) + .expect("failed to write doing file"); + + doing.run(["done"]).assert().success(); + + let contents = doing.read_doing_file(); + + let newest = contents + .lines() + .find(|l| l.contains("Newest task")) + .expect("expected newest entry in doing file"); + assert!( + newest.contains("@done("), + "expected the newest entry by date to be marked @done, got: {newest}" + ); + + let oldest = contents + .lines() + .find(|l| l.contains("Oldest task")) + .expect("expected oldest entry in doing file"); assert!( - !entry_line.contains("@done(2026-03-23 11:00)"), - "expected new @done timestamp (not original 11:00), got: {entry_line}" + !oldest.contains("@done("), + "expected the last entry in file order to be left alone, got: {oldest}" ); } diff --git a/tests/integration/commands/done/when_update_flag_is_provided.rs b/tests/integration/commands/done/when_update_flag_is_provided.rs new file mode 100644 index 0000000..9328577 --- /dev/null +++ b/tests/integration/commands/done/when_update_flag_is_provided.rs @@ -0,0 +1,31 @@ +use std::fs; + +use crate::support::helpers::DoingCmd; + +#[test] +fn it_retags_already_done_entry_with_new_timestamp() { + let doing = DoingCmd::new(); + + fs::write( + doing.doing_file_path(), + "Currently:\n\t- 2026-03-23 10:00 | Already finished @done(2026-03-23 11:00)\n", + ) + .expect("failed to write doing file"); + + doing.run(["done", "--update"]).assert().success(); + + let contents = doing.read_doing_file(); + let entry_line = contents + .lines() + .find(|l| l.contains("Already finished")) + .expect("expected entry in doing file"); + + assert!( + entry_line.contains("@done("), + "expected @done tag on re-tagged entry, got: {entry_line}" + ); + assert!( + !entry_line.contains("@done(2026-03-23 11:00)"), + "expected new @done timestamp (not original 11:00), got: {entry_line}" + ); +}