Skip to content

Commit 771b02b

Browse files
committed
in progress
1 parent 46233ff commit 771b02b

File tree

1 file changed

+110
-0
lines changed

1 file changed

+110
-0
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
from unittest.mock import patch, MagicMock
2+
3+
import pytest
4+
from fastapi import FastAPI, Request, Response
5+
from starlette.testclient import TestClient
6+
7+
from stac_auth_proxy.middleware.Cql2RewriteLinksFilterMiddleware import (
8+
Cql2RewriteLinksFilterMiddleware,
9+
)
10+
11+
12+
@pytest.fixture
13+
def app_with_middleware():
14+
app = FastAPI()
15+
app.add_middleware(Cql2RewriteLinksFilterMiddleware)
16+
17+
@app.get("/test")
18+
async def test_endpoint(request: Request):
19+
# Simulate a response with links containing a filter in the query and body
20+
return {
21+
"links": [
22+
{
23+
"rel": "self",
24+
"href": "http://example.com/search?filter=foo&filter-lang=cql2-text",
25+
},
26+
{
27+
"rel": "post",
28+
"body": {"filter": "foo", "filter-lang": "cql2-json"},
29+
},
30+
]
31+
}
32+
33+
return app
34+
35+
36+
def test_rewrite_links_with_filter(app_with_middleware):
37+
# Patch cql2.Expr to simulate to_text and to_json
38+
with patch(
39+
"stac_auth_proxy.middleware.Cql2RewriteLinksFilterMiddleware.Expr"
40+
) as MockExpr:
41+
mock_expr = MagicMock()
42+
mock_expr.to_text.return_value = "bar"
43+
mock_expr.to_json.return_value = {"foo": "bar"}
44+
MockExpr.return_value = mock_expr
45+
46+
client = TestClient(app_with_middleware)
47+
response = client.get("/test?filter=foo")
48+
assert response.status_code == 200
49+
data = response.json()
50+
# The filter in the href should be rewritten
51+
assert any(
52+
"filter=bar" in link["href"] for link in data["links"] if "href" in link
53+
)
54+
# The filter in the body should be rewritten
55+
assert any(
56+
link.get("body", {}).get("filter") == {"foo": "bar"}
57+
for link in data["links"]
58+
)
59+
60+
61+
def test_remove_filter_from_links(app_with_middleware):
62+
# Patch cql2.Expr to return None (no filter)
63+
with patch(
64+
"stac_auth_proxy.middleware.Cql2RewriteLinksFilterMiddleware.Expr"
65+
) as MockExpr:
66+
MockExpr.return_value = None
67+
client = TestClient(app_with_middleware)
68+
response = client.get("/test")
69+
assert response.status_code == 200
70+
data = response.json()
71+
# The filter should be removed from href and body
72+
for link in data["links"]:
73+
if "href" in link:
74+
assert "filter=" not in link["href"]
75+
if "body" in link:
76+
assert "filter" not in link["body"]
77+
assert "filter-lang" not in link["body"]
78+
79+
80+
def test_passthrough_when_no_filter_state(app_with_middleware):
81+
# Simulate no filter in request.state
82+
with patch(
83+
"stac_auth_proxy.middleware.Cql2RewriteLinksFilterMiddleware.Expr"
84+
) as MockExpr:
85+
MockExpr.return_value = None
86+
client = TestClient(app_with_middleware)
87+
response = client.get("/test")
88+
assert response.status_code == 200
89+
data = response.json()
90+
# Should be unchanged (filter removed)
91+
for link in data["links"]:
92+
if "href" in link:
93+
assert "filter=" not in link["href"]
94+
if "body" in link:
95+
assert "filter" not in link["body"]
96+
assert "filter-lang" not in link["body"]
97+
98+
99+
def test_non_json_response(app_with_middleware):
100+
# Add a route that returns plain text
101+
app = app_with_middleware
102+
103+
@app.get("/plain")
104+
async def plain():
105+
return Response(content="not json", media_type="text/plain")
106+
107+
client = TestClient(app)
108+
response = client.get("/plain")
109+
assert response.status_code == 200
110+
assert response.text == "not json"

0 commit comments

Comments
 (0)