From 0ea68003bbaf2d59f6f114ce48baf63b1333379e Mon Sep 17 00:00:00 2001 From: Anurag Gupta Date: Tue, 26 Aug 2025 00:45:49 +0530 Subject: [PATCH 1/2] feat: enhance MongoDB client creation to support MONGO_URI and MONGO_DBNAME overrides --- foca/database/register_mongodb.py | 32 +++++++++++++++++++++++++ tests/database/test_register_mongodb.py | 23 ++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/foca/database/register_mongodb.py b/foca/database/register_mongodb.py index 4433515d..62544f03 100644 --- a/foca/database/register_mongodb.py +++ b/foca/database/register_mongodb.py @@ -6,6 +6,7 @@ from flask import Flask from flask_pymongo import PyMongo from foca.models.config import MongoConfig, DBConfig +from urllib.parse import urlparse, urlunparse # Get logger instance logger = logging.getLogger(__name__) @@ -123,6 +124,37 @@ def _create_mongo_client( Returns: MongoDB client for Flask application instance. """ + # If full URI provided, prefer it over component-based construction + provided_uri = os.environ.get('MONGO_URI') + if provided_uri: + db_override = os.environ.get('MONGO_DBNAME') + if db_override: + try: + parsed = urlparse(provided_uri) + # Replace/insert path component with overridden db name + new_path = f"/{db_override}" + provided_uri = urlunparse(( + parsed.scheme, + parsed.netloc, + new_path, + parsed.params, + parsed.query, + parsed.fragment, + )) + except Exception: + # In case of any parsing issues, fall back to using the + # provided URI as-is; PyMongo will validate later. + pass + app.config['MONGO_URI'] = provided_uri + mongo = PyMongo(app) + logger.info( + "Registered database '{db}' using provided MONGO_URI.".format( + db=os.environ.get('MONGO_DBNAME', db) + ) + ) + return mongo + + # Fall back to legacy component-based construction auth = '' user = os.environ.get('MONGO_USERNAME') if user is not None and user != "": diff --git a/tests/database/test_register_mongodb.py b/tests/database/test_register_mongodb.py index e4f340ef..c91631eb 100644 --- a/tests/database/test_register_mongodb.py +++ b/tests/database/test_register_mongodb.py @@ -81,6 +81,29 @@ def test_register_mongodb_no_database(): assert isinstance(res, MongoConfig) +def test__create_mongo_client_with_mongo_uri(monkeypatch): + """When MONGO_URI environment variable IS defined, prefer it.""" + # SRV style and options should be accepted without modification + mongo_uri = "mongodb://user:pass@db1.example.com:27017,db2.example.com:27017/admin?replicaSet=rs0&ssl=true" + monkeypatch.setenv("MONGO_URI", mongo_uri) + app = Flask(__name__) + res = _create_mongo_client(app) + assert isinstance(res, PyMongo) + assert app.config['MONGO_URI'] == mongo_uri + + +def test__create_mongo_client_with_mongo_uri_and_db_override(monkeypatch): + """When MONGO_URI and MONGO_DBNAME are both defined, override db name.""" + mongo_uri = "mongodb://localhost:27017/old_db?retryWrites=true&w=majority" + monkeypatch.setenv("MONGO_URI", mongo_uri) + monkeypatch.setenv("MONGO_DBNAME", "new_db") + app = Flask(__name__) + res = _create_mongo_client(app) + assert isinstance(res, PyMongo) + assert app.config['MONGO_URI'].startswith("mongodb://localhost:27017/new_db") + assert "retryWrites=true" in app.config['MONGO_URI'] + + def test_register_mongodb_no_collections(): """Register MongoDB database without any collections""" app = Flask(__name__) From 577e923ca8901f5b33fe07c273f22294061b5446 Mon Sep 17 00:00:00 2001 From: Anurag Gupta Date: Tue, 26 Aug 2025 00:49:27 +0530 Subject: [PATCH 2/2] refactor: improve code readability by formatting multiline conditions and dictionary definitions --- foca/api/register_openapi.py | 5 ++++- tests/api/test_register_openapi.py | 16 ++++++++++++---- tests/database/test_register_mongodb.py | 9 +++++++-- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/foca/api/register_openapi.py b/foca/api/register_openapi.py index 88810054..b28f4ef3 100644 --- a/foca/api/register_openapi.py +++ b/foca/api/register_openapi.py @@ -58,7 +58,10 @@ def register_openapi( ) # Add fields to security definitions/schemes - if not spec.disable_auth and spec.add_security_fields is not None: + if ( + not spec.disable_auth + and spec.add_security_fields is not None + ): for key, val in spec.add_security_fields.items(): # OpenAPI 2 sec_defs = spec_parsed.get('securityDefinitions', {}) diff --git a/tests/api/test_register_openapi.py b/tests/api/test_register_openapi.py index 546f4250..c3eb0c4c 100644 --- a/tests/api/test_register_openapi.py +++ b/tests/api/test_register_openapi.py @@ -24,11 +24,19 @@ PATH_SPECS_INVALID_JSON = DIR / "invalid.json" PATH_SPECS_INVALID_YAML = DIR / "invalid.openapi.yaml" PATH_NOT_FOUND = DIR / "does/not/exist.yaml" -OPERATION_FIELDS_2 = {"x-swagger-router-controller": "controllers"} -OPERATION_FIELDS_2_NO_RESOLVE = {"x-swagger-router-controller": YAMLError} +OPERATION_FIELDS_2 = { + "x-swagger-router-controller": "controllers", +} +OPERATION_FIELDS_2_NO_RESOLVE = { + "x-swagger-router-controller": YAMLError, +} OPERATION_FIELDS_3 = {"x-openapi-router-controller": "controllers"} -SECURITY_FIELDS_2 = {"x-apikeyInfoFunc": "controllers.validate_token"} -SECURITY_FIELDS_3 = {"x-bearerInfoFunc": "controllers.validate_token"} +SECURITY_FIELDS_2 = { + "x-apikeyInfoFunc": "controllers.validate_token", +} +SECURITY_FIELDS_3 = { + "x-bearerInfoFunc": "controllers.validate_token", +} APPEND = { "info": { "version": "1.0.0", diff --git a/tests/database/test_register_mongodb.py b/tests/database/test_register_mongodb.py index c91631eb..23cab85f 100644 --- a/tests/database/test_register_mongodb.py +++ b/tests/database/test_register_mongodb.py @@ -84,7 +84,10 @@ def test_register_mongodb_no_database(): def test__create_mongo_client_with_mongo_uri(monkeypatch): """When MONGO_URI environment variable IS defined, prefer it.""" # SRV style and options should be accepted without modification - mongo_uri = "mongodb://user:pass@db1.example.com:27017,db2.example.com:27017/admin?replicaSet=rs0&ssl=true" + mongo_uri = ( + "mongodb://user:pass@db1.example.com:27017," + "db2.example.com:27017/admin?replicaSet=rs0&ssl=true" + ) monkeypatch.setenv("MONGO_URI", mongo_uri) app = Flask(__name__) res = _create_mongo_client(app) @@ -100,7 +103,9 @@ def test__create_mongo_client_with_mongo_uri_and_db_override(monkeypatch): app = Flask(__name__) res = _create_mongo_client(app) assert isinstance(res, PyMongo) - assert app.config['MONGO_URI'].startswith("mongodb://localhost:27017/new_db") + assert app.config['MONGO_URI'].startswith( + "mongodb://localhost:27017/new_db" + ) assert "retryWrites=true" in app.config['MONGO_URI']