Skip to content

Commit 1be8601

Browse files
connoravo-nhsanthony-nhststephen-nhs
authored
Fix: [AEA-5913] - Part 1, add in two new additional test exceptions (#2362)
## Summary - Routine Change ### Details Add new test cases for 1. Return a HTTP 400 for cases to simulate a failed validation 2. Return a HTTP 429 for cases to simulate a service capacity issue --------- Signed-off-by: Connor Avery <214469360+connoravo-nhs@users.noreply.github.com> Co-authored-by: Anthony Brown <121869075+anthony-nhs@users.noreply.github.com> Co-authored-by: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com>
1 parent a0248ec commit 1be8601

File tree

9 files changed

+177
-5
lines changed

9 files changed

+177
-5
lines changed

.github/scripts/release_code.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,8 @@ sam deploy \
7272
NotifyAPIBaseURLValue="$NOTIFY_API_BASE_URL" \
7373
RequireApplicationName="$REQUIRE_APPLICATION_NAME" \
7474
EnableBackup="$ENABLE_BACKUP" \
75+
TestPrescriptionsValue1="$TEST_PRESCRIPTIONS_1" \
76+
TestPrescriptionsValue2="$TEST_PRESCRIPTIONS_2" \
77+
TestPrescriptionsValue3="$TEST_PRESCRIPTIONS_3" \
78+
TestPrescriptionsValue4="$TEST_PRESCRIPTIONS_4" \
7579
ForwardCsocLogs="$FORWARD_CSOC_LOGS"

.github/workflows/pull_request.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ jobs:
120120
NOTIFY_API_BASE_URL: "https://int.api.service.nhs.uk"
121121
MTLS_KEY: psu-mtls-1
122122
IS_PULL_REQUEST: true
123+
TEST_PRESCRIPTIONS_1: ${{ vars.TEST_PRESCRIPTIONS_1_VALUES }}
124+
TEST_PRESCRIPTIONS_2: ${{ vars.TEST_PRESCRIPTIONS_2_VALUES }}
125+
TEST_PRESCRIPTIONS_3: ${{ vars.TEST_PRESCRIPTIONS_3_VALUES }}
126+
TEST_PRESCRIPTIONS_4: ${{ vars.TEST_PRESCRIPTIONS_4_VALUES }}
123127
FORWARD_CSOC_LOGS: false
124128
secrets:
125129
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }}

