Files
sausage/host/tests/it/extensions.rs
T

47 lines
1.5 KiB
Rust

//! File reloads, immutable calls, debounce, offline edits, and host-side recovery without subprocesses.
use sausage::{
exec::{Command, Exec, Options, Stream},
world::World,
};
use std::sync::Arc;
const BUNDLE: &str = include_str!("../../js/extensions-test-bundle.js");
struct NoExec;
#[async_trait::async_trait]
impl Exec for NoExec {
async fn exec(
&self,
command: Command,
_: Options,
_: &mut (dyn for<'a> FnMut(Stream, &'a [u8]) + Send),
) -> anyhow::Result<i32> {
anyhow::bail!("Extension loading must not spawn commands: {command:?}")
}
}
#[tokio::test(flavor = "current_thread")]
async fn edits_and_restart() -> anyhow::Result<()> {
let dir = tempfile::tempdir()?;
let repo = dir.path().join("world/src/sausage");
std::fs::create_dir_all(&repo)?;
for (phase, expected) in [
("edits", "C"),
("broken", "C"),
("offline", "D"),
("broken", "D"),
] {
if phase == "offline" {
std::fs::copy(
repo.join("offline-source.txt"),
repo.join("extensions/demo/server.ts"),
)?;
} else if phase == "broken" {
std::fs::write(repo.join("extensions/demo/server.ts"), "syntax !!! error")?;
}
let world = World::open(dir.path())?;
sausage::harness::run_module(world, Arc::new(NoExec), &format!(
"globalThis.extensionPhase={phase:?};globalThis.extensionExpected={expected:?};\n{BUNDLE}"
)).await?;
assert!(!repo.join(".git").exists());
}
Ok(())
}