feat(browser): auto-commit con 60 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,150 @@
|
||||
"""Tests para har_extract_calls."""
|
||||
|
||||
from har_extract_calls import har_extract_calls
|
||||
|
||||
|
||||
def test_golden_post_con_cookie_y_body_json():
|
||||
"""Golden: POST con header Cookie + body json -> spec correcta,
|
||||
cookie extraida, hop-by-hop dropeados, set-cookie de respuesta."""
|
||||
entries = [
|
||||
{
|
||||
"request": {
|
||||
"method": "post",
|
||||
"url": "https://api.example.com/login",
|
||||
"headers": [
|
||||
{"name": "Host", "value": "api.example.com"},
|
||||
{"name": "Content-Length", "value": "42"},
|
||||
{"name": "Accept-Encoding", "value": "gzip"},
|
||||
{"name": "Content-Type", "value": "application/json"},
|
||||
{"name": "Authorization", "value": "Bearer tok123"},
|
||||
{"name": "Cookie", "value": "session=abc; csrf=xyz"},
|
||||
],
|
||||
"postData": {
|
||||
"mimeType": "application/json",
|
||||
"text": '{"user":"neo","pass":"secret"}',
|
||||
},
|
||||
},
|
||||
"response": {
|
||||
"status": 200,
|
||||
"cookies": [
|
||||
{"name": "session", "value": "newsess"},
|
||||
{"name": "remember", "value": "1"},
|
||||
],
|
||||
"headers": [],
|
||||
},
|
||||
}
|
||||
]
|
||||
|
||||
[spec] = har_extract_calls(entries)
|
||||
|
||||
assert spec["method"] == "POST"
|
||||
assert spec["url"] == "https://api.example.com/login"
|
||||
# Hop-by-hop dropeados, Cookie extraido fuera de headers.
|
||||
assert spec["headers"] == {
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": "Bearer tok123",
|
||||
}
|
||||
assert "Host" not in spec["headers"]
|
||||
assert "Content-Length" not in spec["headers"]
|
||||
assert "Accept-Encoding" not in spec["headers"]
|
||||
assert "Cookie" not in spec["headers"]
|
||||
# Cookies parseadas del header Cookie.
|
||||
assert spec["cookies"] == {"session": "abc", "csrf": "xyz"}
|
||||
# Body + tipo inferido.
|
||||
assert spec["body"] == '{"user":"neo","pass":"secret"}'
|
||||
assert spec["body_type"] == "json"
|
||||
# Status de respuesta.
|
||||
assert spec["status"] == 200
|
||||
# Cookies que setea la respuesta.
|
||||
assert spec["sets_cookies"] == ["session", "remember"]
|
||||
|
||||
|
||||
def test_edge_get_sin_body():
|
||||
"""Edge: GET sin body -> body None, body_type None, sin cookies."""
|
||||
entries = [
|
||||
{
|
||||
"request": {
|
||||
"method": "get",
|
||||
"url": "https://api.example.com/me",
|
||||
"headers": [
|
||||
{"name": "Accept", "value": "application/json"},
|
||||
],
|
||||
},
|
||||
"response": {"status": 304, "headers": []},
|
||||
}
|
||||
]
|
||||
|
||||
[spec] = har_extract_calls(entries)
|
||||
|
||||
assert spec["method"] == "GET"
|
||||
assert spec["body"] is None
|
||||
assert spec["body_type"] is None
|
||||
assert spec["cookies"] == {}
|
||||
assert spec["headers"] == {"Accept": "application/json"}
|
||||
assert spec["status"] == 304
|
||||
assert spec["sets_cookies"] == []
|
||||
|
||||
|
||||
def test_drop_headers_extra_respetado():
|
||||
"""drop_headers extra elimina headers adicionales (case-insensitive)."""
|
||||
entries = [
|
||||
{
|
||||
"request": {
|
||||
"method": "GET",
|
||||
"url": "https://api.example.com/data",
|
||||
"headers": [
|
||||
{"name": "User-Agent", "value": "curl/8"},
|
||||
{"name": "X-Trace-Id", "value": "noise-123"},
|
||||
{"name": "Accept", "value": "*/*"},
|
||||
],
|
||||
},
|
||||
"response": {"status": 200, "headers": []},
|
||||
}
|
||||
]
|
||||
|
||||
[spec] = har_extract_calls(entries, drop_headers=["x-trace-id"])
|
||||
|
||||
assert "X-Trace-Id" not in spec["headers"]
|
||||
assert spec["headers"] == {"User-Agent": "curl/8", "Accept": "*/*"}
|
||||
|
||||
|
||||
def test_form_body_y_set_cookie_desde_headers():
|
||||
"""Body form-urlencoded -> body_type form; set-cookie parseado de headers
|
||||
cuando no hay response.cookies."""
|
||||
entries = [
|
||||
{
|
||||
"request": {
|
||||
"method": "POST",
|
||||
"url": "https://api.example.com/form",
|
||||
"headers": [
|
||||
{
|
||||
"name": "Content-Type",
|
||||
"value": "application/x-www-form-urlencoded",
|
||||
},
|
||||
],
|
||||
"postData": {
|
||||
"mimeType": "application/x-www-form-urlencoded",
|
||||
"text": "a=1&b=2",
|
||||
},
|
||||
},
|
||||
"response": {
|
||||
"status": 201,
|
||||
"headers": [
|
||||
{"name": "Set-Cookie", "value": "auth=tok; Path=/; HttpOnly"},
|
||||
{"name": "Content-Type", "value": "text/html"},
|
||||
{"name": "Set-Cookie", "value": "lang=es; Path=/"},
|
||||
],
|
||||
},
|
||||
}
|
||||
]
|
||||
|
||||
[spec] = har_extract_calls(entries)
|
||||
|
||||
assert spec["body_type"] == "form"
|
||||
assert spec["body"] == "a=1&b=2"
|
||||
assert spec["sets_cookies"] == ["auth", "lang"]
|
||||
|
||||
|
||||
def test_lista_vacia():
|
||||
"""Sin entries -> lista vacia."""
|
||||
assert har_extract_calls([]) == []
|
||||
Reference in New Issue
Block a user