184 lines
3.8 KiB
Markdown
184 lines
3.8 KiB
Markdown
# Tests - Majoor Assets Manager
|
|
|
|
Test suite for ComfyUI-Majoor-AssetsManager.
|
|
|
|
---
|
|
|
|
## Test Structure
|
|
|
|
```
|
|
tests/
|
|
├── conftest.py # Pytest fixtures & shared setup
|
|
├── README.md # Test documentation
|
|
├── run_tests_all.bat # Windows full-suite runner
|
|
├── __init__.py
|
|
├── assets/ # Asset fixtures and media samples
|
|
├── compat/ # Backward-compatibility coverage
|
|
├── config/ # Configuration tests and runner
|
|
├── core/ # Core route and path helpers
|
|
├── database/ # Schema and SQLite behavior
|
|
├── features/ # Main feature, service, and route coverage
|
|
├── metadata/ # Metadata extraction coverage
|
|
├── parser/ # Parser-focused regression samples
|
|
├── quality/ # Quality-gate tests
|
|
├── rating_tags/ # Ratings, tags, and sync behavior
|
|
├── regressions/ # Targeted regression coverage
|
|
├── routes/ # Route-level scenarios
|
|
└── security/ # Security-specific tests
|
|
```
|
|
|
|
---
|
|
|
|
## Running Tests
|
|
|
|
### All tests (Windows)
|
|
|
|
Double-click `run_tests.bat` in the project root, or:
|
|
|
|
```bash
|
|
cd ComfyUI/custom_nodes/ComfyUI-Majoor-AssetsManager
|
|
python -m pytest tests/ -q
|
|
```
|
|
|
|
### Single test file
|
|
|
|
```bash
|
|
python -m pytest tests/core/test_routes.py -v
|
|
```
|
|
|
|
### Single folder
|
|
|
|
```bash
|
|
python -m pytest tests/metadata/ -v
|
|
```
|
|
|
|
### Single test function
|
|
|
|
```bash
|
|
python -m pytest tests/core/test_routes.py::test_routes -v
|
|
```
|
|
|
|
### With coverage
|
|
```bash
|
|
pytest tests/ --cov=mjr_am_backend --cov=mjr_am_shared --cov-report=html
|
|
```
|
|
|
|
---
|
|
|
|
## Test Categories
|
|
|
|
### `core/` - Core functionality
|
|
|
|
- Result pattern (Ok/Err)
|
|
- IndexService scan/search
|
|
- FTS5 full-text search
|
|
- API route handlers
|
|
- End-to-end integration
|
|
|
|
### `metadata/` - Metadata extraction
|
|
|
|
- ExifTool/FFprobe extraction
|
|
- PNG/WEBP/video generation info
|
|
- Workflow JSON parsing
|
|
- Quality score calculations
|
|
|
|
### `rating_tags/` - Ratings & tags
|
|
|
|
- Rating/tag extraction from files
|
|
- OS file sync
|
|
- Import operations
|
|
|
|
### `assets/` - Assets & search
|
|
|
|
- Batch operations
|
|
- Delete operations
|
|
- FTS5 search
|
|
- Staging deduplication
|
|
|
|
### `database/` - Database & schema
|
|
|
|
- Schema migration/healing
|
|
- SQLite query patterns
|
|
- Geninfo self-healing
|
|
|
|
### `config/` - Config & security
|
|
|
|
- CSRF protection
|
|
- Origin validation
|
|
- Rate limiting
|
|
- Path traversal prevention
|
|
- Settings persistence
|
|
|
|
### `features/` - Feature tests
|
|
|
|
- Collections CRUD
|
|
- Multi-file ZIP export
|
|
- Date histogram
|
|
- Viewer grid masks
|
|
|
|
### `regressions/` - Regression tests
|
|
|
|
- Audit issue fixes
|
|
- Scan batching regressions
|
|
- Logging system
|
|
|
|
---
|
|
|
|
## Writing Tests
|
|
|
|
### Test isolation
|
|
Each test should be independent using in-memory databases:
|
|
|
|
```python
|
|
@pytest.mark.asyncio
|
|
async def test_example():
|
|
db = Sqlite(":memory:")
|
|
await migrate_schema(db)
|
|
# ... test logic
|
|
await db.aclose()
|
|
```
|
|
|
|
### Result pattern
|
|
Always verify the Result pattern:
|
|
|
|
```python
|
|
def test_service_result():
|
|
result = service.do_something()
|
|
|
|
assert isinstance(result, Result)
|
|
if result.ok:
|
|
assert result.data is not None
|
|
else:
|
|
assert result.error is not None
|
|
```
|
|
|
|
### Mock external tools
|
|
Don't depend on ExifTool/FFprobe availability:
|
|
|
|
```python
|
|
class MockExifTool:
|
|
def is_available(self):
|
|
return False
|
|
```
|
|
|
|
---
|
|
|
|
## Fixtures
|
|
|
|
Common fixtures are defined in `conftest.py`:
|
|
|
|
- `test_db` - In-memory SQLite with schema
|
|
- `temp_dir` - Temporary directory for test files
|
|
- `mock_exiftool` - Mocked ExifTool adapter
|
|
|
|
---
|
|
|
|
## Resources
|
|
|
|
- [pytest docs](https://docs.pytest.org/)
|
|
- [Coverage.py](https://coverage.readthedocs.io/)
|
|
|
|
---
|
|
|
|
Last updated: April 5, 2026
|