cognee/cognee/tests/test_cognee_server_start.py
2025-08-14 10:52:39 +02:00

123 lines
4.1 KiB
Python

import unittest
import subprocess
import time
import os
import signal
import requests
from pathlib import Path
import sys
import uuid
class TestCogneeServerStart(unittest.TestCase):
@classmethod
def setUpClass(cls):
# Start the Cognee server - just check if the server can start without errors
cls.server_process = subprocess.Popen(
[
sys.executable,
"-m",
"uvicorn",
"cognee.api.client:app",
"--host",
"0.0.0.0",
"--port",
"8000",
],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
preexec_fn=os.setsid,
)
# Give the server some time to start
time.sleep(35)
# Check if server started with errors
if cls.server_process.poll() is not None:
stderr = cls.server_process.stderr.read().decode("utf-8")
print(f"Server failed to start: {stderr}", file=sys.stderr)
raise RuntimeError(f"Server failed to start: {stderr}")
@classmethod
def tearDownClass(cls):
# Terminate the server process
if hasattr(cls, "server_process") and cls.server_process:
os.killpg(os.getpgid(cls.server_process.pid), signal.SIGTERM)
cls.server_process.wait()
def test_server_is_running(self):
"""Test that the server is running and can accept connections."""
# Test health endpoint
health_response = requests.get("http://localhost:8000/health", timeout=15)
self.assertIn(health_response.status_code, [200, 503])
# Test root endpoint
root_response = requests.get("http://localhost:8000/", timeout=15)
self.assertEqual(root_response.status_code, 200)
self.assertIn("message", root_response.json())
self.assertEqual(root_response.json()["message"], "Hello, World, I am alive!")
# Login request
url = "http://127.0.0.1:8000/api/v1/auth/login"
form_data = {
"username": "default_user@example.com",
"password": "default_password",
}
login_response = requests.post(url, data=form_data, timeout=15)
login_response.raise_for_status() # raises on HTTP 4xx/5xx
# Define Bearer token to use for authorization
auth_var = (
"Bearer " + login_response.json()["access_token"]
) # e.g. "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6..."
# Add request
url = "http://127.0.0.1:8000/api/v1/add"
file_path = Path(os.path.join(Path(__file__).parent, "test_data/example.png"))
headers = {"Authorization": auth_var}
dataset_name = f"test_{uuid.uuid4().hex[:8]}"
form_data = {"datasetName": dataset_name}
file = {
"data": (
file_path.name,
open(file_path, "rb"),
)
}
payload = {"datasets": [dataset_name]}
add_response = requests.post(url, headers=headers, data=form_data, files=file, timeout=50)
if add_response.status_code not in [200, 201, 409]:
add_response.raise_for_status()
# Cognify request
url = "http://127.0.0.1:8000/api/v1/cognify"
headers = {
"Authorization": auth_var,
"Content-Type": "application/json",
}
cognify_response = requests.post(url, headers=headers, json=payload, timeout=150)
if cognify_response.status_code not in [200, 201, 409]:
cognify_response.raise_for_status()
# TODO: Add test to verify cognify pipeline is complete before testing search
# Search request
url = "http://127.0.0.1:8000/api/v1/search"
headers = {
"Authorization": auth_var,
"Content-Type": "application/json",
}
payload = {"searchType": "GRAPH_COMPLETION", "query": "What's in the document?"}
search_response = requests.post(url, headers=headers, json=payload, timeout=50)
if search_response.status_code not in [200, 201, 409]:
search_response.raise_for_status()
if __name__ == "__main__":
unittest.main()