Skip to content

Commit 10ae2f8

Browse files
author
Mike Storey
committed
Updated unit tests to be independent of Mongo database
1 parent 891f34d commit 10ae2f8

File tree

4 files changed

+36
-56
lines changed

4 files changed

+36
-56
lines changed

docker-compose.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: '3.1'
1+
# docker-compose.yaml for stage0_mongodb_api testing
22

33
services:
44
mongodb-server:

stage0_mongodb_api/managers/config_manager.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class ConfigManager:
2525
def __init__(self):
2626
"""Initialize the config manager."""
2727
self.config = Config.get_instance()
28-
self.mongo_io = MongoIO()
28+
self.mongo_io = MongoIO.get_instance()
2929
self.collection_configs: Dict[str, Dict] = {}
3030
self.load_errors: List[Dict] = []
3131
self.version_manager = VersionManager()

tests/managers/test_config_manager.py

Lines changed: 22 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,19 @@
44
import tempfile
55
from stage0_mongodb_api.managers.config_manager import ConfigManager
66
from stage0_py_utils import Config
7-
from unittest.mock import patch
7+
from unittest.mock import patch, MagicMock
88

99
class TestConfigManager(unittest.TestCase):
10+
@classmethod
11+
def setUpClass(cls):
12+
cls.mongoio_patcher = patch('stage0_py_utils.mongo_utils.mongo_io.MongoIO.get_instance')
13+
cls.mock_mongoio_get_instance = cls.mongoio_patcher.start()
14+
cls.mock_mongoio_get_instance.return_value = MagicMock()
15+
16+
@classmethod
17+
def tearDownClass(cls):
18+
cls.mongoio_patcher.stop()
19+
1020
def setUp(self):
1121
self.test_cases_dir = os.path.join(os.path.dirname(__file__), '..', 'test_cases')
1222
self.config = Config.get_instance()
@@ -16,38 +26,26 @@ def tearDown(self):
1626

1727
def test_load_minimum_valid(self):
1828
"""Test loading empty Collections directory structure."""
19-
20-
# Initialize SchemaManager
2129
test_case_dir = os.path.join(self.test_cases_dir, "minimum_valid")
2230
self.config.INPUT_FOLDER = test_case_dir
2331
manager = ConfigManager()
24-
25-
# Verify no load errors
2632
self.assertEqual(manager.load_errors, [], "Unexpected load errors in simple_valid test case")
2733
self.assertEqual(len(manager.collection_configs), 0, f"Unexpected number of collection configs {len(manager.collection_configs)}")
2834

2935
def test_load_small_sample(self):
3036
"""Test loading Small configuration."""
31-
32-
# Initialize SchemaManager
3337
test_case_dir = os.path.join(self.test_cases_dir, "small_sample")
3438
self.config.INPUT_FOLDER = test_case_dir
3539
manager = ConfigManager()
36-
37-
# Verify no load errors
3840
self.assertEqual(manager.load_errors, [], "Unexpected load errors in simple_valid test case")
3941
self.assertEqual(len(manager.collection_configs), 1, f"Unexpected number of collection configs {len(manager.collection_configs)}")
4042
self.assertIn("simple", manager.collection_configs)
4143

4244
def test_load_large_sample(self):
4345
"""Test loading large config"""
44-
45-
# Initialize SchemaManager
4646
test_case_dir = os.path.join(self.test_cases_dir, "large_sample")
4747
self.config.INPUT_FOLDER = test_case_dir
4848
manager = ConfigManager()
49-
50-
# Verify no load errors
5149
self.assertEqual(manager.load_errors, [], "Unexpected load errors in simple_valid test case")
5250
self.assertEqual(len(manager.collection_configs), 4, f"Unexpected number of collection configs {len(manager.collection_configs)}")
5351
self.assertIn("media", manager.collection_configs)
@@ -57,75 +55,56 @@ def test_load_large_sample(self):
5755

5856
def test_non_parsable(self):
5957
"""Test loading with non-parsable files"""
60-
61-
# Initialize SchemaManager
6258
test_case_dir = os.path.join(self.test_cases_dir, "non_parsable")
6359
self.config.INPUT_FOLDER = test_case_dir
6460
manager = ConfigManager()
65-
66-
# Verify no load errors
6761
self.assertEqual(len(manager.load_errors), 1, f"Unexpected load errors {manager.load_errors}")
6862

6963
def test_validation_errors(self):
7064
"""Test loading with validation errors"""
71-
72-
# Initialize SchemaManager
7365
test_case_dir = os.path.join(self.test_cases_dir, "validation_errors")
7466
self.config.INPUT_FOLDER = test_case_dir
7567
manager = ConfigManager()
7668
errors = manager.validate_configs()
77-
78-
# Verify no load errors
7969
self.assertEqual(len(manager.load_errors), 0, f"Unexpected load errors {manager.load_errors}")
8070
self.assertEqual(len(errors), 6, f"Unexpected number of validation errors {errors}")
8171

