Prepare btcprice for Kubernetes deployment
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
import httpx
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from app import main
|
||||
|
||||
|
||||
class StubAsyncClient:
|
||||
def __init__(self, response=None, error=None):
|
||||
self.response = response
|
||||
self.error = error
|
||||
self.requested_url = None
|
||||
self.timeout = None
|
||||
|
||||
async def __aenter__(self):
|
||||
return self
|
||||
|
||||
async def __aexit__(self, exc_type, exc, traceback):
|
||||
return None
|
||||
|
||||
async def get(self, url, timeout):
|
||||
self.requested_url = url
|
||||
self.timeout = timeout
|
||||
if self.error:
|
||||
raise self.error
|
||||
return self.response
|
||||
|
||||
|
||||
def test_health_is_independent_of_btcdata():
|
||||
response = TestClient(main.app).get("/api/health")
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.json() == {"status": "up"}
|
||||
|
||||
|
||||
def test_ready_when_btcdata_is_healthy(monkeypatch):
|
||||
request = httpx.Request("GET", "http://btcdata.test/api/health")
|
||||
upstream = httpx.Response(200, request=request)
|
||||
client = StubAsyncClient(response=upstream)
|
||||
monkeypatch.setattr(main, "BTCDATA_URL", "http://btcdata.test")
|
||||
monkeypatch.setattr(main.httpx, "AsyncClient", lambda: client)
|
||||
|
||||
response = TestClient(main.app).get("/api/ready")
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.json() == {"status": "ready"}
|
||||
assert client.requested_url == "http://btcdata.test/api/health"
|
||||
assert client.timeout == main.READINESS_TIMEOUT_SECONDS
|
||||
|
||||
|
||||
def test_not_ready_when_btcdata_is_unavailable(monkeypatch):
|
||||
request = httpx.Request("GET", "http://btcdata.test/api/health")
|
||||
error = httpx.ConnectError("connection refused", request=request)
|
||||
client = StubAsyncClient(error=error)
|
||||
monkeypatch.setattr(main, "BTCDATA_URL", "http://btcdata.test")
|
||||
monkeypatch.setattr(main.httpx, "AsyncClient", lambda: client)
|
||||
|
||||
response = TestClient(main.app).get("/api/ready")
|
||||
|
||||
assert response.status_code == 503
|
||||
assert response.json() == {"status": "not ready"}
|
||||
assert "btcdata.test" not in response.text
|
||||
|
||||
|
||||
def test_not_ready_when_btcdata_returns_an_error(monkeypatch):
|
||||
request = httpx.Request("GET", "http://btcdata.test/api/health")
|
||||
upstream = httpx.Response(503, request=request)
|
||||
client = StubAsyncClient(response=upstream)
|
||||
monkeypatch.setattr(main.httpx, "AsyncClient", lambda: client)
|
||||
|
||||
response = TestClient(main.app).get("/api/ready")
|
||||
|
||||
assert response.status_code == 503
|
||||
assert response.json() == {"status": "not ready"}
|
||||
|
||||
|
||||
def test_version_endpoint(monkeypatch):
|
||||
monkeypatch.setattr(main, "APP_VERSION", "abc1234")
|
||||
|
||||
response = TestClient(main.app).get("/api/version")
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.json() == {"version": "abc1234"}
|
||||
Reference in New Issue
Block a user