Skip to content

Commit d6230c0

Browse files
author
cj1993
authored
Merge pull request #183 from alphagov/GOVSI-528/terms-and-conds
Front end changes for mandatory and optional terms and conds
2 parents fdf2199 + 9d9fa42 commit d6230c0

12 files changed

Lines changed: 266 additions & 58 deletions

src/app.constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ export const PATH_NAMES = {
1616
CHECK_YOUR_PHONE: "/check-your-phone",
1717
SHARE_INFO: "/share-info",
1818
UPDATED_TERMS_AND_CONDITIONS: "/updated-terms-and-conditions",
19+
UPDATED_TERMS_AND_CONDITIONS_MANDATORY: "/updated-terms-and-conditions-mandatory",
20+
UPDATED_TERMS_AND_CONDITIONS_OPTIONAL: "/updated-terms-and-conditions-optional",
1921
ENTER_MFA: "/enter-code",
2022
SECURITY_CODE_EXPIRED: "/security-code-expired",
2123
AUTH_CODE: "/auth-code",

src/assets/scss/application.scss

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
.interrupt-screen {
44
background-color: #1d70b8;
5-
padding-top: 50px;
6-
padding-bottom: 50px;
5+
padding-top: 25px;
6+
margin-right: 15px;
7+
margin-left: 15px;
78
}
89

910
.govuk-white-text {
@@ -33,4 +34,21 @@
3334
color: #ffffff;
3435
box-shadow: 0px 1px #ffffff;
3536
padding: 0;
36-
}
37+
}
38+
39+
.inverted-button {
40+
background-color: #ffffff;
41+
color: #0b0c0c;
42+
box-shadow: 0 2px 0 #B1B4B6;
43+
font-weight: bold;
44+
}
45+
46+
.inverted-button:hover {
47+
background-color: #f3f2f1;
48+
color: #0b0c0c;
49+
}
50+
51+
.inverted-button-link:hover {
52+
box-shadow: 0px 2px #ffffff;
53+
background: none;
54+
}

src/components/common/layout/base.njk

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@
5353
}) }}
5454
{% block beforeContent %}{% endblock %}
5555
<main class="govuk-main-wrapper {{ mainClasses }}" id="main-content" role="main"{% if mainLang %} lang="{{ mainLang }}"{% endif %}>
56-
<div class="govuk-grid-row {{ rowClasses }}">
57-
<div class="govuk-grid-column-two-thirds">
56+
<div class="govuk-grid-row">
57+
<div class="govuk-grid-column-two-thirds {{ rowClasses }}">
5858
{% block content %}{% endblock %}
5959
</div>
6060
</div>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{% extends "common/layout/base.njk" %}
2+
{% from "govuk/components/button/macro.njk" import govukButton %}
3+
{% from "govuk/components/radios/macro.njk" import govukRadios %}
4+
{% set pageTitleName = 'pages.updatedTermsAndCondsMandatory.title' | translate %}
5+
{% set rowClasses = 'interrupt-screen' %}
6+
{% block content %}
7+
8+
<h1 class="govuk-white-text govuk-heading-l govuk-!-margin-top-0 govuk-!-margin-bottom-3">{{'pages.updatedTermsAndCondsMandatory.header' | translate}}</h1>
9+
10+
<p class="govuk-body govuk-white-text">
11+
{{ 'pages.updatedTermsAndCondsMandatory.paragraph' | translate }}
12+
</p>
13+
14+
<form action="/updated-terms-and-conditions" method="post" novalidate>
15+
16+
<input type="hidden" name="_csrf" value="{{ csrfToken }}" />
17+
18+
{{ govukButton({
19+
"text": 'pages.updatedTermsAndCondsMandatory.agreeAndContinue' | translate,
20+
"type": "Submit",
21+
"preventDoubleClick": true,
22+
classes: 'govuk-blue-text govuk-white-button inverted-button',
23+
"name": "acceptOrReject",
24+
"value": "accept"
25+
}) }}
26+
27+
<br />
28+
{{ govukButton({
29+
"text": 'pages.updatedTermsAndCondsMandatory.goBackToService' | translate + clientInfo.client_name,
30+
"type": "Submit",
31+
"preventDoubleClick": true,
32+
classes: 'govuk-btn-link inverted-button-link',
33+
"name": "acceptOrReject",
34+
"value": "reject"
35+
}) }}
36+
37+
</form>
38+
{% endblock %}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{% extends "common/layout/base.njk" %}
2+
{% from "govuk/components/button/macro.njk" import govukButton %}
3+
{% from "govuk/components/radios/macro.njk" import govukRadios %}
4+
{% set pageTitleName = 'pages.updatedTermsAndCondsOptional.title' | translate %}
5+
{% set rowClasses = 'interrupt-screen' %}
6+
{% block content %}
7+
8+
<h1 class="govuk-white-text govuk-heading-l govuk-!-margin-top-0 govuk-!-margin-bottom-3">{{'pages.updatedTermsAndCondsOptional.header' | translate}}</h1>
9+
10+
<p class="govuk-body govuk-white-text">
11+
{{ 'pages.updatedTermsAndCondsOptional.paragraph1' | translate }}
12+
</p>
13+
14+
<p class="govuk-body govuk-white-text">
15+
{{ 'pages.updatedTermsAndCondsOptional.paragraph2' | translate + clientInfo.client_name + 'pages.updatedTermsAndCondsOptional.paragraph2Continued' | translate }}
16+
</p>
17+
18+
<form action="/updated-terms-and-conditions" method="post" novalidate>
19+
20+
<input type="hidden" name="_csrf" value="{{ csrfToken }}" />
21+
22+
{{ govukButton({
23+
"text": 'pages.updatedTermsAndCondsOptional.agreeAndContinue' | translate,
24+
"type": "Submit",
25+
"preventDoubleClick": true,
26+
classes: 'govuk-blue-text govuk-white-button inverted-button',
27+
"name": "acceptOrReject",
28+
"value": "accept"
29+
}) }}
30+
31+
<br />
32+
{{ govukButton({
33+
"text": 'pages.updatedTermsAndCondsOptional.goBackToService' | translate + clientInfo.client_name,
34+
"type": "Submit",
35+
"preventDoubleClick": true,
36+
classes: 'govuk-btn-link inverted-button-link',
37+
"name": "acceptOrReject",
38+
"value": "reject"
39+
}) }}
40+
41+
</form>
42+
{% endblock %}

