2019-12-31 16:49:52 +00:00
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 < / h 2 >
2020-02-24 11:56:38 +00:00
< a class = "govuk_link cookie-settings__prev-page" href = "#" data - module = "track-click" data - track - category = "cookieSettings" data - track - action = "Back to previous page" >
2019-12-31 16:49:52 +00:00
Go back to the page you were looking at
< / a >
< / d i v >
< h1 class = "heading-large" > Cookies < / h 1 >
< 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 ? < / h 2 >
< 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 < / l i >
< li > turning on Javascript in your browser < / l i >
< / u l >
< / d i v >
< h2 class = "heading-medium" > Analytics cookies ( optional ) < / h 2 >
< 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 ?
< / l e g e n d >
< 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
< / l a b e l >
< / d i v >
< 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
< / l a b e l >
< / d i v >
< / d i v >
< / f i e l d s e t >
< / d i v >
< button class = "govuk-button" type = "submit" > Save cookie settings < / b u t t o n >
< / f o r m >
< / d i v > ` ;
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 ( ) ;
2020-02-20 11:03:03 +00:00
// the first 5 calls are configuration
expect ( window . ga . mock . calls [ 5 ] ) . toEqual ( [ 'send' , 'pageview' , '/privacy' ] ) ;
2019-12-31 16:49:52 +00:00
} ) ;
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 ( ) ;
} ) ;
} ) ;
} ) ;
} ) ;