Skip to content

Commit 0ab6c96

Browse files
committed
Create new headers store helper class
1 parent 1461be4 commit 0ab6c96

File tree

2 files changed

+107
-0
lines changed

2 files changed

+107
-0
lines changed

aikido_zen/helpers/headers.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from typing import List
2+
3+
from typing_extensions import Optional
4+
5+
6+
class Headers(dict):
7+
def store_headers(self, key: str, values: List[str]):
8+
normalized_key = self.normalize_header_key(key)
9+
if self.get(normalized_key, []):
10+
self[normalized_key] += values
11+
else:
12+
self[normalized_key] = values
13+
14+
def store_header(self, key: str, value: str):
15+
self.store_headers(key, [value])
16+
17+
def get_header(self, key: str) -> Optional[str]:
18+
self.validate_header_key(key)
19+
if self.get(key, []):
20+
return self.get(key)[-1]
21+
return None
22+
23+
@staticmethod
24+
def validate_header_key(key: str):
25+
if not key.isupper():
26+
raise ValueError("Header key must be uppercase.")
27+
if "-" in key:
28+
raise ValueError("Header key must use underscores instead of dashes.")
29+
30+
@staticmethod
31+
def normalize_header_key(key: str) -> str:
32+
result = str(key)
33+
result = result.replace("-", "_")
34+
result = result.upper()
35+
return result

aikido_zen/helpers/headers_test.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import pytest
2+
from .headers import Headers
3+
4+
5+
def test_store_header_single_value():
6+
headers = Headers()
7+
headers.store_header("CONTENT_TYPE", "application/json")
8+
assert headers["CONTENT_TYPE"] == ["application/json"]
9+
10+
11+
def test_store_header_multiple_values():
12+
headers = Headers()
13+
headers.store_headers("CONTENT_TYPE", ["application/json"])
14+
headers.store_headers("CONTENT_TYPE", ["text/html"])
15+
assert headers["CONTENT_TYPE"] == ["application/json", "text/html"]
16+
17+
18+
def test_get_header_existing_key():
19+
headers = Headers()
20+
headers.store_header("CONTENT_TYPE", "application/json")
21+
assert headers.get_header("CONTENT_TYPE") == "application/json"
22+
23+
24+
def test_get_header_non_existing_key():
25+
headers = Headers()
26+
assert headers.get_header("NON_EXISTING_KEY") is None
27+
28+
29+
def test_get_header_multiple_values():
30+
headers = Headers()
31+
headers.store_headers("CONTENT_TYPE", ["application/json", "text/html"])
32+
assert headers.get_header("CONTENT_TYPE") == "text/html"
33+
34+
35+
def test_validate_header_key_valid():
36+
try:
37+
Headers.validate_header_key("VALID_HEADER")
38+
except ValueError:
39+
pytest.fail("validate_header_key raised ValueError unexpectedly!")
40+
41+
42+
def test_validate_header_key_not_uppercase():
43+
with pytest.raises(ValueError, match="Header key must be uppercase."):
44+
Headers.validate_header_key("invalid_header")
45+
46+
47+
def test_validate_header_key_with_dash():
48+
with pytest.raises(
49+
ValueError, match="Header key must use underscores instead of dashes."
50+
):
51+
Headers.validate_header_key("INVALID-HEADER")
52+
53+
54+
def test_normalize_header_key_valid():
55+
assert Headers.normalize_header_key("valid-header") == "VALID_HEADER"
56+
assert Headers.normalize_header_key("ANOTHER-HEADER") == "ANOTHER_HEADER"
57+
58+
59+
def test_normalize_header_key_already_normalized():
60+
assert Headers.normalize_header_key("ALREADY_NORMALIZED") == "ALREADY_NORMALIZED"
61+
62+
63+
def test_store_headers_with_empty_list():
64+
headers = Headers()
65+
headers.store_headers("CONTENT_TYPE", [])
66+
assert headers.get_header("CONTENT_TYPE") is None
67+
68+
69+
def test_store_header_with_empty_string():
70+
headers = Headers()
71+
headers.store_header("CONTENT_TYPE", "")
72+
assert headers.get_header("CONTENT_TYPE") == ""

0 commit comments

Comments
 (0)