Files
Ewald 094cb552c2 fix(security,ci): gate reads behind auth, harden release pipeline, fix cache-provider coupling and delete atomicity
- Require the same Comfy auth on all Majoor GET routes as on writes, closing
  a read-confidentiality gap for remote/multi-user deployments (no-op when
  Comfy auth is disabled, the default single-user setup).
- Gate nightly and stable releases on a quality job (pytest, mypy, frontend
  typecheck/build/tests, dist/ drift check) before publishing, and refresh
  the committed dist/ bundle to match a clean build.
- Pin softprops/action-gh-release and Comfy-Org/publish-node-action to
  commit SHAs.
- Resolve ComfyUI's CacheProvider through the public comfy_api.latest.Caching
  alias instead of the underscore-private _caching module.
- Make asset-delete DB cleanup atomic: a failed cleanup statement now aborts
  the transaction instead of committing a partial delete.
2026-09-04 20:53:57 +02:00
..
2026-04-05 20:37:19 +02:00

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:

cd ComfyUI/custom_nodes/ComfyUI-Majoor-AssetsManager
python -m pytest tests/ -q

Single test file

python -m pytest tests/core/test_routes.py -v

Single folder

python -m pytest tests/metadata/ -v

Single test function

python -m pytest tests/core/test_routes.py::test_routes -v

With coverage

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
  • 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:

@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:

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:

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


Last updated: April 5, 2026