@defra-fish/gafl-webapp-service 1.22.0-rc.9 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/package.json +4 -5
  2. package/src/__tests__/server-fetch-public.js +3 -1
  3. package/src/__tests__/server-test-sanitize.js +1 -1
  4. package/src/__tests__/server.telesales.spec.js +10 -5
  5. package/src/handlers/__tests__/agreed-handler-happy-path.spec.js +3 -1
  6. package/src/handlers/__tests__/agreed-handler-payment-failure.spec.js +1 -1
  7. package/src/handlers/__tests__/agreed-handler-sales-api-failure.spec.js +1 -1
  8. package/src/handlers/__tests__/attribution-handler.spec.js +35 -37
  9. package/src/handlers/__tests__/url-handler.spec.js +79 -0
  10. package/src/handlers/attribution-handler.js +3 -2
  11. package/src/handlers/url-handler.js +21 -0
  12. package/src/locales/cy.json +97 -98
  13. package/src/locales/en.json +55 -56
  14. package/src/pages/concessions/date-of-birth/__tests__/update-transaction.spec.js +0 -16
  15. package/src/pages/concessions/date-of-birth/update-transaction.js +0 -15
  16. package/src/pages/contact/address/entry/__tests__/address-entry.spec.js +1 -1
  17. package/src/pages/contact/address/lookup/__tests__/address-lookup.spec.js +1 -1
  18. package/src/pages/contact/address/select/__tests__/address-select.spec.js +1 -1
  19. package/src/pages/contact/digital-licence/licence-fulfilment/__tests__/licence-fulfilment.spec.js +1 -1
  20. package/src/pages/contact/digital-licence/licence-fulfilment/licence-fulfilment.njk +1 -1
  21. package/src/pages/contact/newsletter/__tests__/newsletter.spec.js +1 -1
  22. package/src/pages/guidance/privacy-policy.njk +4 -0
  23. package/src/pages/licence-details/licence-length/__tests__/licence-length.spec.js +1 -1
  24. package/src/pages/licence-details/licence-length/licence-length.njk +3 -1
  25. package/src/pages/licence-details/licence-start-time/__tests__/licence-start-time.spec.js +1 -1
  26. package/src/pages/licence-details/licence-start-time/__tests__/route.spec.js +22 -25
  27. package/src/pages/licence-details/licence-start-time/licence-start-time.njk +1 -1
  28. package/src/pages/licence-details/licence-start-time/route.js +7 -2
  29. package/src/pages/licence-details/licence-to-start/licence-to-start.njk +1 -0
  30. package/src/pages/licence-details/licence-type/__tests__/licence-type.spec.js +1 -1
  31. package/src/pages/licence-details/licence-type/licence-type.njk +3 -3
  32. package/src/pages/licence-details/no-licence-required/__tests__/no-licence-required.spec.js +1 -1
  33. package/src/pages/order-complete/licence-details/licence-details.njk +1 -5
  34. package/src/pages/order-complete/order-complete/__tests__/order-complete.spec.js +1 -1
  35. package/src/pages/order-complete/order-complete/order-complete.njk +11 -31
  36. package/src/pages/payment/cancelled/__tests__/cancelled-spec.js +1 -1
  37. package/src/pages/payment/failed/__tests__/failed-spec.js +1 -1
  38. package/src/pages/renewals/identify/__tests__/identity.spec.js +1 -1
  39. package/src/pages/renewals/renewal-start-date/__tests__/renewal-start-date.spec.js +1 -1
  40. package/src/processors/__tests__/pricing-summary.spec.js +1 -1
  41. package/src/processors/__tests__/renewals-write-cache.spec.js +0 -1
  42. package/src/routes/__tests__/add-permission-route.spec.js +1 -1
  43. package/src/routes/__tests__/back-links.spec.js +2 -2
  44. package/src/routes/__tests__/misc-routes.spec.js +1 -1
  45. package/src/routes/__tests__/new-transaction-route.spec.js +1 -1
  46. package/src/routes/journey-definition.js +1 -1
  47. package/src/routes/misc-routes.js +8 -10
  48. package/src/server.js +7 -7
  49. package/src/session-cache/__tests__/cache-manager.spec.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defra-fish/gafl-webapp-service",
