-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdesign_tests.py
More file actions
199 lines (179 loc) · 8.03 KB
/
Copy pathdesign_tests.py
File metadata and controls
199 lines (179 loc) · 8.03 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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
import time
import requests
import pytest
import random
import string
import logging
logger = logging.getLogger(__name__)
# Base URL of the API
BASE_URL = "http://prod.ecocompass.live:80"
def generate_random_user():
part_one = ''.join(random.choice(string.ascii_letters) for _ in range(random.randint(3, 6)))
part_two = ''.join(random.choice(string.ascii_letters) for _ in range(random.randint(3, 6)))
username = f"{part_one.capitalize()} {part_two.capitalize()}"
email = f"{part_one.lower()}{part_two.lower()}@example.com"
password = f"{part_one.capitalize()}{part_two.capitalize()}"
return username, email, password
def signup_user(email, username, password):
url = f"{BASE_URL}/api/auth/signup"
response = requests.post(url, json={"email": email, "username": username, "password": password})
if response.status_code == 201:
logger.info(f"Successfully signed up user: {email}")
else:
logger.error(f"Failed to sign up user: {email}. Response: {response.text}")
return response
def login_user(email, password):
url = f"{BASE_URL}/api/auth/login"
response = requests.post(url, json={"email": email, "password": password})
if response.status_code == 200:
logger.info(f"Successfully logged in user: {email}")
else:
logger.error(f"Failed to log in user: {email}. Response: {response.text}")
return response
def logout_user(token):
url = f"{BASE_URL}/api/auth/logout"
headers = {'Authorization': f'Bearer {token}'}
response = requests.delete(url, headers=headers)
if response.status_code == 200:
logger.info("Successfully logged out user.")
else:
logger.error(f"Failed to log out user. Response: {response.text}")
return response
def protected_api_call(token):
url = f"{BASE_URL}/protected"
headers = {'Authorization': f'Bearer {token}'}
response = requests.get(url, headers=headers)
if response.status_code == 200:
logger.info("Protected API call successful.")
else:
logger.error("Protected API call failed.")
return response
@pytest.mark.order(1)
def test_signup_new_user_random():
username, email, password = generate_random_user()
signup_response = signup_user(email, username, password)
assert signup_response.status_code == 201
login_response = login_user(email, password)
assert login_response.status_code == 200
token = login_response.json().get('access_token')
protected_response = protected_api_call(token)
assert protected_response.status_code == 200
@pytest.mark.order(2)
def test_signup_existing_user():
username, email, password = generate_random_user()
first_signup_response = signup_user(email, username, password)
assert first_signup_response.status_code == 201
second_signup_response = signup_user(email, username, password)
assert second_signup_response.status_code == 409
@pytest.mark.order(3)
def test_token_revocation():
username, email, password = generate_random_user()
signup_response = signup_user(email, username, password)
assert signup_response.status_code == 201
login_response = login_user(email, password)
assert login_response.status_code == 200
token = login_response.json().get('access_token')
protected_response = protected_api_call(token)
assert protected_response.status_code == 200
logout_response = logout_user(token)
assert logout_response.status_code == 200
protected_response_after_logout = protected_api_call(token)
assert protected_response_after_logout.status_code == 401
@pytest.fixture(scope="module")
def user_token():
username, email, password = generate_random_user()
signup_response = signup_user(email, username, password)
assert signup_response.status_code == 201
login_response = login_user(email, password)
token = login_response.json().get('access_token')
yield token
logout_user(token)
@pytest.mark.order(4)
def test_create_and_get_preferences(user_token):
create_url = f"{BASE_URL}/api/user/preferences"
get_url = f"{BASE_URL}/api/user/preferences"
headers = {'Authorization': f'Bearer {user_token}'}
preferences = {
"public_transport": "1",
"bike_weight": "0",
"walking_weight": "1",
"driving_weight": "1"
}
create_response = requests.post(create_url, json=preferences, headers=headers)
if create_response.status_code != 200:
logger.error(create_response.text)
assert create_response.status_code == 200
get_response = requests.get(get_url, headers=headers)
if get_response.status_code != 200:
logger.error(get_response.text)
assert get_response.status_code == 200
logger.info(f"User preferences: {get_response.json()}")
# assert get_response.json()["payload"]["public_transport"] == preferences["public_transport"]
@pytest.mark.order(5)
def test_create_and_delete_incident():
create_url = f"{BASE_URL}/createIncident"
incident = {
"coordinates": [53.272262, -6.255912],
"description": "Pytest: Test Minor crash on Highway R113 Ballinteer",
"isJamcident": True,
"roadClosed": True,
}
create_response = requests.post(create_url, json=incident)
assert create_response.status_code == 201
# Incident 99ca8855-db35-48cf-9fda-5b603294d4ca created successfully
assert "Incident " in create_response.text
assert " created successfully" in create_response.text
incident_id = create_response.text.replace("Incident ", "").replace(" created successfully", "")
delete_url = f"{BASE_URL}/deleteIncident/{incident_id}"
delete_response = requests.delete(delete_url)
assert delete_response.status_code == 200
@pytest.mark.order(1)
def test_user_profile(user_token):
url = f"{BASE_URL}/api/user/profile"
headers = {'Authorization': f'Bearer {user_token}'}
response = requests.get(url, headers=headers)
if response.status_code == 200:
logger.info(f"Retrieved user profile successfully: {response.json()}")
else:
logger.error(f"Failed to retrieve user profile. Response: {response.text}")
assert response.status_code == 200
# Coordinates data for testing
coordinates_pairs = [
("leapord's town to blackrock", '-6.1998406596697455,53.2555585979835', '-6.134367,53.293963'),
("killiney beach to airport", '-6.112460,53.254836', '-6.235733,53.425014'),
("rathmines to trinity", '-6.274100,53.324656', '-6.254582,53.343915')
]
@pytest.mark.parametrize("label,start,end", coordinates_pairs)
def test_routes_performance(label, start, end):
url = f"{BASE_URL}/api/routes"
params = {
'startCoordinates': start,
'endCoordinates': end
}
start_time = time.time()
response = requests.get(url, params=params)
elapsed_time = time.time() - start_time
if response.status_code == 200 and elapsed_time < 5:
logger.info(f"'{label}' Routes data for {start} to {end} retrieved in {elapsed_time:.2f} seconds.")
else:
logger.error(f"'{label}' Failed to retrieve or slow response for routes data. Response time: {elapsed_time:.2f} seconds. Response: {response.text}")
assert response.status_code == 200
assert elapsed_time < 5, f"Response time {elapsed_time:.2f} exceeds 5 seconds limit."
@pytest.mark.parametrize("label,start,end", coordinates_pairs)
def test_routes2_performance(label, start, end):
url = f"{BASE_URL}/api/routes2"
params = {
'startCoordinates': start,
'endCoordinates': end
}
start_time = time.time()
response = requests.get(url, params=params)
elapsed_time = time.time() - start_time
if response.status_code == 200 and elapsed_time < 5:
logger.info(f"'{label}' Routes2 data for {start} to {end} retrieved in {elapsed_time:.2f} seconds.")
else:
logger.error(f"'{label}' Failed to retrieve or slow response for routes2 data. Response time: {elapsed_time:.2f} seconds. Response: {response.text}")
assert response.status_code == 200
assert elapsed_time < 5, f"Response time {elapsed_time:.2f} exceeds 5 seconds limit."
if __name__ == "__main__":
pytest.main(["-v", "--html=report.html"])