make record test, fix log update

[?]
May 22, 2025, 9:56 AM
I56UGW7UUKLSR4753EYRGNROZB5PD522REEOGHVAQOZZTSVRUEEQC

Dependencies

Change contents

  • edit in libflorescence/src/repo.rs at line 145
    [17.28]
    [12.56]
    AddedUntrackedFile {
    path: String,
    },
    RmedAddedFile {
    path: String,
    },
    /// The State is updated after making a record
    Recorded(State),
  • edit in libflorescence/src/repo.rs at line 212
    [5.2442]
    [11.612]
    let path_clone = path.clone();
  • replacement in libflorescence/src/repo.rs at line 214
    [11.666][11.666:715]()
    add(&mut internal_state, &path);
    [11.666]
    [11.715]
    add(&mut internal_state, &path_clone);
  • edit in libflorescence/src/repo.rs at line 219
    [5.2606]
    [5.2606]
    let _ = msg_out_tx.send(MsgOut::AddedUntrackedFile { path });
  • edit in libflorescence/src/repo.rs at line 222
    [5.2657]
    [11.747]
    let path_clone = path.clone();
  • replacement in libflorescence/src/repo.rs at line 224
    [11.801][11.801:849]()
    rm(&mut internal_state, &path);
    [11.801]
    [11.849]
    rm(&mut internal_state, &path_clone);
  • edit in libflorescence/src/repo.rs at line 229
    [5.2820]
    [5.2820]
    let _ = msg_out_tx.send(MsgOut::RmedAddedFile { path });
  • replacement in libflorescence/src/repo.rs at line 232
    [7.760][11.881:935]()
    internal_state = spawn_blocking(move || {
    [7.760]
    [11.935]
    let state: State;
    (internal_state, state) = spawn_blocking(move || {
  • replacement in libflorescence/src/repo.rs at line 235
    [11.985][11.985:1016]()
    internal_state
    [11.985]
    [10.264]
    // Update state after making a record
    let state = get_state(&internal_state);
    (internal_state, state)
  • edit in libflorescence/src/repo.rs at line 241
    [10.321]
    [10.321]
    let _ = msg_out_tx.send(MsgOut::Recorded(state));
  • edit in libflorescence/src/repo.rs at line 279
    [11.1931]
    [11.1931]
    dbg!(&log);
  • edit in justfile at line 39
    [2.444]
    [2.444]
    # 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
    [2.450][2.450:499]()
    RUST_BACKTRACE={{rust_backtrace}} cargo test
    [2.450]
    [2.499]
    RUST_BACKTRACE={{rust_backtrace}} cargo nextest run
  • replacement in justfile at line 68
    [14.200][14.200:256]()
    cargo test --package inflorescence-view -- view
    [14.200]
    [2.1221]
    cargo nextest run --package inflorescence-view -- view
  • replacement in justfile at line 75
    [14.472][14.472:533]()
    --exec "test --package inflorescence-view -- view" \
    [14.472]
    [14.533]
    --exec "nextest run --package inflorescence-view -- view" \
  • replacement in inflorescence/src/test.rs at line 1
    [16.2521][16.2522:2552]()
    use crate::{init, task, Msg};
    [16.2521]
    [16.2552]
    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
    [16.2578][16.2578:2643]()
    use libflorescence::testing::{setup_pijul_id, setup_pijul_repo};
    [16.2578]
    [16.2643]
    use libflorescence::testing::{
    setup_pijul_id, setup_pijul_repo, PijulId, PijulRepo,
    };
  • replacement in inflorescence/src/test.rs at line 15
    [16.2644][16.2644:2659]()
    #[tokio::test]
    [16.2644]
    [16.2659]
    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
    [16.3018][16.3018:3213]()
    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();
    [16.3018]
    [16.3213]
    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 file
    let file_to_record = "funky.rs";
    fs::write(repo_path.join(file_to_record), "music")
    .await
    .unwrap();
    // Wait for the FS watch to pick it up
    let 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 repo
    let _task = update(&mut state, msg);
    // Wait for response from repo
    let msg = await_next_msg(&mut tasks).await;
    assert_matches!(&msg, Msg::FromRepo(repo::MsgOut::Refreshed(_)));
    let _task = update(&mut state, msg);
    // Select it
    state.cursor.selection = Some(cursor::Selection::UntrackedFile {
    ix: 0,
    path: file_to_record.to_string(),
    });
    // Add it to tracked files
    let _task = update(&mut state, Msg::AddUntrackedFile);
    // Wait for it to be added
    let msg = task::await_next_msg(&mut tasks).await;
    assert_matches!(
    &msg,
    Msg::FromRepo(repo::MsgOut::AddedUntrackedFile { path }) if path == file_to_record
    );
    // Start a record
    let _task = start_record(&mut state);
    assert!(state.record_msg.is_some());
    // Edit the record msg
    let 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 record
    let _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 log
    dbg!(&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 repo
    let 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" file
    let file_to_record = ".ignore";
    state.cursor.selection = Some(cursor::Selection::UntrackedFile {
    ix: 0,
    path: file_to_record.to_string(),
    });
    // Add it to tracked files
    let _task = update(&mut state, Msg::AddUntrackedFile);
    // Wait for it to be added
    let 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 record
    let _task = start_record(&mut state);
    assert!(state.record_msg.is_some());
    // Edit the record msg
    let 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 record
    let _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" file
    let 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
    [15.321][16.3954:4021]()
    pub async fn await_next_msg<T>(tasks: &mut Task<T>) -> Option<T> {
    [15.321]
    [15.391]
    pub async fn await_next_msg<T>(tasks: &mut Task<T>) -> T {
  • replacement in inflorescence/src/task.rs at line 19
    [15.424][15.424:613]()
    if let Some(stream) = stream.as_mut() {
    if let Some(msg) = iced::futures::stream::StreamExt::next(stream).await
    {
    return Some(msg);
    }
    }
    None
    [15.424]
    [15.613]
    let stream = stream.as_mut().unwrap();
    iced::futures::stream::StreamExt::next(stream)
    .await
    .unwrap()
  • replacement in inflorescence/src/task.rs at line 137
    [16.4076][15.3539:3583](),[15.3539][15.3539:3583]()
    assert_eq!(result, Some(123_usize))
    [16.4076]
    [15.3583]
    assert_eq!(result, 123_usize)
  • edit in inflorescence/src/main.rs at line 212
    [17.1078]
    [17.1078]
    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
    [16.4472]
    [16.4472]
    workspace = true
    [dev-dependencies.derivative]
    workspace = true
    [dev-dependencies.test-log]
  • edit in Cargo.toml at line 77
    [3.6092]
    [3.6093]
    [workspace.dependencies.test-log]
    version = "0.2"
  • edit in Cargo.lock at line 134
    [2.6612]
    [4.2771]
    ]
    [[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
    [4.2786]
    [4.2786]
    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
    [13.3449]
    [2.17680]
    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
    [8.5772]
    [2.27445]
    ]
    [[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
    [9.400]
    [9.400]
    "derivative",
  • edit in Cargo.lock at line 2808
    [9.472]
    [9.472]
    "test-log",
  • edit in Cargo.lock at line 2886
    [6.14134]
    [6.14134]
    [[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
    [8.13647]
    [8.13647]
    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
    [8.20582]
    [2.76842]
    [[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
    [13.11077]
    [13.11077]
    name = "utf8parse"
    version = "0.2.2"
    source = "registry+https://github.com/rust-lang/crates.io-index"
    checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
    [[package]]