| | |
| | |
| |
|
| | """ |
| | Unit tests for the Language Detector |
| | """ |
| |
|
| | import unittest |
| | from unittest.mock import patch, MagicMock, mock_open |
| | import os |
| | import sys |
| | from pathlib import Path |
| |
|
| | |
| | project_root = Path(__file__).resolve().parent.parent |
| | sys.path.insert(0, str(project_root)) |
| |
|
| | from src.core.language_detector import LanguageDetector |
| |
|
| |
|
| | class TestLanguageDetector(unittest.TestCase): |
| | """Test cases for the LanguageDetector class""" |
| |
|
| | def setUp(self): |
| | """Set up test fixtures""" |
| | self.detector = LanguageDetector() |
| | |
| | |
| | self.repo_path = "/test/repo" |
| | self.mock_files = [ |
| | "/test/repo/main.py", |
| | "/test/repo/utils.py", |
| | "/test/repo/static/script.js", |
| | "/test/repo/static/style.css", |
| | "/test/repo/src/app.js", |
| | "/test/repo/src/components/Button.jsx", |
| | "/test/repo/src/components/Form.tsx", |
| | "/test/repo/docs/index.html", |
| | "/test/repo/README.md", |
| | "/test/repo/package.json", |
| | "/test/repo/Dockerfile", |
| | "/test/repo/.gitignore" |
| | ] |
| | |
| | def test_get_language_from_extension(self): |
| | """Test _get_language_from_extension method""" |
| | |
| | self.assertEqual(self.detector._get_language_from_extension(".py"), "Python") |
| | self.assertEqual(self.detector._get_language_from_extension(".js"), "JavaScript") |
| | self.assertEqual(self.detector._get_language_from_extension(".jsx"), "JavaScript") |
| | self.assertEqual(self.detector._get_language_from_extension(".ts"), "TypeScript") |
| | self.assertEqual(self.detector._get_language_from_extension(".tsx"), "TypeScript") |
| | self.assertEqual(self.detector._get_language_from_extension(".java"), "Java") |
| | self.assertEqual(self.detector._get_language_from_extension(".go"), "Go") |
| | self.assertEqual(self.detector._get_language_from_extension(".rs"), "Rust") |
| | self.assertEqual(self.detector._get_language_from_extension(".html"), "HTML") |
| | self.assertEqual(self.detector._get_language_from_extension(".css"), "CSS") |
| | self.assertEqual(self.detector._get_language_from_extension(".md"), "Markdown") |
| | |
| | |
| | self.assertEqual(self.detector._get_language_from_extension(".unknown"), "Other") |
| | |
| | def test_get_language_from_filename(self): |
| | """Test _get_language_from_filename method""" |
| | |
| | self.assertEqual(self.detector._get_language_from_filename("Dockerfile"), "Dockerfile") |
| | self.assertEqual(self.detector._get_language_from_filename(".gitignore"), "Git") |
| | self.assertEqual(self.detector._get_language_from_filename("package.json"), "JSON") |
| | self.assertEqual(self.detector._get_language_from_filename("README.md"), "Markdown") |
| | |
| | |
| | self.assertEqual(self.detector._get_language_from_filename("unknown"), None) |
| | |
| | @patch('os.walk') |
| | def test_detect_languages(self, mock_walk): |
| | """Test detect_languages method""" |
| | |
| | mock_walk.return_value = [ |
| | ("/test/repo", ["static", "src", "docs"], ["main.py", "utils.py", "README.md", "package.json", ".gitignore"]), |
| | ("/test/repo/static", [], ["script.js", "style.css"]), |
| | ("/test/repo/src", ["components"], ["app.js"]), |
| | ("/test/repo/src/components", [], ["Button.jsx", "Form.tsx"]), |
| | ("/test/repo/docs", [], ["index.html"]), |
| | ] |
| | |
| | |
| | languages = self.detector.detect_languages(self.repo_path) |
| | |
| | |
| | self.assertIn("Python", languages) |
| | self.assertIn("JavaScript", languages) |
| | self.assertIn("TypeScript", languages) |
| | self.assertIn("HTML", languages) |
| | self.assertIn("CSS", languages) |
| | self.assertIn("Markdown", languages) |
| | self.assertIn("JSON", languages) |
| | self.assertIn("Git", languages) |
| | |
| | @patch('os.walk') |
| | @patch('builtins.open', new_callable=mock_open, read_data="line1\nline2\nline3\n") |
| | def test_get_language_breakdown(self, mock_file, mock_walk): |
| | """Test get_language_breakdown method""" |
| | |
| | mock_walk.return_value = [ |
| | ("/test/repo", ["static", "src"], ["main.py", "utils.py", "README.md"]), |
| | ("/test/repo/static", [], ["script.js"]), |
| | ("/test/repo/src", [], ["app.js"]), |
| | ] |
| | |
| | |
| | breakdown = self.detector.get_language_breakdown(self.repo_path) |
| | |
| | |
| | self.assertIn("Python", breakdown) |
| | self.assertIn("JavaScript", breakdown) |
| | self.assertIn("Markdown", breakdown) |
| | |
| | |
| | self.assertEqual(breakdown["Python"]["files"], 2) |
| | self.assertEqual(breakdown["Python"]["lines"], 8) |
| | self.assertEqual(breakdown["JavaScript"]["files"], 2) |
| | self.assertEqual(breakdown["JavaScript"]["lines"], 8) |
| | self.assertEqual(breakdown["Markdown"]["files"], 1) |
| | self.assertEqual(breakdown["Markdown"]["lines"], 4) |
| | |
| | |
| | total_lines = 20 |
| | self.assertEqual(breakdown["Python"]["percentage"], 40) |
| | self.assertEqual(breakdown["JavaScript"]["percentage"], 40) |
| | self.assertEqual(breakdown["Markdown"]["percentage"], 20) |
| | |
| | @patch('os.path.isfile') |
| | def test_is_binary_file(self, mock_isfile): |
| | """Test _is_binary_file method""" |
| | |
| | mock_isfile.return_value = True |
| | |
| | |
| | self.assertFalse(self.detector._is_binary_file("test.py")) |
| | self.assertFalse(self.detector._is_binary_file("test.js")) |
| | self.assertFalse(self.detector._is_binary_file("test.html")) |
| | self.assertFalse(self.detector._is_binary_file("test.css")) |
| | self.assertFalse(self.detector._is_binary_file("test.md")) |
| | |
| | |
| | self.assertTrue(self.detector._is_binary_file("test.png")) |
| | self.assertTrue(self.detector._is_binary_file("test.jpg")) |
| | self.assertTrue(self.detector._is_binary_file("test.gif")) |
| | self.assertTrue(self.detector._is_binary_file("test.pdf")) |
| | self.assertTrue(self.detector._is_binary_file("test.zip")) |
| | |
| | |
| | mock_isfile.return_value = False |
| | self.assertFalse(self.detector._is_binary_file("nonexistent.py")) |
| | |
| | @patch('os.path.isdir') |
| | def test_should_ignore_directory(self, mock_isdir): |
| | """Test _should_ignore_directory method""" |
| | |
| | mock_isdir.return_value = True |
| | |
| | |
| | self.assertTrue(self.detector._should_ignore_directory("/test/repo/node_modules")) |
| | self.assertTrue(self.detector._should_ignore_directory("/test/repo/.git")) |
| | self.assertTrue(self.detector._should_ignore_directory("/test/repo/__pycache__")) |
| | self.assertTrue(self.detector._should_ignore_directory("/test/repo/venv")) |
| | self.assertTrue(self.detector._should_ignore_directory("/test/repo/.vscode")) |
| | |
| | |
| | self.assertFalse(self.detector._should_ignore_directory("/test/repo/src")) |
| | self.assertFalse(self.detector._should_ignore_directory("/test/repo/app")) |
| | self.assertFalse(self.detector._should_ignore_directory("/test/repo/docs")) |
| | |
| | |
| | mock_isdir.return_value = False |
| | self.assertFalse(self.detector._should_ignore_directory("/test/repo/nonexistent")) |
| | |
| | def test_should_ignore_file(self): |
| | """Test _should_ignore_file method""" |
| | |
| | self.assertTrue(self.detector._should_ignore_file("/test/repo/.DS_Store")) |
| | self.assertTrue(self.detector._should_ignore_file("/test/repo/Thumbs.db")) |
| | self.assertTrue(self.detector._should_ignore_file("/test/repo/.env")) |
| | |
| | |
| | self.assertFalse(self.detector._should_ignore_file("/test/repo/main.py")) |
| | self.assertFalse(self.detector._should_ignore_file("/test/repo/app.js")) |
| | self.assertFalse(self.detector._should_ignore_file("/test/repo/README.md")) |
| |
|
| |
|
| | if __name__ == "__main__": |
| | unittest.main() |