@@ -280,4 +280,36 @@ mod tests {
280280 emit_server_event ( & shared, "any.event" , json ! ( { } ) ) ;
281281 assert_eq ! ( * shared. status. read( ) , ConnectionStatus :: Connected ) ;
282282 }
283+
284+ #[ test]
285+ fn set_webhook_router_populates_the_shared_slot ( ) {
286+ let mgr = SocketManager :: new ( ) ;
287+ assert ! ( mgr. shared. webhook_router. read( ) . is_none( ) ) ;
288+ let router = Arc :: new ( WebhookRouter :: new ( None ) ) ;
289+ mgr. set_webhook_router ( router) ;
290+ assert ! ( mgr. shared. webhook_router. read( ) . is_some( ) ) ;
291+ }
292+
293+ #[ test]
294+ fn set_webhook_router_overwrites_previous_router ( ) {
295+ // Replacing the router is allowed so callers can hot-swap during
296+ // reconfiguration — this test nails that observable behaviour down.
297+ let mgr = SocketManager :: new ( ) ;
298+ mgr. set_webhook_router ( Arc :: new ( WebhookRouter :: new ( None ) ) ) ;
299+ let second = Arc :: new ( WebhookRouter :: new ( None ) ) ;
300+ let second_ptr = Arc :: as_ptr ( & second) ;
301+ mgr. set_webhook_router ( Arc :: clone ( & second) ) ;
302+ let stored = mgr. shared . webhook_router . read ( ) . clone ( ) . unwrap ( ) ;
303+ assert ! ( std:: ptr:: eq( Arc :: as_ptr( & stored) , second_ptr) ) ;
304+ }
305+
306+ #[ tokio:: test]
307+ async fn emit_after_disconnect_errors_not_connected ( ) {
308+ // Even without ever calling connect(), the disconnect() call path
309+ // leaves the emit channel torn down — and emit() must reject.
310+ let mgr = SocketManager :: new ( ) ;
311+ mgr. disconnect ( ) . await . unwrap ( ) ;
312+ let err = mgr. emit ( "x" , json ! ( { } ) ) . await . unwrap_err ( ) ;
313+ assert_eq ! ( err, "Not connected" ) ;
314+ }
283315}
0 commit comments