chilicareAI / tests /test_api.py
feryms's picture
ci: add GitHub Actions CI/CD pipeline
4e65a9c
Raw History Blame Contribute Delete
2.62 kB
import pytest
from unittest.mock import MagicMock, patch
from fastapi.testclient import TestClient
import io
from PIL import Image
from backend.api import app
client = TestClient(app)
def test_read_root():
"""Test root endpoint / returns 200 and expected message."""
response = client.get("/")
assert response.status_code == 200
assert "ChiliCare API" in response.json()["message"]
def test_detect_disease_invalid_file_type():
"""Test /detect rejects non-image file uploads with 400 Bad Request."""
files = {"file": ("test.txt", b"dummy content", "text/plain")}
response = client.post("/detect", files=files)
assert response.status_code == 400
assert "gambar" in response.json()["detail"]
@patch("backend.api.model")
@patch("backend.api.generate_narrative")
def test_detect_disease_success(mock_generate_narrative, mock_model):
"""Test /detect endpoint with a valid image file and mocked YOLO model."""
mock_generate_narrative.return_value = "Saran penanganan penyakit kuning."
# Mock YOLO model box output
mock_box = MagicMock()
mock_box.cls = [0]
mock_box.conf = [0.95]
mock_result = MagicMock()
mock_result.boxes = [mock_box]
# plot() returns a dummy numpy array representing RGB image
import numpy as np
mock_result.plot.return_value = np.zeros((100, 100, 3), dtype=np.uint8)
mock_model.return_value = [mock_result]
mock_model.names = {0: "kuning"}
# Create a small dummy image in bytes
img = Image.new("RGB", (50, 50), color="green")
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format="JPEG")
img_bytes = img_byte_arr.getvalue()
files = {"file": ("chili_leaf.jpg", img_bytes, "image/jpeg")}
response = client.post("/detect", files=files)
assert response.status_code == 200
data = response.json()
assert data["status"] == "success"
assert data["total_detections"] == 1
assert data["results"][0]["class"] == "Kuning"
assert data["results"][0]["narrative"] == "Saran penanganan penyakit kuning."
@patch("backend.api.create_rag_chain")
def test_ask_expert_endpoint(mock_create_rag_chain):
"""Test /ask endpoint streaming response from RAG chain."""
mock_chain = MagicMock()
mock_chain.stream.return_value = ["Tanaman ", "cabai ", "membutuhkan ", "air."]
mock_create_rag_chain.return_value = mock_chain
payload = {"question": "Bagaimana penyiraman cabai?"}
response = client.post("/ask", json=payload)
assert response.status_code == 200
assert "Tanaman cabai membutuhkan air." in response.text