tasks.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /* jshint node: true, esnext: true */
  2. 'use strict';
  3. const gulp = require( 'gulp' );
  4. const istanbul = require( 'gulp-istanbul' );
  5. const gutil = require( 'gulp-util' );
  6. const mocha = require( 'gulp-mocha' );
  7. const chai = require( 'chai' );
  8. const filterBy = require( 'gulp-filter-by' );
  9. const filter = require( 'gulp-filter' );
  10. const sinon = require( 'sinon' );
  11. const devTools = require( '../dev/utils/tools' );
  12. const semver = require( 'semver' );
  13. const buildUtils = require( '../build/utils' );
  14. /**
  15. * Defines Node.js testing task.
  16. *
  17. * To run tests under node:
  18. *
  19. * gulp test:node
  20. *
  21. * To run build before testing:
  22. *
  23. * gulp test:node:build
  24. *
  25. * To run testing with code coverage:
  26. *
  27. * gulp test:node:coverage
  28. */
  29. module.exports = () => {
  30. const ignoreRegexp = /\/\* ?bender-tags:.*\bbrowser-only\b.*\*\//;
  31. // Inject globals before running tests.
  32. global.should = chai.should;
  33. global.expect = chai.expect;
  34. global.assert = chai.assert;
  35. global.sinon = sinon;
  36. global.bender = { model: {}, view: {} };
  37. const tasks = {
  38. /**
  39. * Is set to `true` when code coverage report will be displayed.
  40. *
  41. * @type {Boolean}
  42. */
  43. coverage: false,
  44. /**
  45. * Prepares files for coverage report.
  46. *
  47. * @returns {Stream}
  48. */
  49. prepareCoverage() {
  50. tasks.coverage = true;
  51. return gulp.src( 'build/cjs/ckeditor5/**/*.js' )
  52. .pipe( istanbul() )
  53. .pipe( istanbul.hookRequire() );
  54. },
  55. /**
  56. * Runs tests in Node.js environment.
  57. *
  58. * @returns {Stream}
  59. */
  60. testInNode() {
  61. const minVersion = '6.1.0';
  62. const src = [
  63. 'build/cjs/tests/**/*.js',
  64. '!**/_utils/**/*.js',
  65. '!build/cjs/tests/{ui,ui-*}/**/*.js',
  66. '!build/cjs/tests/theme-*/**/*.js'
  67. ];
  68. if ( semver.lt( process.version, minVersion ) ) {
  69. throw new gutil.PluginError( {
  70. plugin: 'test-node',
  71. message: `Wrong Node.js version. Please use Node.js in version v${ minVersion } or higher.`
  72. } );
  73. }
  74. // Include global test tools.
  75. global.bender.model = require( '../../../build/cjs/tests/engine/_utils/model.js' );
  76. global.bender.view = require( '../../../build/cjs/tests/engine/_utils/view.js' );
  77. return gulp.src( src )
  78. .pipe( tasks.skipManual() )
  79. .pipe( tasks.skipIgnored() )
  80. .pipe( mocha( { reporter: 'progress' } ) )
  81. .pipe( tasks.coverage ? istanbul.writeReports() : buildUtils.noop() );
  82. },
  83. /**
  84. * Removes manual test files from source stream. It checks if the markdown file with the same name exists.
  85. *
  86. * @returns {Stream}
  87. */
  88. skipManual() {
  89. return filter( ( file ) => {
  90. return !devTools.isFile( file.path.slice( 0, -3 ) + '.md' );
  91. } );
  92. },
  93. /**
  94. * Skips test files that are marked to be ignored when testing outside browser.
  95. * To ignore file, add `browser-only` to bender-tags comment in test file.
  96. *
  97. * @returns {Stream}
  98. */
  99. skipIgnored() {
  100. return filterBy( file => !file.contents.toString().match( ignoreRegexp ) );
  101. }
  102. };
  103. gulp.task( 'test:node:pre-coverage', [ 'build:js:cjs' ], tasks.prepareCoverage );
  104. gulp.task( 'test:node', tasks.testInNode );
  105. gulp.task( 'test:node:build', [ 'build:js:cjs' ] , tasks.testInNode );
  106. gulp.task( 'test:node:coverage', [ 'build:js:cjs', 'test:node:pre-coverage' ], tasks.testInNode );
  107. return tasks;
  108. };