diff --git a/crates/projection-irc/tests/lib.rs b/crates/projection-irc/tests/lib.rs index 141dd46..089cb95 100644 --- a/crates/projection-irc/tests/lib.rs +++ b/crates/projection-irc/tests/lib.rs @@ -313,6 +313,98 @@ async fn scenario_join_and_reboot() -> Result<()> { Ok(()) } +#[tokio::test] +async fn scenario_subscribe_after_reboot() -> Result<()> { + let server = TestServer::start().await?; + + server.core.create_player(&PlayerId::from("tester1")?).await?; + server.core.set_password("tester1", "password").await?; + server.core.create_player(&PlayerId::from("tester2")?).await?; + server.core.set_password("tester2", "password").await?; + + let mut stream1 = TcpStream::connect(server.server.addr).await?; + let mut s1 = TestScope::new(&mut stream1); + + // Open a connection, join a channel, close the connection + + s1.send("PASS password").await?; + s1.send("NICK tester1").await?; + s1.send("USER UserName 0 * :Real Name").await?; + s1.expect_server_introduction("tester1").await?; + s1.expect_nothing().await?; + s1.send("JOIN #test").await?; + s1.expect(":tester1 JOIN #test").await?; + s1.expect(":testserver 332 tester1 #test :New room").await?; + s1.expect(":testserver 353 tester1 = #test :tester1").await?; + s1.expect(":testserver 366 tester1 #test :End of /NAMES list").await?; + s1.send("PRIVMSG #test :Hello").await?; + s1.send("QUIT :Leaving").await?; + s1.expect(":testserver ERROR :Leaving the server").await?; + s1.expect_eof().await?; + stream1.shutdown().await?; + + let server = server.reboot().await?; + + // Open a new connection and expect to be force-joined to the channel + + let mut stream1 = TcpStream::connect(server.server.addr).await?; + let mut s1 = TestScope::new(&mut stream1); + + s1.send("PASS password").await?; + s1.send("NICK tester1").await?; + s1.send("USER UserName 0 * :Real Name").await?; + s1.expect_server_introduction("tester1").await?; + s1.expect(":tester1 JOIN #test").await?; + s1.expect(":testserver 332 tester1 #test :New room").await?; + s1.expect(":testserver 353 tester1 = #test :tester1").await?; + s1.expect(":testserver 366 tester1 #test :End of /NAMES list").await?; + + // Open a connection from the second player and join the channel + + let mut stream2 = TcpStream::connect(server.server.addr).await?; + let mut s2 = TestScope::new(&mut stream2); + + s2.send("PASS password").await?; + s2.send("NICK tester2").await?; + s2.send("USER UserName 0 * :Real Name").await?; + s2.expect_server_introduction("tester2").await?; + s2.send("JOIN #test").await?; + s2.expect(":tester2 JOIN #test").await?; + s2.expect(":testserver 332 tester2 #test :New room").await?; + s2.expect_that(|msg| { + msg == ":testserver 353 tester2 = #test :tester1 tester2" + || msg == ":testserver 353 tester2 = #test :tester2 tester1" + }) + .await?; + s2.expect(":testserver 366 tester2 #test :End of /NAMES list").await?; + s2.expect_nothing().await?; + + // The first player should receive the joining message + + s1.expect(":tester2 JOIN #test").await?; + s1.expect_nothing().await?; + + // Also send a message for good measure + + s2.send("PRIVMSG #test :Hello").await?; + s1.expect(":tester2 PRIVMSG #test :Hello").await?; + s1.expect_nothing().await?; + + // Wrap up + + s1.send("QUIT :Leaving").await?; + s1.expect(":testserver ERROR :Leaving the server").await?; + s1.expect_eof().await?; + + s2.send("QUIT :Leaving").await?; + s2.expect(":testserver ERROR :Leaving the server").await?; + s2.expect_eof().await?; + + stream1.shutdown().await?; + stream2.shutdown().await?; + Ok(()) +} + #[tokio::test] async fn scenario_force_join_msg() -> Result<()> { let server = TestServer::start().await?;