Skip to content

Commit 8a319e6

Browse files
tests
1 parent 1dd8043 commit 8a319e6

File tree

1 file changed

+67
-2
lines changed

1 file changed

+67
-2
lines changed

services/web/server/tests/unit/isolated/test_utils_aiohttp.py

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@
55

66
import json
77
from typing import Any
8-
from unittest.mock import Mock
8+
from unittest.mock import Mock, patch
99
from uuid import UUID
1010

1111
import pytest
1212
from aiohttp import web
1313
from faker import Faker
1414
from pydantic import BaseModel
15-
from simcore_service_webserver.utils_aiohttp import envelope_json_response, iter_origins
15+
from simcore_service_webserver.utils_aiohttp import (
16+
envelope_json_response,
17+
get_api_base_url,
18+
iter_origins,
19+
)
1620

1721

1822
@pytest.fixture
@@ -31,6 +35,18 @@ class Point(BaseModel):
3135
}
3236

3337

38+
@pytest.fixture
39+
def make_request():
40+
def _make_request(headers=None, scheme="http", host="example.com"):
41+
req = Mock(spec=web.Request)
42+
req.headers = headers or {}
43+
req.scheme = scheme
44+
req.host = host
45+
return req
46+
47+
return _make_request
48+
49+
3450
def test_enveloped_successful_response(data: dict):
3551
resp = envelope_json_response(data, web.HTTPCreated)
3652
assert resp.text is not None
@@ -111,3 +127,52 @@ def test_iter_origins(headers, expected_output):
111127
results = list(iter_origins(request))
112128

113129
assert results == expected_output
130+
131+
132+
def test_no_forwarded_headers_regular_host(make_request):
133+
req = make_request()
134+
with patch("common_library.network.is_ip_address", return_value=False):
135+
url = get_api_base_url(req)
136+
assert url == "http://api.example.com"
137+
138+
139+
def test_no_forwarded_headers_ip_host(make_request):
140+
req = make_request(host="192.168.1.2")
141+
with patch("common_library.network.is_ip_address", return_value=True):
142+
url = get_api_base_url(req)
143+
assert url == "http://192.168.1.2"
144+
145+
146+
def test_with_forwarded_headers(make_request):
147+
headers = {"X-Forwarded-Proto": "https", "X-Forwarded-Host": "mydomain.com"}
148+
req = make_request(headers=headers, scheme="http", host="example.com")
149+
with patch("common_library.network.is_ip_address", return_value=False):
150+
url = get_api_base_url(req)
151+
assert url == "https://api.mydomain.com"
152+
153+
154+
def test_with_multiple_forwarded_headers(make_request):
155+
headers = {
156+
"X-Forwarded-Proto": "https, http",
157+
"X-Forwarded-Host": "api1.com, api2.com",
158+
}
159+
req = make_request(headers=headers, scheme="http", host="example.com")
160+
with patch("common_library.network.is_ip_address", side_effect=[False, False]):
161+
url = get_api_base_url(req)
162+
assert url == "https://api.api1.com"
163+
164+
165+
def test_forwarded_host_with_port(make_request):
166+
headers = {"X-Forwarded-Proto": "https", "X-Forwarded-Host": "mydomain.com:8080"}
167+
req = make_request(headers=headers, scheme="http", host="example.com:8080")
168+
with patch("common_library.network.is_ip_address", return_value=False):
169+
url = get_api_base_url(req)
170+
assert url == "https://api.mydomain.com"
171+
172+
173+
def test_empty_forwarded_headers_fallback(make_request):
174+
headers = {"X-Forwarded-Proto": "", "X-Forwarded-Host": ""}
175+
req = make_request(headers=headers, scheme="https", host="example.com")
176+
with patch("common_library.network.is_ip_address", return_value=False):
177+
url = get_api_base_url(req)
178+
assert url == "https://api.example.com"

0 commit comments

Comments
 (0)