Browse Source

test: refactor how spec files are collected (#23814)

(cherry picked from commit 3a7775fa73b37cb216553b600505ead67fd849d7)
Alexey Kuzmin 4 years ago
parent
commit
314cfa7aec
3 changed files with 83 additions and 71 deletions
  1. 35 36
      spec-main/index.js
  2. 15 0
      spec/static/get-files.js
  3. 33 35
      spec/static/index.html

+ 35 - 36
spec-main/index.js

@@ -37,7 +37,7 @@ protocol.registerSchemesAsPrivileged([
   { scheme: 'bar', privileges: { standard: true } }
 ]);
 
-app.whenReady().then(() => {
+app.whenReady().then(async () => {
   require('ts-node/register');
 
   const argv = require('yargs')
@@ -68,48 +68,47 @@ app.whenReady().then(() => {
   if (argv.grep) mocha.grep(argv.grep);
   if (argv.invert) mocha.invert();
 
-  // Read all test files.
-  const walker = require('walkdir').walk(__dirname, {
-    no_recurse: true
-  });
+  const filter = (file) => {
+    if (!/-spec\.[tj]s$/.test(file)) {
+      return false;
+    }
 
-  // This allows you to run specific modules only:
-  // npm run test -match=menu
-  const moduleMatch = process.env.npm_config_match
-    ? new RegExp(process.env.npm_config_match, 'g')
-    : null;
-
-  const testFiles = [];
-  walker.on('file', (file) => {
-    if (/-spec\.[tj]s$/.test(file) &&
-        (!moduleMatch || moduleMatch.test(file))) {
-      testFiles.push(file);
+    // This allows you to run specific modules only:
+    // npm run test -match=menu
+    const moduleMatch = process.env.npm_config_match
+      ? new RegExp(process.env.npm_config_match, 'g')
+      : null;
+    if (moduleMatch && !moduleMatch.test(file)) {
+      return false;
+    }
+
+    const baseElectronDir = path.resolve(__dirname, '..');
+    if (argv.files && !argv.files.includes(path.relative(baseElectronDir, file))) {
+      return false;
     }
-  });
 
-  const baseElectronDir = path.resolve(__dirname, '..');
+    return true;
+  };
 
-  walker.on('end', () => {
-    testFiles.sort();
-    sortToEnd(testFiles, f => f.includes('crash-reporter')).forEach((file) => {
-      if (!argv.files || argv.files.includes(path.relative(baseElectronDir, file))) {
-        mocha.addFile(file);
-      }
+  const getFiles = require('../spec/static/get-files');
+  const testFiles = await getFiles(__dirname, { filter });
+  sortToEnd(testFiles, f => f.includes('crash-reporter')).forEach((file) => {
+    mocha.addFile(file);
+  });
+
+  const cb = () => {
+    // Ensure the callback is called after runner is defined
+    process.nextTick(() => {
+      process.exit(runner.failures);
     });
-    const cb = () => {
-      // Ensure the callback is called after runner is defined
-      process.nextTick(() => {
-        process.exit(runner.failures);
-      });
-    };
+  };
 
-    // Set up chai in the correct order
-    const chai = require('chai');
-    chai.use(require('chai-as-promised'));
-    chai.use(require('dirty-chai'));
+  // Set up chai in the correct order
+  const chai = require('chai');
+  chai.use(require('chai-as-promised'));
+  chai.use(require('dirty-chai'));
 
-    const runner = mocha.run(cb);
-  });
+  const runner = mocha.run(cb);
 });
 
 function partition (xs, f) {

+ 15 - 0
spec/static/get-files.js

@@ -0,0 +1,15 @@
+async function getFiles (directoryPath, { filter = null } = {}) {
+  const files = [];
+  const walker = require('walkdir').walk(directoryPath, {
+    no_recurse: true
+  });
+  walker.on('file', (file) => {
+    if (!filter || filter(file)) {
+      files.push(file);
+    }
+  });
+  await new Promise((resolve) => walker.on('end', resolve));
+  return files;
+}
+
+module.exports = getFiles;

+ 33 - 35
spec/static/index.html

@@ -1,7 +1,7 @@
 <body>
 <script src="jquery-2.0.3.min.js"></script>
 <script type="text/javascript" charset="utf-8">
-(function() {
+(async function() {
   // Deprecated APIs are still supported and should be tested.
   process.throwDeprecation = false
 
@@ -49,47 +49,45 @@
   if (query.grep) mocha.grep(query.grep)
   if (query.invert) mocha.invert()
 
-  const files = query.files ? query.files.split(',') : undefined
-
-  // Read all test files.
-  const walker = require('walkdir').walk(path.dirname(__dirname), {
-    no_recurse: true
-  })
+  const filter = (file) => {
+    if (!/-spec\.js$/.test(file)) {
+      return false
+    }
 
-  // This allows you to run specific modules only:
-  // npm run test -match=menu
-  const moduleMatch = process.env.npm_config_match
-    ? new RegExp(process.env.npm_config_match, 'g')
-    : null
+    // This allows you to run specific modules only:
+    // npm run test -match=menu
+    const moduleMatch = process.env.npm_config_match
+      ? new RegExp(process.env.npm_config_match, 'g')
+      : null
+    if (moduleMatch && !moduleMatch.test(file)) {
+      return false
+    }
 
-  const testFiles = []
-  walker.on('file', (file) => {
-    if (/-spec\.js$/.test(file) && (!moduleMatch || moduleMatch.test(file))) {
-      testFiles.push(file)
+    const files = query.files ? query.files.split(',') : undefined
+    const baseElectronDir = path.resolve(__dirname, '..', '..')
+    if (files && !files.includes(path.relative(baseElectronDir, file))) {
+      return false
     }
-  })
 
-  const baseElectronDir = path.resolve(__dirname, '..', '..')
+    return true
+  }
 
-  walker.on('end', () => {
-    testFiles.sort()
-    testFiles.forEach((file) => {
-      if (!files || files.includes(path.relative(baseElectronDir, file))) {
-        mocha.addFile(file)
-      }
-    })
+  const getFiles = require('./get-files')
+  const testFiles = await getFiles(path.dirname(__dirname), { filter })
+  testFiles.sort().forEach((file) => {
+    mocha.addFile(file)
+  })
 
-    // Set up chai in the correct order
-    const chai = require('chai')
-    chai.use(require('chai-as-promised'))
-    chai.use(require('dirty-chai'))
+  // Set up chai in the correct order
+  const chai = require('chai')
+  chai.use(require('chai-as-promised'))
+  chai.use(require('dirty-chai'))
 
-    const runner = mocha.run(() => {
-      // Ensure the callback is called after runner is defined
-      setTimeout(() => {
-        ipcRenderer.send('process.exit', runner.failures)
-      }, 0)
-    })
+  const runner = mocha.run(() => {
+    // Ensure the callback is called after runner is defined
+    setTimeout(() => {
+      ipcRenderer.send('process.exit', runner.failures)
+    }, 0)
   })
 })()
 </script>