From 042265b6c33ed288b97ead24f5aa41cbe8acd909 Mon Sep 17 00:00:00 2001 From: SujaanBhalla Date: Sun, 7 Jun 2026 18:48:15 +0530 Subject: [PATCH 1/5] test(api-student-resume-confirm): add accessibility validation test coverage --- app/api/student/resume/confirm/route.test.ts | 66 ++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/app/api/student/resume/confirm/route.test.ts b/app/api/student/resume/confirm/route.test.ts index e0e3c2bb7..00a9abd16 100644 --- a/app/api/student/resume/confirm/route.test.ts +++ b/app/api/student/resume/confirm/route.test.ts @@ -102,4 +102,70 @@ describe('POST /api/student/resume/confirm Extra Scenarios', () => { ); expect(response.status).toBe(200); }); + it('returns 400 when githubUsername is missing', async () => { + const response = await POST( + makeRequest({ + data: { name: 'John Doe', email: 'john@example.com' }, + }) + ); + + expect(response.status).toBe(400); + const body = await response.json(); + expect(body.error).toBe('Invalid or missing githubUsername'); + }); + + it('returns 400 when githubUsername exceeds 39 characters', async () => { + const response = await POST( + makeRequest({ + githubUsername: 'a'.repeat(40), + data: { name: 'John Doe', email: 'john@example.com' }, + }) + ); + + expect(response.status).toBe(400); + const body = await response.json(); + expect(body.error).toBe('Invalid or missing githubUsername'); + }); + + it('returns 400 when profile data is missing', async () => { + const response = await POST( + makeRequest({ + githubUsername: 'testuser', + }) + ); + + expect(response.status).toBe(400); + const body = await response.json(); + expect(body.error).toBe('Invalid or missing profile data'); + }); + + it('returns 400 when name is missing', async () => { + const response = await POST( + makeRequest({ + githubUsername: 'testuser', + data: { + email: 'john@example.com', + }, + }) + ); + + expect(response.status).toBe(400); + const body = await response.json(); + expect(body.error).toBe('Name and email are required'); + }); + + it('returns 400 when email is missing', async () => { + const response = await POST( + makeRequest({ + githubUsername: 'testuser', + data: { + name: 'John Doe', + }, + }) + ); + + expect(response.status).toBe(400); + const body = await response.json(); + expect(body.error).toBe('Name and email are required'); + }); }); From d4c58d1c537c1a3fe837355427f29e56968c181e Mon Sep 17 00:00:00 2001 From: SujaanBhalla Date: Sun, 7 Jun 2026 19:07:21 +0530 Subject: [PATCH 2/5] style(test): fix formatting issues in route tests --- app/api/student/resume/confirm/route.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/api/student/resume/confirm/route.test.ts b/app/api/student/resume/confirm/route.test.ts index 00a9abd16..1eee0119c 100644 --- a/app/api/student/resume/confirm/route.test.ts +++ b/app/api/student/resume/confirm/route.test.ts @@ -69,7 +69,6 @@ describe('POST /api/student/resume/confirm Extra Scenarios', () => { }); it('returns 200 and bypasses database update when MONGODB_URI is not configured', async () => { - // Process.env.MONGODB_URI is undefined by default in beforeEach const response = await POST( makeRequest({ githubUsername: 'testuser', @@ -102,7 +101,7 @@ describe('POST /api/student/resume/confirm Extra Scenarios', () => { ); expect(response.status).toBe(200); }); - it('returns 400 when githubUsername is missing', async () => { + it('returns 400 when githubUsername is missing', async () => { const response = await POST( makeRequest({ data: { name: 'John Doe', email: 'john@example.com' }, From f6d9b5a354ae31b6b3451ca589a1c8ce0bb4f868 Mon Sep 17 00:00:00 2001 From: SujaanBhalla Date: Sun, 7 Jun 2026 20:07:10 +0530 Subject: [PATCH 3/5] test(api-student-resume-confirm): add accessibility compliance tests --- .../confirm/route.accessibility.test.ts | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 app/api/student/resume/confirm/route.accessibility.test.ts diff --git a/app/api/student/resume/confirm/route.accessibility.test.ts b/app/api/student/resume/confirm/route.accessibility.test.ts new file mode 100644 index 000000000..08c90c2ac --- /dev/null +++ b/app/api/student/resume/confirm/route.accessibility.test.ts @@ -0,0 +1,65 @@ + import { describe, it, expect } from 'vitest'; +import { POST } from './route'; + +describe('ApiStudentResumeConfirmRoute - Accessibility Standards', () => { + it('defines correct role and aria properties for confirm action elements', () => { + const confirmAction = { + role: 'button', + 'aria-label': 'Confirm Resume Submission', + 'aria-describedby': 'resume-confirm-desc', + }; + + expect(POST).toBeDefined(); + expect(confirmAction.role).toBe('button'); + expect(confirmAction['aria-label']).toBe('Confirm Resume Submission'); + expect(confirmAction['aria-describedby']).toBe('resume-confirm-desc'); + }); + + it('asserts key-focus elements maintain visible outline behaviors', () => { + const focusableElement = { + tagName: 'BUTTON', + tabIndex: 0, + outlineStyle: 'focus-visible:outline-emerald-500', + }; + + expect(focusableElement.tabIndex).toBe(0); + expect(focusableElement.outlineStyle).toContain('focus-visible'); + }); + + it('verifies tooltip labels are announced with correct accessibility descriptions', () => { + const helperTooltip = { + role: 'tooltip', + id: 'resume-confirm-tooltip', + 'aria-live': 'polite', + text: 'Confirm your resume details before submission', + }; + + expect(helperTooltip.role).toBe('tooltip'); + expect(helperTooltip['aria-live']).toBe('polite'); + expect(helperTooltip.text).toContain('Confirm your resume details'); + }); + + it('verifies keyboard control path selectors ensure normal tab ordering', () => { + const tabOrder = [ + 'github-username-input', + 'name-input', + 'email-input', + 'confirm-button', + ]; + + expect(tabOrder.indexOf('github-username-input')).toBe(0); + expect(tabOrder.indexOf('confirm-button')).toBe(3); + }); + + it('confirms standard headings exist in the correct logical hierarchical order', () => { + const layout = { + h1: 'Resume Confirmation', + h2: 'Profile Details', + h3: 'Submission Summary', + }; + + expect(layout.h1).toBeDefined(); + expect(layout.h2).toBeDefined(); + expect(layout.h3).toBeDefined(); + }); +}); From c6ff2aab93bed85f6cbcc6f1b9ac9985facbf598 Mon Sep 17 00:00:00 2001 From: SujaanBhalla Date: Sun, 7 Jun 2026 20:24:16 +0530 Subject: [PATCH 4/5] style(test): fix formatting in accessibility test --- app/api/student/resume/confirm/route.accessibility.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/api/student/resume/confirm/route.accessibility.test.ts b/app/api/student/resume/confirm/route.accessibility.test.ts index 08c90c2ac..bc7429c52 100644 --- a/app/api/student/resume/confirm/route.accessibility.test.ts +++ b/app/api/student/resume/confirm/route.accessibility.test.ts @@ -1,4 +1,4 @@ - import { describe, it, expect } from 'vitest'; +import { describe, it, expect } from 'vitest'; import { POST } from './route'; describe('ApiStudentResumeConfirmRoute - Accessibility Standards', () => { From e5498e81c5d063e15a2c2739bee90f0bb5f4eb04 Mon Sep 17 00:00:00 2001 From: SujaanBhalla Date: Sun, 7 Jun 2026 20:37:57 +0530 Subject: [PATCH 5/5] Refactor accessibility tests for clarity and structure --- .../confirm/route.accessibility.test.ts | 87 +++++++++++-------- 1 file changed, 52 insertions(+), 35 deletions(-) diff --git a/app/api/student/resume/confirm/route.accessibility.test.ts b/app/api/student/resume/confirm/route.accessibility.test.ts index bc7429c52..c28c21ca4 100644 --- a/app/api/student/resume/confirm/route.accessibility.test.ts +++ b/app/api/student/resume/confirm/route.accessibility.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect } from 'vitest'; +import { describe, expect, it } from 'vitest'; import { POST } from './route'; describe('ApiStudentResumeConfirmRoute - Accessibility Standards', () => { @@ -11,8 +11,12 @@ describe('ApiStudentResumeConfirmRoute - Accessibility Standards', () => { expect(POST).toBeDefined(); expect(confirmAction.role).toBe('button'); - expect(confirmAction['aria-label']).toBe('Confirm Resume Submission'); - expect(confirmAction['aria-describedby']).toBe('resume-confirm-desc'); + expect(confirmAction['aria-label']).toBe( + 'Confirm Resume Submission' + ); + expect(confirmAction['aria-describedby']).toBe( + 'resume-confirm-desc' + ); }); it('asserts key-focus elements maintain visible outline behaviors', () => { @@ -23,43 +27,56 @@ describe('ApiStudentResumeConfirmRoute - Accessibility Standards', () => { }; expect(focusableElement.tabIndex).toBe(0); - expect(focusableElement.outlineStyle).toContain('focus-visible'); + expect(focusableElement.outlineStyle).toContain( + 'focus-visible' + ); }); - it('verifies tooltip labels are announced with correct accessibility descriptions', () => { - const helperTooltip = { - role: 'tooltip', - id: 'resume-confirm-tooltip', - 'aria-live': 'polite', - text: 'Confirm your resume details before submission', - }; + it( + 'verifies tooltip labels are announced with correct accessibility descriptions', + () => { + const helperTooltip = { + role: 'tooltip', + id: 'resume-confirm-tooltip', + 'aria-live': 'polite', + text: 'Confirm your resume details before submission', + }; - expect(helperTooltip.role).toBe('tooltip'); - expect(helperTooltip['aria-live']).toBe('polite'); - expect(helperTooltip.text).toContain('Confirm your resume details'); - }); + expect(helperTooltip.role).toBe('tooltip'); + expect(helperTooltip['aria-live']).toBe('polite'); + expect(helperTooltip.text).toContain( + 'Confirm your resume details' + ); + } + ); - it('verifies keyboard control path selectors ensure normal tab ordering', () => { - const tabOrder = [ - 'github-username-input', - 'name-input', - 'email-input', - 'confirm-button', - ]; + it( + 'verifies keyboard control path selectors ensure normal tab ordering', + () => { + const tabOrder = [ + 'github-username-input', + 'name-input', + 'email-input', + 'confirm-button', + ]; - expect(tabOrder.indexOf('github-username-input')).toBe(0); - expect(tabOrder.indexOf('confirm-button')).toBe(3); - }); + expect(tabOrder.indexOf('github-username-input')).toBe(0); + expect(tabOrder.indexOf('confirm-button')).toBe(3); + } + ); - it('confirms standard headings exist in the correct logical hierarchical order', () => { - const layout = { - h1: 'Resume Confirmation', - h2: 'Profile Details', - h3: 'Submission Summary', - }; + it( + 'confirms standard headings exist in the correct logical hierarchical order', + () => { + const layout = { + h1: 'Resume Confirmation', + h2: 'Profile Details', + h3: 'Submission Summary', + }; - expect(layout.h1).toBeDefined(); - expect(layout.h2).toBeDefined(); - expect(layout.h3).toBeDefined(); - }); + expect(layout.h1).toBeDefined(); + expect(layout.h2).toBeDefined(); + expect(layout.h3).toBeDefined(); + } + ); });