Files
fastapi-cache/tests/test_decorator.py

103 lines
3.5 KiB
Python
Raw Normal View History

import time
2023-05-09 17:08:32 +01:00
from typing import Generator, Any
import pendulum
import pytest
from starlette.testclient import TestClient
from examples.in_memory.main import app
2022-11-07 16:39:17 +08:00
from fastapi_cache import FastAPICache
from fastapi_cache.backends.inmemory import InMemoryBackend
@pytest.fixture(autouse=True)
2023-05-09 17:08:32 +01:00
def init_cache() -> Generator[Any, Any, None]:
FastAPICache.init(InMemoryBackend())
yield
FastAPICache.reset()
def test_datetime() -> None:
with TestClient(app) as client:
response = client.get("/datetime")
now = response.json().get("now")
2023-05-09 17:08:32 +01:00
now_ = pendulum.now().replace(microsecond=0) # type: ignore[no-untyped-call]
assert pendulum.parse(now).replace(microsecond=0) == now_ # type: ignore[attr-defined]
response = client.get("/datetime")
now = response.json().get("now")
2023-05-09 17:08:32 +01:00
assert pendulum.parse(now).replace(microsecond=0) == now_ # type: ignore[attr-defined]
time.sleep(3)
response = client.get("/datetime")
now = response.json().get("now")
2023-05-09 17:08:32 +01:00
now = pendulum.parse(now).replace(microsecond=0) # type: ignore[attr-defined]
assert now != now_
2023-05-09 17:08:32 +01:00
assert now == pendulum.now().replace(microsecond=0) # type: ignore[no-untyped-call]
2022-10-14 21:59:33 +02:00
def test_date() -> None:
2022-10-14 21:59:33 +02:00
"""Test path function without request or response arguments."""
with TestClient(app) as client:
response = client.get("/date")
2023-05-09 17:08:32 +01:00
assert pendulum.parse(response.json()) == pendulum.today() # type: ignore[attr-defined]
2022-10-14 21:59:33 +02:00
# do it again to test cache
response = client.get("/date")
2023-05-09 17:08:32 +01:00
assert pendulum.parse(response.json()) == pendulum.today() # type: ignore[attr-defined]
2022-10-14 21:59:33 +02:00
# now test with cache disabled, as that's a separate code path
FastAPICache._enable = False
response = client.get("/date")
2023-05-09 17:08:32 +01:00
assert pendulum.parse(response.json()) == pendulum.today() # type: ignore[attr-defined]
2022-10-14 21:59:33 +02:00
FastAPICache._enable = True
def test_sync() -> None:
2022-10-14 21:59:33 +02:00
"""Ensure that sync function support works."""
with TestClient(app) as client:
response = client.get("/sync-me")
assert response.json() == 42
2022-11-04 17:34:20 +08:00
def test_cache_response_obj() -> None:
with TestClient(app) as client:
cache_response = client.get("cache_response_obj")
assert cache_response.json() == {"a": 1}
get_cache_response = client.get("cache_response_obj")
assert get_cache_response.json() == {"a": 1}
assert get_cache_response.headers.get("cache-control")
assert get_cache_response.headers.get("etag")
2023-02-15 10:35:41 +09:00
2023-02-15 10:45:19 +08:00
2023-02-15 10:35:41 +09:00
def test_kwargs() -> None:
with TestClient(app) as client:
name = "Jon"
2023-02-15 10:45:19 +08:00
response = client.get("/kwargs", params={"name": name})
2023-02-15 10:35:41 +09:00
assert response.json() == {"name": name}
def test_method() -> None:
with TestClient(app) as client:
response = client.get("/method")
assert response.json() == 17
def test_pydantic_model() -> None:
with TestClient(app) as client:
r1 = client.get("/pydantic_instance").json()
r2 = client.get("/pydantic_instance").json()
assert r1 == r2
def test_non_get() -> None:
with TestClient(app) as client:
response = client.put("/uncached_put")
assert response.json() == {"value": 1}
response = client.put("/uncached_put")
assert response.json() == {"value": 2}
def test_alternate_injected_namespace() -> None:
with TestClient(app) as client:
response = client.get("/namespaced_injection")
assert response.json() == {"__fastapi_cache_request": 42, "__fastapi_cache_response": 17}