From 98ff615c5e14b88e0fdd68f0fa46f04e34518e1d Mon Sep 17 00:00:00 2001
From: Pietro Marchini <pietro.marchini94@gmail.com>
Date: Fri, 20 Sep 2024 13:41:40 +0000
Subject: [PATCH] test: add runner watch mode isolation tests

PR-URL: https://github.com/nodejs/node/pull/54888
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
---
 test/parallel/test-runner-watch-mode.mjs | 64 ++++++++++++++----------
 1 file changed, 37 insertions(+), 27 deletions(-)

diff --git a/test/parallel/test-runner-watch-mode.mjs b/test/parallel/test-runner-watch-mode.mjs
index 4c059f0a27040e..b6fa0a2fe0f131 100644
--- a/test/parallel/test-runner-watch-mode.mjs
+++ b/test/parallel/test-runner-watch-mode.mjs
@@ -42,11 +42,13 @@ async function testWatch({
   file,
   action = 'update',
   fileToCreate,
+  isolation,
 }) {
   const ran1 = util.createDeferredPromise();
   const ran2 = util.createDeferredPromise();
   const child = spawn(process.execPath,
                       ['--watch', '--test', '--test-reporter=spec',
+                       isolation ? `--experimental-test-isolation=${isolation}` : '',
                        file ? fixturePaths[file] : undefined].filter(Boolean),
                       { encoding: 'utf8', stdio: 'pipe', cwd: tmpdir.path });
   let stdout = '';
@@ -166,31 +168,39 @@ async function testWatch({
 
 describe('test runner watch mode', () => {
   beforeEach(refresh);
-  it('should run tests repeatedly', async () => {
-    await testWatch({ file: 'test.js', fileToUpdate: 'test.js' });
-  });
-
-  it('should run tests with dependency repeatedly', async () => {
-    await testWatch({ file: 'test.js', fileToUpdate: 'dependency.js' });
-  });
-
-  it('should run tests with ESM dependency', async () => {
-    await testWatch({ file: 'test.js', fileToUpdate: 'dependency.mjs' });
-  });
-
-  it('should support running tests without a file', async () => {
-    await testWatch({ fileToUpdate: 'test.js' });
-  });
-
-  it('should support a watched test file rename', async () => {
-    await testWatch({ fileToUpdate: 'test.js', action: 'rename' });
-  });
-
-  it('should not throw when delete a watched test file', async () => {
-    await testWatch({ fileToUpdate: 'test.js', action: 'delete' });
-  });
-
-  it('should run new tests when a new file is created in the watched directory', async () => {
-    await testWatch({ action: 'create', fileToCreate: 'new-test-file.test.js' });
-  });
+  for (const isolation of ['none', 'process']) {
+    describe(`isolation: ${isolation}`, () => {
+      it('should run tests repeatedly', async () => {
+        await testWatch({ file: 'test.js', fileToUpdate: 'test.js', isolation });
+      });
+
+      it('should run tests with dependency repeatedly', async () => {
+        await testWatch({ file: 'test.js', fileToUpdate: 'dependency.js', isolation });
+      });
+
+      it('should run tests with ESM dependency', async () => {
+        await testWatch({ file: 'test.js', fileToUpdate: 'dependency.mjs', isolation });
+      });
+
+      it('should support running tests without a file', async () => {
+        await testWatch({ fileToUpdate: 'test.js', isolation });
+      });
+
+      it('should support a watched test file rename', async () => {
+        await testWatch({ fileToUpdate: 'test.js', action: 'rename', isolation });
+      });
+
+      it('should not throw when delete a watched test file', async () => {
+        await testWatch({ fileToUpdate: 'test.js', action: 'delete', isolation });
+      });
+
+      it('should run new tests when a new file is created in the watched directory', {
+        todo: isolation === 'none' ?
+          'This test is failing when isolation is set to none and must be fixed' :
+          undefined,
+      }, async () => {
+        await testWatch({ action: 'create', fileToCreate: 'new-test-file.test.js', isolation });
+      });
+    });
+  }
 });