tasks.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /**
  2. * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. /* global describe, it, beforeEach, afterEach */
  6. 'use strict';
  7. const mockery = require( 'mockery' );
  8. const sinon = require( 'sinon' );
  9. const Vinyl = require( 'vinyl' );
  10. const utils = require( '../../tasks/gulp/build/utils' );
  11. const babel = require( 'babel-core' );
  12. const chai = require( 'chai' );
  13. const expect = chai.expect;
  14. const gutil = require( 'gulp-util' );
  15. const gulp = require( 'gulp' );
  16. const path = require( 'path' );
  17. describe( 'build-tasks', () => {
  18. let sandbox, tasks;
  19. const config = {
  20. ROOT_DIR: '.',
  21. DIST_DIR: 'dist'
  22. };
  23. beforeEach( () => {
  24. mockery.enable( {
  25. warnOnReplace: false,
  26. warnOnUnregistered: false
  27. } );
  28. sandbox = sinon.sandbox.create();
  29. mockery.registerMock( 'minimist', () => {
  30. return {
  31. formats: 'amd',
  32. watch: false
  33. };
  34. } );
  35. tasks = require( '../../tasks/gulp/build/tasks' )( config );
  36. } );
  37. afterEach( () => {
  38. mockery.disable();
  39. sandbox.restore();
  40. } );
  41. describe( 'packages', () => {
  42. it( 'should return stream with correct packages as src', () => {
  43. const fs = require( 'fs' );
  44. const readDirStub = sandbox.stub( fs, 'readdirSync', () => [ 'ckeditor5-core', 'ckeditor5-toolbar' ] );
  45. const statStub = sandbox.stub( fs, 'lstatSync', () => {
  46. return {
  47. isDirectory() {
  48. return true;
  49. },
  50. isSymbolicLink() {
  51. return false;
  52. }
  53. };
  54. } );
  55. const gulpSrcSpy = sandbox.spy( gulp, 'src' );
  56. tasks.src.packages( false );
  57. sinon.assert.calledOnce( readDirStub );
  58. sinon.assert.calledTwice( gulpSrcSpy );
  59. sinon.assert.calledTwice( statStub );
  60. expect( gulpSrcSpy.firstCall.args[ 0 ] ).to.equal( path.join( 'node_modules', 'ckeditor5-core', 'src/**/*.js' ) );
  61. expect( gulpSrcSpy.secondCall.args[ 0 ] ).to.equal( path.join( 'node_modules', 'ckeditor5-toolbar', 'src/**/*.js' ) );
  62. } );
  63. it( 'should skip files and resolve symbolic links', () => {
  64. const fs = require( 'fs' );
  65. const readDirStub = sandbox.stub( fs, 'readdirSync', () => [ 'ckeditor5-file.js' ] );
  66. const statStub = sandbox.stub( fs, 'lstatSync', () => {
  67. return {
  68. isDirectory() {
  69. return false;
  70. },
  71. isSymbolicLink() {
  72. return true;
  73. }
  74. };
  75. } );
  76. const realPathStub = sandbox.stub( fs, 'realpathSync', () => '/real/path' );
  77. const gulpSrcSpy = sandbox.spy( gulp, 'src' );
  78. tasks.src.packages( false );
  79. sinon.assert.calledOnce( readDirStub );
  80. sinon.assert.calledOnce( realPathStub );
  81. sinon.assert.notCalled( gulpSrcSpy );
  82. sinon.assert.calledTwice( statStub );
  83. } );
  84. } );
  85. describe( 'build', () => {
  86. it( 'should return build stream', ( done ) => {
  87. const code = 'export default {};';
  88. sandbox.stub( gutil, 'log' );
  89. const build = tasks.build;
  90. const stream = require( 'stream' );
  91. const files = [
  92. new Vinyl( {
  93. cwd: './',
  94. path: './src/file.js',
  95. contents: new Buffer( code )
  96. } )
  97. ];
  98. // Stub input stream.
  99. sandbox.stub( tasks.src, 'all', () => {
  100. const fakeInputStream = new stream.Readable( { objectMode: true } );
  101. fakeInputStream._read = () => {
  102. fakeInputStream.push( files.pop() || null );
  103. };
  104. return fakeInputStream;
  105. } );
  106. // Stub output stream.
  107. sandbox.stub( utils, 'dist', () => {
  108. const fakeOutputStream = new stream.Writable( { objectMode: true } );
  109. fakeOutputStream._write = ( file, encoding, done ) => {
  110. const result = babel.transform( code, { plugins: [ 'transform-es2015-modules-amd' ] } );
  111. // Check if provided code was transformed by babel.
  112. expect( file.contents.toString() ).to.equal( result.code );
  113. done();
  114. };
  115. return fakeOutputStream;
  116. } );
  117. const conversionStream = build();
  118. conversionStream.on( 'finish', () => done() );
  119. } );
  120. } );
  121. } );