Skip to content

Commit 1218ab2

Browse files
committed
split imms_api fixtures
1 parent 1025a0f commit 1218ab2

File tree

4 files changed

+106
-94
lines changed

4 files changed

+106
-94
lines changed

mavis/test/fixtures/__init__.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,9 @@
1-
from .helpers import (
2-
add_vaccine_batch,
3-
file_generator,
4-
log_in_as_medical_secretary,
5-
log_in_as_nurse,
6-
log_in_as_prescriber,
7-
schedule_mmr_session_and_get_consent_url,
8-
schedule_session_and_get_consent_url,
9-
set_feature_flags,
10-
setup_session_and_batches_with_fixed_child,
11-
upload_offline_vaccination,
12-
)
13-
from .models import (
14-
authenticate_api,
1+
from .data_models import (
152
children,
163
clinics,
174
delete_team_after_tests,
5+
file_generator,
186
healthcare_assistant,
19-
imms_base_url,
207
medical_secretary,
218
nurse,
229
onboarding,
@@ -30,6 +17,18 @@
3017
team,
3118
year_groups,
3219
)
20+
from .helpers import (
21+
add_vaccine_batch,
22+
log_in_as_medical_secretary,
23+
log_in_as_nurse,
24+
log_in_as_prescriber,
25+
schedule_mmr_session_and_get_consent_url,
26+
schedule_session_and_get_consent_url,
27+
set_feature_flags,
28+
setup_session_and_batches_with_fixed_child,
29+
upload_offline_vaccination,
30+
)
31+
from .imms_api import authenticate_api, imms_base_url
3332
from .playwright import (
3433
base_url,
3534
basic_auth_credentials,
Lines changed: 20 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
import base64
21
import logging
32
import os
43
import random
54
import time
65
import urllib.parse
7-
import uuid
86

9-
import jwt
107
import pytest
118
import requests
129
from faker import Faker
1310

1411
from mavis.test.constants import Programme
12+
from mavis.test.data.file_generator import FileGenerator
1513
from mavis.test.data_models import (
1614
Child,
1715
Clinic,
@@ -30,6 +28,22 @@
3028
onboarding_faker.unique.clear()
3129

3230

31+
@pytest.fixture(scope="session", autouse=True)
32+
def delete_team_after_tests(base_url, team):
33+
yield
34+
35+
url = urllib.parse.urljoin(base_url, f"api/testing/teams/{team.workgroup}")
36+
response = requests.delete(url, timeout=30)
37+
_check_response_status(response)
38+
39+
40+
@pytest.fixture(scope="module", autouse=True)
41+
def reset_before_each_module(base_url, team) -> None:
42+
url = urllib.parse.urljoin(base_url, f"api/testing/teams/{team.workgroup}")
43+
response = requests.delete(url, params={"keep_itself": "true"}, timeout=30)
44+
_check_response_status(response)
45+
46+
3347
@pytest.fixture(scope="session")
3448
def year_groups() -> dict[str, int]:
3549
return {
@@ -84,22 +98,6 @@ def _check_response_status(response) -> None:
8498
response.raise_for_status()
8599

86100

87-
@pytest.fixture(scope="session", autouse=True)
88-
def delete_team_after_tests(base_url, team):
89-
yield
90-
91-
url = urllib.parse.urljoin(base_url, f"api/testing/teams/{team.workgroup}")
92-
response = requests.delete(url, timeout=30)
93-
_check_response_status(response)
94-
95-
96-
@pytest.fixture(scope="module", autouse=True)
97-
def reset_before_each_module(base_url, team) -> None:
98-
url = urllib.parse.urljoin(base_url, f"api/testing/teams/{team.workgroup}")
99-
response = requests.delete(url, params={"keep_itself": "true"}, timeout=30)
100-
_check_response_status(response)
101-
102-
103101
@pytest.fixture(scope="session")
104102
def healthcare_assistant(onboarding) -> User:
105103
return onboarding.users["healthcare_assistant"]
@@ -157,57 +155,6 @@ def children(year_groups) -> dict[str, list[Child]]:
157155
)
158156

159157

160-
def _read_imms_api_credentials() -> dict[str, str]:
161-
return {
162-
"pem": os.environ["IMMS_API_PEM"],
163-
"key": os.environ["IMMS_API_KEY"],
164-
"kid": os.environ["IMMS_API_KID"],
165-
"url": os.environ["IMMS_BASE_URL"],
166-
}
167-
168-
169-
def _get_jwt_payload(api_auth: dict[str, str]) -> str:
170-
_kid = api_auth["kid"]
171-
_api_key = api_auth["key"]
172-
_decoded_pem = base64.b64decode(api_auth["pem"])
173-
_auth_endpoint = urllib.parse.urljoin(api_auth["url"], "oauth2-mock/token")
174-
headers = {
175-
"alg": "RS512",
176-
"typ": "JWT",
177-
"kid": _kid,
178-
}
179-
claims = {
180-
"sub": _api_key,
181-
"iss": _api_key,
182-
"jti": str(uuid.uuid4()),
183-
"aud": _auth_endpoint,
184-
"exp": int(time.time()) + 300, # 5mins in the future
185-
}
186-
return jwt.encode(
187-
payload=claims,
188-
key=_decoded_pem,
189-
algorithm="RS512",
190-
headers=headers,
191-
)
192-
193-
194-
@pytest.fixture(scope="session", autouse=False)
195-
def authenticate_api():
196-
_api_auth: dict[str, str] = _read_imms_api_credentials()
197-
_endpoint = urllib.parse.urljoin(_api_auth["url"], "oauth2-mock/token")
198-
_payload = {
199-
"grant_type": "client_credentials",
200-
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer", # noqa: E501
201-
"client_assertion": _get_jwt_payload(api_auth=_api_auth),
202-
}
203-
_headers = {"Content-Type": "application/x-www-form-urlencoded"}
204-
205-
response = requests.post(url=_endpoint, headers=_headers, data=_payload, timeout=30)
206-
207-
_check_response_status(response=response)
208-
return response.json()["access_token"]
209-
210-
211-
@pytest.fixture(scope="session")
212-
def imms_base_url():
213-
return os.environ["IMMS_AUTH_URL"]
158+
@pytest.fixture
159+
def file_generator(organisation, schools, nurse, children, clinics, year_groups):
160+
return FileGenerator(organisation, schools, nurse, children, clinics, year_groups)

mavis/test/fixtures/helpers.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import pytest
55

66
from mavis.test.constants import ConsentOption, Programme, Vaccine
7-
from mavis.test.data import ClassFileMapping, FileGenerator, VaccsFileMapping
7+
from mavis.test.data import ClassFileMapping, VaccsFileMapping
88
from mavis.test.data_models import School
99
from mavis.test.pages import (
1010
AddBatchPage,
@@ -243,8 +243,3 @@ def _setup(programme_group):
243243
LogInPage(page).log_out()
244244

245245
return _setup
246-
247-
248-
@pytest.fixture
249-
def file_generator(organisation, schools, nurse, children, clinics, year_groups):
250-
return FileGenerator(organisation, schools, nurse, children, clinics, year_groups)

mavis/test/fixtures/imms_api.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import base64
2+
import logging
3+
import os
4+
import time
5+
import urllib.parse
6+
import uuid
7+
8+
import jwt
9+
import pytest
10+
import requests
11+
12+
logger = logging.getLogger(__name__)
13+
14+
15+
def _read_imms_api_credentials() -> dict[str, str]:
16+
return {
17+
"pem": os.environ["IMMS_API_PEM"],
18+
"key": os.environ["IMMS_API_KEY"],
19+
"kid": os.environ["IMMS_API_KID"],
20+
"url": os.environ["IMMS_BASE_URL"],
21+
}
22+
23+
24+
def _get_jwt_payload(api_auth: dict[str, str]) -> str:
25+
_kid = api_auth["kid"]
26+
_api_key = api_auth["key"]
27+
_decoded_pem = base64.b64decode(api_auth["pem"])
28+
_auth_endpoint = urllib.parse.urljoin(api_auth["url"], "oauth2-mock/token")
29+
headers = {
30+
"alg": "RS512",
31+
"typ": "JWT",
32+
"kid": _kid,
33+
}
34+
claims = {
35+
"sub": _api_key,
36+
"iss": _api_key,
37+
"jti": str(uuid.uuid4()),
38+
"aud": _auth_endpoint,
39+
"exp": int(time.time()) + 300, # 5mins in the future
40+
}
41+
return jwt.encode(
42+
payload=claims,
43+
key=_decoded_pem,
44+
algorithm="RS512",
45+
headers=headers,
46+
)
47+
48+
49+
@pytest.fixture(scope="session", autouse=False)
50+
def authenticate_api():
51+
_api_auth: dict[str, str] = _read_imms_api_credentials()
52+
_endpoint = urllib.parse.urljoin(_api_auth["url"], "oauth2-mock/token")
53+
_payload = {
54+
"grant_type": "client_credentials",
55+
"client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer", # noqa: E501
56+
"client_assertion": _get_jwt_payload(api_auth=_api_auth),
57+
}
58+
_headers = {"Content-Type": "application/x-www-form-urlencoded"}
59+
60+
response = requests.post(url=_endpoint, headers=_headers, data=_payload, timeout=30)
61+
62+
if not response.ok:
63+
logger.warning(response.content)
64+
response.raise_for_status()
65+
66+
return response.json()["access_token"]
67+
68+
69+
@pytest.fixture(scope="session")
70+
def imms_base_url():
71+
return os.environ["IMMS_AUTH_URL"]

0 commit comments

Comments
 (0)