From be180c7dccb0688cc28d84bb2976a2c0e9b8170c Mon Sep 17 00:00:00 2001 From: Himanshu Kapoor <hkapoor@gitlab.com> Date: Thu, 11 Jun 2020 21:30:25 +0530 Subject: [PATCH] Migrate dropzone_input_spec.js to Jest --- package.json | 1 + .../dropzone_input_spec.js | 66 ++++++++----------- yarn.lock | 28 ++++++++ 3 files changed, 56 insertions(+), 39 deletions(-) rename spec/{javascripts => frontend}/dropzone_input_spec.js (56%) diff --git a/package.json b/package.json index 6aa3f132f0cd1..8e3e6d2b42302 100644 --- a/package.json +++ b/package.json @@ -210,6 +210,7 @@ "timezone-mock": "^1.0.8", "vue-jest": "^4.0.0-beta.2", "webpack-dev-server": "^3.10.3", + "xhr-mock": "^2.5.1", "yarn-check-webpack-plugin": "^1.2.0", "yarn-deduplicate": "^1.1.1" }, diff --git a/spec/javascripts/dropzone_input_spec.js b/spec/frontend/dropzone_input_spec.js similarity index 56% rename from spec/javascripts/dropzone_input_spec.js rename to spec/frontend/dropzone_input_spec.js index 6f6f20ccca258..688b9164e5f4e 100644 --- a/spec/javascripts/dropzone_input_spec.js +++ b/spec/frontend/dropzone_input_spec.js @@ -1,7 +1,9 @@ import $ from 'jquery'; +import mock from 'xhr-mock'; import { TEST_HOST } from 'spec/test_constants'; import dropzoneInput from '~/dropzone_input'; import PasteMarkdownTable from '~/behaviors/markdown/paste_markdown_table'; +import waitForPromises from 'helpers/wait_for_promises'; const TEST_FILE = new File([], 'somefile.jpg'); TEST_FILE.upload = {}; @@ -38,14 +40,16 @@ describe('dropzone_input', () => { it('pastes Markdown tables', () => { const event = $.Event('paste'); const origEvent = new Event('paste'); - const pasteData = new DataTransfer(); - pasteData.setData('text/plain', 'Hello World'); - pasteData.setData('text/html', '<table><tr><td>Hello World</td></tr></table>'); - origEvent.clipboardData = pasteData; + + origEvent.clipboardData = { + types: ['text/plain', 'text/html'], + getData: () => '<table><tr><td>Hello World</td></tr></table>', + items: [], + }; event.originalEvent = origEvent; - spyOn(PasteMarkdownTable.prototype, 'isTable').and.callThrough(); - spyOn(PasteMarkdownTable.prototype, 'convertToTableMarkdown').and.callThrough(); + jest.spyOn(PasteMarkdownTable.prototype, 'isTable'); + jest.spyOn(PasteMarkdownTable.prototype, 'convertToTableMarkdown'); $('.js-gfm-input').trigger(event); @@ -57,53 +61,37 @@ describe('dropzone_input', () => { describe('shows error message', () => { let form; let dropzone; - let xhr; - let oldXMLHttpRequest; beforeEach(() => { + mock.setup(); + form = $(TEMPLATE); dropzone = dropzoneInput(form); - - xhr = jasmine.createSpyObj(Object.keys(XMLHttpRequest.prototype)); - oldXMLHttpRequest = window.XMLHttpRequest; - window.XMLHttpRequest = () => xhr; }); afterEach(() => { - window.XMLHttpRequest = oldXMLHttpRequest; + mock.teardown(); }); - it('when AJAX fails with json', () => { - xhr = { - ...xhr, - statusCode: 400, - readyState: 4, - responseText: JSON.stringify({ message: TEST_ERROR_MESSAGE }), - getResponseHeader: () => 'application/json', - }; - - dropzone.processFile(TEST_FILE); - - xhr.onload(); - - expect(form.find('.uploading-error-message').text()).toEqual(TEST_ERROR_MESSAGE); - }); + beforeEach(() => {}); - it('when AJAX fails with text', () => { - xhr = { - ...xhr, - statusCode: 400, - readyState: 4, - responseText: TEST_ERROR_MESSAGE, - getResponseHeader: () => 'text/plain', - }; + it.each` + responseType | responseBody + ${'application/json'} | ${JSON.stringify({ message: TEST_ERROR_MESSAGE })} + ${'text/plain'} | ${TEST_ERROR_MESSAGE} + `('when AJAX fails with json', ({ responseType, responseBody }) => { + mock.post(TEST_UPLOAD_PATH, { + status: 400, + body: responseBody, + headers: { 'Content-Type': responseType }, + }); dropzone.processFile(TEST_FILE); - xhr.onload(); - - expect(form.find('.uploading-error-message').text()).toEqual(TEST_ERROR_MESSAGE); + return waitForPromises().then(() => { + expect(form.find('.uploading-error-message').text()).toEqual(TEST_ERROR_MESSAGE); + }); }); }); }); diff --git a/yarn.lock b/yarn.lock index cdb7e5179709b..71b002874c188 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3959,6 +3959,11 @@ dom-serializer@0, dom-serializer@^0.2.1: domelementtype "^2.0.1" entities "^2.0.0" +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + domain-browser@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" @@ -5300,6 +5305,14 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" +global@^4.3.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -7851,6 +7864,13 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + minify@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/minify/-/minify-4.1.2.tgz#88755f4faa5f7ab6d0c64fdd659aa34ea658f180" @@ -12237,6 +12257,14 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xhr-mock@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/xhr-mock/-/xhr-mock-2.5.1.tgz#c591498a8269cc1ce5fefac20d590357affd348b" + integrity sha512-UKOjItqjFgPUwQGPmRAzNBn8eTfIhcGjBVGvKYAWxUQPQsXNGD6KEckGTiHwyaAUp9C9igQlnN1Mp79KWCg7CQ== + dependencies: + global "^4.3.0" + url "^0.11.0" + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" -- GitLab