use futures_util::StreamExt;
use tokio_tungstenite::tungstenite::Message;
use crate::listen::{close, echoed_protocol, frame_matching, is_reload, next_frame, ws, WAIT};
use crate::{App, INDEX_HTML};
#[tokio::test(flavor = "multi_thread")]
async fn root_vite_hmr_socket_connects_and_carries_reloads() {
let app = App::new(&[
(
"package.json",
r#"{"name":"vite-hmr-app","version":"1.0.0"}"#,
),
("src/main.js", "document.title = \"v1\";\n"),
("index.html", INDEX_HTML),
]);
let server = app.serve().await;
let listening = server.listen().await;
let (mut socket, res) = server.ws(listening.addr, "/", Some("vite-hmr")).await;
assert_eq!(
echoed_protocol(&res),
Some("vite-hmr"),
"server echoes the vite-hmr subprotocol"
);
assert_eq!(
next_frame(&mut socket).await["type"],
"connected",
"connected is the first frame"
);
server.text("/src/main.js").await;
app.write(&[("src/main.js", "document.title = \"v2\";\n")]);
frame_matching(&mut socket, "reload frame after edit", is_reload).await;
close(socket).await;
let (mut ping, res) = ws(listening.addr, "/", Some("vite-ping")).await;
assert_eq!(
echoed_protocol(&res),
Some("vite-ping"),
"vite-ping socket opened"
);
let closed = tokio::time::timeout(WAIT, async {
loop {
match ping.next().await {
Some(Ok(Message::Close(_))) | None => return,
Some(Ok(Message::Text(t))) => panic!("vite-ping got a frame: {}", t.as_str()),
Some(Ok(_)) => {}
Some(Err(e)) => panic!("vite-ping socket errored: {e}"),
}
}
})
.await;
assert!(
closed.is_ok(),
"vite-ping socket opened then was closed by the server"
);
}