Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitbb4c1b1

Browse files
committed
fix: Improve MongoDB client initialization and testing
- Remove module-level client instantiation- Add better error handling- Enhance test coverage- Fix environment variable issues
1 parentf7f336a commitbb4c1b1

File tree

2 files changed

+39
-24
lines changed

2 files changed

+39
-24
lines changed

‎src/utils/mongodb_client.py‎

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,21 @@ class MongoDBClient:
1010
def__new__(cls):
1111
ifcls._instanceisNone:
1212
cls._instance=super(MongoDBClient,cls).__new__(cls)
13+
cls._instance.client=None
14+
cls._instance.db=None
1315
returncls._instance
1416

1517
def__init__(self):
16-
ifnothasattr(self,'initialized'):
17-
self.client:Optional[MongoClient]=None
18-
self.db:Optional[Database]=None
19-
self.initialized=True
18+
# Skip initialization if already done
19+
ifhasattr(self,'initialized'):
20+
return
21+
self.initialized=True
2022

2123
definitialize_connection(self)->None:
2224
"""Initialize MongoDB connection using environment variables."""
25+
ifself.clientisnotNone:
26+
return
27+
2328
mongodb_uri=os.getenv('MONGODB_URI')
2429
database_name=os.getenv('MONGODB_DATABASE')
2530

@@ -30,11 +35,13 @@ def initialize_connection(self) -> None:
3035
self.client=MongoClient(mongodb_uri)
3136
self.db=self.client[database_name]
3237
exceptExceptionase:
38+
self.client=None
39+
self.db=None
3340
raiseException(f"Failed to connect to MongoDB:{str(e)}")
3441

3542
defget_collection(self,collection_name:str)->Collection:
3643
"""Get a MongoDB collection."""
37-
ifnotself.db:
44+
ifnotself.clientornotself.db:
3845
self.initialize_connection()
3946
returnself.db[collection_name]
4047

@@ -91,6 +98,6 @@ def close(self) -> None:
9198
self.client=None
9299
self.db=None
93100

94-
# Create a singleton instance
95101
defget_mongodb_client()->MongoDBClient:
102+
"""Get the MongoDB client instance."""
96103
returnMongoDBClient()

‎tests/test_mongodb.py‎

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
importos
22
importpytest
33
fromunittest.mockimportpatch,MagicMock
4-
fromsrc.utils.mongodb_clientimportMongoDBClient
4+
fromsrc.utils.mongodb_clientimportMongoDBClient,get_mongodb_client
55

66
@pytest.fixture(autouse=True)
77
defmock_env_vars():
8-
"""Automatically mock environment variables for all tests."""
8+
"""Mock environment variables for all tests."""
99
withpatch.dict(os.environ, {
1010
'MONGODB_URI':'mongodb://localhost:27017',
1111
'MONGODB_DATABASE':'test_db'
@@ -36,15 +36,16 @@ def mock_mongo_client():
3636
@pytest.fixture
3737
defmongodb_client():
3838
"""Create a fresh MongoDB client instance for each test."""
39-
client=MongoDBClient()
40-
client.client=None# Reset connection
39+
client=get_mongodb_client()
40+
client.client=None
4141
client.db=None
42-
returnclient
42+
yieldclient
43+
client.close()
4344

4445
deftest_singleton_pattern():
4546
"""Test that MongoDBClient follows singleton pattern."""
46-
client1=MongoDBClient()
47-
client2=MongoDBClient()
47+
client1=get_mongodb_client()
48+
client2=get_mongodb_client()
4849
assertclient1isclient2
4950

5051
deftest_lazy_initialization(mongodb_client):
@@ -55,7 +56,6 @@ def test_lazy_initialization(mongodb_client):
5556
deftest_successful_connection(mongodb_client,mock_mongo_client):
5657
"""Test successful database connection."""
5758
mongodb_client.initialize_connection()
58-
5959
mock_mongo_client['client'].assert_called_once_with('mongodb://localhost:27017')
6060
assertmongodb_client.clientisnotNone
6161
assertmongodb_client.dbisnotNone
@@ -67,28 +67,36 @@ def test_insert_one(mongodb_client, mock_mongo_client):
6767
collection.insert_one.return_value.inserted_id="test_id"
6868

6969
result=mongodb_client.insert_one("test_collection",test_doc)
70-
7170
collection.insert_one.assert_called_once_with(test_doc)
7271
assertresult=="test_id"
7372

7473
deftest_find_one(mongodb_client,mock_mongo_client):
7574
"""Test finding a single document."""
7675
test_query= {"name":"test"}
7776
expected_doc= {"_id":"test_id","name":"test"}
78-
7977
collection=mock_mongo_client['collection']
8078
collection.find_one.return_value=expected_doc
8179

8280
result=mongodb_client.find_one("test_collection",test_query)
83-
8481
collection.find_one.assert_called_once_with(test_query)
8582
assertresult==expected_doc
8683

87-
deftest_close_connection(mongodb_client,mock_mongo_client):
88-
"""Test closing the database connection."""
89-
mongodb_client.initialize_connection()
90-
mongodb_client.close()
84+
deftest_connection_error(mock_mongo_client):
85+
"""Test handling of connection errors."""
86+
mock_mongo_client['client'].side_effect=Exception("Connection failed")
87+
client=get_mongodb_client()
88+
client.client=None
9189

92-
mock_mongo_client['client_instance'].close.assert_called_once()
93-
assertmongodb_client.clientisNone
94-
assertmongodb_client.dbisNone
90+
withpytest.raises(Exception)asexc_info:
91+
client.initialize_connection()
92+
assert"Failed to connect to MongoDB"instr(exc_info.value)
93+
94+
deftest_missing_env_vars():
95+
"""Test handling of missing environment variables."""
96+
withpatch.dict(os.environ, {},clear=True):
97+
client=get_mongodb_client()
98+
client.client=None
99+
100+
withpytest.raises(ValueError)asexc_info:
101+
client.initialize_connection()
102+
assert"MongoDB connection details not found"instr(exc_info.value)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp