this repo has no description
1import { describe, test, expect } from "bun:test";
2import { EmailClassifier } from "./classifier.ts";
3import type { EmailInput } from "./types.ts";
4
5const classifier = new EmailClassifier();
6
7function createEmail(subject: string, body: string = "", from: string = "test@college.edu"): EmailInput {
8 return {
9 subject,
10 body,
11 from,
12 to: "student@example.com",
13 cc: ""
14 };
15}
16
17describe("EmailClassifier - Security", () => {
18 test("should flag password reset as relevant", () => {
19 const email = createEmail("Password Reset Required", "Your password needs to be reset immediately");
20 const result = classifier.classify(email);
21 expect(result.pertains).toBe(true);
22 expect(result.matched_rules).toContain("security_alert");
23 });
24
25 test("should flag account locked as relevant", () => {
26 const email = createEmail("Account Locked", "Your account has been locked due to suspicious activity");
27 const result = classifier.classify(email);
28 expect(result.pertains).toBe(true);
29 });
30
31 test("should flag verification code as relevant", () => {
32 const email = createEmail("Your verification code", "Here is your verification code: 123456");
33 const result = classifier.classify(email);
34 expect(result.pertains).toBe(true);
35 });
36});
37
38describe("EmailClassifier - Student Actions", () => {
39 test("should flag application received as relevant", () => {
40 const email = createEmail("Application Received", "Thank you for submitting your application");
41 const result = classifier.classify(email);
42 expect(result.pertains).toBe(true);
43 expect(result.matched_rules).toContain("student_action_confirmation");
44 });
45
46 test("should flag enrollment confirmation as relevant", () => {
47 const email = createEmail("Enrollment Confirmation", "Your enrollment has been confirmed");
48 const result = classifier.classify(email);
49 expect(result.pertains).toBe(true);
50 });
51
52 test("should NOT flag 'how to apply' as relevant", () => {
53 const email = createEmail("How to Apply", "Learn how to apply to our university");
54 const result = classifier.classify(email);
55 expect(result.pertains).toBe(false);
56 });
57});
58
59describe("EmailClassifier - Accepted Students", () => {
60 test("should flag accepted portal as relevant", () => {
61 const email = createEmail("Your Accepted Portal Is Ready", "Access your personalized accepted student portal");
62 const result = classifier.classify(email);
63 expect(result.pertains).toBe(true);
64 expect(result.matched_rules).toContain("accepted_student");
65 });
66
67 test("should flag deposit reminder as relevant", () => {
68 const email = createEmail("Deposit Today To Reserve Your Place", "Submit your enrollment deposit");
69 const result = classifier.classify(email);
70 expect(result.pertains).toBe(true);
71 });
72});
73
74describe("EmailClassifier - Dual Enrollment", () => {
75 test("should flag course registration as relevant", () => {
76 const email = createEmail("Spring 2026 Course Registration", "How to register for your dual enrollment courses");
77 const result = classifier.classify(email);
78 expect(result.pertains).toBe(true);
79 expect(result.matched_rules).toContain("dual_enrollment");
80 });
81
82 test("should flag course deletion as relevant", () => {
83 const email = createEmail("Course Deletion Notice", "Your Spring 2026 course has been deleted", "cedarville.edu");
84 const result = classifier.classify(email);
85 expect(result.pertains).toBe(true);
86 });
87
88 test("should NOT flag dual enrollment marketing as relevant", () => {
89 const email = createEmail("Interested in Dual Enrollment?", "Learn more about our dual enrollment program");
90 const result = classifier.classify(email);
91 expect(result.pertains).toBe(false);
92 });
93});
94
95describe("EmailClassifier - Scholarships", () => {
96 test("should flag awarded scholarship as relevant", () => {
97 const email = createEmail("Congratulations! Scholarship Awarded", "You have received a $5000 scholarship");
98 const result = classifier.classify(email);
99 expect(result.pertains).toBe(true);
100 expect(result.matched_rules).toContain("scholarship_awarded");
101 });
102
103 test("should NOT flag scholarship held/reserved as relevant", () => {
104 const email = createEmail("Scholarship Reserved For You", "A scholarship is being held for you. Apply now!");
105 const result = classifier.classify(email);
106 expect(result.pertains).toBe(false);
107 expect(result.matched_rules).toContain("scholarship_not_awarded");
108 });
109
110 test("should NOT flag scholarship consideration as relevant", () => {
111 const email = createEmail("Scholarship Consideration", "You are eligible for scholarship consideration");
112 const result = classifier.classify(email);
113 expect(result.pertains).toBe(false);
114 });
115
116 test("should flag specific scholarship application as relevant", () => {
117 const email = createEmail("Apply for the President's Ministry Impact Scholarship", "");
118 const result = classifier.classify(email);
119 expect(result.pertains).toBe(true);
120 });
121});
122
123describe("EmailClassifier - Financial Aid", () => {
124 test("should flag aid offer ready as relevant", () => {
125 const email = createEmail("Financial Aid Offer Ready", "Your award letter is available to view");
126 const result = classifier.classify(email);
127 expect(result.pertains).toBe(true);
128 expect(result.matched_rules).toContain("financial_aid_ready");
129 });
130
131 test("should NOT flag FAFSA reminder as relevant", () => {
132 const email = createEmail("Complete Your FAFSA", "Don't forget to complete your FAFSA application");
133 const result = classifier.classify(email);
134 expect(result.pertains).toBe(false);
135 });
136
137 test("should NOT flag aid application info as relevant", () => {
138 const email = createEmail("Learn More About Financial Aid", "Apply for financial aid today");
139 const result = classifier.classify(email);
140 expect(result.pertains).toBe(false);
141 });
142});
143
144describe("EmailClassifier - Irrelevant Marketing", () => {
145 test("should flag blog posts as not relevant", () => {
146 const email = createEmail("Student Life Blog: K9s at the Ville", "Discover one of Cedarville's student ministries!");
147 const result = classifier.classify(email);
148 expect(result.pertains).toBe(false);
149 expect(result.matched_rules).toContain("irrelevant_marketing");
150 });
151
152 test("should flag newsletters as not relevant", () => {
153 const email = createEmail("Weekly Newsletter", "Check out what's happening on campus");
154 const result = classifier.classify(email);
155 expect(result.pertains).toBe(false);
156 });
157
158 test("should flag unsolicited outreach as not relevant", () => {
159 const email = createEmail("How Is Your College Search Going?", "Even though you haven't applied to our university yet...");
160 const result = classifier.classify(email);
161 expect(result.pertains).toBe(false);
162 });
163
164 test("should flag priority deadline extensions as not relevant", () => {
165 const email = createEmail("We've extended our priority deadline!", "The priority deadline has been extended to January 15");
166 const result = classifier.classify(email);
167 expect(result.pertains).toBe(false);
168 });
169
170 test("should flag summer camps as not relevant", () => {
171 const email = createEmail("Summer Academy: Save the Date", "Join us for Wildcat Summer Academy!");
172 const result = classifier.classify(email);
173 expect(result.pertains).toBe(false);
174 });
175
176 test("should flag ugly sweater emails as not relevant", () => {
177 const email = createEmail("⛷️ It's ugly sweater season!", "");
178 const result = classifier.classify(email);
179 expect(result.pertains).toBe(false);
180 });
181});
182
183describe("EmailClassifier - Edge Cases", () => {
184 test("should default to not relevant for unclear emails", () => {
185 const email = createEmail("Hello", "Just saying hi");
186 const result = classifier.classify(email);
187 expect(result.pertains).toBe(false);
188 expect(result.confidence).toBeLessThan(0.5);
189 });
190
191 test("should handle empty body", () => {
192 const email = createEmail("Test Subject", "");
193 const result = classifier.classify(email);
194 expect(result).toBeDefined();
195 });
196
197 test("should handle empty subject", () => {
198 const email = createEmail("", "Test body content");
199 const result = classifier.classify(email);
200 expect(result).toBeDefined();
201 });
202});