From 9967f29ca6da1484b1a212dacb7b8fa2a5d05271 Mon Sep 17 00:00:00 2001 From: Tom Byers Date: Wed, 4 Sep 2019 10:28:25 +0100 Subject: [PATCH] Add tests for preventing duplicate form submit --- .../preventDuplicateFormSubmissions.test.js | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 tests/javascripts/preventDuplicateFormSubmissions.test.js diff --git a/tests/javascripts/preventDuplicateFormSubmissions.test.js b/tests/javascripts/preventDuplicateFormSubmissions.test.js new file mode 100644 index 000000000..43ebfbce0 --- /dev/null +++ b/tests/javascripts/preventDuplicateFormSubmissions.test.js @@ -0,0 +1,68 @@ +const helpers = require('./support/helpers.js'); + +beforeAll(() => { + jest.useFakeTimers(); +}); + +afterAll(() => { + require('./support/teardown.js'); +}); + +describe('Prevent duplicate form submissions', () => { + + let form; + let button; + let formSubmitSpy; + + beforeEach(() => { + + // set up DOM + document.body.innerHTML = ` +
+ +
`; + + form = document.querySelector('form'); + button = document.querySelector('button'); + + // requires a helper due to JSDOM not implementing the submit method + formSubmitSpy = helpers.spyOnFormSubmit(jest, form); + + require('../../app/assets/javascripts/preventDuplicateFormSubmissions.js'); + + }); + + afterEach(() => { + + document.body.innerHTML = ''; + + // we run the previewPane.js script every test + // the module cache needs resetting each time for the script to execute + jest.resetModules(); + + formSubmitSpy.mockClear(); + + }); + + test("It should prevent any clicks of the 'submit' button after the first one submitting the form", () => { + + helpers.triggerEvent(button, 'click'); + helpers.triggerEvent(button, 'click'); + + expect(formSubmitSpy.mock.calls.length).toEqual(1); + + }); + + test("It should allow clicks again after 1.5 minutes", () => { + + helpers.triggerEvent(button, 'click'); + + jest.advanceTimersByTime(1500); + + helpers.triggerEvent(button, 'click'); + + expect(formSubmitSpy.mock.calls.length).toEqual(2); + + }); + +});