16
16
import requests
17
17
18
18
19
+ def raise_error (* args , ** kwargs ):
20
+ """Raise an error if the real playwright gets used."""
21
+ raise RuntimeError ("Real Playwright should not be invoked!" )
22
+
23
+
19
24
@pytest .fixture
20
- def mock_get_user_packages_success () -> Generator [Union [MagicMock , AsyncMock ], Any , None ]:
21
- """Fixture to mock requests.get for get_user_packages success case."""
22
- with patch ('requests.get' ) as mock_get :
23
- mock_response = Mock ()
24
- mock_response .raise_for_status .return_value = None
25
- mock_response .text = '''
26
- <a class="package-snippet">
27
- <h3 class="package-snippet__title">Package1</h3>
28
- <p class="package-snippet__description">Description1</p>
29
- </a>
30
- <a class="package-snippet">
31
- <h3 class="package-snippet__title">Package2</h3>
32
- <p class="package-snippet__description">Description2</p>
33
- </a>
34
- '''
35
- mock_get .return_value = mock_response
36
- yield mock_get
25
+ def mock_playwright () -> Generator [MagicMock , None , None ]:
26
+ """Mock the Playwright sync API."""
27
+ with patch ('wolfsoftware.pypi_extractor.pypi.sync_playwright' ) as mock_sync_playwright :
28
+ mock_playwright_instance = MagicMock ()
29
+ mock_browser = MagicMock ()
30
+ mock_context = MagicMock ()
31
+ mock_page = MagicMock ()
32
+
33
+ # Mock page.goto() and page.wait_for_selector()
34
+ mock_page .goto .return_value = None
35
+ mock_page .wait_for_selector .return_value = None
36
+
37
+ # Mock page.query_selector_all() to return simulated package elements
38
+ def mock_query_selector_all (selector ):
39
+ """Handle mocking the right data."""
40
+ if selector == 'a.package-snippet' :
41
+ return [
42
+ MagicMock (query_selector = MagicMock (side_effect = [
43
+ MagicMock (inner_text = MagicMock (return_value = "Package1" )),
44
+ MagicMock (inner_text = MagicMock (return_value = "Description1" )),
45
+ ])),
46
+ MagicMock (query_selector = MagicMock (side_effect = [
47
+ MagicMock (inner_text = MagicMock (return_value = "Package2" )),
48
+ MagicMock (inner_text = MagicMock (return_value = "Description2" )),
49
+ ])),
50
+ ]
51
+ return []
52
+ mock_page .query_selector_all .side_effect = mock_query_selector_all
53
+
54
+ mock_context .new_page .return_value = mock_page
55
+ mock_browser .new_context .return_value = mock_context
56
+ mock_playwright_instance .chromium .launch .return_value = mock_browser
57
+ mock_sync_playwright .return_value .__enter__ .return_value = mock_playwright_instance
58
+ yield mock_sync_playwright
37
59
38
60
39
61
@pytest .fixture
40
- def mock_get_user_packages_error () -> Generator [Union [MagicMock , AsyncMock ], Any , None ]:
41
- """Fixture to mock requests.get for get_user_packages error case."""
42
- with patch ('requests.get' ) as mock_get :
43
- mock_get .side_effect = requests .RequestException ("Request error" )
44
- yield mock_get
62
+ def mock_playwright_error () -> Generator [MagicMock , None , None ]:
63
+ """Fixture to mock Playwright with an error scenario."""
64
+ with patch ('wolfsoftware.pypi_extractor.pypi.sync_playwright' ) as mock_sync_playwright :
65
+ mock_playwright_instance = MagicMock ()
66
+ mock_playwright_instance .chromium .launch .side_effect = Exception ("Playwright error" )
67
+ mock_sync_playwright .return_value .__enter__ .return_value = mock_playwright_instance
68
+ yield mock_sync_playwright
45
69
46
70
47
71
@pytest .fixture
@@ -155,24 +179,13 @@ def mock_get_package_details_error() -> Generator[Union[MagicMock, AsyncMock], A
155
179
156
180
157
181
@pytest .fixture
158
- def mock_get_all_packages_details_success () -> Generator [Union [ MagicMock , AsyncMock ], Any , None ]:
159
- """Fixture to mock requests.get for get_all_packages_details success case."""
182
+ def mock_get_all_packages_details_success () -> Generator [MagicMock , None , None ]:
183
+ """Mock requests.get for get_all_packages_details success case."""
160
184
with patch ('requests.get' ) as mock_get :
161
- mock_response_user = Mock ()
185
+ # Mock response for the user packages API
186
+ mock_response_user = MagicMock ()
162
187
mock_response_user .raise_for_status .return_value = None
163
- mock_response_user .text = '''
164
- <a class="package-snippet">
165
- <h3 class="package-snippet__title">Package1</h3>
166
- <p class="package-snippet__description">Description1</p>
167
- </a>
168
- <a class="package-snippet">
169
- <h3 class="package-snippet__title">Package2</h3>
170
- <p class="package-snippet__description">Description2</p>
171
- </a>
172
- '''
173
- mock_response_package1 = Mock ()
174
- mock_response_package1 .raise_for_status .return_value = None
175
- mock_response_package1 .json .return_value = {
188
+ mock_response_user .json .return_value = {
176
189
'info' : {
177
190
'name' : 'Package1' ,
178
191
'version' : '1.0.0' ,
@@ -186,37 +199,30 @@ def mock_get_all_packages_details_success() -> Generator[Union[MagicMock, AsyncM
186
199
'requires_python' : '>=3.6' ,
187
200
},
188
201
'releases' : {
189
- '0.9.0' : [
190
- {
191
- 'upload_time' : '2021-01-01T00:00:00' ,
192
- 'upload_time_iso_8601' : '2021-01-01T00:00:00Z' ,
193
- 'python_version' : 'py3' ,
194
- 'url' : 'https://example.com' ,
195
- 'filename' : 'package-0.9.0.tar.gz' ,
196
- 'packagetype' : 'sdist' ,
197
- 'md5_digest' : 'abc123' ,
198
- 'digests' : {'sha256' : 'def456' },
199
- 'size' : 12345
200
- }
201
- ],
202
202
'1.0.0' : [
203
203
{
204
204
'upload_time' : '2021-06-01T00:00:00' ,
205
205
'upload_time_iso_8601' : '2021-06-01T00:00:00Z' ,
206
206
'python_version' : 'py3' ,
207
- 'url' : 'https://example.com' ,
207
+ 'url' : 'https://example.com/package-1.0.0.tar.gz ' ,
208
208
'filename' : 'package-1.0.0.tar.gz' ,
209
209
'packagetype' : 'sdist' ,
210
- 'md5_digest' : 'ghi789 ' ,
211
- 'digests' : {'sha256' : 'jkl012 ' },
212
- 'size' : 23456
210
+ 'md5_digest' : 'abc123 ' ,
211
+ 'digests' : {'sha256' : 'def456 ' },
212
+ 'size' : 12345
213
213
}
214
- ],
214
+ ]
215
215
},
216
216
'requires_dist' : ['requests' , 'beautifulsoup4' ],
217
217
'urls' : [{'url' : 'https://example.com/package-1.0.0.tar.gz' }],
218
218
}
219
- mock_response_package2 = Mock ()
219
+
220
+ # Simulate two different package details responses
221
+ mock_response_package1 = MagicMock ()
222
+ mock_response_package1 .raise_for_status .return_value = None
223
+ mock_response_package1 .json .return_value = mock_response_user .json .return_value
224
+
225
+ mock_response_package2 = MagicMock ()
220
226
mock_response_package2 .raise_for_status .return_value = None
221
227
mock_response_package2 .json .return_value = {
222
228
'info' : {
@@ -226,41 +232,30 @@ def mock_get_all_packages_details_success() -> Generator[Union[MagicMock, AsyncM
226
232
'author' : 'Author2' ,
227
233
'author_email' :
'[email protected] ' ,
228
234
'license' : 'MIT' ,
229
- 'home_page' : 'https://example.com' ,
230
- 'keywords' : 'example, package ' ,
235
+ 'home_page' : 'https://example.com/package2 ' ,
236
+ 'keywords' : 'example, package2 ' ,
231
237
'classifiers' : ['Development Status :: 5 - Production/Stable' ],
232
238
'requires_python' : '>=3.6' ,
233
239
},
234
240
'releases' : {
235
- '1.0.0' : [
236
- {
237
- 'upload_time' : '2021-01-01T00:00:00' ,
238
- 'upload_time_iso_8601' : '2021-01-01T00:00:00Z' ,
239
- 'python_version' : 'py3' ,
240
- 'url' : 'https://example.com' ,
241
- 'filename' : 'package-1.0.0.tar.gz' ,
242
- 'packagetype' : 'sdist' ,
243
- 'md5_digest' : 'abc123' ,
244
- 'digests' : {'sha256' : 'def456' },
245
- 'size' : 12345
246
- }
247
- ],
248
241
'2.0.0' : [
249
242
{
250
- 'upload_time' : '2021 -06-01T00:00:00' ,
251
- 'upload_time_iso_8601' : '2021 -06-01T00:00:00Z' ,
243
+ 'upload_time' : '2022 -06-01T00:00:00' ,
244
+ 'upload_time_iso_8601' : '2022 -06-01T00:00:00Z' ,
252
245
'python_version' : 'py3' ,
253
- 'url' : 'https://example.com' ,
246
+ 'url' : 'https://example.com/package-2.0.0.tar.gz ' ,
254
247
'filename' : 'package-2.0.0.tar.gz' ,
255
248
'packagetype' : 'sdist' ,
256
249
'md5_digest' : 'ghi789' ,
257
250
'digests' : {'sha256' : 'jkl012' },
258
251
'size' : 23456
259
252
}
260
- ],
253
+ ]
261
254
},
262
255
'requires_dist' : ['requests' , 'beautifulsoup4' ],
263
256
'urls' : [{'url' : 'https://example.com/package-2.0.0.tar.gz' }],
264
257
}
265
- mock_get .side_effect = [mock_response_user , mock_response_package1 , mock_response_package2 ]
258
+
259
+ # Simulate the sequence of requests
260
+ mock_get .side_effect = [mock_response_package1 , mock_response_package2 ]
266
261
yield mock_get
0 commit comments