src/components/updated-terms-conds/index.njk

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
{% set rowClasses = 'interrupt-screen' %}
66
{% block content %}
77

8+
<h1 class="govuk-white-text govuk-heading-l govuk-!-margin-top-0 govuk-!-margin-bottom-3">{{'pages.updatedTermsAndConds.header' | translate}}</h1>
9+
810
<p class="govuk-body govuk-white-text">
911
{{ 'pages.updatedTermsAndConds.paragraph1.text' | translate }}
1012
<a class="govuk-white-text"
@@ -25,7 +27,7 @@
2527
"text": 'pages.updatedTermsAndConds.agreeAndContinue' | translate,
2628
"type": "Submit",
2729
"preventDoubleClick": true,
28-
classes: 'govuk-blue-text govuk-white-button',
30+
classes: 'govuk-blue-text govuk-white-button inverted-button',
2931
"name": "acceptOrReject",
3032
"value": "accept"
3133
}) }}
@@ -35,7 +37,7 @@
3537
"text": 'pages.updatedTermsAndConds.doNotAgree' | translate,
3638
"type": "Submit",
3739
"preventDoubleClick": true,
38-
classes: 'govuk-btn-link',
40+
classes: 'govuk-btn-link inverted-button-link',
3941
"name": "acceptOrReject",
4042
"value": "reject"
4143
}) }}

src/components/updated-terms-conds/tests/updated-terms-cond-integration.test.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ function nockClientInfo(baseApi: string) {
1313
clientName: "testclient",
1414
scopes: ["openid", "email", "phone"],
1515
redirectUri: "http://localhost:5000/callback",
16+
state: "test"
1617
});
1718
}
1819

@@ -69,6 +70,16 @@ describe("Integration:: updated-terms-code", () => {
6970
request(app).get("/updated-terms-and-conditions").expect(200, done);
7071
});
7172

