|
|
|
|
|
|
|
""" |
|
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() |