fileuploader.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /**
  2. * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. /* eslint-env commonjs, browser */
  6. 'use strict';
  7. import FileUploader from '../../src/uploadgateway/fileuploader';
  8. const API_ADDRESS = 'https://example.dev';
  9. const TOKEN = 'token';
  10. const BASE_64_FILE = 'data:image/gif;base64,R0lGODlhCQAJAPIAAGFhYZXK/1FRUf///' +
  11. '9ra2gD/AAAAAAAAACH5BAEAAAUALAAAAAAJAAkAAAMYWFqwru2xERcYJLSNNWNBVimC5wjfaTkJADs=';
  12. describe( 'FileUploader', () => {
  13. let fileUploader;
  14. beforeEach( () => {
  15. fileUploader = new FileUploader( BASE_64_FILE, TOKEN, API_ADDRESS );
  16. } );
  17. describe( 'constructor()', () => {
  18. it( 'should throw error when no fileOrData provided', () => {
  19. expect( () => new FileUploader() ).to.throw( 'File must be provided' );
  20. } );
  21. it( 'should throw error when no token provided', () => {
  22. expect( () => new FileUploader( 'file' ) ).to.throw( 'Token must be provided' );
  23. } );
  24. it( 'should throw error when no api address provided', () => {
  25. expect( () => new FileUploader( 'file', TOKEN ) ).to.throw( 'Api address must be provided' );
  26. } );
  27. it( 'should throw error when wrong Base64 file is provided', () => {
  28. expect( () => new FileUploader( 'data:image/gif;base64,R', TOKEN, API_ADDRESS ) )
  29. .to.throw( 'Problem with decoding Base64 image data.' );
  30. } );
  31. it( 'should convert base64 to file', done => {
  32. const fileReader = new FileReader();
  33. fileReader.readAsDataURL( fileUploader.file );
  34. fileReader.onloadend = () => {
  35. expect( fileReader.result ).to.be.equal( BASE_64_FILE );
  36. done();
  37. };
  38. } );
  39. it( 'should set `file` field', () => {
  40. const file = new File( [], 'test.jpg' );
  41. const fileUploader = new FileUploader( file, TOKEN, API_ADDRESS );
  42. expect( fileUploader.file.name ).to.be.equal( 'test.jpg' );
  43. } );
  44. } );
  45. describe( 'onProgress()', () => {
  46. it( 'should register callback for `progress` event', done => {
  47. fileUploader.onProgress( data => {
  48. expect( data ).to.be.deep.equal( { total: 12345, loaded: 123 } );
  49. done();
  50. } );
  51. fileUploader.fire( 'progress', { total: 12345, loaded: 123 } );
  52. } );
  53. } );
  54. describe( 'onError()', () => {
  55. it( 'should register callback for `error` event', done => {
  56. fileUploader.onError( data => {
  57. expect( data ).to.be.instanceOf( Error );
  58. expect( data.message ).to.be.equal( 'TEST' );
  59. done();
  60. } );
  61. fileUploader.fire( 'error', new Error( 'TEST' ) );
  62. } );
  63. it( 'should call registered callback for `error` event once', () => {
  64. const spy = sinon.spy();
  65. fileUploader.onError( spy );
  66. fileUploader.fire( 'error', new Error( 'TEST' ) );
  67. fileUploader.fire( 'error', new Error( 'TEST' ) );
  68. sinon.assert.calledOnce( spy );
  69. } );
  70. } );
  71. describe( 'send()', () => {
  72. let request;
  73. beforeEach( () => {
  74. global.xhr = sinon.useFakeXMLHttpRequest();
  75. global.xhr.onCreate = xhr => {
  76. request = xhr;
  77. };
  78. } );
  79. afterEach( () => global.xhr.restore() );
  80. it( 'should sent request with correct data (url, method, type, headers)', done => {
  81. fileUploader
  82. .send()
  83. .then( () => {
  84. expect( request.url ).to.be.equal( API_ADDRESS );
  85. expect( request.method ).to.be.equal( 'POST' );
  86. expect( request.responseType ).to.be.equal( 'json' );
  87. expect( request.requestHeaders ).to.be.deep.equal( { Authorization: 'token' } );
  88. done();
  89. } );
  90. request.respond( 200, { 'Content-Type': 'application/json' },
  91. JSON.stringify( { 'default': 'https://test.dev' } )
  92. );
  93. } );
  94. it( 'should fire `error` event with error message when response is failed', done => {
  95. fileUploader
  96. .onError( error => {
  97. expect( error ).to.be.equal( 'Message' );
  98. done();
  99. } )
  100. .send();
  101. request.respond( 400, { 'Content-Type': 'application/json' },
  102. JSON.stringify( {
  103. error: 'Error',
  104. message: 'Message'
  105. } )
  106. );
  107. } );
  108. it( 'should fire `error` event with error when response is failed', done => {
  109. fileUploader
  110. .onError( error => {
  111. expect( error ).to.be.equal( 'Error' );
  112. done();
  113. } )
  114. .send();
  115. request.respond( 400, { 'Content-Type': 'application/json' },
  116. JSON.stringify( {
  117. error: 'Error'
  118. } )
  119. );
  120. } );
  121. it( 'should fire `error` event when response is aborted', done => {
  122. fileUploader
  123. .onError( error => {
  124. expect( error ).to.be.equal( 'Abort' );
  125. done();
  126. } )
  127. .send();
  128. request.abort();
  129. } );
  130. it( 'should fire `error` event when network error occurs', done => {
  131. fileUploader
  132. .onError( error => {
  133. expect( error ).to.be.equal( 'Network Error' );
  134. done();
  135. } )
  136. .send();
  137. request.error();
  138. } );
  139. it( 'should fire `progress` event', done => {
  140. fileUploader
  141. .onProgress( data => {
  142. expect( data.total ).to.be.equal( 1 );
  143. expect( data.uploaded ).to.be.equal( 10 );
  144. done();
  145. } )
  146. .send();
  147. request.uploadProgress( { total: 1, loaded: 10 } );
  148. request.respond( 200 );
  149. } );
  150. } );
  151. describe( 'abort()', () => {
  152. let request;
  153. beforeEach( () => {
  154. global.xhr = sinon.useFakeXMLHttpRequest();
  155. global.xhr.onCreate = xhr => {
  156. request = xhr;
  157. };
  158. } );
  159. afterEach( () => global.xhr.restore() );
  160. it( 'should abort xhr request', () => {
  161. fileUploader.send();
  162. fileUploader.abort();
  163. expect( request.aborted ).to.be.true;
  164. } );
  165. } );
  166. } );