contentnormalizer.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /**
  2. * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
  4. */
  5. import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
  6. import ContentNormalizer from '../src/contentnormalizer';
  7. import { createDataTransfer } from './_utils/utils';
  8. describe( 'ContentNormalizer', () => {
  9. let normalizer, sinonTrigger;
  10. const templateData = {
  11. dataTransfer: createDataTransfer( {
  12. 'text/html': 'test data'
  13. } )
  14. };
  15. testUtils.createSinonSandbox();
  16. beforeEach( () => {
  17. sinonTrigger = sinon.fake.returns( true );
  18. normalizer = new ContentNormalizer( {
  19. activationTrigger: sinonTrigger
  20. } );
  21. } );
  22. describe( 'constructor()', () => {
  23. it( 'should have assigned activation trigger', () => {
  24. expect( normalizer.activationTrigger ).to.be.a( 'function' );
  25. expect( normalizer.activationTrigger ).to.equal( sinonTrigger );
  26. } );
  27. } );
  28. describe( 'transform()', () => {
  29. let data;
  30. beforeEach( () => {
  31. data = Object.assign( {}, templateData );
  32. } );
  33. describe( 'valid data', () => {
  34. it( 'should mark data as transformed', () => {
  35. expect( data.isTransformedWithPasteFromOffice ).to.be.undefined;
  36. normalizer.transform( data );
  37. expect( data.isTransformedWithPasteFromOffice ).to.be.true;
  38. } );
  39. it( 'should call for activation trigger to check input data', () => {
  40. sinon.assert.notCalled( sinonTrigger );
  41. normalizer.transform( data );
  42. sinon.assert.calledOnce( sinonTrigger );
  43. sinon.assert.calledWith( sinonTrigger, 'test data' );
  44. } );
  45. it( 'should execute filters over data', () => {
  46. const filter = sinon.fake();
  47. normalizer.addFilter( filter );
  48. normalizer.transform( data );
  49. sinon.assert.calledOnce( filter );
  50. sinon.assert.calledWith( filter, { data } );
  51. } );
  52. it( 'should not process again already transformed data', () => {
  53. const filter = sinon.fake();
  54. // Filters should not be executed
  55. data.isTransformedWithPasteFromOffice = true;
  56. normalizer.addFilter( filter );
  57. normalizer.transform( data );
  58. sinon.assert.notCalled( filter );
  59. } );
  60. } );
  61. describe( 'invalid data', () => {
  62. let normalizer, sinonTrigger;
  63. beforeEach( () => {
  64. sinonTrigger = sinon.fake.returns( false );
  65. normalizer = new ContentNormalizer( { activationTrigger: sinonTrigger } );
  66. } );
  67. it( 'should not change data content', () => {
  68. normalizer.transform( data );
  69. expect( data.isTransformedWithPasteFromOffice ).to.be.undefined;
  70. expect( data ).to.deep.equal( templateData );
  71. } );
  72. it( 'should not fire any filter', () => {
  73. const filter = sinon.fake();
  74. normalizer.addFilter( filter );
  75. normalizer.transform( data );
  76. expect( normalizer._filters.size ).to.equal( 1 );
  77. sinon.assert.notCalled( filter );
  78. } );
  79. } );
  80. } );
  81. describe( 'addFilter()', () => {
  82. let filter;
  83. beforeEach( () => {
  84. filter = {
  85. exec: () => {}
  86. };
  87. normalizer.addFilter( filter );
  88. } );
  89. it( 'should add filter to fullContentFilters set', () => {
  90. expect( normalizer._filters.size ).to.equal( 1 );
  91. const firstFilter = [ ...normalizer._filters ][ 0 ];
  92. expect( firstFilter ).to.equal( filter );
  93. } );
  94. } );
  95. } );