forked from pythonitalia/pythonit-toolkit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgraphql_test_client.py
More file actions
84 lines (68 loc) · 2.41 KB
/
graphql_test_client.py
File metadata and controls
84 lines (68 loc) · 2.41 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
import json
import logging
from collections import namedtuple
from dataclasses import dataclass
from typing import Any, Dict, Optional
from pythonit_toolkit.headers import PASTAPORTO_X_HEADER, SERVICE_JWT_HEADER
from pythonit_toolkit.pastaporto.test import (
fake_pastaporto_token_for_user,
fake_service_to_service_token,
)
logger = logging.getLogger(__name__)
SimulatedUser = namedtuple("User", ["id", "email", "is_staff"])
@dataclass
class Response:
errors: Optional[Dict[str, Any]]
data: Optional[Dict[str, Any]]
class GraphQLClient:
def __init__(
self,
client,
*,
pastaporto_secret: Optional[str] = None,
service_to_service_secret: Optional[str] = None,
internal_api_endpoint: bool = False
):
self._client = client
self._pastaporto_secret = pastaporto_secret
self._service_to_service_secret = service_to_service_secret
self.pastaporto_token = None
self.service_to_service_token = None
if internal_api_endpoint:
self.endpoint = "/internal-api"
else:
self.endpoint = "/graphql"
async def query(
self,
query: str,
variables: Optional[Dict[str, Any]] = None,
headers: Optional[Dict[str, Any]] = None,
) -> Response:
body = {"query": query}
headers = headers or {}
if variables:
body["variables"] = variables
if self.pastaporto_token:
headers[PASTAPORTO_X_HEADER] = self.pastaporto_token
if self.service_to_service_token:
headers[SERVICE_JWT_HEADER] = self.service_to_service_token
resp = await self._client.post(self.endpoint, json=body, headers=headers)
data = json.loads(resp.content.decode())
return Response(errors=data.get("errors"), data=data.get("data"))
def force_login(self, user: SimulatedUser):
self.pastaporto_token = fake_pastaporto_token_for_user(
{"id": user.id, "email": user.email},
str(self._pastaporto_secret),
staff=user.is_staff,
)
def force_service_login(
self,
issuer: str = "gateway",
audience: str = "users-backend",
key: Optional[str] = None,
):
self.service_to_service_token = fake_service_to_service_token(
str(key or self._service_to_service_secret),
issuer=issuer,
audience=audience,
)