/ tests / future / test_ui / test_prompts.py
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"