Trading card city builder game?

add simple test for bus

eldridge.cam bc9105e2 43bbb55d

verified
Waiting for spindle ...
+42 -4
+1 -1
packages/cartography/src/api/operations/open_pack.rs
··· 159 159 .unwrap(); 160 160 161 161 let collector = Collector::<AddCardToDeck>::spawn_default(); 162 - let bus = Bus::spawn(()); 162 + let bus = Bus::spawn_default(); 163 163 bus.listen::<AddCardToDeck, _>(&collector).await.unwrap(); 164 164 165 165 let app = crate::app::Config::test(pool).with_bus(bus).into_router();
+39
packages/cartography/src/bus.rs
··· 131 131 self.notify(msg.0).await; 132 132 } 133 133 } 134 + 135 + #[cfg(test)] 136 + mod tests { 137 + use super::*; 138 + use crate::test::prelude::*; 139 + 140 + #[derive(Clone, Copy, Debug)] 141 + struct MsgA; 142 + 143 + #[derive(Clone, Copy, Debug)] 144 + struct MsgB; 145 + 146 + #[tokio::test] 147 + async fn bus_test() { 148 + let bus = Bus::spawn_default(); 149 + let recv_a = Collector::<MsgA>::spawn_default(); 150 + let recv_b = Collector::<MsgA>::spawn_default(); 151 + let recv_c = Collector::<MsgB>::spawn_default(); 152 + bus.listen::<MsgA, _>(&recv_a).await.unwrap(); 153 + bus.listen::<MsgA, _>(&recv_b).await.unwrap(); 154 + bus.listen::<MsgA, _>(&recv_b).await.unwrap(); // Subscribed twice = received twice 155 + bus.listen::<MsgB, _>(&recv_c).await.unwrap(); 156 + 157 + bus.notify(MsgA).await.unwrap(); 158 + bus.notify(MsgB).await.unwrap(); 159 + bus.notify(MsgA).await.unwrap(); 160 + 161 + assert_eq!(recv_a.collect().await.len(), 2); 162 + assert_eq!(recv_b.collect().await.len(), 4); 163 + assert_eq!(recv_c.collect().await.len(), 1); 164 + 165 + recv_b.stop_gracefully().await.unwrap(); 166 + 167 + bus.notify(MsgA).await.unwrap(); 168 + 169 + assert_eq!(recv_a.collect().await.len(), 1); 170 + assert_eq!(recv_c.collect().await.len(), 0); 171 + } 172 + }
+2 -3
packages/cartography/src/test.rs
··· 87 87 _msg: TakeCollection, 88 88 ctx: &mut kameo::prelude::Context<Self, Self::Reply>, 89 89 ) -> Self::Reply { 90 - ctx.stop(); 91 90 std::mem::take(&mut self.0) 92 91 } 93 92 } 94 93 95 94 pub trait CollectorExt<T> { 96 - async fn collect(self) -> Vec<T>; 95 + async fn collect(&self) -> Vec<T>; 97 96 } 98 97 99 98 impl<T: Any + Clone + Sync + Send> CollectorExt<T> for ActorRef<Collector<T>> { 100 - async fn collect(self) -> Vec<T> { 99 + async fn collect(&self) -> Vec<T> { 101 100 self.ask(TakeCollection).await.unwrap() 102 101 } 103 102 }