Skip to content

Commit 86b1b20

Browse files
committed
update endpoints and tests
1 parent 7d3e99e commit 86b1b20

File tree

12 files changed

+249
-61
lines changed

12 files changed

+249
-61
lines changed

conftest.py

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44
import requests
55
import pytest
66
import shutil
7-
from dotenv import load_dotenv, set_key, find_dotenv
7+
from typing import Generator
8+
from dotenv import (
9+
load_dotenv,
10+
set_key,
11+
find_dotenv,
12+
)
813
from endpoints import (
914
GetMeme,
1015
PostMeme,
@@ -24,50 +29,40 @@
2429

2530

2631
def pytest_configure(config):
27-
"""
28-
Pytest configuration setup
29-
:param config:
30-
:return:
31-
"""
32+
"""Pytest configuration setup"""
3233
__make_dir_for_logs()
3334

3435

3536
@pytest.fixture()
36-
def get_meme():
37+
def get_meme() -> GetMeme:
3738
"""Initialize the GetMeme class"""
3839
return GetMeme()
3940

4041

4142
@pytest.fixture()
42-
def post_meme():
43+
def post_meme() -> PostMeme:
4344
"""Initialize the PostMeme class"""
4445
return PostMeme()
4546

4647

4748
@pytest.fixture()
48-
def delete_meme():
49+
def delete_meme() -> DeleteMeme:
4950
"""Initialize the DeleteMeme class"""
5051
return DeleteMeme()
5152

5253

5354
@pytest.fixture()
54-
def put_meme():
55+
def put_meme() -> PutMeme:
5556
"""Initialize the PutMeme class"""
5657
return PutMeme()
5758

5859

59-
@pytest.fixture(scope="class")
60-
def start_testing(
61-
request: pytest.FixtureRequest,
62-
):
63-
"""Fixture to start testing"""
64-
logging.info(f"Start testing: {request.node.name}")
65-
yield
66-
logging.info(f"Testing completed: {request.node.name}")
67-
68-
6960
@pytest.fixture(scope="session")
70-
def generate_api_token():
61+
def generate_api_token() -> Generator[str, None, None]:
62+
"""
63+
Generate an API token.
64+
Check if the token is valid and update it if it is not.
65+
"""
7166
logger.info("Verifying API token")
7267

7368
# Get the environment variables
@@ -101,7 +96,11 @@ def generate_api_token():
10196

10297

10398
@pytest.fixture(scope="function")
104-
def temporary_meme_cleanup(post_meme, delete_meme):
99+
def temporary_meme_cleanup(
100+
post_meme,
101+
delete_meme,
102+
) -> Generator[None, None, None]:
103+
"""Delete meme after the test is done."""
105104
yield
106105
id = post_meme.meme_id
107106
logger.info(
@@ -112,21 +111,22 @@ def temporary_meme_cleanup(post_meme, delete_meme):
112111

113112

114113
@pytest.fixture(scope="function")
115-
def temporary_meme_id(post_meme):
114+
def temporary_meme_id(
115+
post_meme,
116+
) -> Generator[str, None, None]:
117+
"""Create a meme and return its id."""
116118
logger.info("------------ SetUp: Creating a new meme ------------")
117119
response = post_meme.post_new_meme()
118120
logger.info(
119121
"------------ SetUp: Created a new meme with id: %s ------------ ",
120122
response.json()["id"],
121123
)
124+
assert response.status_code == 200
122125
yield response.json()["id"]
123126

124127

125-
def __make_dir_for_logs():
126-
"""
127-
Create directory for logs. Delete exists
128-
:return:
129-
"""
128+
def __make_dir_for_logs() -> None:
129+
"""Create directory for logs. Delete exists"""
130130
# Check if the directory exists before attempting to delete it
131131
if os.path.exists(LOG_DIR):
132132
# Delete the directory and its contents
@@ -137,7 +137,9 @@ def __make_dir_for_logs():
137137
os.makedirs(FAILED_LOG_DIR, exist_ok=True)
138138

139139

140-
def __sanitize_nodeid(node_id):
140+
def __sanitize_nodeid(
141+
node_id: str,
142+
) -> str:
141143
"""
142144
Cleans up and formats the test's nodeid
143145
(a unique identifier for each test in Pytest).
@@ -150,7 +152,9 @@ def __sanitize_nodeid(node_id):
150152
return node_id
151153

152154

153-
def __get_last_element(node_id):
155+
def __get_last_element(
156+
node_id: str,
157+
) -> str:
154158
"""
155159
Retrieves the last part of the sanitized nodeid,
156160
which represents the specific test name.
@@ -159,7 +163,9 @@ def __get_last_element(node_id):
159163

160164

161165
@pytest.hookimpl(tryfirst=True)
162-
def pytest_runtest_setup(item):
166+
def pytest_runtest_setup(
167+
item: pytest.Item,
168+
) -> None:
163169
"""Configures a unique logger for each test before it runs"""
164170
# Get test node ID for log naming
165171
test_name = __get_last_element(__sanitize_nodeid(item.nodeid))
@@ -178,7 +184,9 @@ def pytest_runtest_setup(item):
178184

179185

180186
@pytest.hookimpl(tryfirst=True)
181-
def pytest_runtest_logreport(report):
187+
def pytest_runtest_logreport(
188+
report,
189+
) -> None:
182190
"""Handles special processing for logs of failed tests"""
183191
if report.when == "call" and report.failed:
184192
test_name = __get_last_element(__sanitize_nodeid(report.nodeid))

data/base_meme.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,6 @@ class BaseMemeData:
3636
# # Boundary conditions
3737
# "a" * XX, # Assuming max length is XX
3838
# "a" * X, # Assuming min length is X
39-
# Edge cases
40-
"\n",
41-
"\t",
42-
"\r",
4339
]
4440

4541
# "tags": ["string", "string"]
@@ -92,7 +88,7 @@ class BaseMemeData:
9288
{"a" * 10001: "value", "key": "b" * 10001},
9389
# Boundary conditions
9490
{f"key{i}": f"value{i}" for i in range(1000)}, # Assuming max keys = ???
95-
{"a" * 51: "value", "key": "b" * 51}, # Assuming max length = ???
91+
# {"a" * 51: "value", "key": "b" * 51}, # Assuming max length = ???
9692
# Edge cases
9793
{" key ": " value "},
9894
{"\nkey": "value", "key": "\tvalue"},

endpoints/base_endpoint.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
from requests import Request
66
from typing import Optional
77
import rlogger
8-
9-
# import requests
8+
import allure
109

1110
# Initialize logger
1211
logger = logging.getLogger(__name__)
@@ -102,6 +101,7 @@ def _default_headers_with_authorization(
102101
) -> dict:
103102
return {"Authorization": f"{os.getenv('API_TOKEN')}"}
104103

104+
@allure.step("Verify response status code")
105105
def verify_response_status_code(
106106
self,
107107
status_code: int,
@@ -110,4 +110,3 @@ def verify_response_status_code(
110110
f"Expected status code {status_code},"
111111
f"but got {self.response.status_code}"
112112
)
113-

endpoints/delete_meme.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class DeleteMeme(BaseEndpoint):
1212
def __init__(self):
1313
super().__init__()
1414

15-
@allure.step("Delete name")
15+
@allure.step("Delete meme")
1616
def delete_meme_by_id(
1717
self,
1818
id: int,

endpoints/post_meme.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class PostMeme(BaseEndpoint):
1212
def __init__(self):
1313
super().__init__()
1414

15-
@allure.step("Step name")
15+
@allure.step("Post name")
1616
def post_new_meme(
1717
self,
1818
*,

endpoints/put_meme.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class PutMeme(BaseEndpoint):
1212
def __init__(self):
1313
super().__init__()
1414

15-
@allure.step("Step name")
15+
@allure.step("Put meme by ID")
1616
def put_meme_by_id(
1717
self,
1818
id: int,

pytest.ini

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ log_cli_level = INFO
88
log_level = INFO
99
markers =
1010
delete_meme
11-
positive
12-
negative
11+
post_meme
12+
get_meme
13+
put_meme
1314

1415
addopts = --alluredir=test-report

rlogger.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import logging
22
import json
3-
import functools
4-
from requests import Request, RequestException, Response
5-
from urllib.parse import urlencode
3+
from requests import Request, Response
64

75
# Initialize logger and Faker
86
logger = logging.getLogger(__name__)

tests/test_delete_meme.py

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,20 @@
22
import pytest
33
from data import BaseMemeData
44

5-
# from data import
6-
75

86
@allure.feature("Delete Meme")
97
@pytest.mark.usefixtures("generate_api_token")
108
@pytest.mark.delete_meme
119
class DeleteMemeTest:
1210

11+
@allure.title("Delete meme successfully")
12+
@allure.description(
13+
"""
14+
Test that a meme can be successfully deleted
15+
with a valid id and authorization header.
16+
"""
17+
)
18+
@allure.severity(allure.severity_level.CRITICAL)
1319
def test_delete_meme_successful_meme_deletion(
1420
self,
1521
delete_meme,
@@ -18,14 +24,32 @@ def test_delete_meme_successful_meme_deletion(
1824
delete_meme.delete_meme_by_id(temporary_meme_id)
1925
delete_meme.verify_response_status_code(200)
2026

27+
@allure.title("Delete meme created by another user")
28+
@allure.description(
29+
"""
30+
Test that a meme cannot be deleted by a user who did not create it.
31+
"""
32+
)
33+
@allure.severity(allure.severity_level.CRITICAL)
2134
def test_delete_meme_unsuccessful_meme_deletion_created_by_another_user(
2235
self,
2336
delete_meme,
2437
id=1,
2538
):
39+
"""
40+
Test that a meme cannot be deleted by a user who did not create it.
41+
"""
2642
delete_meme.delete_meme_by_id(id)
2743
delete_meme.verify_response_status_code(403)
2844

45+
@allure.title("Delete meme by not existing or invalid id")
46+
@allure.description(
47+
"""
48+
Test that a meme cannot be deleted
49+
if the id is not valid or does not exist.
50+
"""
51+
)
52+
@allure.severity(allure.severity_level.CRITICAL)
2953
@pytest.mark.parametrize(
3054
"id",
3155
BaseMemeData.memes_not_existing_ids,
@@ -38,10 +62,17 @@ def test_delete_meme_by_not_existing_or_invalid_id(
3862
delete_meme.delete_meme_by_id(id)
3963
delete_meme.verify_response_status_code(404)
4064

65+
@allure.title("Delete meme without authorization header")
66+
@allure.description(
67+
"""
68+
Test that a meme cannot be deleted without an authorization header.
69+
"""
70+
)
4171
@pytest.mark.parametrize(
4272
"headers, status_code",
4373
BaseMemeData.failed_auth,
4474
)
75+
@allure.severity(allure.severity_level.CRITICAL)
4576
def test_delete_meme_missing_authorization_header(
4677
self,
4778
delete_meme,
@@ -50,12 +81,8 @@ def test_delete_meme_missing_authorization_header(
5081
temporary_meme_id,
5182
temporary_meme_cleanup,
5283
):
84+
"""
85+
Test that a meme cannot be deleted without an authorization header.
86+
"""
5387
delete_meme.delete_meme_by_id(temporary_meme_id, headers=headers)
5488
delete_meme.verify_response_status_code(status_code)
55-
56-
# def test_delete_all_memes_created_by_user(
57-
# self,
58-
# delete_meme,
59-
# ):
60-
# for id in range(1, 1000):
61-
# delete_meme.delete_meme_by_id(id)

0 commit comments

Comments
 (0)