Phase 1: pytest baseline, production hardening, pinned requirements
Establishes the safety net required before any structural refactor. Tests (tests/): - conftest.py rewritten for Flask-SQLAlchemy 3.x (drop-recreate per test, StaticPool-shared in-memory SQLite, admin_user + auth_headers fixtures). Removes deprecated db.create_scoped_session pattern. - test_smoke.py: 8 baseline tests (app boot, JWT login valid+invalid, protected routes, paginated response shape, plugin auto-discovery). - test_security_config.py: 7 tests pinning ProductionConfig.validate failure modes (missing/dev SECRET_KEY, missing JWT_SECRET_KEY, missing DATABASE_URL, wildcard CORS, empty CORS) and one happy-path. Production hardening (shopdb/config.py, shopdb/__init__.py): - ProductionConfig.validate() raises ConfigError on missing or insecure SECRET_KEY, JWT_SECRET_KEY, DATABASE_URL, CORS_ORIGINS. No silent fallback to dev defaults in production. - create_app invokes validate() when config_name == 'production'. - CORS_ORIGINS default no longer wildcard; defaults to localhost Vite dev origin. - Drop os.path.exists probe in serve_frontend (path-traversal risk surface). send_from_directory handles safe-join + 404 itself. - Replace User.query.get with db.session.get (SQLAlchemy 2.0 API). TestingConfig (shopdb/config.py): - Add StaticPool + check_same_thread connect_args so SQLite in-memory is shared across the test session. Index dedup (plugins/printers/models/printer_extension.py): - Rename idx_printer_windowsname -> idx_printerdata_windowsname. Two model classes (Printer, PrinterData) declared the same index name; SQLite enforces global index uniqueness even across tables. Per CONTRIBUTING.md naming convention, indexes follow idx_<table>_<column>. Dependency pinning (requirements.in, requirements.txt): - requirements.in holds the loose source pins (the human-edited file). - requirements.txt is now a uv-compiled lockfile (every transitive dep pinned to an exact version). Reproducible builds. Run `uv pip compile requirements.in -o requirements.txt` to refresh. Test count: 0 -> 15 passing. All naming/style checks still green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
32
requirements.in
Normal file
32
requirements.in
Normal file
@@ -0,0 +1,32 @@
|
||||
# Flask and extensions
|
||||
flask>=3.0
|
||||
flask-sqlalchemy>=3.1
|
||||
flask-migrate>=4.0
|
||||
flask-jwt-extended>=4.6
|
||||
flask-cors>=4.0
|
||||
flask-caching>=2.0
|
||||
flask-marshmallow>=1.2
|
||||
marshmallow-sqlalchemy>=0.29
|
||||
|
||||
# Database
|
||||
mysql-connector-python>=8.0
|
||||
pymysql>=1.1
|
||||
|
||||
# CLI and utilities
|
||||
click>=8.1
|
||||
python-dotenv>=1.0
|
||||
tabulate>=0.9
|
||||
|
||||
# HTTP/API clients
|
||||
requests>=2.31
|
||||
|
||||
# Security
|
||||
werkzeug>=3.0
|
||||
|
||||
# Validation
|
||||
email-validator>=2.0
|
||||
|
||||
# Testing
|
||||
pytest>=7.0
|
||||
pytest-flask>=1.2
|
||||
pytest-cov>=4.0
|
||||
Reference in New Issue
Block a user