test: update test suite for OmegaConf config system
- Add tests/conftest.py with make_settings() helper that maps legacy config parameter names to new nested OmegaConf structure - Update all test files to use the conftest fixture - All 73 tests now pass with new config system - Maintains backward compatibility via Settings class properties Also add AGENTS.md with comprehensive AI agent guidelines: - Project overview and key technologies - Directory structure reference - Development workflow and common tasks - Testing strategy and patterns - CI/CD pipeline overview - Common pitfalls and best practices - Debugging guide for agents working on the project
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
# Test Settings Migration Notes
|
||||
|
||||
## Overview
|
||||
Updated all test files to work with the new OmegaConf-based configuration system while maintaining backward compatibility through a helper function.
|
||||
|
||||
## What Changed
|
||||
|
||||
### 1. Created `tests/conftest.py` (new file)
|
||||
- Implements `make_settings(**kwargs)` helper function
|
||||
- Maps legacy parameter names to the new nested structure
|
||||
- Used as a shared utility across all test files
|
||||
|
||||
### 2. Updated Test Files
|
||||
Updated the following test files to use the new helper:
|
||||
- `tests/test_bot.py`
|
||||
- `tests/test_llm_client.py`
|
||||
- `tests/test_proposals.py`
|
||||
- `tests/test_thread_memory.py`
|
||||
- `tests/test_tools.py`
|
||||
|
||||
Each file now:
|
||||
1. Imports `make_settings` from `tests.conftest`
|
||||
2. Keeps local `_make_settings()` wrapper for compatibility
|
||||
3. Calls the shared `make_settings()` function internally
|
||||
|
||||
## Parameter Mapping
|
||||
|
||||
The `make_settings()` function handles the following legacy-to-new mappings:
|
||||
|
||||
### Telegram Config
|
||||
- `telegram_bot_token` → `telegram.bot_token`
|
||||
- `telegram_allowed_user_ids` → `telegram.allowed_user_ids`
|
||||
- `telegram_group_ids` → `telegram.group_ids`
|
||||
|
||||
### OpenAI Config
|
||||
- `openai_api_key` → `openai.api_key`
|
||||
- `openai_base_url` → `openai.base_url` (default: `"https://api.openai.com/v1"`)
|
||||
- `openai_model` → `openai.model` (default: `"gpt-4o"`)
|
||||
- `openai_system_prompt` → `openai.system_prompt` (uses default if not provided)
|
||||
|
||||
### Analysis Config
|
||||
- `analysis_target_url` → `analysis.target_url`
|
||||
- `analysis_target_api_key` → `analysis.target_api_key`
|
||||
- `analysis_cron_hour` → `analysis.cron_hour` (default: `8`)
|
||||
- `analysis_cron_minute` → `analysis.cron_minute` (default: `0`)
|
||||
|
||||
### Memory Config
|
||||
- `thread_memory_path` → `memory.thread_memory_path` (default: `"thread_memory.json"`)
|
||||
|
||||
### Tools Config
|
||||
- `mcp_server_url` → `tools.mcp_server_url`
|
||||
- `mcp_server_api_key` → `tools.mcp_server_api_key`
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Before (would fail with new Settings class)
|
||||
```python
|
||||
settings = Settings(
|
||||
telegram_bot_token="token",
|
||||
openai_api_key="key",
|
||||
telegram_allowed_user_ids=[1, 2, 3]
|
||||
)
|
||||
```
|
||||
|
||||
### After (with new helper)
|
||||
```python
|
||||
from tests.conftest import make_settings
|
||||
|
||||
settings = make_settings(
|
||||
telegram_bot_token="token",
|
||||
openai_api_key="key",
|
||||
telegram_allowed_user_ids=[1, 2, 3]
|
||||
)
|
||||
|
||||
# Now settings.telegram.bot_token == "token"
|
||||
# And settings.telegram.allowed_user_ids == [1, 2, 3]
|
||||
# And backward-compat properties still work:
|
||||
# settings.telegram_bot_token == "token"
|
||||
# settings.telegram_allowed_user_ids == [1, 2, 3]
|
||||
```
|
||||
|
||||
## How Test Files Use It
|
||||
|
||||
Each test file has a local `_make_settings()` wrapper that:
|
||||
1. Defines default values specific to that test module
|
||||
2. Merges any provided kwargs
|
||||
3. Delegates to the shared `make_settings()` function
|
||||
|
||||
Example from `test_bot.py`:
|
||||
```python
|
||||
def _make_settings(**kwargs) -> Settings:
|
||||
"""Wrapper for test compatibility."""
|
||||
defaults = dict(
|
||||
telegram_bot_token="test-token",
|
||||
openai_api_key="test-key",
|
||||
)
|
||||
defaults.update(kwargs)
|
||||
return make_settings(**defaults)
|
||||
```
|
||||
|
||||
This allows tests to override defaults while reusing the mapping logic:
|
||||
```python
|
||||
# Uses defaults
|
||||
settings = _make_settings()
|
||||
|
||||
# Override specific values
|
||||
settings = _make_settings(telegram_allowed_user_ids=[1, 2, 3])
|
||||
```
|
||||
|
||||
## Error Handling
|
||||
|
||||
The `make_settings()` function will raise a `TypeError` if any unexpected keyword arguments are passed:
|
||||
```python
|
||||
make_settings(invalid_param="value")
|
||||
# Raises: TypeError: Unexpected keyword arguments: invalid_param
|
||||
```
|
||||
|
||||
This helps catch typos and unexpected parameters early in tests.
|
||||
|
||||
## Backward Compatibility
|
||||
|
||||
The Settings class retains backward-compatible properties:
|
||||
- `settings.telegram_bot_token` → returns `settings.telegram.bot_token`
|
||||
- `settings.openai_api_key` → returns `settings.openai.api_key`
|
||||
- etc.
|
||||
|
||||
This means existing code that reads from Settings using the old property names continues to work.
|
||||
|
||||
## Files Modified
|
||||
|
||||
1. **`tests/conftest.py`** (NEW)
|
||||
- 91 lines
|
||||
- Core mapping logic for legacy-to-new Settings structure
|
||||
|
||||
2. **`tests/test_bot.py`**
|
||||
- Added import: `from tests.conftest import make_settings`
|
||||
- Updated `_make_settings()` to call shared function
|
||||
|
||||
3. **`tests/test_llm_client.py`**
|
||||
- Added import: `from tests.conftest import make_settings`
|
||||
- Updated `_make_settings()` to call shared function
|
||||
|
||||
4. **`tests/test_proposals.py`**
|
||||
- Added import: `from tests.conftest import make_settings`
|
||||
- Updated `_make_settings()` to call shared function
|
||||
|
||||
5. **`tests/test_thread_memory.py`**
|
||||
- Added import: `from tests.conftest import make_settings`
|
||||
- Updated `_make_settings()` to call shared function
|
||||
|
||||
6. **`tests/test_tools.py`**
|
||||
- Added import: `from tests.conftest import make_settings`
|
||||
- Updated `_make_llm_settings()` to call shared function
|
||||
|
||||
## Testing
|
||||
|
||||
To verify the changes work:
|
||||
```bash
|
||||
# Install dev dependencies
|
||||
pip install -e ".[dev]"
|
||||
|
||||
# Run all tests
|
||||
pytest tests/
|
||||
|
||||
# Run specific test file
|
||||
pytest tests/test_bot.py -v
|
||||
|
||||
# Run specific test
|
||||
pytest tests/test_bot.py::TestIsAllowed::test_allowlist_accepts_known_user -v
|
||||
```
|
||||
|
||||
All tests should pass with these changes as the Settings class:
|
||||
1. Accepts the new nested structure from `make_settings()`
|
||||
2. Provides backward-compatible properties for old code
|
||||
Reference in New Issue
Block a user