Spaces:
Sleeping
Sleeping
| """ | |
| Unit tests for profanity detector | |
| """ | |
| import unittest | |
| from src.profanity_detector import ProfanityDetector | |
| class TestProfanityDetector(unittest.TestCase): | |
| """Test cases for ProfanityDetector class""" | |
| def setUp(self): | |
| """Set up test fixtures""" | |
| self.detector = ProfanityDetector() | |
| def test_detects_basic_profanity(self): | |
| """Test detection of common profanity""" | |
| self.assertTrue(self.detector.is_profane("This is bullshit")) | |
| self.assertTrue(self.detector.is_profane("damn this")) | |
| self.assertFalse(self.detector.is_profane("This is great")) | |
| self.assertFalse(self.detector.is_profane("Hello world")) | |
| def test_detects_leetspeak(self): | |
| """Test detection of leetspeak variants""" | |
| self.assertTrue(self.detector.is_profane("sh1t happens")) | |
| self.assertTrue(self.detector.is_profane("b*tch please")) | |
| def test_empty_text(self): | |
| """Test handling of empty text""" | |
| self.assertFalse(self.detector.is_profane("")) | |
| self.assertFalse(self.detector.is_profane(" ")) | |
| self.assertIsNone(self.detector.detect_violations("")) | |
| def test_violation_details(self): | |
| """Test detailed violation information""" | |
| violation = self.detector.detect_violations("damn this shit") | |
| self.assertIsNotNone(violation) | |
| self.assertEqual(violation['detected'], True) | |
| self.assertTrue(len(violation['violations']) > 0) | |
| self.assertIn('severity', violation) | |
| self.assertIn('censored_text', violation) | |
| self.assertIn('violation_count', violation) | |
| def test_no_violation(self): | |
| """Test clean text returns None""" | |
| violation = self.detector.detect_violations("This is a nice message") | |
| self.assertIsNone(violation) | |
| def test_whitelist(self): | |
| """Test whitelist functionality""" | |
| detector_with_whitelist = ProfanityDetector(whitelist=['arsenal', 'scunthorpe']) | |
| self.assertFalse(detector_with_whitelist.is_profane("I love arsenal")) | |
| self.assertFalse(detector_with_whitelist.is_profane("Scunthorpe is a town")) | |
| def test_severity_calculation(self): | |
| """Test severity level calculation""" | |
| # Single violation = low | |
| violation_low = self.detector.detect_violations("shit") | |
| self.assertIsNotNone(violation_low) | |
| self.assertEqual(violation_low['severity'], 'low') | |
| # Multiple violations = higher severity | |
| violation_multiple = self.detector.detect_violations("shit damn") | |
| self.assertIsNotNone(violation_multiple) | |
| self.assertIn(violation_multiple['severity'], ['low', 'medium', 'high']) | |
| def test_add_custom_words(self): | |
| """Test adding custom words at runtime""" | |
| custom_words = ['badword1', 'badword2'] | |
| self.detector.add_words(custom_words) | |
| self.assertTrue(self.detector.is_profane("This is badword1")) | |
| self.assertTrue(self.detector.is_profane("badword2 here")) | |
| def test_get_stats(self): | |
| """Test statistics retrieval""" | |
| stats = self.detector.get_stats() | |
| self.assertIn('custom_words_count', stats) | |
| self.assertIn('whitelist_count', stats) | |
| self.assertIn('using_defaults', stats) | |
| class TestProfanityDetectorWithCustomWords(unittest.TestCase): | |
| """Test cases for custom word lists""" | |
| def test_custom_word_list(self): | |
| """Test initialization with custom words""" | |
| custom_words = ['spam', 'phishing', 'scam'] | |
| detector = ProfanityDetector(custom_words=custom_words) | |
| self.assertTrue(detector.is_profane("This is spam")) | |
| self.assertTrue(detector.is_profane("phishing attack")) | |
| self.assertTrue(detector.is_profane("scam alert")) | |
| def test_combined_default_and_custom(self): | |
| """Test that custom words work alongside defaults""" | |
| custom_words = ['custombadword'] | |
| detector = ProfanityDetector(custom_words=custom_words) | |
| # Custom word should be detected (case insensitive) | |
| self.assertTrue(detector.is_profane("This is custombadword")) | |
| # Default profanity should still work | |
| self.assertTrue(detector.is_profane("This is shit")) | |
| if __name__ == '__main__': | |
| unittest.main() | |