Files
Claude-Code-Workflow/codex-lens/tests/conftest.py
catlog22 61e313a0c1 chore: move ccw-skill-hub to standalone repository
Migrated ccw-skill-hub to D:/ccw-skill-hub as independent git project.
Removed nested git repos (ccw/frontend/ccw-skill-hub, skill-hub-repo, skill-hub-temp).
2026-02-24 11:57:26 +08:00

279 lines
6.5 KiB
Python

"""Pytest configuration and shared fixtures for codex-lens tests.
This module provides common fixtures and test utilities to reduce code duplication
across the test suite. Using fixtures ensures consistent test setup and makes tests
more maintainable.
Common Fixtures:
- temp_dir: Temporary directory for test files
- sample_index_db: Sample index database with test data
- mock_config: Mock configuration object
- sample_code_files: Factory for creating sample code files
"""
import pytest
import tempfile
import shutil
from pathlib import Path
from typing import Dict, Any
import sqlite3
@pytest.fixture
def temp_dir():
"""Create a temporary directory for test files.
The directory is automatically cleaned up after the test.
Yields:
Path: Path to the temporary directory.
"""
temp_path = Path(tempfile.mkdtemp())
yield temp_path
# Cleanup
if temp_path.exists():
shutil.rmtree(temp_path)
@pytest.fixture
def sample_index_db(temp_dir):
"""Create a sample index database with test data.
The database has a basic schema with files and chunks tables
populated with sample data.
Args:
temp_dir: Temporary directory fixture.
Yields:
Path: Path to the sample index database.
"""
db_path = temp_dir / "_index.db"
# Create database with basic schema
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Files table
cursor.execute("""
CREATE TABLE files (
id INTEGER PRIMARY KEY,
path TEXT NOT NULL UNIQUE,
content TEXT,
language TEXT,
hash TEXT,
indexed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
# Insert sample files
sample_files = [
("test.py", "def hello():\n print('world')", "python", "hash1"),
("test.js", "function hello() { console.log('world'); }", "javascript", "hash2"),
("README.md", "# Test Project", "markdown", "hash3"),
]
cursor.executemany(
"INSERT INTO files (path, content, language, hash) VALUES (?, ?, ?, ?)",
sample_files
)
conn.commit()
conn.close()
yield db_path
@pytest.fixture
def mock_config():
"""Create a mock configuration object with default values.
Returns:
Mock: Mock object with common config attributes.
"""
from unittest.mock import Mock
config = Mock()
config.index_path = Path("/tmp/test_index")
config.chunk_size = 2000
config.overlap = 200
config.embedding_backend = "fastembed"
config.embedding_model = "code"
config.max_results = 10
return config
@pytest.fixture
def sample_code_factory(temp_dir):
"""Factory for creating sample code files.
Args:
temp_dir: Temporary directory fixture.
Returns:
callable: Function that creates sample code files.
"""
def _create_file(filename: str, content: str, language: str = "python") -> Path:
"""Create a sample code file.
Args:
filename: Name of the file to create.
content: Content of the file.
language: Programming language (default: python).
Returns:
Path: Path to the created file.
"""
file_path = temp_dir / filename
file_path.parent.mkdir(parents=True, exist_ok=True)
file_path.write_text(content)
return file_path
return _create_file
@pytest.fixture
def sample_python_code():
"""Sample Python code for testing.
Returns:
str: Sample Python code snippet.
"""
return '''
def calculate_sum(a: int, b: int) -> int:
"""Calculate the sum of two integers."""
return a + b
class Calculator:
"""A simple calculator class."""
def __init__(self):
self.value = 0
def add(self, x: int) -> None:
"""Add a value to the calculator."""
self.value += x
if __name__ == "__main__":
calc = Calculator()
calc.add(5)
print(f"Result: {calc.value}")
'''
@pytest.fixture
def sample_javascript_code():
"""Sample JavaScript code for testing.
Returns:
str: Sample JavaScript code snippet.
"""
return '''
// Simple utility functions
function add(a, b) {
return a + b;
}
const Calculator = class {
constructor() {
this.value = 0;
}
add(x) {
this.value += x;
}
};
// Example usage
const calc = new Calculator();
calc.add(5);
console.log(`Result: ${calc.value}`);
'''
class CodeSampleFactory:
"""Factory class for generating various code samples.
This class provides methods to generate code samples in different
languages with various patterns (classes, functions, imports, etc.).
"""
@staticmethod
def python_function(name: str = "example", docstring: bool = True) -> str:
"""Generate a Python function sample.
Args:
name: Function name.
docstring: Whether to include docstring.
Returns:
str: Python function code.
"""
doc = f' """Example function."""\n' if docstring else ''
return f'''
def {name}(param1: str, param2: int = 10) -> str:
{doc} return param1 * param2
'''.strip()
@staticmethod
def python_class(name: str = "Example") -> str:
"""Generate a Python class sample.
Args:
name: Class name.
Returns:
str: Python class code.
"""
return f'''
class {name}:
"""Example class."""
def __init__(self, value: int = 0):
self.value = value
def increment(self) -> None:
"""Increment the value."""
self.value += 1
'''.strip()
@staticmethod
def javascript_function(name: str = "example") -> str:
"""Generate a JavaScript function sample.
Args:
name: Function name.
Returns:
str: JavaScript function code.
"""
return f'''function {name}(param1, param2 = 10) {{
return param1 * param2;
}}'''.strip()
@staticmethod
def typescript_interface(name: str = "Example") -> str:
"""Generate a TypeScript interface sample.
Args:
name: Interface name.
Returns:
str: TypeScript interface code.
"""
return f'''interface {name} {{
id: number;
name: string;
getValue(): number;
}}'''.strip()
@pytest.fixture
def code_sample_factory():
"""Create a code sample factory instance.
Returns:
CodeSampleFactory: Factory for generating code samples.
"""
return CodeSampleFactory()