this repo has no description
at main 8.4 kB view raw
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});