From 0fb4689cb2951993494aca0c7f891f292db3e5ac Mon Sep 17 00:00:00 2001 From: ddidderr Date: Fri, 22 May 2026 09:30:30 +0200 Subject: [PATCH] test(client): cover gateway replacement status The manual lifecycle check depends on the Windows client diagnostics moving from connected, to disconnected, and back to connected when the LAN gateway is restarted. Existing formatter tests covered a gateway leave, but not the replacement join updating the tracked gateway peer id afterward. Add a client lifecycle unit test that formats the first gateway join, its leave, and a replacement gateway join. The assertions prove the client-side relay status clears the old peer id and then reports the new gateway as connected. Test Plan: - cargo fmt --check - cargo test -p lanparty-client-win \ tracks_gateway_replacement_after_disconnect -- --nocapture - cargo test -p lanparty-client-win - cargo test --workspace - cargo clippy --workspace --all-targets -- -D warnings - git diff --check Refs: MVP lifecycle sanity check --- crates/lanparty-client-win/src/main.rs | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/crates/lanparty-client-win/src/main.rs b/crates/lanparty-client-win/src/main.rs index ddc0d42..46188ee 100644 --- a/crates/lanparty-client-win/src/main.rs +++ b/crates/lanparty-client-win/src/main.rs @@ -1685,6 +1685,41 @@ mod tests { assert_eq!(relay_status.gateway_peer_id(), None); } + #[test] + fn tracks_gateway_replacement_after_disconnect() { + let first_gateway = + ControlMessage::PeerJoined(PeerInfo::new(1, Role::Gateway, None).unwrap()); + let first_gateway_left = ControlMessage::PeerLeft { + peer_id: 1, + reason: DisconnectReason::Normal, + }; + let replacement_gateway = + ControlMessage::PeerJoined(PeerInfo::new(3, Role::Gateway, None).unwrap()); + let mut formatter = ControlEventFormatter::default(); + let relay_status = ClientRelayStatus::new(false); + + assert_eq!( + formatter.format(&first_gateway, &relay_status), + "relay event: LAN gateway connected as peer 1" + ); + assert!(relay_status.gateway_connected()); + assert_eq!(relay_status.gateway_peer_id(), Some(1)); + + assert_eq!( + formatter.format(&first_gateway_left, &relay_status), + "relay event: LAN gateway disconnected (peer 1, Normal)" + ); + assert!(!relay_status.gateway_connected()); + assert_eq!(relay_status.gateway_peer_id(), None); + + assert_eq!( + formatter.format(&replacement_gateway, &relay_status), + "relay event: LAN gateway connected as peer 3" + ); + assert!(relay_status.gateway_connected()); + assert_eq!(relay_status.gateway_peer_id(), Some(3)); + } + const fn mac(last_octet: u8) -> MacAddr { MacAddr::new([0x02, 0, 0, 0, 0, last_octet]) }