Coverage for backend/core/client.py: 83%
40 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-11-06 23:27 +0000
1from rest_framework.test import APIClient
2from urllib.parse import urlencode, urlparse, parse_qs, urlunparse
3import json
5from CoreRoot import settings
6from authentication.user.models import User
8class FlowsheetClient(APIClient):
9 """
10 A custom APIClient that automatically includes the flowsheet ID in each request
11 as a query parameter, and sets the appropriate user headers for authentication.
12 Used in tests.
13 """
15 def __init__(self, *args, flowsheet: int, user: User, **kwargs):
16 super().__init__(*args, **kwargs)
17 self.flowsheet = flowsheet
18 additional_headers = {
19 settings.REMOTE_USER_HEADER: user.username,
20 settings.REMOTE_USER_EMAIL_HEADER: user.email if user.email else '',
21 }
22 self.credentials(**additional_headers)
24 def _add_flowsheet_query_param(self, path: str) -> str:
25 url_parts = list(urlparse(path))
26 query = parse_qs(url_parts[4])
27 query['flowsheet'] = [self.flowsheet]
28 url_parts[4] = urlencode(query, doseq=True)
29 return urlunparse(url_parts)
31 def get(self, path, data=None, **extra):
32 path = self._add_flowsheet_query_param(path)
33 return super().get(path, data=data, **extra)
35 def post(self, path, data=None, content_type="application/json", **extra):
36 path = self._add_flowsheet_query_param(path)
37 if content_type == "application/json" and isinstance(data, dict):
38 data = json.dumps(data)
39 return super().post(path, data=data, content_type=content_type, **extra)
41 def patch(self, path, data=None, content_type="application/json", **extra):
42 path = self._add_flowsheet_query_param(path)
43 if content_type == "application/json" and isinstance(data, dict):
44 data = json.dumps(data)
45 return super().patch(path, data=data, content_type=content_type, **extra)
47 def put(self, path, data=None, content_type="application/json", **extra):
48 path = self._add_flowsheet_query_param(path)
49 if content_type == "application/json" and isinstance(data, dict):
50 data = json.dumps(data)
51 return super().put(path, data=data, content_type=content_type, **extra)
53 def delete(self, path, data=None, content_type="application/json", **extra):
54 path = self._add_flowsheet_query_param(path)
55 if content_type == "application/json" and isinstance(data, dict): 55 ↛ 56line 55 didn't jump to line 56 because the condition on line 55 was never true
56 data = json.dumps(data)
57 return super().delete(path, data=data, content_type=content_type, **extra)