use std::env;
use std::fs::{self, File};
use std::io::Write;
use std::path::PathBuf;
use std::process::{Command, Stdio};
use std::thread;
use std::time::Duration;
use tempfile::TempDir;
#[cfg(test)]
mod tests {
use super::*;
fn setup_test_dir() -> TempDir {
let temp_dir = TempDir::new().expect("Failed to create temp directory");
let src_dir = temp_dir.path().join("src");
fs::create_dir(&src_dir).expect("Failed to create src directory");
let js_file = src_dir.join("test.js");
let mut file = File::create(js_file).expect("Failed to create test.js");
writeln!(file, "console.log('hello');").expect("Failed to write to test.js");
let css_file = src_dir.join("style.css");
let mut file = File::create(css_file).expect("Failed to create style.css");
writeln!(file, "body {{ color: black; }}").expect("Failed to write to style.css");
temp_dir
}
fn run_flash(args: &[&str], working_dir: &PathBuf) -> (Command, String) {
let flash_binary = env::current_dir()
.expect("Failed to get current dir")
.join("target/debug/flash");
let mut command = Command::new(&flash_binary);
command
.args(args)
.current_dir(working_dir)
.stdout(Stdio::piped())
.stderr(Stdio::piped());
let cmd_str = format!("{:?} {:?}", flash_binary, args);
(command, cmd_str)
}
#[test]
#[ignore]
fn test_flash_watches_file_changes() {
Command::new("cargo")
.args(["build"])
.status()
.expect("Failed to build flash binary");
let temp_dir = setup_test_dir();
let test_dir = temp_dir.path().to_path_buf();
let (mut command, cmd_str) = run_flash(
&[
"-w",
"src", "-e",
"js", "--initial", "echo",
"File changed",
],
&test_dir,
);
println!("Running: {}", cmd_str);
let mut child = command.spawn().expect("Failed to start flash");
thread::sleep(Duration::from_millis(500));
let js_file = test_dir.join("src/test.js");
let mut file = File::create(js_file).expect("Failed to open test.js");
writeln!(file, "console.log('updated');").expect("Failed to update test.js");
thread::sleep(Duration::from_millis(1000));
let css_file = test_dir.join("src/style.css");
let mut file = File::create(css_file).expect("Failed to open style.css");
writeln!(file, "body {{ color: blue; }}").expect("Failed to update style.css");
thread::sleep(Duration::from_millis(1000));
child.kill().expect("Failed to kill flash process");
let output = child.wait_with_output().expect("Failed to wait for output");
let stdout = String::from_utf8_lossy(&output.stdout);
let stderr = String::from_utf8_lossy(&output.stderr);
println!("Flash stdout: {}", stdout);
println!("Flash stderr: {}", stderr);
assert!(stdout.contains("Flash watching for changes"));
assert!(stdout.contains("Change detected in:") && stdout.contains("test.js"));
assert!(!stdout.contains("style.css"));
}
#[test]
fn test_integration_setup() {
let temp_dir = setup_test_dir();
let js_file = temp_dir.path().join("src/test.js");
let css_file = temp_dir.path().join("src/style.css");
assert!(js_file.exists(), "test.js was not created");
assert!(css_file.exists(), "style.css was not created");
}
}