mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-06-26 02:11:49 -04:00
The `<textarea>` should have its existing `aria-describedby` point to a hint. Pointing to the label is bad practice as it would duplicate the accessible name into the accessible description. It’s good not to have that in the tests in case anyone copies the code elsewhere.
166 lines
4.1 KiB
JavaScript
166 lines
4.1 KiB
JavaScript
const each = require('jest-each').default;
|
|
const jestDateMock = require('jest-date-mock');
|
|
|
|
const helpers = require('./support/helpers.js');
|
|
|
|
const serviceNumber = '6658542f-0cad-491f-bec8-ab8457700ead';
|
|
const updatesURL = `/services/${serviceNumber}/templates/count-sms-length`;
|
|
|
|
let responseObj = {};
|
|
let jqueryAJAXReturnObj;
|
|
|
|
beforeAll(() => {
|
|
|
|
// ensure all timers go through Jest
|
|
jest.useFakeTimers();
|
|
|
|
// mock the bits of jQuery used
|
|
jest.spyOn(window.$, 'ajax');
|
|
|
|
// set up the object returned from $.ajax so it responds with whatever responseObj is set to
|
|
jqueryAJAXReturnObj = {
|
|
done: callback => {
|
|
// For these tests the server responds immediately
|
|
callback(responseObj);
|
|
return jqueryAJAXReturnObj;
|
|
},
|
|
fail: () => {}
|
|
};
|
|
|
|
$.ajax.mockImplementation(() => jqueryAJAXReturnObj);
|
|
|
|
require('../../app/assets/javascripts/updateStatus.js');
|
|
|
|
});
|
|
|
|
afterAll(() => {
|
|
require('./support/teardown.js');
|
|
});
|
|
|
|
describe('Update content', () => {
|
|
|
|
beforeEach(() => {
|
|
|
|
document.body.innerHTML = `
|
|
<form>
|
|
<input type="hidden" name="csrf_token" value="abc123" />
|
|
<label for="template_content" id="template-content-label">Template content<label>
|
|
<span id="example-hint-text">Example hint text</span>
|
|
<textarea name="template_content" id="template_content" aria-described-by="example-hint-text">Content of message</textarea>
|
|
</form>
|
|
<div data-module="update-status" data-updates-url="${updatesURL}" data-target="template_content">
|
|
Initial content
|
|
</div>
|
|
`;
|
|
|
|
});
|
|
|
|
afterEach(() => {
|
|
|
|
document.body.innerHTML = '';
|
|
|
|
// tidy up record of mocked AJAX calls
|
|
$.ajax.mockClear();
|
|
|
|
// ensure any timers set by continually starting the module are cleared
|
|
jest.clearAllTimers();
|
|
|
|
});
|
|
|
|
test("It should add attributes to the elements", () => {
|
|
|
|
window.GOVUK.modules.start();
|
|
|
|
expect(
|
|
document.querySelectorAll('[data-module=update-status]')[0].id
|
|
).toEqual(
|
|
"update-status"
|
|
);
|
|
|
|
expect(
|
|
document.getElementById('template_content').getAttribute('aria-described-by')
|
|
).toEqual(
|
|
"example-hint-text update-status"
|
|
);
|
|
|
|
});
|
|
|
|
test("It should make requests to the URL specified in the data-updates-url attribute", () => {
|
|
|
|
window.GOVUK.modules.start();
|
|
|
|
expect($.ajax.mock.calls[0][0]).toEqual(updatesURL);
|
|
expect($.ajax.mock.calls[0]).toEqual([
|
|
updatesURL,
|
|
{
|
|
"data": "csrf_token=abc123&template_content=Content%20of%20message",
|
|
"method": "post"
|
|
}
|
|
]);
|
|
|
|
});
|
|
|
|
test("It should replace the content of the div with the returned HTML", () => {
|
|
|
|
responseObj = {'html': 'Updated content'}
|
|
|
|
expect(
|
|
document.querySelectorAll('[data-module=update-status]')[0].textContent.trim()
|
|
).toEqual(
|
|
"Initial content"
|
|
);
|
|
|
|
window.GOVUK.modules.start();
|
|
|
|
expect(
|
|
document.querySelectorAll('[data-module=update-status]')[0].textContent.trim()
|
|
).toEqual(
|
|
"Updated content"
|
|
);
|
|
|
|
});
|
|
|
|
test("It should fire when the content of the textarea changes", () => {
|
|
|
|
let textarea = document.getElementById('template_content');
|
|
|
|
// Initial update triggered
|
|
window.GOVUK.modules.start();
|
|
expect($.ajax.mock.calls.length).toEqual(1);
|
|
|
|
// 150ms of inactivity
|
|
jest.advanceTimersByTime(150);
|
|
helpers.triggerEvent(textarea, 'input');
|
|
|
|
expect($.ajax.mock.calls.length).toEqual(2);
|
|
|
|
});
|
|
|
|
test("It should fire only after 150ms of inactivity", () => {
|
|
|
|
let textarea = document.getElementById('template_content');
|
|
|
|
// Initial update triggered
|
|
window.GOVUK.modules.start();
|
|
expect($.ajax.mock.calls.length).toEqual(1);
|
|
|
|
helpers.triggerEvent(textarea, 'input');
|
|
jest.advanceTimersByTime(149);
|
|
expect($.ajax.mock.calls.length).toEqual(1);
|
|
|
|
helpers.triggerEvent(textarea, 'input');
|
|
jest.advanceTimersByTime(149);
|
|
expect($.ajax.mock.calls.length).toEqual(1);
|
|
|
|
helpers.triggerEvent(textarea, 'input');
|
|
jest.advanceTimersByTime(149);
|
|
expect($.ajax.mock.calls.length).toEqual(1);
|
|
|
|
// > 150ms of inactivity
|
|
jest.advanceTimersByTime(1);
|
|
expect($.ajax.mock.calls.length).toEqual(2);
|
|
|
|
});
|
|
|
|
});
|