tasks.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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 semver = require( 'semver' );
  12. const { tools, stream } = require( 'ckeditor5-dev-utils' );
  13. const benderConfig = require( '../../../bender' );
  14. /**
  15. * Defines Node.js testing task and development tools testing tasks.
  16. *
  17. * To run tests under Node.js:
  18. *
  19. * gulp test:node
  20. *
  21. * To run build under Node.js before testing:
  22. *
  23. * gulp test:node:build
  24. *
  25. * To run testing under Node.js with code coverage:
  26. *
  27. * gulp test:node:coverage
  28. *
  29. * To run development tools tests:
  30. *
  31. * gulp test:dev
  32. *
  33. * To run development tools tests with coverage:
  34. *
  35. * gulp test:dev:coverage
  36. */
  37. module.exports = () => {
  38. const ignoreRegexp = /\/\* ?bender-tags:.*\bbrowser-only\b.*\*\//;
  39. // Inject globals before running tests.
  40. global.should = chai.should;
  41. global.expect = chai.expect;
  42. global.assert = chai.assert;
  43. global.sinon = sinon;
  44. const tasks = {
  45. /**
  46. * Is set to `true` when code coverage report will be displayed.
  47. *
  48. * @type {Boolean}
  49. */
  50. coverage: false,
  51. /**
  52. * Prepares files for coverage report.
  53. *
  54. * @returns {Stream}
  55. */
  56. prepareNodeCoverage() {
  57. const src = benderConfig.coverage.paths.map( ( item ) => {
  58. return item.replace( 'build/amd/', 'build/cjs/' );
  59. } );
  60. tasks.coverage = true;
  61. return gulp.src( src )
  62. .pipe( istanbul() )
  63. .pipe( istanbul.hookRequire() );
  64. },
  65. /**
  66. * Runs tests in Node.js environment.
  67. *
  68. * @returns {Stream}
  69. */
  70. testInNode() {
  71. const minVersion = '6.0.0';
  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. const benderSrc = benderConfig.tests.all.paths.map( ( item ) => {
  79. return item.replace( 'build/amd/', 'build/cjs/' ) + '/*.js' ;
  80. } );
  81. const src = [
  82. ...benderSrc,
  83. '!build/cjs/tests/{ui,ui-*}/**/*.js',
  84. '!build/cjs/tests/theme-*/**/*.js',
  85. '!build/cjs/tests/creator-*/**/*.js'
  86. ];
  87. return gulp.src( src )
  88. .pipe( tasks.skipManual() )
  89. .pipe( tasks.skipIgnored() )
  90. .pipe( mocha( { reporter: 'progress' } ) )
  91. .pipe( tasks.coverage ? istanbul.writeReports() : stream.noop() );
  92. },
  93. /**
  94. * Removes manual test files from source stream. It checks if the markdown file with the same name exists.
  95. *
  96. * @returns {Stream}
  97. */
  98. skipManual() {
  99. return filter( ( file ) => {
  100. return !tools.isFile( file.path.slice( 0, -3 ) + '.md' );
  101. } );
  102. },
  103. /**
  104. * Skips test files that are marked to be ignored when testing outside browser.
  105. * To ignore file, add `browser-only` to bender-tags comment in test file.
  106. *
  107. * @returns {Stream}
  108. */
  109. skipIgnored() {
  110. return filterBy( file => !file.contents.toString().match( ignoreRegexp ) );
  111. },
  112. /**
  113. * Runs dev unit tests.
  114. *
  115. * @returns {Stream}
  116. */
  117. devTest() {
  118. return gulp.src( 'dev/tests/**/*.js' )
  119. .pipe( mocha() )
  120. .pipe( tasks.coverage ? istanbul.writeReports() : stream.noop() );
  121. },
  122. /**
  123. * Prepares files for coverage report.
  124. *
  125. * @returns {Stream}
  126. */
  127. prepareDevCoverage() {
  128. tasks.coverage = true;
  129. return gulp.src( 'dev/tasks/**/*.js' )
  130. .pipe( istanbul() )
  131. .pipe( istanbul.hookRequire() );
  132. },
  133. register() {
  134. gulp.task( 'test:node:pre-coverage', [ 'build:js:cjs' ], tasks.prepareNodeCoverage );
  135. gulp.task( 'test:node', tasks.testInNode );
  136. gulp.task( 'test:node:build', [ 'build:js:cjs' ] , tasks.testInNode );
  137. gulp.task( 'test:node:coverage', [ 'build:js:cjs', 'test:node:pre-coverage' ], tasks.testInNode );
  138. gulp.task( 'test:dev:pre-coverage', tasks.prepareDevCoverage );
  139. gulp.task( 'test:dev', tasks.devTest );
  140. gulp.task( 'test:dev:coverage', [ 'test:dev:pre-coverage' ], tasks.devTest );
  141. }
  142. };
  143. return tasks;
  144. };