Cookie streamlining (#493)

* remove cookie banner
* remove form from cookies.html
* move cookie content to privacy page
This commit is contained in:
Steven Reilly
2023-05-03 15:33:27 -04:00
committed by GitHub
parent b9c78eeb43
commit 454b778582
16 changed files with 101 additions and 928 deletions

View File

@@ -1,263 +0,0 @@
const helpers = require('./support/helpers');
beforeAll(() => {
require('../../app/assets/javascripts/govuk/cookie-functions.js');
require('../../app/assets/javascripts/analytics/analytics.js');
require('../../app/assets/javascripts/analytics/init.js');
require('../../app/assets/javascripts/cookieMessage.js');
});
afterAll(() => {
require('./support/teardown.js');
});
describe("Cookie message", () => {
let cookieMessage;
beforeAll(() => {
const cookieMessageStyles = document.createElement('style');
// add the CSS that hides the cookie message by default
cookieMessageStyles.textContent = '.notify-cookie-banner { display: none; }';
document.getElementsByTagName('head')[0].appendChild(cookieMessageStyles);
// protect against any previous tests setting a cookies-policy cookie
helpers.deleteCookie('cookies_policy');
});
beforeEach(() => {
// add the script GA looks for in the document
document.body.appendChild(document.createElement('script'));
jest.spyOn(window.GOVUK, 'initAnalytics');
cookieMessage = `
<div id="global-cookie-message" class="notify-cookie-banner" data-module="cookie-banner" role="region" aria-label="cookie banner" data-nosnippet="">
<div class="notify-cookie-banner__wrapper govuk-width-container govuk-!-padding-4">
<h2 class="notify-cookie-banner__heading govuk-heading-m">Cookies on GOV.UK Notify</h2>
<p class="notify-cookie-banner__message govuk-body">We use <a class="govuk-link govuk-link--no-visited-state" href="/cookies">small files called cookies</a> to make GOV.UK Notify work.</p>
<div class="notify-cookie-banner__buttons notify-cookie-banner__no-js">
<div class="notify-cookie-banner__button">
<a href="/cookies" class="govuk-button notify-cookie-banner-button--inline" role="button" data-accept-cookies="true">Set cookie preferences</a>
</div>
</div>
<div class="notify-cookie-banner__with-js">
<p class="notify-cookie-banner__message govuk-body">We'd also like to use analytics cookies to help us improve our service.</p>
<p class="notify-cookie-banner__message govuk-body">Please let us know if this is OK.</p>
<div class="notify-cookie-banner__buttons">
<div class="notify-cookie-banner__button notify-cookie-banner__button-accept">
<button class="govuk-button notify-cookie-banner-button--secondary notify-cookie-banner-button--inline" type="submit" data-accept-cookies="true">Yes, I accept analytics cookies</button>
</div>
<div class="notify-cookie-banner__button notify-cookie-banner__button-reject">
<button class="govuk-button notify-cookie-banner-button--secondary notify-cookie-banner-button--inline" type="submit" data-accept-cookies="false">No, do not use analytics cookies</button>
</div>
</div>
</div>
</div>
<div class="notify-cookie-banner__confirmation govuk-width-container" tabindex="-1">
<p class="notify-cookie-banner__confirmation-message govuk-body">
You can <a class="govuk-link govuk-link--no-visited-state" href="/cookies">change your cookie settings</a> at any time.
</p>
<button class="notify-cookie-banner__hide-button" data-hide-cookie-banner="true">Hide</button>
</div>
</div>`;
document.body.innerHTML += cookieMessage;
});
afterEach(() => {
document.body.innerHTML = '';
// remove cookie set by tests
helpers.deleteCookie('cookies_policy');
// reset spies
window.GOVUK.initAnalytics.mockClear();
// remove analytics tracker
delete window.GOVUK.analytics;
// reset global variable to state when init.js loaded
window['ga-disable-UA-26179049-1'] = true;
});
/*
Note: If no JS, the cookie banner is hidden.
This works through CSS, based on the presence of the `js-enabled` class on the <body> so is not tested here.
*/
describe("The `clearOldCookies` method", () => {
test("Will clear the seen_cookie_message cookie if it still exists", () => {
// seen_cookie_message was set on the www domain, which setCookie defaults to
helpers.setCookie('seen_cookie_message', 'true', { 'days': 365 });
window.GOVUK.Modules.CookieBanner.clearOldCookies({ "analytics": false });
expect(window.GOVUK.cookie('seen_cookie_message')).toBeNull();
});
test("Will clear any existing Google Analytics cookies if consent is not set", () => {
// GA cookies are set on the root domain
helpers.setCookie('_ga', 'GA1.1.123.123', { 'days': 365, 'domain': '.notifications.service.gov.uk' });
helpers.setCookie('_gid', 'GA1.1.456.456', { 'days': 1, 'domain': '.notifications.service.gov.uk' });
window.GOVUK.Modules.CookieBanner.clearOldCookies(null);
expect(window.GOVUK.cookie('_ga')).toBeNull();
expect(window.GOVUK.cookie('_gid')).toBeNull();
});
test("Will leave any existing Google Analytics cookies if consent is set", () => {
helpers.setCookie('_ga', 'GA1.1.123.123', { 'days': 365 });
helpers.setCookie('_gid', 'GA1.1.456.456', { 'days': 1 });
window.GOVUK.Modules.CookieBanner.clearOldCookies({ "analytics": true });
expect(window.GOVUK.cookie('_ga')).not.toBeNull();
expect(window.GOVUK.cookie('_gid')).not.toBeNull();
});
});
test("If user has made a choice to give their consent or not, the cookie banner should be hidden", () => {
window.GOVUK.setConsentCookie({ 'analytics': false });
window.GOVUK.modules.start()
expect(helpers.element(document.querySelector('.notify-cookie-banner')).is('hidden')).toBe(true);
});
describe("If user hasn't made a choice to give their consent or not", () => {
beforeEach(() => {
window.GOVUK.modules.start();
});
test("The cookie banner should show", () => {
const banner = helpers.element(document.querySelector('.notify-cookie-banner'));
expect(banner.is('hidden')).toBe(false);
});
test("No analytics should run", () => {
expect(window.GOVUK.initAnalytics).not.toHaveBeenCalled();
});
describe("If the user clicks the button to accept analytics", () => {
beforeEach(() => {
const acceptButton = document.querySelector('.notify-cookie-banner__button-accept button');
helpers.triggerEvent(acceptButton, 'click');
});
test("the banner should confirm your choice and link to the cookies page as a way to change your mind", () => {
confirmation = helpers.element(document.querySelector('.notify-cookie-banner__confirmation'));
expect(confirmation.is('hidden')).toBe(false);
expect(confirmation.el.textContent.trim()).toEqual(expect.stringMatching(/^Youve accepted analytics cookies/));
});
test("If the user clicks the 'hide' button, the banner should be hidden", () => {
const hideButton = document.querySelector('.notify-cookie-banner__hide-button');
const banner = helpers.element(document.querySelector('.notify-cookie-banner'));
helpers.triggerEvent(hideButton, 'click');
expect(banner.is('hidden')).toBe(true);
});
test("The consent cookie should be set, with analytics set to 'true'", () => {
expect(window.GOVUK.getConsentCookie()).toEqual({ 'analytics': true });
});
test("The analytics should be set up", () => {
expect(window.GOVUK.analytics).toBeDefined();
});
});
describe("If the user clicks the button to reject analytics", () => {
beforeEach(() => {
const rejectButton = document.querySelector('.notify-cookie-banner__button-reject button');
helpers.triggerEvent(rejectButton, 'click');
});
test("the banner should confirm your choice and link to the cookies page as a way to change your mind", () => {
confirmation = helpers.element(document.querySelector('.notify-cookie-banner__confirmation'));
expect(confirmation.is('hidden')).toBe(false);
expect(confirmation.el.textContent.trim()).toEqual(expect.stringMatching(/^You told us not to use analytics cookies/));
});
test("If the user clicks the 'hide' button, the banner should be hidden", () => {
const hideButton = document.querySelector('.notify-cookie-banner__hide-button');
const banner = helpers.element(document.querySelector('.notify-cookie-banner'));
helpers.triggerEvent(hideButton, 'click');
expect(banner.is('hidden')).toBe(true);
});
test("The consent cookie should be set, with analytics set to 'false'", () => {
expect(window.GOVUK.getConsentCookie()).toEqual({ 'analytics': false });
});
test("The analytics should not be set up", () => {
expect(window.GOVUK.analytics).not.toBeDefined();
});
});
});
});

View File

@@ -1,255 +0,0 @@
const helpers = require('./support/helpers');
beforeAll(() => {
require('../../app/assets/javascripts/govuk/cookie-functions.js');
require('../../app/assets/javascripts/consent.js');
require('../../app/assets/javascripts/analytics/analytics.js');
require('../../app/assets/javascripts/analytics/init.js');
require('../../app/assets/javascripts/cookieSettings.js');
});
afterAll(() => {
require('./support/teardown.js');
});
describe("Cookie settings", () => {
let cookiesPageContent;
let yesRadio;
let noRadio;
let saveButton;
beforeEach(() => {
// add the script GA looks for in the document
document.body.appendChild(document.createElement('script'));
window.ga = jest.fn();
jest.spyOn(window.GOVUK, 'initAnalytics');
cookiesPageContent = `
<div class="cookie-settings__confirmation banner banner-with-tick" data-cookie-confirmation="true" role="group" tabindex="-1">
<h2 class="banner-title">Your cookie settings were saved</h2>
<a class="govuk_link govuk_link--no-visited-state cookie-settings__prev-page" href="#" data-module="track-click" data-track-category="cookieSettings" data-track-action="Back to previous page">
Go back to the page you were looking at
</a>
</div>
<h1 class="heading-large">Cookies</h1>
<p class="summary">
Cookies are small files saved on your phone, tablet or computer when you visit a website.
</p>
<p>We use cookies to make GOV.UK Notify work and collect information about how you use our service.</p>
<div class="cookie-settings__no-js">
<h2 class="govuk-heading-s govuk-!-margin-top-6">Do you want to accept analytics cookies?</h2>
<p>We use Javascript to set most of our cookies. Unfortunately Javascript is not running on your browser, so you cannot change your settings. You can try:</p>
<ul class="govuk-list govuk-list--bullet">
<li>reloading the page</li>
<li>turning on Javascript in your browser</li>
</ul>
</div>
<h2 class="heading-medium">Analytics cookies (optional)</h2>
<div class="cookie-settings__form-wrapper">
<form data-module="cookie-settings">
<div class="govuk-form-group govuk-!-margin-top-6">
<fieldset class="govuk-fieldset" aria-describedby="changed-name-hint">
<legend class="govuk-fieldset__legend govuk-fieldset__legend--s">
Do you want to accept analytics cookies?
</legend>
<div class="govuk-radios govuk-radios--inline">
<div class="govuk-radios__item">
<input class="govuk-radios__input" id="cookies-analytics-yes" name="cookies-analytics" type="radio" value="on">
<label class="govuk-label govuk-radios__label" for="cookies-analytics-yes">
Yes
</label>
</div>
<div class="govuk-radios__item">
<input class="govuk-radios__input" id="cookies-analytics-no" name="cookies-analytics" type="radio" value="off">
<label class="govuk-label govuk-radios__label" for="cookies-analytics-no">
No
</label>
</div>
</div>
</fieldset>
</div>
<button class="govuk-button" type="submit">Save cookie settings</button>
</form>
</div>`;
document.body.innerHTML += cookiesPageContent;
yesRadio = document.querySelector('#cookies-analytics-yes');
noRadio = document.querySelector('#cookies-analytics-no');
saveButton = document.querySelector('.govuk-button');
});
afterEach(() => {
document.body.innerHTML = '';
// remove cookie set by tests
helpers.deleteCookie('cookies_policy');
// reset spies
window.ga.mockClear();
window.GOVUK.initAnalytics.mockClear();
// remove analytics tracker
delete window.GOVUK.analytics;
// reset global variable to state when init.js loaded
window['ga-disable-UA-26179049-1'] = true;
});
/*
Note: If no JS, the cookies page contains content to explain why JS is required to set analytics cookies.
This is hidden if JS is available when the page loads.
The message displayed to confirm any selection made is also in the page but hidden on load.
Both of these work through CSS, based on the presence of the `js-enabled` class on the <body> so are not tested here.
*/
describe("When the page loads", () => {
test("If user has not chosen to accept or reject analytics, the radios for making that choice should be set to unchecked", () => {
window.GOVUK.modules.start();
expect(yesRadio.checked).toBe(false);
expect(noRadio.checked).toBe(false);
});
test("If analytics are accepted, the radio for 'accept analytics' should be set to checked", () => {
window.GOVUK.setConsentCookie({ 'analytics': true });
window.GOVUK.modules.start();
expect(yesRadio.checked).toBe(true);
expect(noRadio.checked).toBe(false);
});
test("If analytics are rejected, the radio for 'reject analytics' should be set to checked", () => {
window.GOVUK.setConsentCookie({ 'analytics': false });
window.GOVUK.modules.start();
expect(yesRadio.checked).toBe(false);
expect(noRadio.checked).toBe(true);
});
});
describe("When the 'Save cookie settings' button is clicked", () => {
beforeEach(() => {
window.GOVUK.modules.start();
});
test("If no selection is made, set consent to reject analytics", () => {
helpers.triggerEvent(saveButton, 'click');
expect(window.GOVUK.getConsentCookie()).toEqual({ 'analytics': false });
});
test("If a selection is made, save this as consent", () => {
yesRadio.checked = true;
helpers.triggerEvent(saveButton, 'click');
expect(window.GOVUK.getConsentCookie()).toEqual({ 'analytics': true });
});
describe("The message confirming your choice", () => {
let confirmationMessage;
beforeEach(() => {
confirmationMessage = document.querySelector('.cookie-settings__confirmation');
helpers.triggerEvent(saveButton, 'click');
});
test("Should be shown when the 'Save cookie settings' button is clicked", () => {
expect(helpers.element(confirmationMessage).is('hidden')).toBe(false);
});
test("Should include a link to the last page visited, if information on the referrer is available", () => {
jest.spyOn(document, 'referrer', 'get').mockReturnValue('https://notifications.service.gov.uk/privacy');
helpers.triggerEvent(saveButton, 'click');
expect(confirmationMessage.querySelector('.cookie-settings__prev-page').getAttribute('href')).toEqual('/privacy');
});
});
describe("Analytics code", () => {
beforeAll(() => {
jest.spyOn(window, 'location', 'get').mockImplementation(() => {
return {
'pathname': '/privacy',
'search': ''
}
});
});
test("if user accepted analytics, the analytics code should initialise and register a pageview", () => {
window.GOVUK.modules.start();
yesRadio.checked = true;
helpers.triggerEvent(saveButton, 'click');
expect(window.GOVUK.initAnalytics).toHaveBeenCalled();
expect(window.ga).toHaveBeenCalled();
// the first 5 calls are configuration
expect(window.ga.mock.calls[5]).toEqual(['send', 'pageview', '/privacy']);
});
test("if user rejected analytics, the analytics code should not run", () => {
window.GOVUK.modules.start();
noRadio.checked = true;
helpers.triggerEvent(saveButton, 'click');
expect(window.GOVUK.initAnalytics).not.toHaveBeenCalled();
});
});
});
});