1
+ """
2
+ Shared pytest fixtures and configuration for modelcache tests.
3
+ """
4
+ import os
5
+ import tempfile
6
+ import shutil
7
+ from pathlib import Path
8
+ from typing import Iterator , Dict , Any
9
+ import pytest
10
+ from unittest .mock import MagicMock
11
+
12
+
13
+ @pytest .fixture
14
+ def temp_dir () -> Iterator [Path ]:
15
+ """
16
+ Create a temporary directory for test files.
17
+
18
+ Yields:
19
+ Path: Path to the temporary directory
20
+ """
21
+ temp_path = Path (tempfile .mkdtemp ())
22
+ yield temp_path
23
+ # Cleanup after test
24
+ if temp_path .exists ():
25
+ shutil .rmtree (temp_path )
26
+
27
+
28
+ @pytest .fixture
29
+ def mock_config () -> Dict [str , Any ]:
30
+ """
31
+ Provide a mock configuration dictionary for testing.
32
+
33
+ Returns:
34
+ Dict[str, Any]: Mock configuration
35
+ """
36
+ return {
37
+ "cache_dir" : "/tmp/test_cache" ,
38
+ "max_cache_size" : 1000 ,
39
+ "ttl" : 3600 ,
40
+ "embedding_model" : "test-model" ,
41
+ "similarity_threshold" : 0.8 ,
42
+ "vector_dimension" : 768 ,
43
+ "batch_size" : 32 ,
44
+ "database" : {
45
+ "type" : "memory" ,
46
+ "host" : "localhost" ,
47
+ "port" : 6379 ,
48
+ "password" : None
49
+ }
50
+ }
51
+
52
+
53
+ @pytest .fixture
54
+ def mock_embedding ():
55
+ """
56
+ Mock embedding object for testing.
57
+
58
+ Returns:
59
+ MagicMock: Mock embedding with common methods
60
+ """
61
+ mock = MagicMock ()
62
+ mock .embed .return_value = [0.1 ] * 768 # Default 768-dim embedding
63
+ mock .embed_batch .return_value = [[0.1 ] * 768 ] * 10
64
+ mock .dimension = 768
65
+ mock .model_name = "test-embedding-model"
66
+ return mock
67
+
68
+
69
+ @pytest .fixture
70
+ def mock_cache_manager ():
71
+ """
72
+ Mock cache manager for testing.
73
+
74
+ Returns:
75
+ MagicMock: Mock cache manager with common methods
76
+ """
77
+ mock = MagicMock ()
78
+ mock .get .return_value = None
79
+ mock .set .return_value = True
80
+ mock .delete .return_value = True
81
+ mock .clear .return_value = True
82
+ mock .size .return_value = 0
83
+ return mock
84
+
85
+
86
+ @pytest .fixture
87
+ def sample_vector_data ():
88
+ """
89
+ Sample vector data for testing vector operations.
90
+
91
+ Returns:
92
+ Dict[str, Any]: Sample vector data
93
+ """
94
+ return {
95
+ "id" : "test_vector_001" ,
96
+ "vector" : [0.1 , 0.2 , 0.3 , 0.4 , 0.5 ] * 153 + [0.6 , 0.7 , 0.8 ], # 768 dimensions
97
+ "metadata" : {
98
+ "source" : "test" ,
99
+ "timestamp" : 1234567890 ,
100
+ "model" : "test-model"
101
+ }
102
+ }
103
+
104
+
105
+ @pytest .fixture
106
+ def mock_redis_client ():
107
+ """
108
+ Mock Redis client for testing Redis-based operations.
109
+
110
+ Returns:
111
+ MagicMock: Mock Redis client
112
+ """
113
+ mock = MagicMock ()
114
+ mock .get .return_value = None
115
+ mock .set .return_value = True
116
+ mock .delete .return_value = 1
117
+ mock .exists .return_value = 0
118
+ mock .expire .return_value = True
119
+ mock .ttl .return_value = - 2
120
+ return mock
121
+
122
+
123
+ @pytest .fixture
124
+ def mock_milvus_client ():
125
+ """
126
+ Mock Milvus client for testing vector database operations.
127
+
128
+ Returns:
129
+ MagicMock: Mock Milvus client
130
+ """
131
+ mock = MagicMock ()
132
+ mock .create_collection .return_value = True
133
+ mock .insert .return_value = MagicMock (primary_keys = [1 , 2 , 3 ])
134
+ mock .search .return_value = [[]]
135
+ mock .query .return_value = []
136
+ mock .delete .return_value = MagicMock (delete_count = 1 )
137
+ return mock
138
+
139
+
140
+ @pytest .fixture (autouse = True )
141
+ def reset_environment ():
142
+ """
143
+ Reset environment variables before each test.
144
+ """
145
+ # Store original env vars
146
+ original_env = os .environ .copy ()
147
+
148
+ # Set test environment variables
149
+ os .environ ["MODELCACHE_ENV" ] = "test"
150
+ os .environ ["MODELCACHE_LOG_LEVEL" ] = "DEBUG"
151
+
152
+ yield
153
+
154
+ # Restore original env vars
155
+ os .environ .clear ()
156
+ os .environ .update (original_env )
157
+
158
+
159
+ @pytest .fixture
160
+ def sample_text_data ():
161
+ """
162
+ Sample text data for testing text processing.
163
+
164
+ Returns:
165
+ List[str]: List of sample texts
166
+ """
167
+ return [
168
+ "This is a test sentence for modelcache." ,
169
+ "Machine learning models need efficient caching." ,
170
+ "Vector embeddings help with semantic search." ,
171
+ "Testing is important for code quality." ,
172
+ "PyTest makes testing in Python easier."
173
+ ]
174
+
175
+
176
+ @pytest .fixture
177
+ def mock_http_response ():
178
+ """
179
+ Mock HTTP response for testing API calls.
180
+
181
+ Returns:
182
+ MagicMock: Mock response object
183
+ """
184
+ mock = MagicMock ()
185
+ mock .status_code = 200
186
+ mock .json .return_value = {"status" : "success" , "data" : {}}
187
+ mock .text = '{"status": "success", "data": {}}'
188
+ mock .headers = {"Content-Type" : "application/json" }
189
+ return mock
190
+
191
+
192
+ # Pytest configuration hooks
193
+ def pytest_configure (config ):
194
+ """
195
+ Configure pytest with custom settings.
196
+ """
197
+ # Add custom markers description
198
+ config .addinivalue_line (
199
+ "markers" , "unit: mark test as a unit test"
200
+ )
201
+ config .addinivalue_line (
202
+ "markers" , "integration: mark test as an integration test"
203
+ )
204
+ config .addinivalue_line (
205
+ "markers" , "slow: mark test as slow running"
206
+ )
207
+
208
+
209
+ def pytest_collection_modifyitems (config , items ):
210
+ """
211
+ Modify test collection to add markers based on test location.
212
+ """
213
+ for item in items :
214
+ # Auto-mark tests based on their location
215
+ if "unit" in str (item .fspath ):
216
+ item .add_marker (pytest .mark .unit )
217
+ elif "integration" in str (item .fspath ):
218
+ item .add_marker (pytest .mark .integration )
0 commit comments