Skip to content

Commit cb6b37d

Browse files
committed
add component tests for get mi
1 parent f515753 commit cb6b37d

3 files changed

Lines changed: 154 additions & 1 deletion

File tree

tests/component-tests/apiGateway-tests/create-mi.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ test.beforeAll(async () => {
2525
baseUrl = await getRestApiGatewayBaseUrl();
2626
});
2727

28-
test.describe("API Gateway Tests to Verify Mi Endpoint", () => {
28+
test.describe("API Gateway Tests to Verify create MI Endpoint", () => {
2929
test(`Post /mi returns 200 when a valid request is passed`, async ({
3030
request,
3131
}) => {
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import { expect, test } from "@playwright/test";
2+
import {
3+
createHeaderWithNoCorrelationId,
4+
createInvalidRequestHeaders,
5+
createValidRequestHeaders,
6+
} from "../../constants/request-headers";
7+
import getRestApiGatewayBaseUrl from "../../helpers/aws-gateway-helper";
8+
import {
9+
getMI,
10+
isErrorResponse,
11+
isGetMIResponse,
12+
} from "../../helpers/generate-fetch-test-data";
13+
import { miValidRequest } from "./testCases/create-mi";
14+
import { MI_ENDPOINT } from "tests/constants/api-constants";
15+
16+
let baseUrl: string;
17+
let insertedId: string;
18+
let insertedTimestamp: string;
19+
20+
test.beforeAll(async ( { request }) => {
21+
baseUrl = await getRestApiGatewayBaseUrl();
22+
const headers = createValidRequestHeaders();
23+
const body = miValidRequest();
24+
25+
const response = await request.post(`${baseUrl}/${MI_ENDPOINT}`, {
26+
headers,
27+
data: body,
28+
});
29+
30+
const miResponseBody = await response.json();
31+
insertedId = miResponseBody.data.id;
32+
insertedTimestamp = miResponseBody.data.attributes.timestamp;
33+
});
34+
35+
test.describe("API Gateway Tests To Get MI data", () => {
36+
test("GET /mi should return 200 and MI data for specified id", async ({ request }) => {
37+
const headers = createValidRequestHeaders();
38+
const { responseBody, statusCode } = await getMI(
39+
insertedId,
40+
request,
41+
baseUrl,
42+
headers,
43+
);
44+
45+
expect(statusCode).toBe(200);
46+
if (!isGetMIResponse(responseBody)) {
47+
throw new Error("Expected GetMIResponse body for 200 status");
48+
}
49+
expect(responseBody.data.attributes).toMatchObject({
50+
groupId: "group123",
51+
lineItem: "envelope-business-standard",
52+
quantity: 10,
53+
specificationId: "Test-Spec-Id",
54+
stockRemaining: 100,
55+
timestamp: insertedTimestamp,
56+
});
57+
expect(responseBody.data.type).toBe("ManagementInformation");
58+
});
59+
60+
test("GET /mi with invalid authentication should return 403", async ({
61+
request,
62+
}) => {
63+
const headers = createInvalidRequestHeaders();
64+
const { responseBody, statusCode } = await getMI(
65+
insertedId,
66+
request,
67+
baseUrl,
68+
headers,
69+
);
70+
expect(statusCode).toBe(403);
71+
expect(responseBody).toMatchObject({
72+
Message:
73+
"User is not authorized to access this resource with an explicit deny in an identity-based policy",
74+
});
75+
});
76+
77+
test("GET /mi with empty correlationId should return 500", async ({
78+
request,
79+
}) => {
80+
const headers = createHeaderWithNoCorrelationId();
81+
const { responseBody, statusCode } = await getMI(
82+
insertedId,
83+
request,
84+
baseUrl,
85+
headers,
86+
);
87+
expect(statusCode).toBe(500);
88+
if (!isErrorResponse(responseBody)) {
89+
throw new Error("Expected ErrorResponse body for 500 status");
90+
}
91+
expect(responseBody.errors[0].code).toBe("NOTIFY_INTERNAL_SERVER_ERROR");
92+
expect(responseBody.errors[0].detail).toBe("Unexpected error");
93+
});
94+
});

tests/helpers/generate-fetch-test-data.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
GET_LETTERS_MAX_RETRIES,
1313
LETTERQUEUE_TABLENAME,
1414
LETTERSTABLENAME,
15+
MI_ENDPOINT,
1516
SUPPLIERTABLENAME,
1617
SUPPLIER_LETTERS,
1718
VISIBILITY_TIMEOUT_SECONDS,
@@ -23,6 +24,7 @@ import {
2324
GetLettersResponse,
2425
GetLettersResponseSchema,
2526
} from "../../lambdas/api-handler/src/contracts/letters";
27+
import { GetMIResponse, GetMIResponseSchema } from "../../lambdas/api-handler/src/contracts/mi";
2628
import { ErrorResponse } from "../../lambdas/api-handler/src/contracts/errors";
2729

2830
const ddb = new DynamoDBClient({});
@@ -117,12 +119,28 @@ type FetchLettersWithRetryResult = {
117119
responseBody: GetLettersResponseBody;
118120
};
119121

122+
type GetMIResponseBody =
123+
| GetMIResponse
124+
| ErrorResponse
125+
| Record<string, unknown>;
126+
127+
type FetchMiResult = {
128+
statusCode: number;
129+
responseBody: GetMIResponseBody;
130+
};
131+
120132
export function isGetLettersResponse(
121133
responseBody: GetLettersResponseBody,
122134
): responseBody is GetLettersResponse {
123135
return GetLettersResponseSchema.safeParse(responseBody).success;
124136
}
125137

138+
export function isGetMIResponse(
139+
responseBody: GetMIResponseBody,
140+
): responseBody is GetMIResponse {
141+
return GetMIResponseSchema.safeParse(responseBody).success;
142+
}
143+
126144
export function isErrorResponse(
127145
responseBody: GetLettersResponseBody,
128146
): responseBody is ErrorResponse {
@@ -148,6 +166,22 @@ function parseGetLettersResponseBody(
148166
return parsedBody as Record<string, unknown>;
149167
}
150168

169+
function parseGetMIResponseBody(
170+
parsedBody: unknown,
171+
): GetMIResponseBody {
172+
const parsedGetMIResponse =
173+
GetMIResponseSchema.safeParse(parsedBody);
174+
if (parsedGetMIResponse.success) {
175+
return parsedGetMIResponse.data;
176+
}
177+
178+
if (isErrorResponse(parsedBody as GetMIResponseBody)) {
179+
return parsedBody as ErrorResponse;
180+
}
181+
182+
return parsedBody as Record<string, unknown>;
183+
}
184+
151185
function shouldRetryGetLettersRequest(
152186
waitForVisibilityTimeout: boolean,
153187
statusCode: number,
@@ -207,6 +241,31 @@ export async function getLettersWithRetry(
207241
throw new Error("Unexpectedly exhausted GET /letters retries");
208242
}
209243

244+
export async function getMI(
245+
miId: string,
246+
request: APIRequestContext,
247+
baseUrl: string,
248+
headers: Record<string, string>,
249+
): Promise<FetchMiResult> { // change retrun type to FetchMiResult and create new type if the response body shape is different to the get letters response, currently reusing as the response shapes are the same and to avoid code duplication
250+
251+
const executeGetMiRequest =
252+
() =>
253+
request.get(`${baseUrl}/${MI_ENDPOINT}`, {
254+
headers,
255+
params: {
256+
miId,
257+
},
258+
});
259+
260+
const response = await executeGetMiRequest();
261+
const statusCode = response.status();
262+
263+
const parsedBody = (await response.json()) as unknown;
264+
const responseBody = parseGetMIResponseBody(parsedBody);
265+
return { statusCode, responseBody };
266+
}
267+
268+
210269
export async function waitForLetterStatus(
211270
supplierId: string,
212271
id: string,

0 commit comments

Comments
 (0)