-
Notifications
You must be signed in to change notification settings - Fork 676
Expand file tree
/
Copy pathtest_graphql.py
More file actions
116 lines (87 loc) · 3.67 KB
/
test_graphql.py
File metadata and controls
116 lines (87 loc) · 3.67 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
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}}")