Skip to content
This repository was archived by the owner on May 18, 2025. It is now read-only.

Commit 7771ad7

Browse files
feat(auth): update academic number validation to accept 5, 6, or 13 digits
1 parent 583686b commit 7771ad7

File tree

3 files changed

+67
-10
lines changed

3 files changed

+67
-10
lines changed

src/utils/api/signup/validateSignupForm.test.ts

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
/**
2+
* To run these tests:
3+
* - Run this file test: pnpm test validateSignupForm
4+
* - Run with coverage: pnpm test validateSignupForm -- --coverage
5+
* - Run in watch mode: pnpm test validateSignupForm -- --watch
6+
*/
7+
18
import { Department, Level } from "@/types";
29
import validateSignupForm, { SignupFormData } from "./validateSignupForm";
310
import RESPONSE_MESSAGES from "../../constants/RESPONSE_MESSAGES";
@@ -52,25 +59,61 @@ describe("validateSignupForm", () => {
5259
expect(errors.academicNumber).toBe(RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_REQUIRED);
5360
});
5461

55-
it("should validate academic number length", () => {
62+
it("should validate academic number type", () => {
5663
const data = createValidFormData();
57-
data.academicNumber = "12345";
64+
data.academicNumber = 12345 as any;
5865
const errors = validateSignupForm(data);
59-
expect(errors.academicNumber).toBe(RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_LENGTH);
66+
expect(errors.academicNumber).toBe(RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_NOT_STRING);
6067
});
6168

62-
it("should validate academic number format", () => {
69+
it("should validate academic number format (only numbers)", () => {
6370
const data = createValidFormData();
64-
data.academicNumber = "123abc4567890";
71+
data.academicNumber = "123abc45";
6572
const errors = validateSignupForm(data);
6673
expect(errors.academicNumber).toBe(RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_ONLY_NUMBERS);
6774
});
6875

69-
it("should accept valid academic number", () => {
76+
it("should validate academic number length (5 digits)", () => {
7077
const data = createValidFormData();
78+
data.academicNumber = "12345";
7179
const errors = validateSignupForm(data);
7280
expect(errors.academicNumber).toBeUndefined();
7381
});
82+
83+
it("should validate academic number length (6 digits)", () => {
84+
const data = createValidFormData();
85+
data.academicNumber = "123456";
86+
const errors = validateSignupForm(data);
87+
expect(errors.academicNumber).toBeUndefined();
88+
});
89+
90+
it("should validate academic number length (13 digits)", () => {
91+
const data = createValidFormData();
92+
data.academicNumber = "1234567890123";
93+
const errors = validateSignupForm(data);
94+
expect(errors.academicNumber).toBeUndefined();
95+
});
96+
97+
it("should reject academic number with invalid length (4 digits)", () => {
98+
const data = createValidFormData();
99+
data.academicNumber = "1234";
100+
const errors = validateSignupForm(data);
101+
expect(errors.academicNumber).toBe(RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_LENGTH);
102+
});
103+
104+
it("should reject academic number with invalid length (7 digits)", () => {
105+
const data = createValidFormData();
106+
data.academicNumber = "1234567";
107+
const errors = validateSignupForm(data);
108+
expect(errors.academicNumber).toBe(RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_LENGTH);
109+
});
110+
111+
it("should reject academic number with invalid length (14 digits)", () => {
112+
const data = createValidFormData();
113+
data.academicNumber = "12345678901234";
114+
const errors = validateSignupForm(data);
115+
expect(errors.academicNumber).toBe(RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_LENGTH);
116+
});
74117
});
75118

76119
describe("Email Validation", () => {

src/utils/api/signup/validateSignupForm.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,16 @@ export const validateSignupForm = (values: Partial<SignupFormData>) => {
3131
}
3232

3333
// Academic number validation
34-
if (!values.academicNumber?.trim()) {
34+
if (!values.academicNumber) {
35+
errors.academicNumber = RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_REQUIRED;
36+
} else if (typeof values.academicNumber !== 'string') {
37+
errors.academicNumber = RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_NOT_STRING;
38+
} else if (!values.academicNumber.trim()) {
3539
errors.academicNumber = RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_REQUIRED;
36-
} else if (values.academicNumber.length !== 13) {
37-
errors.academicNumber = RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_LENGTH;
3840
} else if (!/^\d+$/.test(values.academicNumber)) {
3941
errors.academicNumber = RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_ONLY_NUMBERS;
42+
} else if (!/^\d{5}$|^\d{6}$|^\d{13}$/.test(values.academicNumber)) {
43+
errors.academicNumber = RESPONSE_MESSAGES.signup.VALIDATIONS.ACADEMIC_LENGTH;
4044
}
4145

4246
// Username validation
@@ -91,6 +95,15 @@ export const validateSignupForm = (values: Partial<SignupFormData>) => {
9195
}
9296
}
9397

98+
// Email validation
99+
if (!values.email?.trim()) {
100+
errors.email = RESPONSE_MESSAGES.signup.VALIDATIONS.EMAIL_REQUIRED;
101+
} else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(values.email)) {
102+
errors.email = RESPONSE_MESSAGES.signup.VALIDATIONS.EMAIL_INVALID;
103+
} else if (values.email.length > 255) {
104+
errors.email = RESPONSE_MESSAGES.signup.VALIDATIONS.EMAIL_TOO_LONG;
105+
}
106+
94107
return errors;
95108
};
96109

src/utils/constants/RESPONSE_MESSAGES.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ const RESPONSE_MESSAGES = {
2727
NAME_TOO_SHORT: "يجب أن يحتوي الاسم على 3 أحرف على الأقل",
2828
NAME_TOO_LONG: "يجب أن لا يتجاوز الاسم 100 حرف",
2929
ACADEMIC_REQUIRED: "الرقم الأكاديمي مطلوب",
30-
ACADEMIC_LENGTH: "يجب أن يتكون الرقم الأكاديمي من 13 رقم",
30+
ACADEMIC_NOT_STRING: "يجب أن يكون الرقم الأكاديمي نصاً",
31+
ACADEMIC_LENGTH: "يجب أن يتكون الرقم الأكاديمي من 5 أو 6 أو 13 رقم",
3132
ACADEMIC_ONLY_NUMBERS: "يجب أن يحتوي الرقم الأكاديمي على أرقام فقط",
3233
EMAIL_REQUIRED: "البريد الإلكتروني مطلوب",
3334
EMAIL_INVALID: "يرجى إدخال بريد إلكتروني صالح",

0 commit comments

Comments
 (0)