@defra-fish/gafl-webapp-service 1.22.0-rc.7 → 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.
- package/package.json +4 -5
- package/src/__tests__/server-fetch-public.js +3 -1
- package/src/__tests__/server-test-sanitize.js +1 -1
- package/src/__tests__/server.telesales.spec.js +10 -5
- package/src/handlers/__tests__/agreed-handler-happy-path.spec.js +3 -1
- package/src/handlers/__tests__/agreed-handler-payment-failure.spec.js +1 -1
- package/src/handlers/__tests__/agreed-handler-sales-api-failure.spec.js +1 -1
- package/src/handlers/__tests__/attribution-handler.spec.js +35 -37
- package/src/handlers/__tests__/url-handler.spec.js +79 -0
- package/src/handlers/attribution-handler.js +3 -2
- package/src/handlers/url-handler.js +21 -0
- package/src/locales/cy.json +100 -101
- package/src/locales/en.json +55 -56
- package/src/pages/concessions/date-of-birth/__tests__/update-transaction.spec.js +0 -16
- package/src/pages/concessions/date-of-birth/update-transaction.js +0 -15
- package/src/pages/contact/address/entry/__tests__/address-entry.spec.js +1 -1
- package/src/pages/contact/address/lookup/__tests__/address-lookup.spec.js +1 -1
- package/src/pages/contact/address/select/__tests__/address-select.spec.js +1 -1
- package/src/pages/contact/digital-licence/licence-fulfilment/__tests__/licence-fulfilment.spec.js +1 -1
- package/src/pages/contact/digital-licence/licence-fulfilment/licence-fulfilment.njk +1 -1
- package/src/pages/contact/newsletter/__tests__/newsletter.spec.js +1 -1
- package/src/pages/guidance/privacy-policy.njk +4 -0
- package/src/pages/licence-details/licence-length/__tests__/licence-length.spec.js +1 -1
- package/src/pages/licence-details/licence-length/licence-length.njk +3 -1
- package/src/pages/licence-details/licence-start-time/__tests__/licence-start-time.spec.js +1 -1
- package/src/pages/licence-details/licence-start-time/__tests__/route.spec.js +22 -25
- package/src/pages/licence-details/licence-start-time/licence-start-time.njk +1 -1
- package/src/pages/licence-details/licence-start-time/route.js +7 -2
- package/src/pages/licence-details/licence-to-start/licence-to-start.njk +1 -0
- package/src/pages/licence-details/licence-type/__tests__/licence-type.spec.js +1 -1
- package/src/pages/licence-details/licence-type/licence-type.njk +3 -3
- package/src/pages/licence-details/no-licence-required/__tests__/no-licence-required.spec.js +1 -1
- package/src/pages/order-complete/licence-details/licence-details.njk +1 -5
- package/src/pages/order-complete/order-complete/__tests__/order-complete.spec.js +1 -1
- package/src/pages/order-complete/order-complete/order-complete.njk +11 -31
- package/src/pages/payment/cancelled/__tests__/cancelled-spec.js +1 -1
- package/src/pages/payment/failed/__tests__/failed-spec.js +1 -1
- package/src/pages/renewals/identify/__tests__/identity.spec.js +1 -1
- package/src/pages/renewals/renewal-start-date/__tests__/renewal-start-date.spec.js +1 -1
- package/src/processors/__tests__/pricing-summary.spec.js +1 -1
- package/src/processors/__tests__/renewals-write-cache.spec.js +0 -1
- package/src/routes/__tests__/add-permission-route.spec.js +1 -1
- package/src/routes/__tests__/back-links.spec.js +2 -2
- package/src/routes/__tests__/misc-routes.spec.js +1 -1
- package/src/routes/__tests__/new-transaction-route.spec.js +1 -1
- package/src/routes/journey-definition.js +1 -1
- package/src/routes/misc-routes.js +8 -10
- package/src/server.js +7 -7
- 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
|
|
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
|
|
40
|
-
"@defra-fish/connectors-lib": "1.22.0
|
|
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": "4840a94a046213c95478ea8ce84c086a81d5b2fb"
|
|
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 => {
|
|
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 () => {
|
|
@@ -4,13 +4,18 @@ import { LICENCE_LENGTH } from '../uri.js'
|
|
|
4
4
|
|
|
5
5
|
jest.mock('../handlers/oidc-handler.js')
|
|
6
6
|
|
|
7
|
-
beforeAll(
|
|
8
|
-
|
|
9
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
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
|
+
}
|