test_prompts.py
1 import pytest 2 from litestar.testing import TestClient 3 4 from evidently.llm.prompts.content import TextPromptContent 5 6 7 @pytest.fixture 8 def created_project(test_client: TestClient): 9 """Create a test project via API.""" 10 response = test_client.post( 11 "/api/projects", 12 json={ 13 "name": "Test Project", 14 "description": "Test project for prompts", 15 }, 16 ) 17 assert response.status_code == 201 18 project_id = response.json() 19 return project_id 20 21 22 def test_list_prompts(test_client: TestClient, created_project): 23 """GET /api/prompts""" 24 response = test_client.get(f"/api/prompts?project_id={created_project}") 25 assert response.status_code == 200 26 assert response.json() == [] 27 28 # Create a prompt 29 prompt_data = {"name": "test prompt", "metadata": {}} 30 response = test_client.post( 31 f"/api/prompts?project_id={created_project}", 32 json=prompt_data, 33 ) 34 assert response.status_code == 201 35 created_prompt = response.json() 36 37 response = test_client.get(f"/api/prompts?project_id={created_project}") 38 assert response.status_code == 200 39 prompts = response.json() 40 assert len(prompts) == 1 41 assert prompts[0]["id"] == created_prompt["id"] 42 43 44 def test_create_and_get_prompt_by_id(test_client: TestClient, created_project): 45 """GET /api/prompts/{prompt_id}""" 46 prompt_data = {"name": "my prompt", "metadata": {}} 47 response = test_client.post( 48 f"/api/prompts?project_id={created_project}", 49 json=prompt_data, 50 ) 51 assert response.status_code == 201 52 prompt = response.json() 53 assert prompt["name"] == "my prompt" 54 assert prompt["project_id"] == str(created_project) 55 56 response = test_client.get(f"/api/prompts/{prompt['id']}") 57 assert response.status_code == 200 58 fetched = response.json() 59 assert fetched["id"] == prompt["id"] 60 assert fetched["name"] == "my prompt" 61 62 63 def test_get_prompt_by_name(test_client: TestClient, created_project): 64 """GET /api/prompts/by-name/{name}""" 65 prompt_data = {"name": "some prompt", "metadata": {}} 66 response = test_client.post( 67 f"/api/prompts?project_id={created_project}", 68 json=prompt_data, 69 ) 70 assert response.status_code == 201 71 72 response = test_client.get(f"/api/prompts/by-name/some prompt?project_id={created_project}") 73 assert response.status_code == 200 74 fetched = response.json() 75 assert fetched["name"] == "some prompt" 76 77 response = test_client.get(f"/api/prompts/by-name/nonexistent?project_id={created_project}") 78 assert response.status_code == 404 79 80 81 def test_list_versions(test_client: TestClient, created_project): 82 """GET /api/prompts/{prompt_id}/versions""" 83 prompt_data = {"name": "versioned prompt", "metadata": {}} 84 response = test_client.post( 85 f"/api/prompts?project_id={created_project}", 86 json=prompt_data, 87 ) 88 assert response.status_code == 201 89 prompt = response.json() 90 91 response = test_client.get(f"/api/prompts/{prompt['id']}/versions") 92 assert response.status_code == 200 93 versions = response.json() 94 assert versions == [] 95 96 97 def test_create_and_get_version(test_client: TestClient, created_project): 98 """POST /api/prompts/{prompt_id}/versions and GET /api/prompts/{prompt_id}/versions/{version}""" 99 prompt_data = {"name": "v prompt", "metadata": {}} 100 response = test_client.post( 101 f"/api/prompts?project_id={created_project}", 102 json=prompt_data, 103 ) 104 assert response.status_code == 201 105 prompt = response.json() 106 107 content = TextPromptContent(text="Hello world") 108 version_data = { 109 "version": 1, 110 "content": content.dict(), 111 "content_type": content.get_type().value, 112 "metadata": {}, 113 } 114 response = test_client.post( 115 f"/api/prompts/{prompt['id']}/versions", 116 json=version_data, 117 ) 118 assert response.status_code == 201 119 version = response.json() 120 assert version["version"] == 1 121 122 response = test_client.get(f"/api/prompts/{prompt['id']}/versions/1") 123 assert response.status_code == 200 124 fetched = response.json() 125 assert fetched["version"] == 1 126 127 128 def test_get_version_by_id(test_client: TestClient, created_project): 129 """GET /api/prompts/prompt-versions/{prompt_version_id}""" 130 prompt_data = {"name": "test prompt", "metadata": {}} 131 response = test_client.post( 132 f"/api/prompts?project_id={created_project}", 133 json=prompt_data, 134 ) 135 assert response.status_code == 201 136 prompt = response.json() 137 138 content = TextPromptContent(text="Test content") 139 version_data = { 140 "version": 1, 141 "content": content.dict(), 142 "content_type": content.get_type().value, 143 "metadata": {}, 144 } 145 response = test_client.post( 146 f"/api/prompts/{prompt['id']}/versions", 147 json=version_data, 148 ) 149 assert response.status_code == 201 150 version = response.json() 151 152 response = test_client.get(f"/api/prompts/prompt-versions/{version['id']}") 153 assert response.status_code == 200 154 fetched = response.json() 155 assert fetched["id"] == version["id"] 156 assert fetched["version"] == 1 157 158 159 def test_get_version_by_latest(test_client: TestClient, created_project): 160 """GET /api/prompts/{prompt_id}/versions/latest""" 161 prompt_data = {"name": "test prompt", "metadata": {}} 162 response = test_client.post( 163 f"/api/prompts?project_id={created_project}", 164 json=prompt_data, 165 ) 166 assert response.status_code == 201 167 prompt = response.json() 168 169 content = TextPromptContent(text="Latest version") 170 version_data = { 171 "version": 1, 172 "content": content.dict(), 173 "content_type": content.get_type().value, 174 "metadata": {}, 175 } 176 response = test_client.post( 177 f"/api/prompts/{prompt['id']}/versions", 178 json=version_data, 179 ) 180 assert response.status_code == 201 181 version = response.json() 182 183 response = test_client.get(f"/api/prompts/{prompt['id']}/versions/latest") 184 assert response.status_code == 200 185 fetched = response.json() 186 assert fetched["id"] == version["id"] 187 assert fetched["version"] == 1 188 189 190 def test_bump_prompt_version(test_client: TestClient, created_project): 191 """Test creating multiple prompt versions""" 192 prompt_data = {"name": "bump prompt", "metadata": {}} 193 response = test_client.post( 194 f"/api/prompts?project_id={created_project}", 195 json=prompt_data, 196 ) 197 assert response.status_code == 201 198 prompt = response.json() 199 200 # Create first version 201 content1 = TextPromptContent(text="Version 1") 202 version_data = { 203 "version": 1, 204 "content": content1.dict(), 205 "content_type": content1.get_type().value, 206 "metadata": {}, 207 } 208 response = test_client.post( 209 f"/api/prompts/{prompt['id']}/versions", 210 json=version_data, 211 ) 212 assert response.status_code == 201 213 version1 = response.json() 214 assert version1["version"] == 1 215 216 # Create second version 217 content2 = TextPromptContent(text="Version 2") 218 version_data = { 219 "version": 2, 220 "content": content2.dict(), 221 "content_type": content2.get_type().value, 222 "metadata": {}, 223 } 224 response = test_client.post( 225 f"/api/prompts/{prompt['id']}/versions", 226 json=version_data, 227 ) 228 assert response.status_code == 201 229 version2 = response.json() 230 assert version2["version"] == 2 231 232 # Create third version 233 content3 = TextPromptContent(text="Version 3") 234 version_data = { 235 "version": 3, 236 "content": content3.dict(), 237 "content_type": content3.get_type().value, 238 "metadata": {}, 239 } 240 response = test_client.post( 241 f"/api/prompts/{prompt['id']}/versions", 242 json=version_data, 243 ) 244 assert response.status_code == 201 245 version3 = response.json() 246 assert version3["version"] == 3 247 248 249 def test_delete_prompt(test_client: TestClient, created_project): 250 """DELETE /api/prompts/{prompt_id}""" 251 response = test_client.get(f"/api/prompts?project_id={created_project}") 252 assert response.status_code == 200 253 assert len(response.json()) == 0 254 255 prompt_data = {"name": "test prompt", "metadata": {}} 256 response = test_client.post( 257 f"/api/prompts?project_id={created_project}", 258 json=prompt_data, 259 ) 260 assert response.status_code == 201 261 prompt = response.json() 262 263 response = test_client.get(f"/api/prompts?project_id={created_project}") 264 assert response.status_code == 200 265 assert len(response.json()) == 1 266 267 response = test_client.delete(f"/api/prompts/{prompt['id']}") 268 assert response.status_code == 204 269 270 response = test_client.get(f"/api/prompts?project_id={created_project}") 271 assert response.status_code == 200 272 assert len(response.json()) == 0 273 274 275 def test_delete_prompt_version(test_client: TestClient, created_project): 276 """DELETE /api/prompts/prompt-versions/{prompt_version_id}""" 277 prompt_data = {"name": "test prompt", "metadata": {}} 278 response = test_client.post( 279 f"/api/prompts?project_id={created_project}", 280 json=prompt_data, 281 ) 282 assert response.status_code == 201 283 prompt = response.json() 284 285 content = TextPromptContent(text="Test content") 286 version_data = { 287 "version": 1, 288 "content": content.dict(), 289 "content_type": content.get_type().value, 290 "metadata": {}, 291 } 292 response = test_client.post( 293 f"/api/prompts/{prompt['id']}/versions", 294 json=version_data, 295 ) 296 assert response.status_code == 201 297 version = response.json() 298 299 response = test_client.get(f"/api/prompts/{prompt['id']}/versions") 300 assert response.status_code == 200 301 assert len(response.json()) == 1 302 303 response = test_client.delete(f"/api/prompts/prompt-versions/{version['id']}") 304 assert response.status_code == 204 305 306 response = test_client.get(f"/api/prompts/{prompt['id']}/versions") 307 assert response.status_code == 200 308 assert len(response.json()) == 0 309 310 311 def test_update_prompt(test_client: TestClient, created_project): 312 """PUT /api/prompts/{prompt_id}""" 313 prompt_data = {"name": "test prompt", "metadata": {}} 314 response = test_client.post( 315 f"/api/prompts?project_id={created_project}", 316 json=prompt_data, 317 ) 318 assert response.status_code == 201 319 prompt = response.json() 320 321 updated_data = { 322 "id": prompt["id"], 323 "project_id": prompt["project_id"], 324 "name": "test prompt 2", 325 "metadata": prompt["metadata"], 326 } 327 response = test_client.put( 328 f"/api/prompts/{prompt['id']}", 329 json=updated_data, 330 ) 331 assert response.status_code == 200 332 333 response = test_client.get(f"/api/prompts/{prompt['id']}") 334 assert response.status_code == 200 335 updated_prompt = response.json() 336 assert updated_prompt["name"] == "test prompt 2"