Skip to content

Commit 52a57ff

Browse files
Yuri ZmytrakovYuri Zmytrakov
authored andcommitted
test: add Redis cache for navigation tests
Add tests for Redis pagination caching in search and collections endpoints, plus utility function tests.
1 parent d6d268e commit 52a57ff

File tree

3 files changed

+124
-0
lines changed

3 files changed

+124
-0
lines changed

stac_fastapi/tests/redis/__init__.py

Whitespace-only changes.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import uuid
2+
3+
import pytest
4+
5+
from ..conftest import create_collection, create_item
6+
7+
8+
@pytest.mark.asyncio
9+
async def test_search_pagination_uses_redis_cache(
10+
app_client, txn_client, load_test_data
11+
):
12+
"""Test Redis caching and navigation for the /search endpoint."""
13+
14+
collection = load_test_data("test_collection.json")
15+
collection_id = f"test-pagination-collection-{uuid.uuid4()}"
16+
collection["id"] = collection_id
17+
await create_collection(txn_client, collection)
18+
19+
for i in range(5):
20+
item = load_test_data("test_item.json")
21+
item["id"] = f"test-pagination-item-{uuid.uuid4()}"
22+
item["collection"] = collection_id
23+
await create_item(txn_client, item)
24+
25+
resp = await app_client.post(
26+
"/search", json={"collections": [collection_id], "limit": 1}
27+
)
28+
resp_json = resp.json()
29+
30+
next_link = next(
31+
(link for link in resp_json["links"] if link["rel"] == "next"), None
32+
)
33+
next_token = next_link["body"]["token"]
34+
35+
# Expect the previous link on the second page to be retrieved from Redis cache
36+
resp2 = await app_client.post(
37+
"/search",
38+
json={"collections": [collection_id], "limit": 1, "token": next_token},
39+
)
40+
resp2_json = resp2.json()
41+
42+
prev_link = next(
43+
(link for link in resp2_json["links"] if link["rel"] == "prev"), None
44+
)
45+
assert prev_link is not None
46+
47+
48+
@pytest.mark.asyncio
49+
async def test_collections_pagination_uses_redis_cache(
50+
app_client, txn_client, load_test_data
51+
):
52+
"""Test Redis caching and navigation for the /collection endpoint."""
53+
54+
collection_data = load_test_data("test_collection.json")
55+
for i in range(5):
56+
collection = collection_data.copy()
57+
collection["id"] = f"test-collection-pagination-{uuid.uuid4()}"
58+
collection["title"] = f"Test Collection Pagination {i}"
59+
await create_collection(txn_client, collection)
60+
61+
resp = await app_client.get("/collections", params={"limit": 1})
62+
assert resp.status_code == 200
63+
resp1_json = resp.json()
64+
65+
next_link = next(
66+
(link for link in resp1_json["links"] if link["rel"] == "next"), None
67+
)
68+
next_token = next_link["href"].split("token=")[1]
69+
70+
# Expect the previous link on the second page to be retrieved from Redis cache
71+
resp2 = await app_client.get(
72+
"/collections", params={"limit": 1, "token": next_token}
73+
)
74+
assert resp2.status_code == 200
75+
resp2_json = resp2.json()
76+
77+
prev_link = next(
78+
(link for link in resp2_json["links"] if link["rel"] == "prev"), None
79+
)
80+
assert prev_link is not None
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import pytest
2+
3+
from stac_fastapi.core.redis_utils import connect_redis, get_prev_link, save_self_link
4+
5+
6+
@pytest.mark.asyncio
7+
async def test_redis_connection():
8+
"""Test Redis connection."""
9+
redis = await connect_redis()
10+
assert redis is not None
11+
12+
# Test set/get
13+
await redis.set("string_key", "string_value")
14+
string_value = await redis.get("string_key")
15+
assert string_value == "string_value"
16+
17+
# Test key retrieval operation
18+
exists = await redis.exists("string_key")
19+
assert exists == 1
20+
21+
# Test key deletion
22+
await redis.delete("string_key")
23+
deleted_value = await redis.get("string_key")
24+
assert deleted_value is None
25+
26+
27+
@pytest.mark.asyncio
28+
async def test_redis_utils_functions():
29+
redis = await connect_redis()
30+
assert redis is not None
31+
32+
token = "test_token_123"
33+
self_link = "http://mywebsite.com/search?token=test_token_123"
34+
35+
await save_self_link(redis, token, self_link)
36+
retrieved_link = await get_prev_link(redis, token)
37+
assert retrieved_link == self_link
38+
39+
await save_self_link(redis, None, "should_not_save")
40+
null_result = await get_prev_link(redis, None)
41+
assert null_result is None
42+
43+
non_existent = await get_prev_link(redis, "non_existent_token")
44+
assert non_existent is None

0 commit comments

Comments
 (0)