馃 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});