Skip to content

Commit 850d468

Browse files
Reapply "VIA-629 SB & EO Build correct NBS URL, with query parameters."
This reverts commit d13e917.
1 parent d13e917 commit 850d468

16 files changed

+107
-66
lines changed

src/_lambda/content-cache-hydrator/handler.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ jest.mock("@src/_lambda/content-cache-hydrator/content-change-detector");
2222
jest.mock("@src/_lambda/content-cache-hydrator/invalidate-cache");
2323
jest.mock("@src/services/content-api/parsers/content-filter-service");
2424
jest.mock("@src/services/content-api/parsers/content-styling-service");
25+
jest.mock("@src/services/nbs/nbs-service", () => ({
26+
buildNbsUrlWithQueryParams: jest.fn(),
27+
}));
2528

2629
jest.mock("@src/utils/requestContext", () => ({
2730
asyncLocalStorage: {

src/app/_components/nbs/NBSBookingAction.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22

33
import { useBrowserContext } from "@src/app/_components/context/BrowserContext";
44
import { SSO_TO_NBS_ROUTE } from "@src/app/api/sso-to-nbs/constants";
5-
import { UrlPathFragment, VaccineInfo } from "@src/models/vaccine";
6-
import { VaccinesWithNBSBookingAvailable } from "@src/services/nbs/nbs-service";
5+
import { UrlPathFragment, VaccineInfo, VaccineType } from "@src/models/vaccine";
76
import { ActionLink } from "nhsuk-react-components";
87
import React, { JSX } from "react";
98

109
type RenderOptions = "anchor" | "button" | "actionLink";
1110

1211
interface NBSBookingActionForVaccineProps {
13-
vaccineType: VaccinesWithNBSBookingAvailable;
12+
vaccineType: VaccineType;
1413
displayText: string;
1514
renderAs: RenderOptions;
1615
reduceBottomPadding: boolean;

src/app/_components/nbs/PharmacyBookingInfo.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { NBSBookingActionForVaccine } from "@src/app/_components/nbs/NBSBookingAction";
2-
import { VaccineInfo } from "@src/models/vaccine";
3-
import { VaccinesWithNBSBookingAvailable } from "@src/services/nbs/nbs-service";
2+
import { VaccineInfo, VaccineType } from "@src/models/vaccine";
43
import React, { JSX } from "react";
54

65
type PharmacyBookingProps = {
7-
vaccineType: VaccinesWithNBSBookingAvailable;
6+
vaccineType: VaccineType;
87
};
98

109
const PharmacyBookingInfo = ({ vaccineType }: PharmacyBookingProps): JSX.Element => {

src/app/_components/vaccine-custom/RSVPregnancyInfo.tsx

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
import { PharmacyBookingInfo } from "@src/app/_components/nbs/PharmacyBookingInfo";
22
import NonUrgentCareCard from "@src/app/_components/nhs-frontend/NonUrgentCareCard";
33
import { HEADINGS } from "@src/app/constants";
4-
import { VaccinesWithNBSBookingAvailable } from "@src/services/nbs/nbs-service";
4+
import { VaccineType } from "@src/models/vaccine";
55
import React, { JSX } from "react";
66

7-
const RSVPregnancyInfo = (props: {
8-
vaccineType: VaccinesWithNBSBookingAvailable;
9-
howToGetVaccineOrFallback: JSX.Element;
10-
}): JSX.Element => {
7+
const RSVPregnancyInfo = (props: { vaccineType: VaccineType; howToGetVaccineOrFallback: JSX.Element }): JSX.Element => {
118
return (
129
<>
1310
<NonUrgentCareCard

src/models/vaccine.ts

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Brand } from "@src/utils/types";
33
export type NhsNumber = Brand<string, "NhsNumber">;
44
export type UrlPathFragment = Brand<string, "UrlPathFragment">;
55
export type Filename = Brand<string, "Filename">;
6+
export type NbsCampaign = Brand<string, "NbsCampaign">;
67

78
enum VaccineType {
89
RSV = "RSV",
@@ -40,6 +41,7 @@ export type VaccineDetails = {
4041
contentPath: UrlPathFragment;
4142
cacheFilename: Filename;
4243
nbsPath: UrlPathFragment;
44+
nbsCampaign: NbsCampaign;
4345
supressWarningCallout?: boolean;
4446
moreInformationHeadersFromContentApi?: boolean;
4547
};
@@ -70,6 +72,7 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
7072
contentPath: "vaccinations/rsv-vaccine" as UrlPathFragment,
7173
cacheFilename: "rsv-vaccine.json" as Filename,
7274
nbsPath: "rsv" as UrlPathFragment,
75+
nbsCampaign: "vita-RSV-booking" as NbsCampaign,
7376
},
7477
[VaccineType.RSV_PREGNANCY]: {
7578
urlPath: "rsv-pregnancy" as UrlPathFragment,
@@ -89,7 +92,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
8992
removeHowToGetExpanderFromMoreInformationSection: true,
9093
contentPath: "vaccinations/rsv-vaccine" as UrlPathFragment,
9194
cacheFilename: "rsv-vaccine.json" as Filename,
92-
nbsPath: "rsv-pregnancy" as UrlPathFragment,
95+
nbsPath: "rsv" as UrlPathFragment,
96+
nbsCampaign: "vita-RSV-booking" as NbsCampaign,
9397
},
9498
[VaccineType.TD_IPV_3_IN_1]: {
9599
urlPath: "td-ipv-vaccine-3-in-1-teenage-booster" as UrlPathFragment,
@@ -108,7 +112,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
108112
personalisedEligibilityStatusRequired: false,
109113
contentPath: "vaccinations/td-ipv-vaccine-3-in-1-teenage-booster" as UrlPathFragment,
110114
cacheFilename: "td-ipv-vaccine-3-in-1-teenage-booster.json" as Filename,
111-
nbsPath: "td-ipv-vaccine-3-in-1-teenage-booster" as UrlPathFragment,
115+
nbsPath: "unknown" as UrlPathFragment,
116+
nbsCampaign: "unknown" as NbsCampaign,
112117
},
113118
[VaccineType.VACCINE_6_IN_1]: {
114119
urlPath: "6-in-1-vaccine" as UrlPathFragment,
@@ -125,7 +130,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
125130
personalisedEligibilityStatusRequired: false,
126131
contentPath: "vaccinations/6-in-1-vaccine" as UrlPathFragment,
127132
cacheFilename: "6-in-1-vaccine.json" as Filename,
128-
nbsPath: "6-in-1-vaccine" as UrlPathFragment,
133+
nbsPath: "unknown" as UrlPathFragment,
134+
nbsCampaign: "unknown" as NbsCampaign,
129135
},
130136
[VaccineType.ROTAVIRUS]: {
131137
urlPath: "rotavirus-vaccine" as UrlPathFragment,
@@ -142,7 +148,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
142148
personalisedEligibilityStatusRequired: false,
143149
contentPath: "vaccinations/rotavirus-vaccine" as UrlPathFragment,
144150
cacheFilename: "rotavirus-vaccine.json" as Filename,
145-
nbsPath: "rotavirus-vaccine" as UrlPathFragment,
151+
nbsPath: "unknown" as UrlPathFragment,
152+
nbsCampaign: "unknown" as NbsCampaign,
146153
},
147154
[VaccineType.HPV]: {
148155
urlPath: "hpv-vaccine" as UrlPathFragment,
@@ -159,7 +166,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
159166
personalisedEligibilityStatusRequired: false,
160167
contentPath: "vaccinations/hpv-vaccine" as UrlPathFragment,
161168
cacheFilename: "hpv-vaccine.json" as Filename,
162-
nbsPath: "hpv-vaccine" as UrlPathFragment,
169+
nbsPath: "unknown" as UrlPathFragment,
170+
nbsCampaign: "unknown" as NbsCampaign,
163171
supressWarningCallout: true,
164172
},
165173
[VaccineType.MENB_CHILDREN]: {
@@ -177,7 +185,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
177185
personalisedEligibilityStatusRequired: false,
178186
contentPath: "vaccinations/menb-vaccine-for-children" as UrlPathFragment,
179187
cacheFilename: "menb-vaccine-for-children.json" as Filename,
180-
nbsPath: "menb-vaccine-for-children" as UrlPathFragment,
188+
nbsPath: "unknown" as UrlPathFragment,
189+
nbsCampaign: "unknown" as NbsCampaign,
181190
},
182191
[VaccineType.MMR]: {
183192
urlPath: "mmr-vaccine" as UrlPathFragment,
@@ -194,7 +203,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
194203
personalisedEligibilityStatusRequired: false,
195204
contentPath: "vaccinations/mmr-vaccine" as UrlPathFragment,
196205
cacheFilename: "mmr-vaccine.json" as Filename,
197-
nbsPath: "mmr-vaccine" as UrlPathFragment,
206+
nbsPath: "unknown" as UrlPathFragment,
207+
nbsCampaign: "unknown" as NbsCampaign,
198208
},
199209
[VaccineType.PNEUMOCOCCAL]: {
200210
urlPath: "pneumococcal-vaccine" as UrlPathFragment,
@@ -211,7 +221,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
211221
personalisedEligibilityStatusRequired: false,
212222
contentPath: "vaccinations/pneumococcal-vaccine" as UrlPathFragment,
213223
cacheFilename: "pneumococcal-vaccine.json" as Filename,
214-
nbsPath: "pneumococcal-vaccine" as UrlPathFragment,
224+
nbsPath: "unknown" as UrlPathFragment,
225+
nbsCampaign: "unknown" as NbsCampaign,
215226
},
216227
[VaccineType.SHINGLES]: {
217228
urlPath: "shingles-vaccine" as UrlPathFragment,
@@ -228,8 +239,9 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
228239
personalisedEligibilityStatusRequired: false,
229240
contentPath: "vaccinations/shingles-vaccine" as UrlPathFragment,
230241
cacheFilename: "shingles-vaccine.json" as Filename,
231-
nbsPath: "shingles-vaccine" as UrlPathFragment,
242+
nbsPath: "unknown" as UrlPathFragment,
232243
supressWarningCallout: true,
244+
nbsCampaign: "unknown" as NbsCampaign,
233245
},
234246
[VaccineType.MENACWY]: {
235247
urlPath: "menacwy-vaccine" as UrlPathFragment,
@@ -246,7 +258,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
246258
personalisedEligibilityStatusRequired: false,
247259
contentPath: "vaccinations/menacwy-vaccine" as UrlPathFragment,
248260
cacheFilename: "menacwy-vaccine.json" as Filename,
249-
nbsPath: "menacwy-vaccine" as UrlPathFragment,
261+
nbsPath: "unknown" as UrlPathFragment,
262+
nbsCampaign: "unknown" as NbsCampaign,
250263
supressWarningCallout: true,
251264
},
252265
[VaccineType.VACCINE_4_IN_1]: {
@@ -264,7 +277,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
264277
personalisedEligibilityStatusRequired: false,
265278
contentPath: "vaccinations/4-in-1-preschool-booster-vaccine" as UrlPathFragment,
266279
cacheFilename: "4-in-1-preschool-booster-vaccine.json" as Filename,
267-
nbsPath: "4-in-1-preschool-booster-vaccine" as UrlPathFragment,
280+
nbsPath: "unknown" as UrlPathFragment,
281+
nbsCampaign: "unknown" as NbsCampaign,
268282
},
269283
[VaccineType.WHOOPING_COUGH]: {
270284
urlPath: "whooping-cough-vaccination" as UrlPathFragment,
@@ -284,7 +298,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
284298
personalisedEligibilityStatusRequired: false,
285299
contentPath: "pregnancy/keeping-well/whooping-cough-vaccination" as UrlPathFragment,
286300
cacheFilename: "whooping-cough-vaccination.json" as Filename,
287-
nbsPath: "whooping-cough-vaccination" as UrlPathFragment,
301+
nbsPath: "unknown" as UrlPathFragment,
302+
nbsCampaign: "unknown" as NbsCampaign,
288303
},
289304
[VaccineType.HIB_MENC]: {
290305
urlPath: "hib-menc-vaccine" as UrlPathFragment,
@@ -301,7 +316,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
301316
personalisedEligibilityStatusRequired: false,
302317
contentPath: "vaccinations/hib-menc-vaccine" as UrlPathFragment,
303318
cacheFilename: "hib-menc-vaccine.json" as Filename,
304-
nbsPath: "hib-menc-vaccine" as UrlPathFragment,
319+
nbsPath: "unknown" as UrlPathFragment,
320+
nbsCampaign: "unknown" as NbsCampaign,
305321
},
306322
[VaccineType.FLU_IN_PREGNANCY]: {
307323
urlPath: "flu-vaccine-in-pregnancy" as UrlPathFragment,
@@ -319,7 +335,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
319335
personalisedEligibilityStatusRequired: false,
320336
contentPath: "pregnancy/keeping-well/flu-jab" as UrlPathFragment,
321337
cacheFilename: "flu-jab.json" as Filename,
322-
nbsPath: "flu-vaccine-in-pregnancy" as UrlPathFragment,
338+
nbsPath: "unknown" as UrlPathFragment,
339+
nbsCampaign: "unknown" as NbsCampaign,
323340
moreInformationHeadersFromContentApi: true,
324341
},
325342
[VaccineType.COVID_19]: {
@@ -338,6 +355,7 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
338355
contentPath: "vaccinations/covid-19-vaccine" as UrlPathFragment,
339356
cacheFilename: "covid-19-vaccine.json" as Filename,
340357
nbsPath: "covid" as UrlPathFragment,
358+
nbsCampaign: "vita-COVID-booking" as NbsCampaign,
341359
},
342360
[VaccineType.FLU_FOR_ADULTS]: {
343361
urlPath: "flu-vaccine" as UrlPathFragment,
@@ -354,7 +372,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
354372
personalisedEligibilityStatusRequired: false,
355373
contentPath: "vaccinations/flu-vaccine" as UrlPathFragment,
356374
cacheFilename: "flu-vaccine.json" as Filename,
357-
nbsPath: "path-to-be-removed" as UrlPathFragment,
375+
nbsPath: "unknown" as UrlPathFragment,
376+
nbsCampaign: "unknown" as NbsCampaign,
358377
},
359378
[VaccineType.FLU_FOR_CHILDREN]: {
360379
urlPath: "flu-vaccine-for-children" as UrlPathFragment,
@@ -371,7 +390,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
371390
personalisedEligibilityStatusRequired: false,
372391
contentPath: "vaccinations/child-flu-vaccine" as UrlPathFragment,
373392
cacheFilename: "child-flu-vaccine.json" as Filename,
374-
nbsPath: "path-to-be-removed" as UrlPathFragment,
393+
nbsPath: "unknown" as UrlPathFragment,
394+
nbsCampaign: "unknown" as NbsCampaign,
375395
},
376396
[VaccineType.FLU_FOR_SCHOOL_AGED_CHILDREN]: {
377397
urlPath: "flu-vaccine-for-school-aged-children" as UrlPathFragment,
@@ -389,7 +409,8 @@ const VaccineInfo: Record<VaccineType, VaccineDetails> = {
389409
personalisedEligibilityStatusRequired: false,
390410
contentPath: "vaccinations/child-flu-vaccine" as UrlPathFragment,
391411
cacheFilename: "child-flu-vaccine.json" as Filename,
392-
nbsPath: "path-to-be-removed" as UrlPathFragment,
412+
nbsPath: "unknown" as UrlPathFragment,
413+
nbsCampaign: "unknown" as NbsCampaign,
393414
},
394415
};
395416

src/services/content-api/content-api.integration.test.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ const mockMarkdownWithStylingHtml = "<ul><li>sausage</li><li>egg</li><li>chips</
1616
jest.mock("@project/src/app/_components/markdown/MarkdownWithStyling", () => ({
1717
MarkdownWithStyling: () => mockMarkdownWithStylingHtml,
1818
}));
19+
jest.mock("@src/services/nbs/nbs-service", () => ({
20+
buildNbsUrlWithQueryParams: jest.fn(),
21+
}));
1922

2023
const mockRsvResponse = {
2124
Body: new Readable({

src/services/content-api/content-service.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import { ConfigMock, configBuilder } from "@test-data/config/builders";
1010
jest.mock("@src/services/content-api/gateway/content-reader-service");
1111
jest.mock("@src/utils/config");
1212
jest.mock("sanitize-data", () => ({ sanitize: jest.fn() }));
13+
jest.mock("@src/services/nbs/nbs-service", () => ({
14+
buildNbsUrlWithQueryParams: jest.fn(),
15+
}));
1316
const mockMarkdownWithStylingHtml = "<ul><li>sausage</li><li>egg</li><li>chips</li></ul>";
1417
jest.mock("@project/src/app/_components/markdown/MarkdownWithStyling", () => ({
1518
MarkdownWithStyling: () => mockMarkdownWithStylingHtml,

src/services/content-api/parsers/content-filter-service.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ jest.mock("@src/services/content-api/parsers/custom/flu-for-school-aged-children
3434
jest.mock("@src/services/content-api/parsers/custom/covid-19");
3535

3636
jest.mock("sanitize-data", () => ({ sanitize: jest.fn() }));
37+
jest.mock("@src/services/nbs/nbs-service", () => ({
38+
buildNbsUrlWithQueryParams: jest.fn(),
39+
}));
3740

3841
describe("Content Filter", () => {
3942
describe("_extractDescriptionForVaccine", () => {

src/services/content-api/parsers/custom/covid-19.test.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
import { buildFilteredContentForCovid19Vaccine } from "@src/services/content-api/parsers/custom/covid-19";
22
import { ActionDisplayType, ButtonUrl, Content, Label } from "@src/services/eligibility-api/types";
3+
import { buildNbsUrlWithQueryParams } from "@src/services/nbs/nbs-service";
34
import { Campaigns } from "@src/utils/campaigns/types";
45
import config from "@src/utils/config";
56
import { ConfigMock, configBuilder } from "@test-data/config/builders";
67
import { genericVaccineContentAPIResponse } from "@test-data/content-api/data";
78

89
jest.mock("sanitize-data", () => ({ sanitize: jest.fn() }));
9-
10-
const nbsUrlFromConfig = new URL("https://test-nbs-url.example.com/sausages");
11-
const nbsBookingPathFromConfig = "/test/path/book";
10+
jest.mock("@src/services/nbs/nbs-service", () => ({
11+
buildNbsUrlWithQueryParams: jest.fn(),
12+
}));
1213

1314
describe("buildFilteredContentForCovid19Vaccine", () => {
1415
const mockedConfig = config as ConfigMock;
1516

1617
beforeEach(() => {
1718
const defaultConfig = configBuilder()
18-
.withNbsUrl(nbsUrlFromConfig)
19-
.andNbsBookingPath(nbsBookingPathFromConfig)
20-
.andCampaigns(
19+
.withCampaigns(
2120
Campaigns.fromJson(
2221
JSON.stringify({
2322
COVID_19: [
@@ -29,6 +28,8 @@ describe("buildFilteredContentForCovid19Vaccine", () => {
2928
)
3029
.build();
3130
Object.assign(mockedConfig, defaultConfig);
31+
32+
(buildNbsUrlWithQueryParams as jest.Mock).mockResolvedValue(new URL("https://test-nbs-url.example.com/sausages"));
3233
});
3334

3435
jest.useFakeTimers();
@@ -86,7 +87,7 @@ describe("buildFilteredContentForCovid19Vaccine", () => {
8687
content: "## If this applies to you\n\n### Book an appointment online at a pharmacy" as Content,
8788
button: {
8889
label: "Continue to booking" as Label,
89-
url: new URL("https://test-nbs-url.example.com/sausages/test/path/book/covid") as ButtonUrl,
90+
url: new URL("https://test-nbs-url.example.com/sausages") as ButtonUrl,
9091
},
9192
delineator: true,
9293
},

src/services/content-api/parsers/custom/covid-19.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { VaccineInfo, VaccineType } from "@src/models/vaccine";
1+
import { VaccineType } from "@src/models/vaccine";
22
import { buildFilteredContentForStandardVaccine } from "@src/services/content-api/parsers/content-filter-service";
33
import { HeadingWithContent, HeadingWithTypedContent, VaccinePageContent } from "@src/services/content-api/types";
44
import {
@@ -9,6 +9,7 @@ import {
99
Content,
1010
Label,
1111
} from "@src/services/eligibility-api/types";
12+
import { buildNbsUrlWithQueryParams } from "@src/services/nbs/nbs-service";
1213
import config from "@src/utils/config";
1314
import { logger } from "@src/utils/logger";
1415
import { Logger } from "pino";
@@ -51,12 +52,7 @@ export const buildFilteredContentForCovid19Vaccine = async (apiContent: string):
5152
};
5253

5354
async function _buildActions(): Promise<Action[]> {
54-
const nbsBaseUrl = await config.NBS_URL;
55-
const nbsBookingPath = await config.NBS_BOOKING_PATH;
56-
const nbsURl = new URL(
57-
`${nbsBaseUrl.pathname}${nbsBookingPath}/${VaccineInfo.COVID_19.nbsPath}`,
58-
nbsBaseUrl.origin,
59-
) as ButtonUrl;
55+
const nbsURl = (await buildNbsUrlWithQueryParams(VaccineType.COVID_19)) as ButtonUrl;
6056

6157
const nbsBooking: ActionWithButton = {
6258
type: ActionDisplayType.buttonWithInfo,

0 commit comments

Comments
 (0)