diff --git a/reactive_stores/src/lib.rs b/reactive_stores/src/lib.rs index 9c0d8b824..7acf7bb75 100644 --- a/reactive_stores/src/lib.rs +++ b/reactive_stores/src/lib.rs @@ -833,7 +833,7 @@ mod tests { use reactive_graph::{ effect::Effect, owner::StoredValue, - traits::{Read, ReadUntracked, Set, Update, Write}, + traits::{Read, ReadUntracked, Set, Track, Update, Write}, }; use std::sync::{ atomic::{AtomicUsize, Ordering}, @@ -1375,4 +1375,34 @@ mod tests { assert_eq!(combined_count.load(Ordering::Relaxed), 3); } + + #[tokio::test] + async fn untracked_write_on_subfield_shouldnt_notify() { + _ = any_spawner::Executor::init_tokio(); + + let name_count = Arc::new(AtomicUsize::new(0)); + + let store = Store::new(data()); + + let tracked_field = store.user(); + + Effect::new_sync({ + let name_count = Arc::clone(&name_count); + move |_| { + tracked_field.track(); + name_count.fetch_add(1, Ordering::Relaxed); + } + }); + + tick().await; + assert_eq!(name_count.load(Ordering::Relaxed), 1); + + tracked_field.write().push('!'); + tick().await; + assert_eq!(name_count.load(Ordering::Relaxed), 2); + + tracked_field.write_untracked().push('!'); + tick().await; + assert_eq!(name_count.load(Ordering::Relaxed), 2); + } }