@@ -52,7 +52,7 @@ def test_get_settings_with_environment_variables():
5252 os .environ ,
5353 {
5454 "WATSONX_URL" : "https://test.example.com" ,
55- "JWT_SECRET_KEY" : "test-secret-key" ,
55+ "JWT_SECRET_KEY" : "test-secret-key" , # pragma: allowlist secret
5656 "RAG_LLM" : "openai" ,
5757 },
5858 ):
@@ -63,6 +63,7 @@ def test_get_settings_with_environment_variables():
6363 settings = get_settings ()
6464
6565 assert settings .wx_url == "https://test.example.com"
66+ # pragma: allowlist secret
6667 assert settings .jwt_secret_key == "test-secret-key"
6768 assert settings .rag_llm == "openai"
6869
@@ -104,14 +105,18 @@ def test_no_import_time_settings_access():
104105 try :
105106 # Clear all relevant environment variables to make settings invalid
106107 for key in list (os .environ .keys ()):
107- if any (prefix in key for prefix in ["WATSONX" , "JWT" , "RAG" , "VECTOR" , "MILVUS" ]):
108+ if any (
109+ prefix in key
110+ for prefix in ["WATSONX" , "JWT" , "RAG" , "VECTOR" , "MILVUS" ]
111+ ):
108112 del os .environ [key ]
109113
110114 # The function should exist but not be called during import
111115 assert callable (get_settings )
112116
113- # When we call get_settings() with empty environment, it should work with defaults
114- # This is the desired behavior - settings should be accessible even without env vars
117+ # When we call get_settings() with empty environment,
118+ # it should work with defaults. This is the desired behavior -
119+ # settings should be accessible even without env vars
115120 settings = get_settings ()
116121 assert settings is not None
117122 # Should have default values
@@ -138,10 +143,13 @@ def test_settings_validation_error_handling():
138143 # Patch both os.environ and dotenv to prevent loading from .env file
139144 with (
140145 patch .dict (os .environ , {}, clear = True ),
141- patch ("pydantic_settings.sources.DotEnvSettingsSource.__call__" , return_value = {}),
146+ patch (
147+ "pydantic_settings.sources.DotEnvSettingsSource.__call__" , return_value = {}
148+ ),
142149 ):
143150 settings = get_settings ()
144151 # Should get default values
152+ # pragma: allowlist secret
145153 assert settings .jwt_secret_key == "dev-secret-key-change-in-production-f8a7b2c1"
146154 assert settings .rag_llm == "ibm/granite-3-3-8b-instruct"
147155
@@ -297,7 +305,9 @@ def test_database_models_no_import_time_settings():
297305 except ImportError as e :
298306 # If import fails, it should NOT be due to settings/database validation
299307 error_msg = str (e ).lower ()
300- assert not any (term in error_msg for term in ["validation" , "database" , "connection" ])
308+ assert not any (
309+ term in error_msg for term in ["validation" , "database" , "connection" ]
310+ )
301311
302312 finally :
303313 # Restore original environment
@@ -338,11 +348,10 @@ def test_fastapi_route_dependency_injection_pattern():
338348 """Test the recommended FastAPI route dependency injection pattern."""
339349 from typing import Annotated
340350
351+ from core .config import Settings , get_settings
341352 from fastapi import Depends , FastAPI
342353 from fastapi .testclient import TestClient
343354
344- from core .config import Settings , get_settings
345-
346355 app = FastAPI ()
347356
348357 @app .get ("/settings-test" )
@@ -358,7 +367,9 @@ def test_route(settings: Annotated[Settings, Depends(get_settings)]):
358367
359368 # Clear cache and set test environment
360369 get_settings .cache_clear ()
361- with patch .dict (os .environ , {"RAG_LLM" : "watsonx" , "VECTOR_DB" : "pinecone" }, clear = False ):
370+ with patch .dict (
371+ os .environ , {"RAG_LLM" : "watsonx" , "VECTOR_DB" : "pinecone" }, clear = False
372+ ):
362373 response = client .get ("/settings-test" )
363374
364375 assert response .status_code == 200
@@ -393,7 +404,9 @@ def get_config(self):
393404
394405 config = service .get_config ()
395406 assert config ["llm" ] == "anthropic"
396- assert config ["embeddings" ] == "ibm/slate-125m-english-rtrvr" # Updated to match current default
407+ # Embedding model comes from .env file
408+ # (EMBEDDING_MODEL=ibm/slate-125m-english-rtrvr)
409+ assert config ["embeddings" ] == "ibm/slate-125m-english-rtrvr"
397410
398411
399412@pytest .mark .unit
@@ -454,13 +467,17 @@ def test_vector_store_base_class_requires_settings():
454467
455468 # Create a concrete implementation for testing
456469 class TestVectorStore (VectorStore ):
457- def create_collection (self , _collection_name : str , _metadata : dict | None = None ) -> None :
470+ def create_collection (
471+ self , _collection_name : str , _metadata : dict | None = None
472+ ) -> None :
458473 pass
459474
460475 def add_documents (self , _collection_name : str , _documents : list ) -> list [str ]:
461476 return []
462477
463- def retrieve_documents (self , _query : str , _collection_name : str , _number_of_results : int = 10 ) -> list :
478+ def retrieve_documents (
479+ self , _query : str , _collection_name : str , _number_of_results : int = 10
480+ ) -> list :
464481 return []
465482
466483 def query (
@@ -475,11 +492,13 @@ def query(
475492 def delete_collection (self , _collection_name : str ) -> None :
476493 pass
477494
478- def delete_documents (self , _collection_name : str , _document_ids : list [str ]) -> None :
495+ def delete_documents (
496+ self , _collection_name : str , _document_ids : list [str ]
497+ ) -> None :
479498 pass
480499
481500 # Test that settings are properly injected
482- mock_settings = Mock ()
501+ mock_settings = Mock () # pragma: allowlist secret
483502 mock_settings .vector_db = "test"
484503
485504 store = TestVectorStore (mock_settings )
@@ -494,7 +513,7 @@ def test_pinecone_store_dependency_injection():
494513
495514 # Mock settings
496515 mock_settings = Mock ()
497- mock_settings .pinecone_api_key = "test-key"
516+ mock_settings .pinecone_api_key = "test-key" # pragma: allowlist secret
498517 mock_settings .pinecone_cloud = "aws"
499518 mock_settings .pinecone_region = "us-east-1"
500519 mock_settings .embedding_dim = 768
@@ -539,12 +558,16 @@ def test_vector_stores_no_module_level_settings_access():
539558 try :
540559 # Clear all vector database related environment variables
541560 for key in list (os .environ .keys ()):
542- if any (prefix in key for prefix in ["PINECONE" , "CHROMA" , "MILVUS" , "ELASTIC" , "WEAVIATE" ]):
561+ if any (
562+ prefix in key
563+ for prefix in ["PINECONE" , "CHROMA" , "MILVUS" , "ELASTIC" , "WEAVIATE" ]
564+ ):
543565 del os .environ [key ]
544566
545567 # These imports should NOT fail even with invalid vector db config
546568 # because settings should not be accessed during import
547- from vectordbs import chroma_store , elasticsearch_store , milvus_store , pinecone_store , weaviate_store
569+ from vectordbs import (chroma_store , elasticsearch_store , milvus_store ,
570+ pinecone_store , weaviate_store )
548571
549572 # Modules should be importable
550573 assert pinecone_store is not None
@@ -556,7 +579,9 @@ def test_vector_stores_no_module_level_settings_access():
556579 except ImportError as e :
557580 # If import fails, it should NOT be due to settings validation
558581 error_msg = str (e ).lower ()
559- assert not any (term in error_msg for term in ["validation" , "settings" , "config" ])
582+ assert not any (
583+ term in error_msg for term in ["validation" , "settings" , "config" ]
584+ )
560585
561586 finally :
562587 # Restore original environment
@@ -581,7 +606,9 @@ def test_data_ingestion_dependency_injection():
581606 mock_settings .chunking_strategy = "semantic"
582607
583608 # Test PdfProcessor (concrete implementation of BaseProcessor)
584- with patch ("rag_solution.data_ingestion.base_processor.get_chunking_method" ) as mock_get_chunking :
609+ with patch (
610+ "rag_solution.data_ingestion.base_processor.get_chunking_method"
611+ ) as mock_get_chunking :
585612 mock_get_chunking .return_value = Mock ()
586613
587614 processor = PdfProcessor (settings = mock_settings )
@@ -607,7 +634,9 @@ def test_data_ingestion_dependency_injection():
607634@pytest .mark .unit
608635def test_chunking_functions_dependency_injection ():
609636 """Test that chunking functions properly use dependency injection."""
610- from rag_solution .data_ingestion .chunking import get_chunking_method , semantic_chunker , simple_chunker
637+ from rag_solution .data_ingestion .chunking import (get_chunking_method ,
638+ semantic_chunker ,
639+ simple_chunker )
611640
612641 mock_settings = Mock ()
613642 mock_settings .min_chunk_size = 100
@@ -616,7 +645,9 @@ def test_chunking_functions_dependency_injection():
616645 mock_settings .chunking_strategy = "semantic"
617646
618647 # Test simple_chunker with injected settings
619- with patch ("rag_solution.data_ingestion.chunking.simple_chunking" ) as mock_simple_chunking :
648+ with patch (
649+ "rag_solution.data_ingestion.chunking.simple_chunking"
650+ ) as mock_simple_chunking :
620651 mock_simple_chunking .return_value = ["chunk1" , "chunk2" ]
621652
622653 result = simple_chunker ("test text" , mock_settings )
@@ -625,7 +656,9 @@ def test_chunking_functions_dependency_injection():
625656 assert result == ["chunk1" , "chunk2" ]
626657
627658 # Test semantic_chunker with injected settings
628- with patch ("rag_solution.data_ingestion.chunking.semantic_chunking" ) as mock_semantic_chunking :
659+ with patch (
660+ "rag_solution.data_ingestion.chunking.semantic_chunking"
661+ ) as mock_semantic_chunking :
629662 mock_semantic_chunking .return_value = ["semantic1" , "semantic2" ]
630663
631664 result = semantic_chunker ("test text" , mock_settings )
@@ -667,8 +700,12 @@ def test_watsonx_utils_dependency_injection():
667700 ):
668701 get_wx_client (mock_settings )
669702
670- mock_credentials .assert_called_once_with (api_key = "test-key" , url = "https://test.watsonx.com" )
671- mock_api_client .assert_called_once_with (project_id = "test-project" , credentials = mock_credentials .return_value )
703+ mock_credentials .assert_called_once_with (
704+ api_key = "test-key" , url = "https://test.watsonx.com"
705+ )
706+ mock_api_client .assert_called_once_with (
707+ project_id = "test-project" , credentials = mock_credentials .return_value
708+ )
672709
673710 # Test get_embeddings with injected settings
674711 with patch ("vectordbs.utils.watsonx.get_wx_embeddings_client" ) as mock_get_client :
@@ -679,7 +716,9 @@ def test_watsonx_utils_dependency_injection():
679716 result = get_embeddings ("test text" , mock_settings )
680717
681718 mock_get_client .assert_called_once_with (mock_settings )
682- mock_embed_client .embed_documents .assert_called_once_with (texts = ["test text" ], concurrency_limit = 8 )
719+ mock_embed_client .embed_documents .assert_called_once_with (
720+ texts = ["test text" ], concurrency_limit = 8
721+ )
683722 assert result == [[0.1 , 0.2 , 0.3 ]]
684723
685724
@@ -753,10 +792,16 @@ def test_no_global_settings_import_in_critical_modules():
753792
754793 # Check for problematic imports
755794 for node in ast .walk (tree ):
756- if isinstance (node , ast .ImportFrom ) and node .module == "core.config" and node .names :
795+ if (
796+ isinstance (node , ast .ImportFrom )
797+ and node .module == "core.config"
798+ and node .names
799+ ):
757800 for alias in node .names :
758801 # Should NOT import 'settings' directly
759- assert alias .name != "settings" , f"File { file_path } still imports global 'settings' object"
802+ assert (
803+ alias .name != "settings"
804+ ), f"File { file_path } still imports global 'settings' object"
760805 # SHOULD import 'Settings' class and 'get_settings' function
761806 assert alias .name in [
762807 "Settings" ,
0 commit comments