Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python3 | |
| # -*- coding: utf-8 -*- | |
| """ | |
| Unit tests for the Language Detector | |
| """ | |
| import unittest | |
| from unittest.mock import patch, MagicMock, mock_open | |
| import os | |
| import sys | |
| from pathlib import Path | |
| # Add the project root directory to the Python 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() | |
| # Create a mock repository structure | |
| 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""" | |
| # Test common extensions | |
| 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") | |
| # Test unknown extension | |
| self.assertEqual(self.detector._get_language_from_extension(".unknown"), "Other") | |
| def test_get_language_from_filename(self): | |
| """Test _get_language_from_filename method""" | |
| # Test common filenames | |
| 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") | |
| # Test unknown filename | |
| self.assertEqual(self.detector._get_language_from_filename("unknown"), None) | |
| def test_detect_languages(self, mock_walk): | |
| """Test detect_languages method""" | |
| # Mock os.walk to return our mock files | |
| 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"]), | |
| ] | |
| # Test the method | |
| languages = self.detector.detect_languages(self.repo_path) | |
| # Verify the result | |
| 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) | |
| def test_get_language_breakdown(self, mock_file, mock_walk): | |
| """Test get_language_breakdown method""" | |
| # Mock os.walk to return our mock files | |
| mock_walk.return_value = [ | |
| ("/test/repo", ["static", "src"], ["main.py", "utils.py", "README.md"]), | |
| ("/test/repo/static", [], ["script.js"]), | |
| ("/test/repo/src", [], ["app.js"]), | |
| ] | |
| # Test the method | |
| breakdown = self.detector.get_language_breakdown(self.repo_path) | |
| # Verify the result | |
| self.assertIn("Python", breakdown) | |
| self.assertIn("JavaScript", breakdown) | |
| self.assertIn("Markdown", breakdown) | |
| # Each file has 4 lines (including the newline at the end) | |
| self.assertEqual(breakdown["Python"]["files"], 2) | |
| self.assertEqual(breakdown["Python"]["lines"], 8) # 2 files * 4 lines | |
| self.assertEqual(breakdown["JavaScript"]["files"], 2) | |
| self.assertEqual(breakdown["JavaScript"]["lines"], 8) # 2 files * 4 lines | |
| self.assertEqual(breakdown["Markdown"]["files"], 1) | |
| self.assertEqual(breakdown["Markdown"]["lines"], 4) # 1 file * 4 lines | |
| # Check percentages | |
| total_lines = 20 # 5 files * 4 lines | |
| self.assertEqual(breakdown["Python"]["percentage"], 40) # 8/20 * 100 | |
| self.assertEqual(breakdown["JavaScript"]["percentage"], 40) # 8/20 * 100 | |
| self.assertEqual(breakdown["Markdown"]["percentage"], 20) # 4/20 * 100 | |
| def test_is_binary_file(self, mock_isfile): | |
| """Test _is_binary_file method""" | |
| # Mock isfile to always return True | |
| mock_isfile.return_value = True | |
| # Test with text file extensions | |
| 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")) | |
| # Test with binary file extensions | |
| 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")) | |
| # Test with non-existent file | |
| mock_isfile.return_value = False | |
| self.assertFalse(self.detector._is_binary_file("nonexistent.py")) | |
| def test_should_ignore_directory(self, mock_isdir): | |
| """Test _should_ignore_directory method""" | |
| # Mock isdir to always return True | |
| mock_isdir.return_value = True | |
| # Test with common directories to ignore | |
| 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")) | |
| # Test with directories not to ignore | |
| 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")) | |
| # Test with non-existent directory | |
| 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""" | |
| # Test with common files to ignore | |
| 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")) | |
| # Test with files not to ignore | |
| 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() |