from pydantic_core import from_json from mcpuniverse.app.api.benchmark import ( CreateBenchmarkResponse, GetBenchmarkResponse, CreateReleasedBenchmarkResponse, GetReleasedBenchmarkResponse, ListReleasedBenchmarkResponse ) from mcpuniverse.app.api.task import GetReleasedTaskResponse from mcpuniverse.app.api.user import CreateUserResponse class TestBenchmarkAPI: def test_create_benchmark(self, client): name = "test_benchmark" description = "A test benchmark" response = client.post( "/internal/benchmark/create", json={"name": name, "description": description} ) assert response.status_code == 400 response = client.post( "/internal/benchmark/create", json={"name": name, "description": description}, headers={"x-user-id": "12345"} ) assert response.status_code == 200 r = CreateBenchmarkResponse.model_validate(from_json(response.text)) assert r.name == name response = client.post( "/internal/benchmark/create", json={"name": "", "description": description}, headers={"x-user-id": "12345"} ) assert response.status_code == 400 response = client.post( "/internal/benchmark/create", json={"description": description}, headers={"x-user-id": "12345"} ) assert response.status_code == 400 def test_get_benchmark(self, client): name = "test_benchmark" description = "A test benchmark" response = client.post( "/internal/benchmark/create", json={"name": name, "description": description}, headers={"x-user-id": "12345"} ) assert response.status_code == 200 r = CreateBenchmarkResponse.model_validate(from_json(response.text)) assert r.name == name response = client.get( f"/internal/benchmark/get?name={name}", headers={"x-user-id": "12345"} ) assert response.status_code == 200 response = client.get( f"/internal/benchmark/get?name=xxx", headers={"x-user-id": "12345"} ) assert response.status_code == 404 def test_update_benchmark(self, client): name = "test_benchmark" description = "A test benchmark" response = client.post( "/internal/benchmark/create", json={"name": name, "description": description}, headers={"x-user-id": "12345"} ) assert response.status_code == 200 response = client.post( "/internal/benchmark/update", json={"name": name, "description": "test test"}, headers={"x-user-id": "12345"} ) assert response.status_code == 200 response = client.get( f"/internal/benchmark/get?name={name}", headers={"x-user-id": "12345"} ) assert response.status_code == 200 r = GetBenchmarkResponse.model_validate(from_json(response.text)) assert r.description == "test test" response = client.post( "/internal/benchmark/update", json={"name": name}, headers={"x-user-id": "12345"} ) assert response.status_code == 200 response = client.get( f"/internal/benchmark/get?name={name}", headers={"x-user-id": "12345"} ) assert response.status_code == 200 r = GetBenchmarkResponse.model_validate(from_json(response.text)) assert r.description == "test test" response = client.post( "/internal/benchmark/update", json={"name": "xxx"}, headers={"x-user-id": "12345"} ) assert response.status_code == 404 def test_create_released_benchmark(self, client): benchmark_name = "test_benchmark" description = "A test benchmark" response = client.post( "/user/create", json={"username": "abc", "email": "abc@gmail.com", "password": "123"}, ) assert response.status_code == 200 r = CreateUserResponse.model_validate(from_json(response.text)) user_id = r.id response = client.post( "/internal/benchmark/create", json={"name": benchmark_name, "description": description}, headers={"x-user-id": str(user_id)} ) assert response.status_code == 200 response = client.post( "/internal/task/create", json={ "benchmark_name": benchmark_name, "name": "task-1", "category": "test", "question": "the first task", "config": "{}" }, headers={"x-user-id": str(user_id)} ) assert response.status_code == 200 response = client.post( "/internal/task/create", json={ "benchmark_name": benchmark_name, "name": "task-2", "category": "test", "question": "the second task", "config": "{}" }, headers={"x-user-id": str(user_id)} ) assert response.status_code == 200 response = client.post( "/admin/benchmark/create_release", json={"owner_name": "abc", "name": benchmark_name, "tag": "v1"}, ) assert response.status_code == 200 r = CreateReleasedBenchmarkResponse.model_validate(from_json(response.text)) assert r.name == benchmark_name and r.tag == "v1" benchmark_id = r.id response = client.get( f"/task/get_release?benchmark_id={benchmark_id}&name=task-1&tag=v1" ) assert response.status_code == 200 r = GetReleasedTaskResponse.model_validate(from_json(response.text)) assert r.name == "task-1" and r.question == "the first task" response = client.get( f"/task/get_release?benchmark_id={benchmark_id}&name=task-2&tag=v1" ) assert response.status_code == 200 r = GetReleasedTaskResponse.model_validate(from_json(response.text)) assert r.name == "task-2" and r.question == "the second task" response = client.get( f"/benchmark/get_release?owner_name=abc&name={benchmark_name}&tag=v1" ) assert response.status_code == 200 r = GetReleasedBenchmarkResponse.model_validate(from_json(response.text)) assert r.id == benchmark_id and r.name == benchmark_name assert len(r.tasks) == 2 assert "task-1" in r.tasks and "task-2" in r.tasks response = client.post( "/benchmark/list_release", json={"limit": 1, "offset": 0}, headers={"x-user-id": "12345"} ) assert response.status_code == 200 r = ListReleasedBenchmarkResponse.model_validate(from_json(response.text)) assert r.benchmarks[0] == (user_id, benchmark_name)