8
0

tasks.js 3.2 KB

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