-
Notifications
You must be signed in to change notification settings - Fork 675
Expand file tree
/
Copy pathtest_graphql.py
More file actions
124 lines (95 loc) · 3.73 KB
/
Copy pathtest_graphql.py
File metadata and controls
124 lines (95 loc) · 3.73 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
import httpx
import pytest
import respx
import gitlab
@pytest.fixture(scope="module")
def api_url() -> str:
return "https://gitlab.example.com/api/graphql"
@pytest.fixture
def gl_gql() -> gitlab.GraphQL:
return gitlab.GraphQL("https://gitlab.example.com")
@pytest.fixture
def gl_async_gql() -> gitlab.AsyncGraphQL:
return gitlab.AsyncGraphQL("https://gitlab.example.com")
def test_import_error_includes_message(monkeypatch: pytest.MonkeyPatch):
monkeypatch.setattr(gitlab.client, "_GQL_INSTALLED", False)
with pytest.raises(ImportError, match="GraphQL client could not be initialized"):
gitlab.GraphQL()
@pytest.mark.anyio
async def test_async_import_error_includes_message(monkeypatch: pytest.MonkeyPatch):
monkeypatch.setattr(gitlab.client, "_GQL_INSTALLED", False)
with pytest.raises(ImportError, match="GraphQL client could not be initialized"):
gitlab.AsyncGraphQL()
def test_graphql_as_context_manager_exits():
with gitlab.GraphQL() as gl:
assert isinstance(gl, gitlab.GraphQL)
@pytest.mark.anyio
async def test_async_graphql_as_context_manager_aexits():
async with gitlab.AsyncGraphQL() as gl:
assert isinstance(gl, gitlab.AsyncGraphQL)
def test_graphql_retries_on_429_response(
gl_gql: gitlab.GraphQL, respx_mock: respx.MockRouter
):
url = "https://gitlab.example.com/api/graphql"
responses = [
httpx.Response(429, headers={"retry-after": "1"}),
httpx.Response(
200, json={"data": {"currentUser": {"id": "gid://gitlab/User/1"}}}
),
]
respx_mock.post(url).mock(side_effect=responses)
gl_gql.execute("query {currentUser {id}}")
@pytest.mark.anyio
async def test_async_graphql_retries_on_429_response(
api_url: str, gl_async_gql: gitlab.AsyncGraphQL, respx_mock: respx.MockRouter
):
responses = [
httpx.Response(429, headers={"retry-after": "1"}),
httpx.Response(
200, json={"data": {"currentUser": {"id": "gid://gitlab/User/1"}}}
),
]
respx_mock.post(api_url).mock(side_effect=responses)
await gl_async_gql.execute("query {currentUser {id}}")
def test_graphql_raises_when_max_retries_exceeded(
api_url: str, respx_mock: respx.MockRouter
):
responses = [
httpx.Response(502),
httpx.Response(502),
httpx.Response(502),
]
respx_mock.post(api_url).mock(side_effect=responses)
gl_gql = gitlab.GraphQL(
"https://gitlab.example.com", max_retries=1, retry_transient_errors=True
)
with pytest.raises(gitlab.GitlabHttpError):
gl_gql.execute("query {currentUser {id}}")
@pytest.mark.anyio
async def test_async_graphql_raises_when_max_retries_exceeded(
api_url: str, respx_mock: respx.MockRouter
):
responses = [
httpx.Response(502),
httpx.Response(502),
httpx.Response(502),
]
respx_mock.post(api_url).mock(side_effect=responses)
gl_async_gql = gitlab.AsyncGraphQL(
"https://gitlab.example.com", max_retries=1, retry_transient_errors=True
)
with pytest.raises(gitlab.GitlabHttpError):
await gl_async_gql.execute("query {currentUser {id}}")
def test_graphql_raises_on_401_response(
api_url: str, gl_gql: gitlab.GraphQL, respx_mock: respx.MockRouter
):
respx_mock.post(api_url).mock(return_value=httpx.Response(401))
with pytest.raises(gitlab.GitlabAuthenticationError):
gl_gql.execute("query {currentUser {id}}")
@pytest.mark.anyio
async def test_async_graphql_raises_on_401_response(
api_url: str, gl_async_gql: gitlab.AsyncGraphQL, respx_mock: respx.MockRouter
):
respx_mock.post(api_url).mock(return_value=httpx.Response(401))
with pytest.raises(gitlab.GitlabAuthenticationError):
await gl_async_gql.execute("query {currentUser {id}}")