82-
@patch('stage0_mongodb_api.managers.config_manager.MongoIO')
83-
def test_load_test_data_bulk_write_error(self, mock_mongo):
72+
def test_load_test_data_bulk_write_error(self):
8473
"""Test that _load_test_data properly handles bulk write errors."""
85-
# Arrange
8674
from stage0_py_utils.mongo_utils.mongo_io import TestDataLoadError
8775
mock_details = {'writeErrors': [{'index': 0, 'code': 121, 'errmsg': 'Document failed validation'}]}
88-
mock_mongo.return_value.load_test_data.side_effect = TestDataLoadError("Schema validation failed during test data load", details=mock_details)
89-
76+
self.mock_mongoio_get_instance.return_value.load_test_data.side_effect = TestDataLoadError(
77+
"Schema validation failed during test data load", details=mock_details
78+
)
9079
config_manager = ConfigManager()
9180
collection_name = "test_collection"
9281
test_data_file = "test.json"
93-
94-
# Act
9582
result = config_manager._load_test_data(collection_name, test_data_file)
96-
97-
# Assert
9883
self.assertEqual(result["status"], "error")
9984
self.assertEqual(result["operation"], "load_test_data")
10085
self.assertEqual(result["collection"], collection_name)
10186
self.assertIn("test.json", result["test_data"])
10287
self.assertEqual(result["error"], "Schema validation failed during test data load")
10388
self.assertEqual(result["details"], mock_details)
10489

105-
@patch('stage0_mongodb_api.managers.config_manager.MongoIO')
106-
def test_load_test_data_generic_error(self, mock_mongo):
90+
def test_load_test_data_generic_error(self):
10791
"""Test that _load_test_data properly handles generic errors."""
108-
# Arrange
109-
mock_mongo.return_value.load_test_data.side_effect = Exception("File not found")
110-
92+
self.mock_mongoio_get_instance.return_value.load_test_data.side_effect = Exception("File not found")
11193
config_manager = ConfigManager()
11294
collection_name = "test_collection"
11395
test_data_file = "test.json"
114-
115-
# Act
11696
result = config_manager._load_test_data(collection_name, test_data_file)
117-
118-
# Assert
11997
self.assertEqual(result["status"], "error")
12098
self.assertEqual(result["operation"], "load_test_data")
12199
self.assertEqual(result["collection"], collection_name)
122100
self.assertIn("test.json", result["test_data"])
123101
self.assertEqual(result["error"], "File not found")
124102

125-
@patch('stage0_mongodb_api.managers.config_manager.MongoIO')
126-
def test_load_test_data_success(self, mock_mongo):
103+
def test_load_test_data_success(self):
127104
"""Test that _load_test_data properly handles successful loads."""
128-
# Arrange
105+
# Reset any previous side effects or return values
106+
self.mock_mongoio_get_instance.return_value.load_test_data.reset_mock()
107+
self.mock_mongoio_get_instance.return_value.load_test_data.side_effect = None
129108
mock_results = {
130109
"status": "success",
131110
"operation": "load_test_data",
@@ -134,16 +113,11 @@ def test_load_test_data_success(self, mock_mongo):
134113
"inserted_ids": ["id1", "id2", "id3", "id4", "id5"],
135114
"acknowledged": True
136115
}
137-
mock_mongo.return_value.load_test_data.return_value = mock_results
138-
116+
self.mock_mongoio_get_instance.return_value.load_test_data.return_value = mock_results
139117
config_manager = ConfigManager()
140118
collection_name = "test_collection"
141119
test_data_file = "test.json"
142-
143-
# Act
144120
result = config_manager._load_test_data(collection_name, test_data_file)
145-
146-
# Assert
147121
self.assertEqual(result["status"], "success")
148122
self.assertEqual(result["operation"], "load_test_data")
149123
self.assertEqual(result["collection"], collection_name)

tests/services/test_render_service.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,16 @@ def test_render_openapi_not_implemented(self, mock_config_manager_class):
7474
# Assert
7575
self.assertEqual(result, expected_message)
7676

77+
@patch('stage0_mongodb_api.managers.schema_manager.MongoIO')
7778
@patch('stage0_mongodb_api.services.render_service.ConfigManager')
78-
def test_render_json_schema_load_errors(self, mock_config_manager_class):
79-
"""Test JSON schema rendering with load errors."""
79+
def test_render_json_schema_load_errors(self, mock_config_manager_class, mock_mongoio_class):
80+
# This ensures that any call to MongoIO.get_instance() returns a mock
81+
mock_mongoio_class.get_instance.return_value = MagicMock()
82+
8083
# Arrange
8184
schema_name = "test_collection.1.0.0.1"
8285
load_errors = [{"error": "load_error", "message": "Failed to load config"}]
83-
86+
8487
mock_config_manager = MagicMock()
8588
mock_config_manager.load_errors = load_errors
8689
mock_config_manager_class.return_value = mock_config_manager
@@ -92,13 +95,16 @@ def test_render_json_schema_load_errors(self, mock_config_manager_class):
9295
self.assertEqual(context.exception.schema_name, schema_name)
9396
self.assertEqual(context.exception.errors, load_errors)
9497

98+
@patch('stage0_mongodb_api.managers.schema_manager.MongoIO')
9599
@patch('stage0_mongodb_api.services.render_service.ConfigManager')
96-
def test_render_bson_schema_validation_errors(self, mock_config_manager_class):
97-
"""Test BSON schema rendering with validation errors."""
100+
def test_render_bson_schema_validation_errors(self, mock_config_manager_class, mock_mongoio_class):
101+
# This ensures that any call to MongoIO.get_instance() returns a mock
102+
mock_mongoio_class.get_instance.return_value = MagicMock()
103+
98104
# Arrange
99105
schema_name = "test_collection.1.0.0.1"
100106
validation_errors = [{"error": "validation_error", "message": "Invalid schema"}]
101-
107+
102108
mock_config_manager = MagicMock()
103109
mock_config_manager.load_errors = []
104110
mock_config_manager.validate_configs.return_value = validation_errors

0 commit comments

Comments
 (0)