Skip to content

Commit 0bb94f4

Browse files
committed
test(api validation): check query validation boundaries for ?layout= parameter (Variation 4) (JhaSourav07#1456)
1 parent e6b5723 commit 0bb94f4

2 files changed

Lines changed: 83 additions & 1 deletion

File tree

app/api/streak/route.test.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,21 @@ describe('GET /api/streak', () => {
149149
expect(response.status).toBe(400);
150150
const body = await response.json();
151151
expect(body.error).toBe('Invalid parameters');
152-
expect(body.details).not.toBeNull();
152+
});
153+
154+
it('returns 400 Bad Request when ?layout= is set to an unsupported format (Variation 4)', async () => {
155+
const response = await GET(
156+
makeRequest({
157+
user: 'octocat',
158+
layout: 'unsupported_layout',
159+
})
160+
);
161+
162+
expect(response.status).toBe(400);
163+
const body = await response.json();
164+
expect(body.details.fieldErrors.layout[0]).toContain(
165+
'Invalid layout format. Supported values: default, compact, full.'
166+
);
153167
});
154168

155169
it('returns 400 when the user parameter is missing', async () => {

lib/validations.test.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,3 +1118,71 @@ describe('streakParamsSchema — date query validation boundaries (Variation 4)'
11181118
expect(result.success).toBe(true);
11191119
});
11201120
});
1121+
1122+
/* ==========================================================================
1123+
* LAYOUT PARAMETER — QUERY VALIDATION BOUNDARIES (VARIATION 4)
1124+
* ========================================================================== */
1125+
1126+
describe('streakParamsSchema — layout query validation boundaries (Variation 4)', () => {
1127+
it('rejects unsupported_layout and marks the parse as failed', () => {
1128+
const result = streakParamsSchema.safeParse({
1129+
user: 'octocat',
1130+
layout: 'unsupported_layout',
1131+
});
1132+
1133+
expect(result.success).toBe(false);
1134+
});
1135+
1136+
it('surfaces a meaningful error message for unsupported_layout', () => {
1137+
const result = streakParamsSchema.safeParse({
1138+
user: 'octocat',
1139+
layout: 'unsupported_layout',
1140+
});
1141+
1142+
expect(result.success).toBe(false);
1143+
if (!result.success) {
1144+
const messages = result.error.issues.map((i) => i.message).join(' ');
1145+
expect(messages).toContain(
1146+
'Invalid layout format. Supported values: default, compact, full.'
1147+
);
1148+
}
1149+
});
1150+
1151+
it('accepts "default" as a valid layout value', () => {
1152+
const result = streakParamsSchema.safeParse({
1153+
user: 'octocat',
1154+
layout: 'default',
1155+
});
1156+
1157+
expect(result.success).toBe(true);
1158+
});
1159+
1160+
it('accepts "compact" as a valid layout value', () => {
1161+
const result = streakParamsSchema.safeParse({
1162+
user: 'octocat',
1163+
layout: 'compact',
1164+
});
1165+
1166+
expect(result.success).toBe(true);
1167+
});
1168+
1169+
it('accepts "full" as a valid layout value', () => {
1170+
const result = streakParamsSchema.safeParse({
1171+
user: 'octocat',
1172+
layout: 'full',
1173+
});
1174+
1175+
expect(result.success).toBe(true);
1176+
});
1177+
1178+
it('treats omitted layout as undefined (no validation error)', () => {
1179+
const result = streakParamsSchema.safeParse({
1180+
user: 'octocat',
1181+
});
1182+
1183+
expect(result.success).toBe(true);
1184+
if (result.success) {
1185+
expect(result.data.layout).toBeUndefined();
1186+
}
1187+
});
1188+
});

0 commit comments

Comments
 (0)