.github/workflows/release.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ jobs:
9191
NOTIFY_API_BASE_URL: "https://int.api.service.nhs.uk"
9292
MTLS_KEY: psu-mtls-1
9393
IS_PULL_REQUEST: false
94+
TEST_PRESCRIPTIONS_1: ${{ vars.TEST_PRESCRIPTIONS_1_VALUES }}
95+
TEST_PRESCRIPTIONS_2: ${{ vars.TEST_PRESCRIPTIONS_2_VALUES }}
96+
TEST_PRESCRIPTIONS_3: ${{ vars.TEST_PRESCRIPTIONS_3_VALUES }}
97+
TEST_PRESCRIPTIONS_4: ${{ vars.TEST_PRESCRIPTIONS_4_VALUES }}
9498
FORWARD_CSOC_LOGS: false
9599
secrets:
96100
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }}
@@ -130,6 +134,10 @@ jobs:
130134
NOTIFY_API_BASE_URL: "https://int.api.service.nhs.uk"
131135
MTLS_KEY: psu-mtls-1
132136
IS_PULL_REQUEST: false
137+
TEST_PRESCRIPTIONS_1: ${{ vars.TEST_PRESCRIPTIONS_1_VALUES }}
138+
TEST_PRESCRIPTIONS_2: ${{ vars.TEST_PRESCRIPTIONS_2_VALUES }}
139+
TEST_PRESCRIPTIONS_3: ${{ vars.TEST_PRESCRIPTIONS_3_VALUES }}
140+
TEST_PRESCRIPTIONS_4: ${{ vars.TEST_PRESCRIPTIONS_4_VALUES }}
133141
FORWARD_CSOC_LOGS: false
134142
secrets:
135143
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }}
@@ -174,6 +182,10 @@ jobs:
174182
NOTIFY_API_BASE_URL: "https://int.api.service.nhs.uk"
175183
MTLS_KEY: psu-mtls-1
176184
IS_PULL_REQUEST: false
185+
TEST_PRESCRIPTIONS_1: ${{ vars.TEST_PRESCRIPTIONS_1_VALUES }}
186+
TEST_PRESCRIPTIONS_2: ${{ vars.TEST_PRESCRIPTIONS_2_VALUES }}
187+
TEST_PRESCRIPTIONS_3: ${{ vars.TEST_PRESCRIPTIONS_3_VALUES }}
188+
TEST_PRESCRIPTIONS_4: ${{ vars.TEST_PRESCRIPTIONS_4_VALUES }}
177189
FORWARD_CSOC_LOGS: false
178190
secrets:
179191
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.REF_CLOUD_FORMATION_DEPLOY_ROLE }}
@@ -218,6 +230,10 @@ jobs:
218230
NOTIFY_API_BASE_URL: "https://int.api.service.nhs.uk"
219231
MTLS_KEY: psu-mtls-1
220232
IS_PULL_REQUEST: false
233+
TEST_PRESCRIPTIONS_1: ${{ vars.TEST_PRESCRIPTIONS_1_VALUES }}
234+
TEST_PRESCRIPTIONS_2: ${{ vars.TEST_PRESCRIPTIONS_2_VALUES }}
235+
TEST_PRESCRIPTIONS_3: ${{ vars.TEST_PRESCRIPTIONS_3_VALUES }}
236+
TEST_PRESCRIPTIONS_4: ${{ vars.TEST_PRESCRIPTIONS_4_VALUES }}
221237
FORWARD_CSOC_LOGS: false
222238
secrets:
223239
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.QA_CLOUD_FORMATION_DEPLOY_ROLE }}
@@ -257,6 +273,10 @@ jobs:
257273
NOTIFY_API_BASE_URL: "https://int.api.service.nhs.uk"
258274
MTLS_KEY: psu-mtls-1
259275
IS_PULL_REQUEST: false
276+
TEST_PRESCRIPTIONS_1: ${{ vars.TEST_PRESCRIPTIONS_1_VALUES }}
277+
TEST_PRESCRIPTIONS_2: ${{ vars.TEST_PRESCRIPTIONS_2_VALUES }}
278+
TEST_PRESCRIPTIONS_3: ${{ vars.TEST_PRESCRIPTIONS_3_VALUES }}
279+
TEST_PRESCRIPTIONS_4: ${{ vars.TEST_PRESCRIPTIONS_4_VALUES }}
260280
FORWARD_CSOC_LOGS: false
261281
secrets:
262282
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.INT_CLOUD_FORMATION_DEPLOY_ROLE }}
@@ -296,6 +316,10 @@ jobs:
296316
NOTIFY_API_BASE_URL: "https://int.api.service.nhs.uk"
297317
MTLS_KEY: psu-mtls-1
298318
IS_PULL_REQUEST: false
319+
TEST_PRESCRIPTIONS_1: ${{ vars.TEST_PRESCRIPTIONS_1_VALUES }}
320+
TEST_PRESCRIPTIONS_2: ${{ vars.TEST_PRESCRIPTIONS_2_VALUES }}
321+
TEST_PRESCRIPTIONS_3: ${{ vars.TEST_PRESCRIPTIONS_3_VALUES }}
322+
TEST_PRESCRIPTIONS_4: ${{ vars.TEST_PRESCRIPTIONS_4_VALUES }}
299323
FORWARD_CSOC_LOGS: false
300324
secrets:
301325
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.INT_CLOUD_FORMATION_DEPLOY_ROLE }}

.github/workflows/run_release_code_and_api.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,21 @@ on:
102102
MTLS_KEY:
103103
type: string
104104
required: true
105+
TEST_PRESCRIPTIONS_1:
106+
required: false
107+
type: string
108+
TEST_PRESCRIPTIONS_2:
109+
required: false
110+
type: string
111+
112+
TEST_PRESCRIPTIONS_3:
113+
required: false
114+
type: string
115+
116+
TEST_PRESCRIPTIONS_4:
117+
required: false
118+
type: string
119+
105120
FORWARD_CSOC_LOGS:
106121
required: true
107122
type: boolean
@@ -206,6 +221,10 @@ jobs:
206221
BLOCKED_SITE_ODS_CODES: ${{ inputs.BLOCKED_SITE_ODS_CODES }}
207222
NOTIFY_ROUTING_PLAN_ID: ${{ inputs.NOTIFY_ROUTING_PLAN_ID }}
208223
NOTIFY_API_BASE_URL: ${{ inputs.NOTIFY_API_BASE_URL }}
224+
TEST_PRESCRIPTIONS_1: ${{ inputs.TEST_PRESCRIPTIONS_1 || 'noval' }}
225+
TEST_PRESCRIPTIONS_2: ${{ inputs.TEST_PRESCRIPTIONS_2 || 'noval' }}
226+
TEST_PRESCRIPTIONS_3: ${{ inputs.TEST_PRESCRIPTIONS_3 || 'noval' }}
227+
TEST_PRESCRIPTIONS_4: ${{ inputs.TEST_PRESCRIPTIONS_4 || 'noval' }}
209228
FORWARD_CSOC_LOGS: ${{ inputs.FORWARD_CSOC_LOGS }}
210229
run: ./release_code.sh
211230