3
- "version": "1.22.0-rc.9",
3
+ "version": "1.22.0",
4
4
  "description": "The websales frontend for the GAFL service",
5
5
  "type": "module",
6
6
  "engines": {
@@ -36,8 +36,8 @@
36
36
  "prepare": "gulp --gulpfile build/gulpfile.cjs"
37
37
  },
38
38
  "dependencies": {
39
- "@defra-fish/business-rules-lib": "1.22.0-rc.9",
40
- "@defra-fish/connectors-lib": "1.22.0-rc.9",
39
+ "@defra-fish/business-rules-lib": "1.22.0",
40
+ "@defra-fish/connectors-lib": "1.22.0",
41
41
  "@defra/hapi-gapi": "^1.1.0",
42
42
  "@hapi/boom": "^9.1.2",
43
43
  "@hapi/catbox-redis": "^6.0.2",
@@ -75,6 +75,5 @@
75
75
  "gulp-sass": "^4.1.0",
76
76
  "gulp-sourcemaps": "^3.0.0",
77
77
  "node-sass": "^6.0.0"
78
- },
79
- "gitHead": "a63ab0465b3594f7f980ccfadec08d815d166754"
78
+ }
80
79
  }
@@ -2,7 +2,9 @@ import { start, stop, initialize, injectWithoutSessionCookie } from '../__mocks_
2
2
 
3
3
  beforeAll(() => new Promise(resolve => start(resolve)))
4
4
  beforeAll(() => new Promise(resolve => initialize(resolve)))
5
- afterAll(done => { stop(done) })
5
+ afterAll(done => {
6
+ stop(done)
7
+ })
6
8
 
