diff options
Diffstat (limited to 'cli/tests/integration/watcher_tests.rs')
-rw-r--r-- | cli/tests/integration/watcher_tests.rs | 116 |
1 files changed, 70 insertions, 46 deletions
diff --git a/cli/tests/integration/watcher_tests.rs b/cli/tests/integration/watcher_tests.rs index 0c9b8c29f..e50ac04e7 100644 --- a/cli/tests/integration/watcher_tests.rs +++ b/cli/tests/integration/watcher_tests.rs @@ -58,6 +58,24 @@ fn wait_contains(s: &str, lines: &mut impl Iterator<Item = String>) { wait_for(|msg| msg.contains(s), lines) } +/// Before test cases touch files, they need to wait for the watcher to be +/// ready. Waiting for subcommand output is insufficient. +/// The file watcher takes a moment to start watching files due to +/// asynchronicity. It is possible for the watched subcommand to finish before +/// any files are being watched. +/// deno must be running with --log-level=debug +/// file_name should be the file name and, optionally, extension. file_name +/// may not be a full path, as it is not portable. +fn wait_for_watcher( + file_name: &str, + stderr_lines: &mut impl Iterator<Item = String>, +) { + wait_for( + |m| m.contains("Watching paths") && m.contains(file_name), + stderr_lines, + ); +} + fn read_line(s: &str, lines: &mut impl Iterator<Item = String>) -> String { lines.find(|m| m.contains(s)).unwrap() } @@ -508,20 +526,14 @@ fn run_watch_no_dynamic() { let (mut stdout_lines, mut stderr_lines) = child_lines(&mut child); wait_contains("Hello world", &mut stdout_lines); - wait_for( - |m| m.contains("Watching paths") && m.contains("file_to_watch.js"), - &mut stderr_lines, - ); + wait_for_watcher("file_to_watch.js", &mut stderr_lines); // Change content of the file write(&file_to_watch, "console.log('Hello world2');").unwrap(); wait_contains("Restarting", &mut stderr_lines); wait_contains("Hello world2", &mut stdout_lines); - wait_for( - |m| m.contains("Watching paths") && m.contains("file_to_watch.js"), - &mut stderr_lines, - ); + wait_for_watcher("file_to_watch.js", &mut stderr_lines); // Add dependency let another_file = t.path().join("another_file.js"); @@ -534,30 +546,21 @@ fn run_watch_no_dynamic() { wait_contains("Restarting", &mut stderr_lines); wait_contains("0", &mut stdout_lines); - wait_for( - |m| m.contains("Watching paths") && m.contains("another_file.js"), - &mut stderr_lines, - ); + wait_for_watcher("another_file.js", &mut stderr_lines); // Confirm that restarting occurs when a new file is updated write(&another_file, "export const foo = 42;").unwrap(); wait_contains("Restarting", &mut stderr_lines); wait_contains("42", &mut stdout_lines); - wait_for( - |m| m.contains("Watching paths") && m.contains("file_to_watch.js"), - &mut stderr_lines, - ); + wait_for_watcher("file_to_watch.js", &mut stderr_lines); // Confirm that the watcher keeps on working even if the file is updated and has invalid syntax write(&file_to_watch, "syntax error ^^").unwrap(); wait_contains("Restarting", &mut stderr_lines); wait_contains("error:", &mut stderr_lines); - wait_for( - |m| m.contains("Watching paths") && m.contains("file_to_watch.js"), - &mut stderr_lines, - ); + wait_for_watcher("file_to_watch.js", &mut stderr_lines); // Then restore the file write( @@ -568,20 +571,14 @@ fn run_watch_no_dynamic() { wait_contains("Restarting", &mut stderr_lines); wait_contains("42", &mut stdout_lines); - wait_for( - |m| m.contains("Watching paths") && m.contains("another_file.js"), - &mut stderr_lines, - ); + wait_for_watcher("another_file.js", &mut stderr_lines); // Update the content of the imported file with invalid syntax write(&another_file, "syntax error ^^").unwrap(); wait_contains("Restarting", &mut stderr_lines); wait_contains("error:", &mut stderr_lines); - wait_for( - |m| m.contains("Watching paths") && m.contains("another_file.js"), - &mut stderr_lines, - ); + wait_for_watcher("another_file.js", &mut stderr_lines); // Modify the imported file and make sure that restarting occurs write(&another_file, "export const foo = 'modified!';").unwrap(); @@ -629,12 +626,7 @@ fn run_watch_external_watch_files() { let (mut stdout_lines, mut stderr_lines) = child_lines(&mut child); wait_contains("Process started", &mut stderr_lines); wait_contains("Hello world", &mut stdout_lines); - wait_for( - |m| { - m.contains("Watching paths") && m.contains("external_file_to_watch.txt") - }, - &mut stderr_lines, - ); + wait_for_watcher("external_file_to_watch.txt", &mut stderr_lines); // Change content of the external file write(&external_file_to_watch, "Hello world2").unwrap(); @@ -685,10 +677,7 @@ fn run_watch_load_unload_events() { // Wait for the first load event to fire wait_contains("load", &mut stdout_lines); - wait_for( - |m| m.contains("Watching paths") && m.contains("file_to_watch.js"), - &mut stderr_lines, - ); + wait_for_watcher("file_to_watch.js", &mut stderr_lines); // Change content of the file, this time without an interval to keep it alive. write( @@ -743,10 +732,7 @@ fn run_watch_not_exit() { wait_contains("Process started", &mut stderr_lines); wait_contains("error:", &mut stderr_lines); - wait_for( - |m| m.contains("Watching paths") && m.contains("file_to_watch.js"), - &mut stderr_lines, - ); + wait_for_watcher("file_to_watch.js", &mut stderr_lines); // Make sure the watcher actually restarts and works fine with the proper syntax write(&file_to_watch, "console.log(42);").unwrap(); @@ -808,6 +794,47 @@ fn run_watch_with_import_map_and_relative_paths() { } #[test] +fn run_watch_with_ext_flag() { + let t = TempDir::new(); + let file_to_watch = t.path().join("file_to_watch"); + write(&file_to_watch, "interface I{}; console.log(42);").unwrap(); + + let mut child = util::deno_cmd() + .current_dir(util::testdata_path()) + .arg("run") + .arg("--watch") + .arg("--log-level") + .arg("debug") + .arg("--ext") + .arg("ts") + .arg(&file_to_watch) + .env("NO_COLOR", "1") + .stdout(std::process::Stdio::piped()) + .stderr(std::process::Stdio::piped()) + .spawn() + .unwrap(); + let (mut stdout_lines, mut stderr_lines) = child_lines(&mut child); + + wait_contains("42", &mut stdout_lines); + + // Make sure the watcher actually restarts and works fine with the proper language + wait_for_watcher("file_to_watch", &mut stderr_lines); + wait_contains("Process finished", &mut stderr_lines); + + write( + &file_to_watch, + "type Bear = 'polar' | 'grizzly'; console.log(123);", + ) + .unwrap(); + + wait_contains("Restarting!", &mut stderr_lines); + wait_contains("123", &mut stdout_lines); + wait_contains("Process finished", &mut stderr_lines); + + check_alive_then_kill(child); +} + +#[test] fn run_watch_error_messages() { let t = TempDir::new(); let file_to_watch = t.path().join("file_to_watch.js"); @@ -1193,10 +1220,7 @@ fn run_watch_dynamic_imports() { &mut stdout_lines, ); - wait_for( - |m| m.contains("Watching paths") && m.contains("imported2.js"), - &mut stderr_lines, - ); + wait_for_watcher("imported2.js", &mut stderr_lines); wait_contains("finished", &mut stderr_lines); write( |