Files
the-nexus/tests/__pycache__/test_bridge.cpython-312-pytest-9.0.2.pyc

83 lines
28 KiB
Plaintext
Raw Normal View History

2026-04-12 20:36:26 -04:00
<EFBFBD>
<00>9<EFBFBD>i<EFBFBD>9<00>
<00><<00>dZddlZddlmcmZddlZddlZddl Z ddl
Z
ddl Z ddl Z ddl mZmZddlmZddlmZmZe j(j+dej(j-ej(j-ej(j/e<18><00><00><00>e<0F>Zdej4_ej8dded <09><00>
<EFBFBD>i<01>5ddlZddd<02>Gd <0B>d e j><00>Z Gd <0A>de j><00>Z!Gd<0F>de j><00>Z"Gd<11>de j><00>Z#Gd<13>de j><00>Z$Gd<15>de j><00>Z%Gd<17>de j><00>Z&e'dk(re jP<00>yy#1swY<00><>xYw)a+
Tests for multi_user_bridge.py
Validates:
1. Session isolation (2 users, no cross-contamination)
2. Crisis detection (low, moderate, high risk)
3. Room awareness (Timmy knows which room user is in)
4. Session timeout (inactive sessions cleaned up)
5. Max sessions limit (eviction works)
<EFBFBD>N)<02>patch<63> MagicMock)<01>HTTPConnection)<02>datetime<6D> timedeltazTest response from Timmyz sys.modules<65> run_agentc <00><00>tS<00>N)<01> _mock_agent)<01>kws <20>,/private/tmp/mud-bridge/tests/test_bridge.py<70><lambda>rs<00><00>K<EFBFBD><00>)<01>AIAgentc<00>.<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zd<06>Zy)<08>TestPresenceManagerzTest the PresenceManager class.c<00>6<00>tj<00>|_yr
<00><03>bridge<67>PresenceManager<65>pm<70><01>selfs r <00>setUpzTestPresenceManager.setUp%<00><00><00><18>(<28>(<28>*<2A><04>rc<00>"<00>|jjddd<03>}|j|dd<05>|j|dd<02>|j|dd<03>|jjd<03>}|jt |<02>d<08>|j|d dd<02>|jj dd<03>}|j|dd
<EFBFBD>|jt |jjd<03><00>d <09>y) N<>u1<75>Alice<63>Lobby<62>event<6E>enter<65>username<6D>room<6F>r<00>leave)r<00>
enter_room<EFBFBD> assertEqual<61>get_players_in_room<6F>len<65>
leave_room)r<00>ev<65>players<72>levs r <00>test_enter_and_leave_roomz-TestPresenceManager.test_enter_and_leave_room(s<><00><00> <11>W<EFBFBD>W<EFBFBD> <1F> <1F><04>g<EFBFBD>w<EFBFBD> 7<><02> <0C><18><18><12>G<EFBFBD><1B>g<EFBFBD>.<2E> <0C><18><18><12>J<EFBFBD><1E><17>1<> <0C><18><18><12>F<EFBFBD><1A>W<EFBFBD>-<2D><16>'<27>'<27>-<2D>-<2D>g<EFBFBD>6<><07> <0C><18><18><13>W<EFBFBD><1C>q<EFBFBD>)<29> <0C><18><18><17><11><1A>J<EFBFBD>/<2F><17>9<><12>g<EFBFBD>g<EFBFBD> <20> <20><14>w<EFBFBD>/<2F><03> <0C><18><18><13>W<EFBFBD><1C>w<EFBFBD>/<2F> <0C><18><18><13>T<EFBFBD>W<EFBFBD>W<EFBFBD>8<>8<><17>A<>B<>A<EFBFBD>Frc<00>:<00>|jjddd<03>|jjdddd<04>}|j|dd<06>|j|dd<04>|jj d<03>}|jt |<02>d<08>y) Nr<00>Bob<6F>Tavernz hello world<6C>type<70>say<61>message<67>)rr&r3r'<00>get_room_eventsr))rr+<00>eventss r <00>test_say_eventz"TestPresenceManager.test_say_event6s<><00><00> <0C><07><07><1A><1A>4<EFBFBD><15><08>1<> <11>W<EFBFBD>W<EFBFBD>[<5B>[<5B><14>u<EFBFBD>h<EFBFBD> <0A> ><3E><02> <0C><18><18><12>F<EFBFBD><1A>U<EFBFBD>+<2B> <0C><18><18><12>I<EFBFBD><1D> <0A>6<><15><17><17>(<28>(<28><18>2<><06> <0C><18><18><13>V<EFBFBD><1B>a<EFBFBD>(rc<00>^<00>|jjdd<02>}|j|<01>y)Nr<00>Nowhere)rr*<00> assertIsNone)r<00>results r <00>(test_leave_nonexistent_room_returns_nonez<TestPresenceManager.test_leave_nonexistent_room_returns_none?s&<00><00><15><17><17>#<23>#<23>D<EFBFBD>)<29>4<><06> <0C><19><19>&<26>!rc<00><><00>|jjddd<03>|jjddd<04>|jjd<01>}|jt |<01>d<05>|jt |jj d<03><00>d<06>|jt |jj d<04><00>d<06>y)Nr<00>Carol<6F>RoomA<6D>RoomBr5r)rr&<00> cleanup_userr'r)r()rr7s r <00>test_cleanup_userz%TestPresenceManager.test_cleanup_userCs<><00><00> <0C><07><07><1A><1A>4<EFBFBD><17>'<27>2<> <0C><07><07><1A><1A>4<EFBFBD><17>'<27>2<><15><17><17>%<25>%<25>d<EFBFBD>+<2B><06> <0C><18><18><13>V<EFBFBD><1B>a<EFBFBD>(<28> <0C><18><18><13>T<EFBFBD>W<EFBFBD>W<EFBFBD>8<>8<><17>A<>B<>A<EFBFBD>F<> <0C><18><18><13>T<EFBFBD>W<EFBFBD>W<EFBFBD>8<>8<><17>A<>B<>A<EFBFBD>FrN) <09>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__doc__rr.r8r=rC<00>rr rr"s <00><00>)<29>+<2B> G<01>)<29>"<22>Grrc<00>.<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zd<06>Zy)<08>TestSessionIsolationuETest 1: Session isolation — 2 users, verify no cross-contamination.c<00><><00>tjdd<02><03>|_tjtj
dd<05><00>|_|j j<00>y)N<>
<00><00><02> max_sessions<6E>session_timeout<75> _init_agentc<00><00>yr
rHrs r rz,TestSessionIsolation.setUp.<locals>.<lambda>S<00><00>r<00>r<00>SessionManager<65>smr<00>object<63> UserSession<6F>patcher<65>startrs r rzTestSessionIsolation.setUpOsA<00><00><18>'<27>'<27>R<EFBFBD><14>N<><04><07><1C>|<7C>|<7C>F<EFBFBD>$6<>$6<> <0A>GX<47>Y<><04> <0C> <0C> <0C> <0C><1A><1A>rc<00>8<00>|jj<00>yr
<00>rY<00>stoprs r <00>tearDownzTestSessionIsolation.tearDownV<00><00><00> <0C> <0C> <0C><19><19>rc<00><00>|jjddd<03>}|jjddd<03>}|jjddd<08><02>|jjdd d<08><02>|jD<00>cgc]}|d
<00><02> }}|jD<00>cgc]}|d
<00><02> }}|j d|<04>|j d|<05>|j d |<05>|j d |<04>ycc}wcc}w) Nrrr<00>u2r0<00>userz Alice secret)<02>role<6C>contentz
Bob secretrd)rV<00> get_or_create<74>messages<65>append<6E>assertIn<49> assertNotIn)r<00>s1<73>s2<73>m<> s1_contents<74> s2_contentss r <00> test_two_users_isolated_messagesz5TestSessionIsolation.test_two_users_isolated_messagesYs<><00><00> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><17>'<27> :<3A><02> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><15><07> 8<><02> <0B> <0B> <0B><1A><1A>F<EFBFBD>~<7E>F<>G<>
<EFBFBD> <0B> <0B><1A><1A>F<EFBFBD>|<7C>D<>E<>.0<EFBFBD>[<5B>[<5B>9<><01>q<EFBFBD><19>|<7C>9<> <0B>9<>-/<2F>[<5B>[<5B>9<><01>q<EFBFBD><19>|<7C>9<> <0B>9<> <0C> <0A> <0A>n<EFBFBD>k<EFBFBD>2<> <0C><18><18><1E><1B>5<> <0C> <0A> <0A>l<EFBFBD>K<EFBFBD>0<> <0C><18><18><1C>{<7B>3<><33> :<3A><>9s <00> C8<04>! C=c<00><><00>|jjddd<03>}|jjddd<06>}|jt|<01>t|<02><00>|j |j
d<02>|j |j
d<05>|j |j d<03>|j |j d<06>y)Nrrrrar0r1)rVre<00>assertNotEqual<61>idr'r"r#<00>rrjrks r <00>!test_two_users_different_sessionsz6TestSessionIsolation.test_two_users_different_sessionsjs<><00><00> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><17>'<27> :<3A><02> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><15><08> 9<><02> <0C><1B><1B>B<EFBFBD>r<EFBFBD>F<EFBFBD>B<EFBFBD>r<EFBFBD>F<EFBFBD>+<2B> <0C><18><18><12><1B><1B>g<EFBFBD>.<2E> <0C><18><18><12><1B><1B>e<EFBFBD>,<2C> <0C><18><18><12><17><17>'<27>*<2A> <0C><18><18><12><17><17>(<28>+rc<00><><00>|jjddd<03>}|jjddd<03>}|j||<02>y)Nrrr)rVre<00>assertIsrss r <00>'test_get_or_create_returns_same_sessionz<TestSessionIsolation.test_get_or_create_returns_same_sessionts@<00><00> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><17>'<27> :<3A><02> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><17>'<27> :<3A><02> <0C> <0A> <0A>b<EFBFBD>"<22>rN) rDrErFrGrr^rortrwrHrr rJrJLs<00><00>O<><1D><1C>4<>",<2C>rrJc<00>4<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zd<06>Zd<07>Z y) <09>TestCrisisDetectionz=Test 2: Crisis detection (low, moderate, high risk keywords).c<00>6<00>tj<00>|_yr
rrs r rzTestCrisisDetection.setUp}rrc<00> <00>tj}|j|t<00>|j t |<01>d<01>dj |<01>j<00>}|jd|<02>|jd|<02>y)z3Crisis protocol must exist and have required steps.<2E><00> <20>988<38>crisisN) r<00>CRISIS_PROTOCOL<4F>assertIsInstance<63>list<73>assertGreaterEqualr)<00>join<69>lowerrh)r<00>protocol<6F>combineds r <00>test_crisis_protocol_definedz0TestCrisisDetection.test_crisis_protocol_defined<65>sd<00><00><19>)<29>)<29><08> <0C><1D><1D>h<EFBFBD><04>-<2D> <0C><1F><1F><03>H<EFBFBD> <0A>q<EFBFBD>1<><16>8<EFBFBD>8<EFBFBD>H<EFBFBD>%<25>+<2B>+<2B>-<2D><08> <0C> <0A> <0A>e<EFBFBD>X<EFBFBD>&<26> <0C> <0A> <0A>h<EFBFBD><08>)rc<00><><00>|jjdddd<04>}|j|dd<06>|jd|<01>y) z7Low risk: normal chat does not trigger crisis protocol.r<00>DanrzHello, how are you?r2r3rN)rr3r'ri)rr+s r <00>test_low_risk_normal_messagez0TestCrisisDetection.test_low_risk_normal_message<67>s?<00><00> <11>W<EFBFBD>W<EFBFBD>[<5B>[<5B><14>u<EFBFBD>g<EFBFBD>/D<> E<><02> <0C><18><18><12>F<EFBFBD><1A>U<EFBFBD>+<2B> <0C><18><18><18>2<EFBFBD>&rc<00><><00>gd<01>}|D]M}|jjdddd|<02><00><02>}|j|dd<07>|j||d<00><00>Oy )
z2Moderate risk: crisis keywords present in message.)<03>hopelessztired of livingz can't go onrr<>rzI feel r2r3r4N)rr3r'rh)r<00>crisis_keywordsr r+s r <00>$test_moderate_risk_keyword_detectionz8TestCrisisDetection.test_moderate_risk_keyword_detection<6F>sZ<00><00>H<><0F>!<21> -<2D>B<EFBFBD><15><17><17><1B><1B>T<EFBFBD>5<EFBFBD>'<27>W<EFBFBD>R<EFBFBD>D<EFBFBD>><3E>B<>B<EFBFBD> <10> <1C> <1C>R<EFBFBD><06>Z<EFBFBD><15> /<2F> <10>M<EFBFBD>M<EFBFBD>"<22>b<EFBFBD><19>m<EFBFBD> ,<2C>  -rc<00><><00>d}|jjddd|<01>}|j|d|<01>|jjd<04>}|jt |<03>d<06>y)z=High risk: message with strong crisis indicators is captured.zI want to end my life tonightrr<>rr4r$N)rr3r'r6r))r<00>msgr+r7s r <00>test_high_risk_message_recordedz3TestCrisisDetection.test_high_risk_message_recorded<65>s[<00><00>-<2D><03> <11>W<EFBFBD>W<EFBFBD>[<5B>[<5B><14>u<EFBFBD>g<EFBFBD>s<EFBFBD> 3<><02> <0C><18><18><12>I<EFBFBD><1D><03>,<2C><15><17><17>(<28>(<28><17>1<><06> <0C><18><18><13>V<EFBFBD><1B>a<EFBFBD>(rc<00><><00>djtj<00>j<00>}|j d|<01>y)z2Crisis protocol must reference grounding exercise.r}<00> groundingN)r<>rr<>r<>rh)rr<>s r <00>"test_crisis_protocol_has_groundingz6TestCrisisDetection.test_crisis_protocol_has_grounding<6E>s-<00><00><16>8<EFBFBD>8<EFBFBD>F<EFBFBD>2<>2<>3<>9<>9<>;<3B><08> <0C> <0A> <0A>k<EFBFBD>8<EFBFBD>,rN)
rDrErFrGrr<>r<>r<>r<>r<>rHrr ryryzs#<00><00>G<>+<2B>*<2A>'<27>-<2D>)<29>-rryc<00>4<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zd<06>Zd<07>Z y) <09>TestRoomAwarenessu;Test 3: Room awareness — know which room each user is in.c<00><><00>tjdd<02><03>|_tj<00>|_t j tjdd<05><00>|_|jj<00>y)NrLrMrNrQc<00><00>yr
rHrs r rz)TestRoomAwareness.setUp.<locals>.<lambda><3E>rSr)
rrUrVrrrrWrXrYrZrs r rzTestRoomAwareness.setUp<55>sQ<00><00><18>'<27>'<27>R<EFBFBD><14>N<><04><07><18>(<28>(<28>*<2A><04><07><1C>|<7C>|<7C>F<EFBFBD>$6<>$6<> <0A>GX<47>Y<><04> <0C> <0C> <0C> <0C><1A><1A>rc<00>8<00>|jj<00>yr
r\rs r r^zTestRoomAwareness.tearDown<77>r_rc<00>v<00>|jjddd<03>}|j|jd<03>y)Nrrz Dark Cave)rVrer'r#<00>r<00>ss r <00>test_session_tracks_roomz*TestRoomAwareness.test_session_tracks_room<6F>s.<00><00> <10>G<EFBFBD>G<EFBFBD> !<21> !<21>$<24><07><1B> =<3D><01> <0C><18><18><11><16><16><1B>-rc<00> <00>|jjddd<03>}|j|jd<03>|jjddd<04>}|j ||<02>|j|jd<04>y)Nrrrz Tower Top)rVrer'r#rv)rr<>rks r <00>test_room_update_on_movez*TestRoomAwareness.test_room_update_on_move<76>sh<00><00> <10>G<EFBFBD>G<EFBFBD> !<21> !<21>$<24><07><17> 9<><01> <0C><18><18><11><16><16><17>)<29> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><17>+<2B> ><3E><02> <0C> <0A> <0A>a<EFBFBD><12><1C> <0C><18><18><12><17><17>+<2B>.rc<00><><00>|jjddd<03>|jjddd<06>|jjddd<03>|jjd<03>}|jjd<06>}|D<00>chc]}|d <00><02> }}|D<00>chc]}|d <00><02> }}|j|ddh<02>|j|dh<01>ycc}wcc}w)
Nrrrrar0r1<00>u3r?r")rr&r(r')r<00> lobby_players<72>tavern_players<72>p<> lobby_names<65> tavern_namess r <00>#test_presence_tracks_multiple_roomsz5TestRoomAwareness.test_presence_tracks_multiple_rooms<6D>s<><00><00> <0C><07><07><1A><1A>4<EFBFBD><17>'<27>2<> <0C><07><07><1A><1A>4<EFBFBD><15><08>1<> <0C><07><07><1A><1A>4<EFBFBD><17>'<27>2<><1C><07><07>3<>3<>G<EFBFBD><<3C> <0A><1D><17><17>4<>4<>X<EFBFBD>><3E><0E>.;<3B><<3C><11>q<EFBFBD><1A>}<7D><<3C> <0B><<3C>/=<3D>><3E>!<21><01>*<2A> <0A>><3E> <0C>><3E> <0C><18><18><1B>w<EFBFBD><07>&8<>9<> <0C><18><18><1C><05>w<EFBFBD>/<2F><> =<3D><>>s <00> C<04>$ Cc<00><><00>|jjddd<03>}|j<00>}|j|dd<03>|j|dd<02>y)Nrr<00>Libraryr#rb)rVre<00>get_context_summaryr')rr<><00>summarys r <00>test_context_summary_has_roomz/TestRoomAwareness.test_context_summary_has_room<6F>sP<00><00> <10>G<EFBFBD>G<EFBFBD> !<21> !<21>$<24><07><19> ;<3B><01><13>'<27>'<27>)<29><07> <0C><18><18><17><16><1F>)<29>4<> <0C><18><18><17><16><1F>'<27>2rN)
rDrErFrGrr^r<>r<>r<>r<>rHrr r<>r<><00>s#<00><00>E<><1D> <1C>.<2E>/<2F> 0<>3rr<>c<00>.<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zd<06>Zy)<08>TestSessionTimeoutu9Test 4: Session timeout — inactive sessions cleaned up.c<00><><00>tjdd<02><03>|_tjtj
dd<05><00>|_|j j<00>y)NrLr$rNrQc<00><00>yr
rHrs r rz*TestSessionTimeout.setUp.<locals>.<lambda><3E>rSrrTrs r rzTestSessionTimeout.setUp<55>sA<00><00><18>'<27>'<27>R<EFBFBD><11>K<><04><07><1C>|<7C>|<7C>F<EFBFBD>$6<>$6<> <0A>GX<47>Y<><04> <0C> <0C> <0C> <0C><1A><1A>rc<00>8<00>|jj<00>yr
r\rs r r^zTestSessionTimeout.tearDown<77>r_rc<00><><00>|jjddd<03>}|j|jj<00>d<04>t j<00>dz
|_|jjddd<03>|j|jj<00>d<04>|j d|jj<00>|jd|jj<00>y)Nrrrr$<00>rar0) rVrer'<00>get_session_count<6E>time<6D> last_activeri<00>sessionsrhr<>s r <00>test_stale_session_cleaned_upz0TestSessionTimeout.test_stale_session_cleaned_up<75>s<><00><00> <10>G<EFBFBD>G<EFBFBD> !<21> !<21>$<24><07><17> 9<><01> <0C><18><18><14><17><17>2<>2<>4<>a<EFBFBD>8<><1D> <09> <09> <0B>a<EFBFBD><0F><01> <0A> <0A><07><07><1D><1D>d<EFBFBD>E<EFBFBD>7<EFBFBD>3<> <0C><18><18><14><17><17>2<>2<>4<>a<EFBFBD>8<> <0C><18><18><14>t<EFBFBD>w<EFBFBD>w<EFBFBD>/<2F>/<2F>0<> <0C> <0A> <0A>d<EFBFBD>D<EFBFBD>G<EFBFBD>G<EFBFBD>,<2C>,<2C>-rc<00><00>|jjddd<03>}|jjddd<03>|j|jj<00>d<06>|j d|jj
<00>y<00>Nrrrrar0r5)rVrer'r<>rhr<>r<>s r <00>test_active_session_not_cleanedz2TestSessionTimeout.test_active_session_not_cleaned<65>se<00><00> <10>G<EFBFBD>G<EFBFBD> !<21> !<21>$<24><07><17> 9<><01> <0C><07><07><1D><1D>d<EFBFBD>E<EFBFBD>7<EFBFBD>3<> <0C><18><18><14><17><17>2<>2<>4<>a<EFBFBD>8<> <0C> <0A> <0A>d<EFBFBD>D<EFBFBD>G<EFBFBD>G<EFBFBD>,<2C>,<2C>-rc<00><00>|jjddd<03>}|jjddd<03>}|j|jj<00>d<06>t j<00>dz
|_t j<00>dz
|_|jjdd d<03>|j|jj<00>d
<EFBFBD>|j d|jj<00>y) Nrrrrar0r5rLr<>r?r$)rVrer'r<>r<>r<>rhr<>rss r <00>test_cleanup_stale_directz,TestSessionTimeout.test_cleanup_stale_direct<63>s<><00><00> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><17>'<27> :<3A><02> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><15><07> 8<><02> <0C><18><18><14><17><17>2<>2<>4<>a<EFBFBD>8<><1E><19><19><1B>r<EFBFBD>)<29><02><0E><1D><19><19><1B>r<EFBFBD>)<29><02><0E> <0A><07><07><1D><1D>d<EFBFBD>G<EFBFBD>W<EFBFBD>5<> <0C><18><18><14><17><17>2<>2<>4<>a<EFBFBD>8<> <0C> <0A> <0A>d<EFBFBD>D<EFBFBD>G<EFBFBD>G<EFBFBD>,<2C>,<2C>-rN) rDrErFrGrr^r<>r<>r<>rHrr r<>r<><00>s<00><00>C<><1D> <1C> .<2E>.<2E> .rr<>c<00>4<00>eZdZdZd<02>Zd<03>Zd<04>Zd<05>Zd<06>Zd<07>Z y) <09>TestMaxSessionsu.Test 5: Max sessions limit — eviction works.c<00><><00>tjdd<02><03>|_tjtj
dd<05><00>|_|j j<00>y)Nr|rMrNrQc<00><00>yr
rHrs r rz'TestMaxSessions.setUp.<locals>.<lambda>rSrrTrs r rzTestMaxSessions.setUpsA<00><00><18>'<27>'<27>Q<EFBFBD><04>M<><04><07><1C>|<7C>|<7C>F<EFBFBD>$6<>$6<> <0A>GX<47>Y<><04> <0C> <0C> <0C> <0C><1A><1A>rc<00>8<00>|jj<00>yr
r\rs r r^zTestMaxSessions.tearDown r_rc<00><><00>|jjddd<03>}|jjddd<03>}|jjddd<03>}|j|jj<00>d<08>|jjd d
d<03>}|j|jj<00>d<08>|j d|jj
<00>|j d|jj
<00>|j d|jj
<00>|j d |jj
<00>y) Nrrrrar0r<>r?r|<00>u4r<34>)rVrer'r<>rir<>rh<00>rrjrk<00>s3<73>s4s r <00>test_eviction_at_maxz$TestMaxSessions.test_eviction_at_maxs<00><00> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><17>'<27> :<3A><02> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><15><07> 8<><02> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><17>'<27> :<3A><02> <0C><18><18><14><17><17>2<>2<>4<>a<EFBFBD>8<><12>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><15><07> 8<><02> <0C><18><18><14><17><17>2<>2<>4<>a<EFBFBD>8<> <0C><18><18><14>t<EFBFBD>w<EFBFBD>w<EFBFBD>/<2F>/<2F>0<> <0C> <0A> <0A>d<EFBFBD>D<EFBFBD>G<EFBFBD>G<EFBFBD>,<2C>,<2C>-<2D> <0C> <0A> <0A>d<EFBFBD>D<EFBFBD>G<EFBFBD>G<EFBFBD>,<2C>,<2C>-<2D> <0C> <0A> <0A>d<EFBFBD>D<EFBFBD>G<EFBFBD>G<EFBFBD>,<2C>,<2C>-rc<00><><00>|jjddd<03>}tjd<04>|jjddd<03>}tjd<04>|jjddd<03>}|jjd d
d<03>}|j d|jj
<00>y) Nrrrg{<14>G<EFBFBD>z<EFBFBD>?rar0r<>r?r<>r<>)rVrer<><00>sleeprir<>r<>s r <00>test_eviction_oldest_firstz*TestMaxSessions.test_eviction_oldest_firsts<><00><00> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><17>'<27> :<3A><02> <0C>
<EFBFBD>
<EFBFBD>4<EFBFBD><18> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><15><07> 8<><02> <0C>
<EFBFBD>
<EFBFBD>4<EFBFBD><18> <11>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><17>'<27> :<3A><02><12>W<EFBFBD>W<EFBFBD> "<22> "<22>4<EFBFBD><15><07> 8<><02> <0C><18><18><14>t<EFBFBD>w<EFBFBD>w<EFBFBD>/<2F>/<2F>0rc<00><><00>|jjddd<03>|jjddd<03>|j|jj<00>d<06>yr<>)rVrer'r<>rs r <00>test_no_eviction_under_limitz,TestMaxSessions.test_no_eviction_under_limit'sK<00><00> <0C><07><07><1D><1D>d<EFBFBD>G<EFBFBD>W<EFBFBD>5<> <0C><07><07><1D><1D>d<EFBFBD>E<EFBFBD>7<EFBFBD>3<> <0C><18><18><14><17><17>2<>2<>4<>a<EFBFBD>8rc<00>8<00>|jjddd<03>|jjddd<06>|jj<00>}|jt |<01>d<07>|D<00>chc]}|d<00><02> }}|j|ddh<02>ycc}w) Nrrrrar0r1r5rb)rVre<00> list_sessionsr'r))rr<>r<><00>userss r <00>test_list_sessionsz"TestMaxSessions.test_list_sessions,s<><00><00> <0C><07><07><1D><1D>d<EFBFBD>G<EFBFBD>W<EFBFBD>5<> <0C><07><07><1D><1D>d<EFBFBD>E<EFBFBD>8<EFBFBD>4<><17>7<EFBFBD>7<EFBFBD>(<28>(<28>*<2A><08> <0C><18><18><13>X<EFBFBD><1D><01>*<2A>$,<2C>-<2D>q<EFBFBD><11>6<EFBFBD><19>-<2D><05>-<2D> <0C><18><18><15><17>%<25> 0<>1<><31>.s<00>4 BN)
rDrErFrGrr^r<>r<>r<>r<>rHrr r<>r<>s#<00><00>8<><1D>
<1C> .<2E> 1<>9<>
2rr<>c<00>`<00>eZdZdZed<02><00>Zed<03><00>Zd<04>Zd<05>Zd<06>Z d<07>Z
d<08>Z d <09>Z d
<EFBFBD>Z d <0B>Zy ) <0A>TestBridgeHTTPAPIz=Integration tests: start the bridge server and hit endpoints.c<00><><00>dtj<00>dzz|_|jt_dt_tj dd<05><06>t_tj<00>t_ tjtjdd<08><00>|_ |jj<00>tjd|jftj <00>|_t%j&|j"j(d <09>
<EFBFBD>|_|j*j<00>t-j.d <0B>y) Ni<4E>6i<><00> 127.0.0.1r<EFBFBD>rMrNrQc<00><00>yr
rHrs r rz.TestBridgeHTTPAPI.setUpClass.<locals>.<lambda>DrSrT)<02>target<65>daemong333333<33>?)<18>os<6F>getpid<69>portr<00> BRIDGE_PORT<52> BRIDGE_HOSTrU<00>session_managerr<00>presence_managerrrWrXrYrZ<00>
HTTPServer<EFBFBD> BridgeHandler<65>server<65> threading<6E>Thread<61> serve_forever<65> server_threadr<64>r<><00><01>clss r <00>
setUpClasszTestBridgeHTTPAPI.setUpClass8s<><00><00><19>B<EFBFBD>I<EFBFBD>I<EFBFBD>K<EFBFBD>$<24>.<2E>/<2F><03><08> <20>X<EFBFBD>X<EFBFBD><06><1A>(<28><06><1A>"(<28>!6<>!6<>A<EFBFBD>W[<5B>!\<5C><06><1E>"(<28>"8<>"8<>":<3A><06><1F><1C>l<EFBFBD>l<EFBFBD>6<EFBFBD>#5<>#5<>}<7D>FW<46>X<><03> <0B> <0B> <0B> <0B><19><19><1B><1C>&<26>&<26> <0B>S<EFBFBD>X<EFBFBD>X<EFBFBD>'><3E><06>@T<>@T<>U<><03>
<EFBFBD>%<25>,<2C>,<2C>C<EFBFBD>J<EFBFBD>J<EFBFBD>4L<34>4L<34>UY<55>Z<><03><19> <0B><19><19><1F><1F>!<21> <0C>
<EFBFBD>
<EFBFBD>3<EFBFBD>rc<00>l<00>|jj<00>|jj<00>yr
)r<><00>shutdownrYr]r<>s r <00> tearDownClasszTestBridgeHTTPAPI.tearDownClassMs"<00><00> <0B>
<EFBFBD>
<EFBFBD><1B><1B><1D> <0B> <0B> <0B><18><18>rc<00><00>td|j<00>}tj|<02>}|j d||ddi<01><05>|j <00>}|j tj|j<00><00>fS)Nr<4E><00>POSTz Content-Typezapplication/json)<02>body<64>headers) rr<><00>json<6F>dumps<70>request<73> getresponse<73>status<75>loads<64>read)r<00>path<74>data<74>connr<6E><00>resps r <00>_postzTestBridgeHTTPAPI._postRsf<00><00><1D>k<EFBFBD>4<EFBFBD>9<EFBFBD>9<EFBFBD>5<><04><13>z<EFBFBD>z<EFBFBD>$<24><1F><04> <0C> <0C> <0C>V<EFBFBD>T<EFBFBD><04>~<7E>GY<47>6Z<36> <0C>[<5B><13><1F><1F>!<21><04><13>{<7B>{<7B>D<EFBFBD>J<EFBFBD>J<EFBFBD>t<EFBFBD>y<EFBFBD>y<EFBFBD>{<7B>3<>3<>3rc<00><><00>td|j<00>}|jd|<01>|j<00>}|jt j |j<00><00>fS)Nr<4E><00>GET)rr<>r<>r<>r<>r<>r<>r<>)rr<>r<>r<>s r <00>_getzTestBridgeHTTPAPI._getYsL<00><00><1D>k<EFBFBD>4<EFBFBD>9<EFBFBD>9<EFBFBD>5<><04> <0C> <0C> <0C>U<EFBFBD>D<EFBFBD>!<21><13><1F><1F>!<21><04><13>{<7B>{<7B>D<EFBFBD>J<EFBFBD>J<EFBFBD>t<EFBFBD>y<EFBFBD>y<EFBFBD>{<7B>3<>3<>3rc<00>z<00>|jd<01>\}}|j|d<02>|j|dd<04>y)Nz/bridge/health<74><68>r<><00>ok<6F>rr'<00>rr<>r<>s r <00> test_healthzTestBridgeHTTPAPI.test_health_s9<00><00><1B>y<EFBFBD>y<EFBFBD>!1<>2<> <0C><06><04> <0C><18><18><16><13>%<25> <0C><18><18><14>h<EFBFBD><1E><14>.rc<00><><00>|jdddddd<06><04>\}}|j|d<07>|j|d<00>|j|d d
d<04>y) Nz /bridge/say<61>test_u1<75>Testerz Hello room!<21>TestRoom)<04>user_idr"r4r#rrr r4)r<>r'<00>
assertTruers r <00>test_say_endpointz#TestBridgeHTTPAPI.test_say_endpointdsb<00><00><1B>z<EFBFBD>z<EFBFBD>-<2D> <20> <20>$<24><1E> 2
<EFBFBD> <0B> <0C><06><04> <0A><18><18><16><13>%<25> <0C><0F><0F><04>T<EFBFBD>
<EFBFBD>#<23> <0C><18><18><14>g<EFBFBD><1D>y<EFBFBD>1<>=<3D>Arc<00><><00>tjjddd<03>|jd<04>\}}|j |d<05>|dD<00>cgc]}|d<00><02> }}|j d|<04>ycc}w)N<>http_u1<75> HttpAlice<63>HttpRoomz/bridge/room/HttpRoom/playersrr,r")rr<>r&rr'rh)rr<>r<>r<><00>namess r <00>test_room_players_endpointz,TestBridgeHTTPAPI.test_room_players_endpointosk<00><00><0E><1F><1F>*<2A>*<2A>9<EFBFBD>k<EFBFBD>:<3A>N<><1B>y<EFBFBD>y<EFBFBD>!@<40>A<> <0C><06><04> <0C><18><18><16><13>%<25>(,<2C>Y<EFBFBD><0F>8<>1<EFBFBD><11>:<3A><1D>8<><05>8<> <0C> <0A> <0A>k<EFBFBD>5<EFBFBD>)<29><>9s<00> A0c<00><00>tjjddd<03>tjjdddd<04>|j d<05>\}}|j |d<06>|j t|d<00>d<08>y) N<>ev_u1<75>EvAlice<63>EvRoomz test messagez/bridge/room/EvRoom/eventsrr7r)rr<>r&r3rr'<00> assertGreaterr)rs r <00>test_room_events_endpointz+TestBridgeHTTPAPI.test_room_events_endpointwsp<00><00><0E><1F><1F>*<2A>*<2A>7<EFBFBD>I<EFBFBD>x<EFBFBD>H<><0E><1F><1F>#<23>#<23>G<EFBFBD>Y<EFBFBD><08>.<2E>Q<><1B>y<EFBFBD>y<EFBFBD>!=<3D>><3E> <0C><06><04> <0C><18><18><16><13>%<25> <0C><1A><1A>3<EFBFBD>t<EFBFBD>H<EFBFBD>~<7E>.<2E><01>2rc<00>t<00>|jd<01>\}}|j|d<02>|jd|<02>y)Nz/bridge/sessionsrr<>)rr'rhrs r <00>test_sessions_endpointz(TestBridgeHTTPAPI.test_sessions_endpoint~s3<00><00><1B>y<EFBFBD>y<EFBFBD>!3<>4<> <0C><06><04> <0C><18><18><16><13>%<25> <0C> <0A> <0A>j<EFBFBD>$<24>'rc<00>P<00>|jd<01>\}}|j|d<02>y)Nz/bridge/nonexistenti<74>rrs r <00>test_not_foundz TestBridgeHTTPAPI.test_not_found<6E>s%<00><00><1B>y<EFBFBD>y<EFBFBD>!6<>7<> <0C><06><04> <0C><18><18><16><13>%rN)rDrErFrG<00> classmethodr<64>r<>r<>rrr rrrrrHrr r<>r<>5sT<00><00>G<><10><18><11><18>(<11><1B><11><1B>4<>4<> /<2F>
B<01>*<2A>3<>(<28>
&rr<><00>__main__))rG<00>builtins<6E> @py_builtins<6E>_pytest.assertion.rewrite<74> assertion<6F>rewrite<74>
@pytest_arr<72>r<><00>sysr<73>r<><00>unittest<73> unittest.mockrr<00> http.clientrrrr<><00>insert<72>dirname<6D>abspath<74>__file__r <00>chat<61> return_value<75>dict<63>multi_user_bridger<00>TestCaserrJryr<>r<>r<>r<>rD<00>mainrHrr <00><module>r4sT<00><01> <04><01><00> <0B> <09>
<EFBFBD> <0B><10><0F>*<2A>&<26>(<28><04><08><08><0F><0F><01>2<EFBFBD>7<EFBFBD>7<EFBFBD>?<3F>?<3F>2<EFBFBD>7<EFBFBD>7<EFBFBD>?<3F>?<3F>2<EFBFBD>7<EFBFBD>7<EFBFBD>?<3F>?<3F>8<EFBFBD>3L<33>#M<>N<>O<><18>k<EFBFBD> <0B> :<3A> <0B><10><10><1D><0F>U<EFBFBD>Z<EFBFBD>Z<EFBFBD> <0A> <0B>Y<EFBFBD>?W<>-X<>Y<>Z<>'<27>&<26>'<27>'G<01>(<28>+<2B>+<2B>'G<01>T+<1E>8<EFBFBD>,<2C>,<2C>+<1E>\+-<2D>(<28>+<2B>+<2B>+-<2D>\)3<><08>)<29>)<29>)3<>X,.<2E><18>*<2A>*<2A>,.<2E>^/2<>h<EFBFBD>'<27>'<27>/2<>dP&<26><08>)<29>)<29>P&<26>f <0C>z<EFBFBD><19><11>H<EFBFBD>M<EFBFBD>M<EFBFBD>O<EFBFBD><1A>U '<27>'<27>s <00>F<03>F