SAMtemplates/functions/main.yaml

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,22 @@ Parameters:
8888
EnableBackup:
8989
Type: String
9090

91+
TestPrescriptions1:
92+
Type: String
93+
Default: None
94+
95+
TestPrescriptions2:
96+
Type: String
97+
Default: None
98+
99+
TestPrescriptions3:
100+
Type: String
101+
Default: None
102+
103+
TestPrescriptions4:
104+
Type: String
105+
Default: None
106+
91107
Conditions:
92108
ShouldDeployCheckPrescriptionStatusUpdate: !Equals
93109
- true
@@ -116,8 +132,10 @@ Resources:
116132
ENABLE_NOTIFICATIONS_PARAM: !Ref EnableNotificationsInternalParam
117133
LOG_LEVEL: !Ref LogLevel
118134
ENVIRONMENT: !Ref Environment
119-
TEST_PRESCRIPTIONS_1: "None"
120-
TEST_PRESCRIPTIONS_2: "None"
135+
TEST_PRESCRIPTIONS_1: !Ref TestPrescriptions1
136+
TEST_PRESCRIPTIONS_2: !Ref TestPrescriptions2
137+
TEST_PRESCRIPTIONS_3: !Ref TestPrescriptions3
138+
TEST_PRESCRIPTIONS_4: !Ref TestPrescriptions4
121139
REQUIRE_APPLICATION_NAME: !Ref RequireApplicationName
122140
Metadata:
123141
BuildMethod: esbuild

SAMtemplates/main_template.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,18 @@ Parameters:
144144
- true
145145
- false
146146

147+
TestPrescriptionsValue1:
148+
Type: String
149+
150+
TestPrescriptionsValue2:
151+
Type: String
152+
153+
TestPrescriptionsValue3:
154+
Type: String
155+
156+
TestPrescriptionsValue4:
157+
Type: String
158+
147159
Resources:
148160
Secrets:
149161
Type: AWS::Serverless::Application
@@ -233,6 +245,10 @@ Resources:
233245
Environment: !Ref Environment
234246
EnableBackup: !Ref EnableBackup
235247
RequireApplicationName: !Ref RequireApplicationName
248+
TestPrescriptions1: !Ref TestPrescriptionsValue1
249+
TestPrescriptions2: !Ref TestPrescriptionsValue2
250+
TestPrescriptions3: !Ref TestPrescriptionsValue3
251+
TestPrescriptions4: !Ref TestPrescriptionsValue4
236252

237253
StateMachines:
238254
Type: AWS::Serverless::Application

