@@ -43,3 +43,52 @@ async def test_latest_value_cache() -> None:
4343 await asyncio .sleep (0 )
4444
4545 assert cache .get () == 19
46+
47+
48+ @pytest .mark .integration
49+ async def test_latest_value_cache_key () -> None :
50+ """Ensure LatestValueCache works with keys."""
51+ channel = Broadcast [tuple [int , str ]](name = "lvc_test" )
52+
53+ cache = LatestValueCache (channel .new_receiver (), key = lambda x : x [0 ])
54+ sender = channel .new_sender ()
55+
56+ assert not cache .has_value ()
57+ with pytest .raises (ValueError , match = "No value has been received yet." ):
58+ cache .get ()
59+ with pytest .raises (ValueError , match = "No value received for key: 0" ):
60+ cache .get (0 )
61+
62+ await sender .send ((5 , "a" ))
63+ await sender .send ((6 , "b" ))
64+ await sender .send ((5 , "c" ))
65+ await asyncio .sleep (0 )
66+
67+ assert cache .has_value ()
68+ assert cache .has_value (5 )
69+ assert cache .has_value (6 )
70+ assert not cache .has_value (7 )
71+
72+ assert cache .get () == (5 , "c" )
73+ assert cache .get (5 ) == (5 , "c" )
74+ assert cache .get (6 ) == (6 , "b" )
75+
76+ with pytest .raises (ValueError , match = "No value received for key: 7" ):
77+ cache .get (7 )
78+
79+ await sender .send ((12 , "d" ))
80+ await asyncio .sleep (0 )
81+
82+ assert cache .get () == (12 , "d" )
83+ assert cache .get () == (12 , "d" )
84+ assert cache .get (12 ) == (12 , "d" )
85+ assert cache .get (12 ) == (12 , "d" )
86+ assert cache .get (5 ) == (5 , "c" )
87+ assert cache .get (6 ) == (6 , "b" )
88+
89+ await sender .send ((6 , "e" ))
90+ await sender .send ((6 , "f" ))
91+ await sender .send ((6 , "g" ))
92+ await asyncio .sleep (0 )
93+
94+ assert cache .get (6 ) == (6 , "g" )
0 commit comments