Files
egutierrez 7913116a8e chore: auto-commit (129 archivos)
- .claude/agents/fn-analizador/SKILL.md
- .claude/agents/fn-constructor/SKILL.md
- .claude/agents/fn-executor/SKILL.md
- .claude/agents/fn-mejorador/SKILL.md
- .claude/agents/fn-orquestador/SKILL.md
- .claude/agents/fn-recopilador/SKILL.md
- .claude/commands/app.md
- .claude/commands/compile.md
- .claude/commands/cpp-app.md
- .claude/commands/create_functions.md
- ...

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-01 22:23:12 +02:00

89 lines
3.0 KiB
Python

"""Tests para http_get_json."""
import json
import sys
import os
import unittest
import urllib.error
import urllib.request
from io import BytesIO
from unittest.mock import MagicMock, patch
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from infra.http_get_json import http_get_json
def _make_response(data: bytes, status: int = 200, content_type: str = "application/json"):
"""Crea un mock de HTTPResponse."""
resp = MagicMock()
resp.read.return_value = data
resp.status = status
resp.__enter__ = lambda s: s
resp.__exit__ = MagicMock(return_value=False)
return resp
class TestHttpGetJson(unittest.TestCase):
def test_mock_respuesta_200_con_json(self):
payload = {"ok": True, "value": 42}
mock_resp = _make_response(json.dumps(payload).encode())
with patch("urllib.request.urlopen", return_value=mock_resp):
result = http_get_json("http://example.com/api")
self.assertEqual(result, payload)
def test_mock_respuesta_404_error_con_status_code(self):
err = urllib.error.HTTPError(
url="http://example.com/missing",
code=404,
msg="Not Found",
hdrs=None, # type: ignore[arg-type]
fp=BytesIO(b"not found"),
)
with patch("urllib.request.urlopen", side_effect=err):
with self.assertRaises(RuntimeError) as ctx:
http_get_json("http://example.com/missing")
self.assertIn("404", str(ctx.exception))
def test_mock_respuesta_json_invalido_error_descriptivo(self):
mock_resp = _make_response(b"not-json!!!")
with patch("urllib.request.urlopen", return_value=mock_resp):
with self.assertRaises(RuntimeError) as ctx:
http_get_json("http://example.com/api")
self.assertIn("not valid JSON", str(ctx.exception))
def test_params_serializados_como_query_string(self):
captured_url = []
def fake_urlopen(req, timeout=None):
captured_url.append(req.full_url)
return _make_response(b"{}")
with patch("urllib.request.urlopen", side_effect=fake_urlopen):
http_get_json("http://example.com/api", params={"page": "1", "limit": "10"})
url = captured_url[0]
self.assertIn("page=1", url)
self.assertIn("limit=10", url)
def test_headers_custom_enviados(self):
captured_headers = []
def fake_urlopen(req, timeout=None):
captured_headers.append(dict(req.headers))
return _make_response(b'{"x": 1}')
with patch("urllib.request.urlopen", side_effect=fake_urlopen):
http_get_json("http://example.com/api", headers={"X-Api-Key": "secret"})
# urllib capitaliza el primer caracter de cada header
headers_lower = {k.lower(): v for k, v in captured_headers[0].items()}
self.assertIn("x-api-key", headers_lower)
self.assertEqual(headers_lower["x-api-key"], "secret")
self.assertIn("accept", headers_lower)
if __name__ == "__main__":
unittest.main()