馃 distributed transcription service thistle.dunkirk.sh
1import { expect, test } from "bun:test"; 2import { 3 validateClassId, 4 validateCourseCode, 5 validateCourseName, 6 validateEmail, 7 validateName, 8 validatePasswordHash, 9 validateSemester, 10 validateYear, 11} from "./validation"; 12 13test("validateEmail accepts valid emails", () => { 14 expect(validateEmail("test@example.com").valid).toBe(true); 15 expect(validateEmail("user.name+tag@example.co.uk").valid).toBe(true); 16 expect(validateEmail("test@subdomain.example.com").valid).toBe(true); 17}); 18 19test("validateEmail rejects invalid emails", () => { 20 expect(validateEmail("").valid).toBe(false); 21 expect(validateEmail("not-an-email").valid).toBe(false); 22 expect(validateEmail("@example.com").valid).toBe(false); 23 expect(validateEmail("test@").valid).toBe(false); 24 expect(validateEmail("a".repeat(321)).valid).toBe(false); // Too long 25 expect(validateEmail(123).valid).toBe(false); // Not a string 26}); 27 28test("validateName accepts valid names", () => { 29 expect(validateName("John Doe").valid).toBe(true); 30 expect(validateName("Alice").valid).toBe(true); 31 expect(validateName("Mar铆a Garc铆a").valid).toBe(true); 32}); 33 34test("validateName rejects invalid names", () => { 35 expect(validateName("").valid).toBe(false); 36 expect(validateName(" ").valid).toBe(false); // Whitespace only 37 expect(validateName("a".repeat(256)).valid).toBe(false); // Too long 38 expect(validateName(123).valid).toBe(false); // Not a string 39}); 40 41test("validatePasswordHash accepts valid PBKDF2 hashes", () => { 42 const validHash = "a".repeat(64); // 64 char hex string 43 expect(validatePasswordHash(validHash).valid).toBe(true); 44 expect(validatePasswordHash("0123456789abcdef".repeat(4)).valid).toBe(true); 45}); 46 47test("validatePasswordHash rejects invalid hashes", () => { 48 expect(validatePasswordHash("short").valid).toBe(false); 49 expect(validatePasswordHash("a".repeat(63)).valid).toBe(false); // Too short 50 expect(validatePasswordHash("a".repeat(65)).valid).toBe(false); // Too long 51 expect(validatePasswordHash("g".repeat(64)).valid).toBe(false); // Invalid hex 52 expect(validatePasswordHash(123).valid).toBe(false); // Not a string 53}); 54 55test("validateCourseCode accepts valid course codes", () => { 56 expect(validateCourseCode("CS101").valid).toBe(true); 57 expect(validateCourseCode("MATH 2410").valid).toBe(true); 58 expect(validateCourseCode("BIO-101").valid).toBe(true); 59}); 60 61test("validateCourseCode rejects invalid course codes", () => { 62 expect(validateCourseCode("").valid).toBe(false); 63 expect(validateCourseCode(" ").valid).toBe(false); 64 expect(validateCourseCode("a".repeat(51)).valid).toBe(false); // Too long 65 expect(validateCourseCode(123).valid).toBe(false); // Not a string 66}); 67 68test("validateCourseName accepts valid course names", () => { 69 expect(validateCourseName("Introduction to Computer Science").valid).toBe( 70 true, 71 ); 72 expect(validateCourseName("Calculus I").valid).toBe(true); 73}); 74 75test("validateCourseName rejects invalid course names", () => { 76 expect(validateCourseName("").valid).toBe(false); 77 expect(validateCourseName(" ").valid).toBe(false); 78 expect(validateCourseName("a".repeat(501)).valid).toBe(false); // Too long 79 expect(validateCourseName(123).valid).toBe(false); // Not a string 80}); 81 82test("validateSemester accepts valid semesters", () => { 83 expect(validateSemester("Fall").valid).toBe(true); 84 expect(validateSemester("spring").valid).toBe(true); // Case insensitive 85 expect(validateSemester("SUMMER").valid).toBe(true); 86 expect(validateSemester("Winter").valid).toBe(true); 87}); 88 89test("validateSemester rejects invalid semesters", () => { 90 expect(validateSemester("").valid).toBe(false); 91 expect(validateSemester("Invalid").valid).toBe(false); 92 expect(validateSemester("Autumn").valid).toBe(false); 93 expect(validateSemester(123).valid).toBe(false); // Not a string 94}); 95 96test("validateYear accepts valid years", () => { 97 const currentYear = new Date().getFullYear(); 98 expect(validateYear(currentYear).valid).toBe(true); 99 expect(validateYear(2024).valid).toBe(true); 100 expect(validateYear(currentYear + 1).valid).toBe(true); 101}); 102 103test("validateYear rejects invalid years", () => { 104 expect(validateYear(1999).valid).toBe(false); // Too old 105 expect(validateYear(2050).valid).toBe(false); // Too far in future 106 expect(validateYear("2024").valid).toBe(false); // Not a number 107}); 108 109test("validateClassId accepts valid class IDs", () => { 110 expect(validateClassId("abc123").valid).toBe(true); 111 expect(validateClassId("class-2024-fall").valid).toBe(true); 112}); 113 114test("validateClassId rejects invalid class IDs", () => { 115 expect(validateClassId("").valid).toBe(false); 116 expect(validateClassId("a".repeat(101)).valid).toBe(false); // Too long 117 expect(validateClassId(123).valid).toBe(false); // Not a string 118});