packages/common/middyErrorHandler/src/errorHandler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ class MiddyErrorHandler {
2727

2828
// if there are a `statusCode` and an `error` field
2929
// this is a valid http error object
30-
if (typeof logger[level] === "function") {
31-
logger[level](
30+
if (typeof (logger as Logger)[level] === "function") {
31+
(logger as Logger)[level](
3232
{
3333
error: ((e) => ({
3434
name: e.name,

packages/updatePrescriptionStatus/src/updatePrescriptionStatus.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ export const TEST_PRESCRIPTIONS_1 = (process.env.TEST_PRESCRIPTIONS_1 ?? "")
4444
.split(",").map(item => item.trim()) || []
4545
export const TEST_PRESCRIPTIONS_2 = (process.env.TEST_PRESCRIPTIONS_2 ?? "")
4646
.split(",").map(item => item.trim()) || []
47+
// AEA-5913 - Return 400
48+
export const TEST_PRESCRIPTIONS_3 = (process.env.TEST_PRESCRIPTIONS_3 ?? "")
49+
.split(",").map(item => item.trim()) || []
50+
// AEA-5913 - Return 429
51+
export const TEST_PRESCRIPTIONS_4 = (process.env.TEST_PRESCRIPTIONS_4 ?? "")
52+
.split(",").map(item => item.trim()) || []
4753

4854
// Fetching the parameters from SSM using a dedicated provider, so that the values can be cached
4955
// and reused across invocations, reducing the number of calls to SSM.
@@ -149,6 +155,22 @@ const lambdaHandler = async (event: APIGatewayProxyEvent): Promise<APIGatewayPro
149155
interceptionResponse = await testPrescription2Intercept(logger, matchingPrescription2ID, taskID)
150156
}
151157

158+
const testPrescription3Index = prescriptionIDs.findIndex((id) => TEST_PRESCRIPTIONS_3.includes(id))
159+
const isTestPrescription3 = testPrescription3Index !== -1
160+
if (isTestPrescription3) {
161+
logger.info("Forcing error for INT test prescription. Simulating failure to write to database.")
162+
responseEntries = [serverError()]
163+
return response(400, responseEntries)
164+
}
165+
166+
const testPrescription4Index = prescriptionIDs.findIndex((id) => TEST_PRESCRIPTIONS_4.includes(id))
167+
const isTestPrescription4 = testPrescription4Index !== -1
168+
if (isTestPrescription4) {
169+
logger.info("Forcing error for INT test prescription. Simulating PSU capacity failure.")
170+
responseEntries = [serverError()]
171+
return response(429, responseEntries)
172+
}
173+
152174
testPrescription1Forced201 = !!interceptionResponse.testPrescription1Forced201
153175
testPrescriptionForcedError = !!interceptionResponse.testPrescriptionForcedError
154176
}

packages/updatePrescriptionStatus/tests/testPrescriptionIntercept.test.ts

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import {
33
expect,
44
it,
55
describe,
6-
jest
6+
jest,
7+
beforeEach
78
} from "@jest/globals"
89
import {
910
DEFAULT_DATE,
@@ -175,3 +176,67 @@ describe("testPrescription2Intercept", () => {
175176
expectGetItemCommand(TASK_VALUES[3].prescriptionID, TASK_VALUES[3].id)
176177
})
177178
})
179+
180+
describe("testPrescription3Intercept", () => {
181+
beforeEach(() => {
182+
jest.useFakeTimers().setSystemTime(DEFAULT_DATE)
183+
jest.resetAllMocks()
184+
// Set TEST_PRESCRIPTIONS_3 only for these tests
185+
process.env.TEST_PRESCRIPTIONS_3 = ["abc", TASK_VALUES[2].prescriptionID, "def"].join(",")
186+
// Clear the module cache so it re-reads the env var
187+
jest.resetModules()
188+
})
189+
190+
afterEach(() => {
191+
// Clean up after each test to avoid affecting other test suites
192+
delete process.env.TEST_PRESCRIPTIONS_3
193+
// Clear module cache again to ensure clean state for other tests
194+
jest.resetModules()
195+
})
196+
197+
it("Return 400 when test prescription 3 is submitted", async () => {
198+
const body = generateBody(3)
199+
// Only include entries 0, 1, and 2. Entry 2 contains TASK_VALUES[2] which matches TEST_PRESCRIPTIONS_3
200+
const event: APIGatewayProxyEvent = generateMockEvent(body)
201+
202+
const {handler, logger} = await import("../src/updatePrescriptionStatus")
203+
const loggerInfo = jest.spyOn(logger, "info")
204+
const response: APIGatewayProxyResult = await handler(event, {})
205+
206+
expect(response.statusCode).toEqual(400)
207+
expect(loggerInfo).toHaveBeenCalledWith(
208+
"Forcing error for INT test prescription. Simulating failure to write to database.")
209+
})
210+
})
211+
212+
describe("testPrescription4Intercept", () => {
213+
beforeEach(() => {
214+
jest.useFakeTimers().setSystemTime(DEFAULT_DATE)
215+
jest.resetAllMocks()
216+
// Set TEST_PRESCRIPTIONS_4 only for these tests
217+
process.env.TEST_PRESCRIPTIONS_4 = ["abc", TASK_VALUES[2].prescriptionID, "def"].join(",")
218+
// Clear the module cache so it re-reads the env var
219+
jest.resetModules()
220+
})
221+
222+
afterEach(() => {
223+
// Clean up after each test to avoid affecting other test suites
224+
delete process.env.TEST_PRESCRIPTIONS_4
225+
// Clear module cache again to ensure clean state for other tests
226+
jest.resetModules()
227+
})
228+
229+
it("Return 400 when test prescription 4 is submitted", async () => {
230+
const body = generateBody(3)
231+
// Only include entries 0, 1, and 2. Entry 2 contains TASK_VALUES[2] which matches TEST_PRESCRIPTIONS_4
232+
const event: APIGatewayProxyEvent = generateMockEvent(body)
233+
234+
const {handler, logger} = await import("../src/updatePrescriptionStatus")
235+
const loggerInfo = jest.spyOn(logger, "info")
236+
const response: APIGatewayProxyResult = await handler(event, {})
237+
238+
expect(response.statusCode).toEqual(429)
239+
expect(loggerInfo).toHaveBeenCalledWith(
240+
"Forcing error for INT test prescription. Simulating PSU capacity failure.")
241+
})
242+
})

0 commit comments

Comments
 (0)