73+
it("should return update terms and conditions optional page", (done) => {
74+
nockClientInfo(baseApi);
75+
request(app).get("/updated-terms-and-conditions-optional").expect(200, done);
76+
});
77+
78+
it("should return update terms and conditions mandatory page", (done) => {
79+
nockClientInfo(baseApi);
80+
request(app).get("/updated-terms-and-conditions-mandatory").expect(200, done);
81+
});
82+
7283
it("should return error when csrf not present", (done) => {
7384
request(app)
7485
.post("/updated-terms-and-conditions")
@@ -111,7 +122,7 @@ describe("Integration:: updated-terms-code", () => {
111122
})
112123
.expect(
113124
"Location",
114-
"http://localhost:5000/callback?error_code=rejectedTermsAndConditions"
125+
"http://localhost:5000/callback?error_code=rejectedTermsAndConditions&state=test"
115126
)
116127
.expect(302, done);
117128
});

src/components/updated-terms-conds/tests/updated-terms-conds.test.ts

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { describe } from "mocha";
44
import { sinon } from "../../../../test/utils/test-utils";
55
import { Request, Response } from "express";
66
import {
7-
updatedTermsCondsGet,
7+
updatedTermsCondsGet, updatedTermsCondsMandatoryGet, updatedTermsCondsOptionalGet,
88
updatedTermsCondsPost,
99
} from "../updated-terms-conds-controller";
1010
import { UserSession } from "../../../types";
@@ -52,6 +52,40 @@ describe("share-info controller", () => {
5252
});
5353
});
5454

55+
describe("updatedTermsCondsMandatoryGet", () => {
56+
it("should render updated-terms-conds-mandatory page", async () => {
57+
const fakeService: UpdateTermsAndCondsServiceInterface = {
58+
updateProfile: sandbox.fake(),
59+
clientInfo: sandbox.fake.returns({ scopes: ["openid", "profile"], serviceType: "mandatory" }),
60+
};
61+
62+
res.locals.sessionId = "s-123456-djjad";
63+
res.locals.clientSessionId = "c-123456-djjad";
64+
65+
await updatedTermsCondsMandatoryGet(fakeService)(req as Request, res as Response);
66+
67+
expect(fakeService.clientInfo).to.be.calledOnce;
68+
expect(res.render).to.have.calledWith("updated-terms-conds/index-mandatory.njk");
69+
});
70+
});
71+
72+
describe("updatedTermsCondsOptionalGet", () => {
73+
it("should render updated-terms-conds-optional page", async () => {
74+
const fakeService: UpdateTermsAndCondsServiceInterface = {
75+
updateProfile: sandbox.fake(),
76+
clientInfo: sandbox.fake.returns({ scopes: ["openid", "profile"], serviceType: "optional" }),
77+
};
78+
79+
res.locals.sessionId = "s-123456-djjad";
80+
res.locals.clientSessionId = "c-123456-djjad";
81+
82+
await updatedTermsCondsOptionalGet(fakeService)(req as Request, res as Response);
83+
84+
expect(fakeService.clientInfo).to.be.calledOnce;
85+
expect(res.render).to.have.calledWith("updated-terms-conds/index-optional.njk");
86+
});
87+
});
88+
5589
describe("updatedTermsCondsPost", () => {
5690
it("should redirect to /auth-code when acceptOrReject has value accept", async () => {
5791
const fakeService: UpdateTermsAndCondsServiceInterface = {
@@ -77,7 +111,7 @@ describe("share-info controller", () => {
77111
it("should redirect to redirectUri with error code param when acceptOrReject has value reject", async () => {
78112
const fakeService: UpdateTermsAndCondsServiceInterface = {
79113
updateProfile: sandbox.fake.returns(true),
80-
clientInfo: sandbox.fake.returns({ scopes: ["openid", "profile"] }),
114+
clientInfo: sandbox.fake.returns({ scopes: ["openid", "profile"], state: "test" }),
81115
};
82116

83117
req.session.redirectUri = "http://test.test";
@@ -87,12 +121,13 @@ describe("share-info controller", () => {
87121
req.session.user = {
88122
email: "test@test.com",
89123
};
124+
req.session.state = "test";
90125

91126
await updatedTermsCondsPost(fakeService)(req as Request, res as Response);
92127

93128
expect(fakeService.updateProfile).not.to.been.called;
94129
expect(res.redirect).to.have.calledWith(
95-
"http://test.test?error_code=rejectedTermsAndConditions"
130+
"http://test.test?error_code=rejectedTermsAndConditions&state=test"
96131
);
97132
});
98133
});

src/components/updated-terms-conds/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ export interface ClientInfoResponse {
1919
clientName: string;
2020
scopes: string[];
2121
redirectUri: string;
22+
serviceType: string;
23+
state: string;
2224
}

0 commit comments

Comments
 (0)