make record test, fix log update
[?]
May 22, 2025, 9:56 AM
I56UGW7UUKLSR4753EYRGNROZB5PD522REEOGHVAQOZZTSVRUEEQCDependencies
- [2]
6YZAVBWUInitial commit - [3]
KLR5FRIBadd fs state read/write of repos - [4]
IQDCHWCPload a pijul repo - [5]
YBJRDOTCmake all repo actions async - [6]
2VUX5BTDload identity - [7]
A5YBC77Vrecord! - [8]
6SW7UVSHupdate iced version - [9]
HOJZI52Yrename flowers_ui to inflorescence - [10]
JE44NYHMdisplay log files diffs - [11]
ONRCENKTrm unnecessary state from repo's internal state - [12]
4ELJZGRJload and store all change diffs at once - [13]
3SYSJKYLadd app icon - [14]
OPXFZKEBview tests setup - [15]
WGID4LS4absolutely slayed testing with iced task - [16]
VCNKFNUFapp init test - [17]
ACDXXAX2refactor main's updates into smaller fns - [18]
ELG3UDT6allow to rm added files - [*]
SWWE2R6Mdisplay basic repo stuff
Change contents
- edit in libflorescence/src/repo.rs at line 145
AddedUntrackedFile {path: String,},RmedAddedFile {path: String,},/// The State is updated after making a recordRecorded(State), - edit in libflorescence/src/repo.rs at line 212
let path_clone = path.clone(); - replacement in libflorescence/src/repo.rs at line 214
add(&mut internal_state, &path);add(&mut internal_state, &path_clone); - edit in libflorescence/src/repo.rs at line 219
let _ = msg_out_tx.send(MsgOut::AddedUntrackedFile { path }); - edit in libflorescence/src/repo.rs at line 222
let path_clone = path.clone(); - replacement in libflorescence/src/repo.rs at line 224
rm(&mut internal_state, &path);rm(&mut internal_state, &path_clone); - edit in libflorescence/src/repo.rs at line 229
let _ = msg_out_tx.send(MsgOut::RmedAddedFile { path }); - replacement in libflorescence/src/repo.rs at line 232
internal_state = spawn_blocking(move || {let state: State;(internal_state, state) = spawn_blocking(move || { - replacement in libflorescence/src/repo.rs at line 235
internal_state// Update state after making a recordlet state = get_state(&internal_state);(internal_state, state) - edit in libflorescence/src/repo.rs at line 241
let _ = msg_out_tx.send(MsgOut::Recorded(state)); - edit in libflorescence/src/repo.rs at line 279
dbg!(&log); - edit in justfile at line 39
# NOTE: tests may fail with regular `cargo test` due to use of env var to set# pijul config dir to a temp dir. We have to use use `cargo-nextest` that runs# tests in isolated processes. - replacement in justfile at line 43
RUST_BACKTRACE={{rust_backtrace}} cargo testRUST_BACKTRACE={{rust_backtrace}} cargo nextest run - replacement in justfile at line 68
cargo test --package inflorescence-view -- viewcargo nextest run --package inflorescence-view -- view - replacement in justfile at line 75
--exec "test --package inflorescence-view -- view" \--exec "nextest run --package inflorescence-view -- view" \ - replacement in inflorescence/src/test.rs at line 1
use crate::{init, task, Msg};use std::sync::Arc;use crate::task::{await_next_msg, Task};use crate::{cursor, edit_record_msg, init, save_record, start_record, task, update,Msg, State,};use iced::widget::text_editor;use inflorescence_view::app; - replacement in inflorescence/src/test.rs at line 11
use libflorescence::testing::{setup_pijul_id, setup_pijul_repo};use libflorescence::testing::{setup_pijul_id, setup_pijul_repo, PijulId, PijulRepo,}; - replacement in inflorescence/src/test.rs at line 15
#[tokio::test]use assert_matches::assert_matches;use derivative::Derivative;use test_log::test;use tokio::fs;/// Test app [`init`] function#[test(tokio::test)] - replacement in inflorescence/src/test.rs at line 35
let msg_0 = task::await_next_msg(&mut tasks).await.unwrap();let msg_1 = task::await_next_msg(&mut tasks).await.unwrap();let msg_2 = task::await_next_msg(&mut tasks).await.unwrap();let msg_0 = task::await_next_msg(&mut tasks).await;let msg_1 = task::await_next_msg(&mut tasks).await;let msg_2 = task::await_next_msg(&mut tasks).await; - edit in inflorescence/src/test.rs at line 63[16.3920]
/// Test making of records#[test(tokio::test)]async fn test_making_records() {let TestState {mut state,mut tasks,mut fs_watch_task,initial_change_len,id: _,repo,} = setup_state().await;let repo_path = repo.dir.path();// _________________________________________________________________________// Case: start -> edit -> save// Add an untracked filelet file_to_record = "funky.rs";fs::write(repo_path.join(file_to_record), "music").await.unwrap();// Wait for the FS watch to pick it uplet msg = await_next_msg(&mut fs_watch_task).await;assert_matches!(&msg,Msg::View(app::Msg::ToRepo(repo::MsgIn::RefreshChangedAndUntrackedFiles)));// Update the state with it to send it to repolet _task = update(&mut state, msg);// Wait for response from repolet msg = await_next_msg(&mut tasks).await;assert_matches!(&msg, Msg::FromRepo(repo::MsgOut::Refreshed(_)));let _task = update(&mut state, msg);// Select itstate.cursor.selection = Some(cursor::Selection::UntrackedFile {ix: 0,path: file_to_record.to_string(),});// Add it to tracked fileslet _task = update(&mut state, Msg::AddUntrackedFile);// Wait for it to be addedlet msg = task::await_next_msg(&mut tasks).await;assert_matches!(&msg,Msg::FromRepo(repo::MsgOut::AddedUntrackedFile { path }) if path == file_to_record);// Start a recordlet _task = start_record(&mut state);assert!(state.record_msg.is_some());// Edit the record msglet record_msg = "Added funky music";edit_record_msg(&mut state,text_editor::Action::Edit(text_editor::Edit::Paste(Arc::new(record_msg.to_string(),))),);assert!(state.record_msg.is_some());assert_matches!(state.record_msg.as_ref().unwrap(),app::RecordMsg::Typing(_));if let app::RecordMsg::Typing(content) = state.record_msg.as_ref().unwrap(){assert_eq!(&content.text(), record_msg);}// Save the recordlet _task = save_record(&mut state);let msg = task::await_next_msg(&mut tasks).await;assert_matches!(&msg, Msg::FromRepo(repo::MsgOut::Recorded(_)));let _task = update(&mut state, msg);// Check the logdbg!(&state.repo.as_ref().unwrap().log);assert_eq!(state.repo.as_ref().unwrap().log.len(),initial_change_len + 1);// _________________________________________________________________________// Case: start -> edit -> abandon -> start// _________________________________________________________________________// Case: start -> edit -> defer -> start}async fn setup_state() -> TestState {let id = setup_pijul_id();let repo = setup_pijul_repo();let repo_path = repo.dir.path();let (mut state, mut tasks) = init(repo_path.to_path_buf());// Wait for the first 3 msgs:// - Msg::WindowOpened// - Msg::LoadedId// - Msg::FromRepo(repo::MsgOut::Init)let mut fs_watch_task: Task<Msg> = Task::none();for _ in 0..3 {let msg = task::await_next_msg(&mut tasks).await;// Upate state with the msg received from task to init the repolet task = update(&mut state, msg.clone());if matches!(&msg, Msg::FromRepo(repo::MsgOut::Init(_))) {fs_watch_task = task;}}assert!(state.repo.is_some());// Select and record the default ".ignore" filelet file_to_record = ".ignore";state.cursor.selection = Some(cursor::Selection::UntrackedFile {ix: 0,path: file_to_record.to_string(),});// Add it to tracked fileslet _task = update(&mut state, Msg::AddUntrackedFile);// Wait for it to be addedlet msg = task::await_next_msg(&mut tasks).await;assert_matches!(&msg,Msg::FromRepo(repo::MsgOut::AddedUntrackedFile { path }) if path == file_to_record);// Make the initial record to add project root: Start a recordlet _task = start_record(&mut state);assert!(state.record_msg.is_some());// Edit the record msglet record_msg = "Initialized";edit_record_msg(&mut state,text_editor::Action::Edit(text_editor::Edit::Paste(Arc::new(record_msg.to_string(),))),);assert!(state.record_msg.is_some());assert_matches!(state.record_msg.as_ref().unwrap(),app::RecordMsg::Typing(_));if let app::RecordMsg::Typing(content) = state.record_msg.as_ref().unwrap(){assert_eq!(&content.text(), record_msg);}// Save the recordlet _task = save_record(&mut state);let msg = task::await_next_msg(&mut tasks).await;assert_matches!(&msg, Msg::FromRepo(repo::MsgOut::Recorded(_)));let _task = update(&mut state, msg);// Expect 2 changes in the log:// - Add root// - Add ".ignore" filelet initial_change_len = 2;let log = &state.repo.as_ref().unwrap().log;assert_eq!(log.len(), initial_change_len);assert_eq!(log[0].file_paths, [file_to_record]);assert_eq!(log[1].file_paths, ["/"]);TestState {state,tasks,fs_watch_task,initial_change_len,id,repo,}}#[derive(Derivative)]#[derivative(Debug)]struct TestState {pub state: State,#[derivative(Debug = "ignore")]pub tasks: Task<Msg>,#[derivative(Debug = "ignore")]pub fs_watch_task: Task<Msg>,initial_change_len: usize,pub id: PijulId,pub repo: PijulRepo,} - replacement in inflorescence/src/task.rs at line 17
pub async fn await_next_msg<T>(tasks: &mut Task<T>) -> Option<T> {pub async fn await_next_msg<T>(tasks: &mut Task<T>) -> T { - replacement in inflorescence/src/task.rs at line 19
if let Some(stream) = stream.as_mut() {if let Some(msg) = iced::futures::stream::StreamExt::next(stream).await{return Some(msg);}}Nonelet stream = stream.as_mut().unwrap();iced::futures::stream::StreamExt::next(stream).await.unwrap() - replacement in inflorescence/src/task.rs at line 137
assert_eq!(result, Some(123_usize))assert_eq!(result, 123_usize) - edit in inflorescence/src/main.rs at line 212
repo::MsgOut::AddedUntrackedFile { path: _ } => Task::none(),repo::MsgOut::RmedAddedFile { path: _ } => Task::none(),repo::MsgOut::Recorded(repo) => repo_refreshed(state, repo), - edit in inflorescence/Cargo.toml at line 44
workspace = true[dev-dependencies.derivative]workspace = true[dev-dependencies.test-log] - edit in Cargo.toml at line 77
[workspace.dependencies.test-log]version = "0.2" - edit in Cargo.lock at line 134
][[package]]name = "anstream"version = "0.6.18"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"dependencies = ["anstyle","anstyle-parse","anstyle-query","anstyle-wincon","colorchoice","is_terminal_polyfill","utf8parse", - edit in Cargo.lock at line 152
name = "anstyle"version = "1.0.10"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"[[package]]name = "anstyle-parse"version = "0.2.6"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"dependencies = ["utf8parse",][[package]]name = "anstyle-query"version = "1.1.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"dependencies = ["windows-sys 0.59.0",][[package]]name = "anstyle-wincon"version = "3.0.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa"dependencies = ["anstyle","once_cell_polyfill","windows-sys 0.59.0",][[package]] - edit in Cargo.lock at line 1032
name = "colorchoice"version = "1.0.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"[[package]] - edit in Cargo.lock at line 1627
][[package]]name = "env_filter"version = "0.1.3"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0"dependencies = ["log",][[package]]name = "env_logger"version = "0.11.8"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f"dependencies = ["anstream","anstyle","env_filter","log", - edit in Cargo.lock at line 2803
"derivative", - edit in Cargo.lock at line 2808
"test-log", - edit in Cargo.lock at line 2886
[[package]]name = "is_terminal_polyfill"version = "1.70.1"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - edit in Cargo.lock at line 3914
name = "once_cell_polyfill"version = "1.70.0"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "2611b99ab098a31bdc8be48b4f1a285ca0ced28bd5b4f23e45efa8c63b09efa5"dependencies = ["once_cell",][[package]] - edit in Cargo.lock at line 5439
[[package]]name = "test-log"version = "0.2.17"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "e7f46083d221181166e5b6f6b1e5f1d499f3a76888826e6cb1d057554157cd0f"dependencies = ["env_logger","test-log-macros","tracing-subscriber",][[package]]name = "test-log-macros"version = "0.2.17"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "888d0c3c6db53c0fdab160d2ed5e12ba745383d3e85813f2ea0f2b1475ab553f"dependencies = ["proc-macro2","quote","syn 2.0.100",] - edit in Cargo.lock at line 6002
name = "utf8parse"version = "0.2.2"source = "registry+https://github.com/rust-lang/crates.io-index"checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"[[package]]