-
Notifications
You must be signed in to change notification settings - Fork 166
Expand file tree
/
Copy pathconftest.py
More file actions
144 lines (113 loc) · 3.87 KB
/
Copy pathconftest.py
File metadata and controls
144 lines (113 loc) · 3.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
"""Shared fixtures and helpers for unit tests."""
import json
from unittest.mock import AsyncMock, MagicMock, patch
import httpx
import pytest
from meraki.session.sync import RestSession
FAKE_API_KEY = "fake_api_key_1234567890123456789012345678901234567890"
DEFAULT_SESSION_KWARGS = {
"base_url": "https://api.meraki.com/api/v1",
"single_request_timeout": 60,
"certificate_path": "",
"requests_proxy": "",
"wait_on_rate_limit": True,
"nginx_429_retry_wait_time": 2,
"action_batch_retry_wait_time": 2,
"network_delete_retry_wait_time": 2,
"retry_4xx_error": False,
"retry_4xx_error_wait_time": 1,
"maximum_retries": 3,
"simulate": False,
"be_geo_id": "",
"caller": "TestApp TestVendor",
"use_iterator_for_get_pages": False,
}
def make_metadata(operation="getOrganizations", tags=None, **extra):
meta = {"tags": tags or ["organizations"], "operation": operation}
meta.update(extra)
return meta
def make_mock_response(
status_code=200,
json_data=None,
reason_phrase="OK",
headers=None,
content=None,
links=None,
):
resp = MagicMock(spec=httpx.Response)
resp.status_code = status_code
resp.reason_phrase = reason_phrase
resp.headers = headers or {}
resp.links = links or {}
if content is not None:
resp.content = content
else:
resp.content = json.dumps(json_data if json_data is not None else {"ok": True}).encode()
resp.json.return_value = json_data if json_data is not None else {"ok": True}
resp.text = json.dumps(json_data if json_data is not None else {"ok": True})
resp.close = MagicMock()
return resp
def make_async_mock_response(
status_code=200,
json_data=None,
reason_phrase="OK",
headers=None,
content=None,
links=None,
):
resp = make_mock_response(
status_code=status_code,
json_data=json_data,
reason_phrase=reason_phrase,
headers=headers,
content=content,
links=links,
)
resp.close = MagicMock(side_effect=RuntimeError("Attempted to call sync close on an async stream."))
resp.aclose = AsyncMock()
return resp
def make_sync_session(logger=None, **overrides):
kwargs = {**DEFAULT_SESSION_KWARGS, **overrides}
with patch("meraki.session.base.check_python_version"):
with patch("httpx.Client") as mock_client:
mock_instance = MagicMock()
mock_instance.headers = MagicMock(spec=dict)
mock_client.return_value = mock_instance
s = RestSession(logger=logger, api_key=FAKE_API_KEY, **kwargs)
if s._smart_flow:
s._smart_flow = MagicMock()
return s
def make_async_session(logger=None, **overrides):
kwargs = {"maximum_concurrent_requests": 8, **DEFAULT_SESSION_KWARGS, **overrides}
with (
patch("meraki.session.base.check_python_version"),
patch("httpx.AsyncClient") as mock_client,
):
mock_instance = MagicMock()
mock_instance.headers = {}
mock_instance.request = AsyncMock()
mock_client.return_value = mock_instance
from meraki.session.async_ import AsyncRestSession
s = AsyncRestSession(logger=logger, api_key=FAKE_API_KEY, **kwargs)
return s
# --- Pytest fixtures wrapping the factories ---
@pytest.fixture
def session():
return make_sync_session()
@pytest.fixture
def session_with_logger():
return make_sync_session(logger=MagicMock())
@pytest.fixture
def async_session():
return make_async_session()
@pytest.fixture
def async_session_with_logger():
return make_async_session(logger=MagicMock())
@pytest.fixture
def async_session_with_cert(tmp_path):
cert_file = tmp_path / "cert.pem"
cert_file.write_text("FAKE CERT")
return make_async_session(certificate_path=str(cert_file))
@pytest.fixture
def async_session_with_proxy():
return make_async_session(requests_proxy="http://proxy:8080")