7
9
  describe('Where the server is started', () => {
8
10
  it('serve public resources without the session cookie', async () => {
@@ -16,7 +16,7 @@ beforeAll(() => {
16
16
  })
17
17
  })
18
18
 
19
- afterAll((d) => stop(d))
19
+ afterAll(d => stop(d))
20
20
 
21
21
  describe('That the server', () => {
22
22
  it('sanitizes user input', async () => {
@@ -4,13 +4,18 @@ import { LICENCE_LENGTH } from '../uri.js'
4
4
 
5
5
  jest.mock('../handlers/oidc-handler.js')
6
6
 
7
- beforeAll(() => new Promise(resolve => {
8
- process.env.CHANNEL = 'telesales'
9
- start(resolve)
10
- }))
7
+ beforeAll(
8
+ () =>
9
+ new Promise(resolve => {
10
+ process.env.CHANNEL = 'telesales'
11
+ start(resolve)
12
+ })
13
+ )
11
14
 
12
15
  beforeAll(() => new Promise(resolve => initialize(resolve)))
13
- afterAll((d) => { stop(d) })
16
+ afterAll(d => {
17
+ stop(d)
18
+ })
14
19
 
15
20
  describe('Where the server started in telesales mode', () => {
16
21
  it('telesales is displayed in the header', async () => {
@@ -21,7 +21,9 @@ beforeAll(() => {
21
21
  })
22
22
  beforeAll(() => new Promise(resolve => start(resolve)))
23
23
  beforeAll(() => new Promise(resolve => initialize(resolve)))
24
- afterAll((d) => { stop(d) })
24
+ afterAll(d => {
25
+ stop(d)
26
+ })
25
27
  afterAll(() => {
26
28
  delete process.env.ANALYTICS_PRIMARY_PROPERTY
27
29
  delete process.env.ANALYTICS_XGOV_PROPERTY
@@ -12,7 +12,7 @@ beforeAll(() => {
12
12
  })
13
13
  beforeAll(() => new Promise(resolve => start(resolve)))
14
14
  beforeAll(() => new Promise(resolve => initialize(resolve)))
15
- afterAll((d) => stop(d))
15
+ afterAll(d => stop(d))
16
16
  afterAll(() => {
17
17
  delete process.env.ANALYTICS_PRIMARY_PROPERTY
18
18
  delete process.env.ANALYTICS_XGOV_PROPERTY
@@ -13,7 +13,7 @@ beforeAll(() => {
13
13
  })
14
14
  beforeAll(() => new Promise(resolve => start(resolve)))
15
15
  beforeAll(() => new Promise(resolve => initialize(resolve)))
16
- afterAll((d) => stop(d))
16
+ afterAll(d => stop(d))
17
17
  afterAll(() => {
18
18
  delete process.env.ANALYTICS_PRIMARY_PROPERTY
19
19
  delete process.env.ANALYTICS_XGOV_PROPERTY
@@ -15,8 +15,8 @@ jest.mock('../../constants', () => ({
15
15
  }))
16
16
 
17
17
  jest.mock('../../uri', () => ({
18
- RENEWAL_BASE: '/licence-renew-url',
19
- IDENTIFY: '/renewal-url'
18
+ RENEWAL_BASE: { uri: '/licence-renew-url' },
19
+ IDENTIFY: { uri: '/renewal-url' }
20
20
  }))
21
21
 
22
22
  describe('The attribution handler', () => {
@@ -52,23 +52,22 @@ describe('The attribution handler', () => {
52
52
  })
53
53
  })
54
54
 
55
- it.each([
56
- ['campaign-12'],
57
- ['sample-campaign'],
58
- ['important-campaign']
59
- ])("redirects to ATTRIBUTION_REDIRECT_DEFAULT if ATTRIBUTION_REDIRECT env var isn't set", async campaign => {
60
- delete process.env.ATTRIBUTION_REDIRECT
61
- const query = {
62
- [UTM.CAMPAIGN]: campaign,
63
- [UTM.MEDIUM]: 'click_bait',
64
- [UTM.CONTENT]: 'eieioh',
65
- [UTM.SOURCE]: 'tomato',
66
- [UTM.TERM]: 'Michaelmas'
55
+ it.each([['campaign-12'], ['sample-campaign'], ['important-campaign']])(
56
+ "redirects to ATTRIBUTION_REDIRECT_DEFAULT if ATTRIBUTION_REDIRECT env var isn't set",
57
+ async campaign => {
58
+ delete process.env.ATTRIBUTION_REDIRECT
59
+ const query = {
60
+ [UTM.CAMPAIGN]: campaign,
61
+ [UTM.MEDIUM]: 'click_bait',
62
+ [UTM.CONTENT]: 'eieioh',
63
+ [UTM.SOURCE]: 'tomato',
64
+ [UTM.TERM]: 'Michaelmas'
65
+ }
66
+ const responseToolkit = generateResponseToolkitMock()
67
+ await attributionHandler(generateRequestMock(query), responseToolkit)
68
+ expect(responseToolkit.redirect).toHaveBeenCalledWith(ATTRIBUTION_REDIRECT_DEFAULT)
67
69
  }
68
- const responseToolkit = generateResponseToolkitMock()
69
- await attributionHandler(generateRequestMock(query), responseToolkit)
70
- expect(responseToolkit.redirect).toHaveBeenCalledWith(ATTRIBUTION_REDIRECT_DEFAULT)
71
- })
70
+ )
72
71
 
73
72
  it("redirects to ATTRIBUTION_REDIRECT env var if it's set", async () => {
74
73
  const attributionRedirect = '/attribution/redirect'
@@ -97,7 +96,7 @@ describe('The attribution handler', () => {
97
96
  const responseToolkit = generateResponseToolkitMock()
98
97
 
99
98
  await attributionHandler(generateRequestMock(query), responseToolkit)
100
- expect(responseToolkit.redirect).toHaveBeenCalledWith(IDENTIFY)
99
+ expect(responseToolkit.redirect).toHaveBeenCalledWith(IDENTIFY.uri)
101
100
  })
102
101
 
103
102
  it('redirects begins with { IDENTIFY } when journey is renewal', async () => {
@@ -109,30 +108,29 @@ describe('The attribution handler', () => {
109
108
  [UTM.TERM]: 'Michaelmas'
110
109
  }
111
110
  const responseToolkit = generateResponseToolkitMock()
112
- const regExMatch = new RegExp(`^${IDENTIFY}`)
111
+ const regExMatch = new RegExp(`^${IDENTIFY.uri}`)
113
112
 
114
113
  await attributionHandler(generateRequestMock(query), responseToolkit)
115
114
  expect(responseToolkit.redirect).toHaveBeenCalledWith(expect.stringMatching(regExMatch))
116
115
  })
117
116
 
118
- it.each([
119
- ['B2F11U'],
120
- ['AH56F6'],
121
- ['GH330P']
122
- ])('test renewal includes reference number when journey is renewal and reference number exists', async licenceKey => {
123
- const query = {
124
- [UTM.CAMPAIGN]: 'RENEWALS_CAMPAIGN_ID',
125
- [UTM.MEDIUM]: 'click_bait',
126
- [UTM.CONTENT]: 'eieioh',
127
- [UTM.SOURCE]: 'tomato',
128
- [UTM.TERM]: 'Michaelmas',
129
- [QUERYSTRING_LICENCE_KEY]: licenceKey
117
+ it.each([['B2F11U'], ['AH56F6'], ['GH330P']])(
118
+ 'test renewal includes reference number when journey is renewal and reference number exists',
119
+ async licenceKey => {
120
+ const query = {
121
+ [UTM.CAMPAIGN]: 'RENEWALS_CAMPAIGN_ID',
122
+ [UTM.MEDIUM]: 'click_bait',
123
+ [UTM.CONTENT]: 'eieioh',
124
+ [UTM.SOURCE]: 'tomato',
125
+ [UTM.TERM]: 'Michaelmas',
126
+ [QUERYSTRING_LICENCE_KEY]: licenceKey
127
+ }
128
+ const responseToolkit = generateResponseToolkitMock()
129
+ await attributionHandler(generateRequestMock(query), responseToolkit)
130
+ const regExMatch = new RegExp(`^${RENEWAL_BASE.uri}/${licenceKey}$`)
131
+ expect(responseToolkit.redirect).toHaveBeenCalledWith(expect.stringMatching(regExMatch))
130
132
  }
131
- const responseToolkit = generateResponseToolkitMock()
132
- await attributionHandler(generateRequestMock(query), responseToolkit)
133
- const regExMatch = new RegExp(`^${RENEWAL_BASE}/${licenceKey}$`)
134
- expect(responseToolkit.redirect).toHaveBeenCalledWith(expect.stringMatching(regExMatch))
135
- })
133
+ )
136
134
 
137
135
  const generateRequestMock = (query, status = {}) => ({
138
136
  query,
@@ -0,0 +1,79 @@
1
+ import { UTM, QUERYSTRING_LICENCE_KEY } from '../../constants'
2
+ import urlHandler from '../url-handler'
3
+ import { ATTRIBUTION, IDENTIFY } from '../../uri'
4
+
5
+ jest.mock('../../constants', () => ({
6
+ UTM: {
7
+ CAMPAIGN: 'utmcampaign',
8
+ MEDIUM: 'utmmedium',
9
+ CONTENT: 'utmcontent',
10
+ SOURCE: 'utmsource',
11
+ TERM: 'utmterm'
12
+ }
13
+ }))
14
+
15
+ jest.mock('../../uri', () => ({
16
+ ATTRIBUTION: { uri: '/attribution-url' },
17
+ IDENTIFY: { uri: '/renewal-url' }
18
+ }))
19
+
20
+ describe('The url handler', () => {
21
+ beforeEach(() => {
22
+ jest.clearAllMocks()
23
+ })
24
+
25
+ it('returns identify if no licence key', async () => {
26
+ const query = {
27
+ [UTM.CAMPAIGN]: 'renewals',
28
+ [QUERYSTRING_LICENCE_KEY]: null
29
+ }
30
+ const responseToolkit = generateResponseToolkitMock()
31
+ await urlHandler(generateRequestMock(query), responseToolkit)
32
+ expect(responseToolkit.redirect).toHaveBeenCalledWith(IDENTIFY.uri)
33
+ })
34
+
35
+ it.each([
36
+ ['B2F11U'],
37
+ ['AH56F6'],
38
+ ['GH330P']
39
+ ])('6 digit reference number exists and returns ATTRIBUTION', async licenceKey => {
40
+ const query = {
41
+ [UTM.CAMPAIGN]: 'renewals',
42
+ [QUERYSTRING_LICENCE_KEY]: licenceKey
43
+ }
44
+ const responseToolkit = generateResponseToolkitMock()
45
+ await urlHandler(generateRequestMock(query), responseToolkit)
46
+ const regExMatch = new RegExp(`^${ATTRIBUTION.uri}/${licenceKey}$`)
47
+ expect(responseToolkit.redirect).toHaveBeenCalledWith(expect.stringMatching(regExMatch))
48
+ })
49
+
50
+ it.each([
51
+ ['B2F11UH5D'],
52
+ ['AH56'],
53
+ ['GH330PPTD']
54
+ ])('reference number is not 6 digits and returns back to IDENTIFY', async licenceKey => {
55
+ const query = {
56
+ [UTM.CAMPAIGN]: 'renewals',
57
+ [QUERYSTRING_LICENCE_KEY]: licenceKey
58
+ }
59
+ const responseToolkit = generateResponseToolkitMock()
60
+ await urlHandler(generateRequestMock(query), responseToolkit)
61
+ expect(responseToolkit.redirect).toHaveBeenCalledWith(IDENTIFY.uri)
62
+ })
63
+
64
+ const generateRequestMock = (query, status = {}) => ({
65
+ query,
66
+ cache: jest.fn(() => ({
67
+ helpers: {
68
+ status: {
69
+ get: jest.fn(() => status),
70
+ set: jest.fn()
71
+ }
72
+ }
73
+ }))
74
+ })
75
+
76
+ const generateResponseToolkitMock = () => ({
77
+ redirect: jest.fn()
78
+ })
79
+ })
@@ -13,9 +13,10 @@ export default async (request, h) => {
13
13
 
14
14
  if (request.query[UTM.CAMPAIGN] === RENEWALS_CAMPAIGN_ID) {
15
15
  if (request.query[QUERYSTRING_LICENCE_KEY]) {
16
- return h.redirect(`${RENEWAL_BASE}/${request.query[QUERYSTRING_LICENCE_KEY]}`)
16
+ return h.redirect(`${RENEWAL_BASE.uri}/${request.query[QUERYSTRING_LICENCE_KEY]}`)
17
17
  }
18
- return h.redirect(IDENTIFY)
18
+ return h.redirect(IDENTIFY.uri)
19
19
  }
20
+
20
21
  return h.redirect(process.env.ATTRIBUTION_REDIRECT || ATTRIBUTION_REDIRECT_DEFAULT)
21
22
  }
@@ -0,0 +1,21 @@
1
+ import { QUERYSTRING_LICENCE_KEY } from '../constants.js'
2
+ import { initialiseAnalyticsSessionData } from '../processors/analytics.js'
3
+ import { IDENTIFY, ATTRIBUTION } from '../uri.js'
4
+
5
+ /**
6
+ * Attribution route handler
7
+ * @param request
8
+ * @param h
9
+ * @returns {Promise}
10
+ */
11
+ export default async (request, h) => {
12
+ await initialiseAnalyticsSessionData(request)
13
+ if (request.query[QUERYSTRING_LICENCE_KEY]) {
14
+ const refNumber = request.query[QUERYSTRING_LICENCE_KEY]
15
+ const sixDigit = /^[A-Za-z0-9]{6}$/.test(refNumber)
16
+ if (sixDigit) {
17
+ return h.redirect(`${ATTRIBUTION.uri}/${refNumber}`)
18
+ }
19
+ }
20
+ return h.redirect(IDENTIFY.uri)
21
+ }