8
0

tasks.js 3.0 KB

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