|
13 | 13 | from models.database.base import Base |
14 | 14 | from models.database.saved_prompts import SavedPrompt |
15 | 15 | from utils.saved_prompts import ( |
| 16 | + SavedPromptAccessDeniedError, |
16 | 17 | SavedPromptConflictError, |
17 | 18 | SavedPromptLimitExceededError, |
| 19 | + SavedPromptNotFoundError, |
18 | 20 | SavedPromptValidationError, |
19 | 21 | create_saved_prompt, |
| 22 | + delete_saved_prompt_by_id_and_user, |
20 | 23 | list_saved_prompts_by_user, |
21 | 24 | validate_saved_prompt_content, |
22 | 25 | validate_saved_prompt_name, |
@@ -334,3 +337,51 @@ def test_list_returns_only_that_users_prompts_ordered_by_created_at_desc( |
334 | 337 |
|
335 | 338 | assert [p.id for p in results] == [newer.id, older.id] |
336 | 339 | assert all(p.user_id == "user-1" for p in results) |
| 340 | + |
| 341 | + |
| 342 | +class TestDeleteSavedPromptByIdAndUser: |
| 343 | + """Test cases for delete_saved_prompt_by_id_and_user.""" |
| 344 | + |
| 345 | + def test_delete_owned_prompt( |
| 346 | + self, patch_saved_prompts_get_session: None, sqlite_engine: Engine |
| 347 | + ) -> None: |
| 348 | + """Test deleting an owned prompt removes the row.""" |
| 349 | + created = create_saved_prompt( |
| 350 | + "user-1", "to-delete", "body", max_prompts_per_user=50 |
| 351 | + ) |
| 352 | + |
| 353 | + delete_saved_prompt_by_id_and_user(created.id, "user-1") |
| 354 | + |
| 355 | + session_factory = sessionmaker( |
| 356 | + autocommit=False, autoflush=False, bind=sqlite_engine |
| 357 | + ) |
| 358 | + with session_factory() as session: |
| 359 | + assert session.get(SavedPrompt, created.id) is None |
| 360 | + |
| 361 | + def test_delete_missing_raises_not_found( |
| 362 | + self, patch_saved_prompts_get_session: None |
| 363 | + ) -> None: |
| 364 | + """Test deleting an unknown id raises SavedPromptNotFoundError.""" |
| 365 | + with pytest.raises(SavedPromptNotFoundError) as exc_info: |
| 366 | + delete_saved_prompt_by_id_and_user("missing-id", "user-1") |
| 367 | + |
| 368 | + assert str(exc_info.value) == "Saved prompt not found" |
| 369 | + |
| 370 | + def test_delete_other_users_prompt_raises_access_denied( |
| 371 | + self, patch_saved_prompts_get_session: None, sqlite_engine: Engine |
| 372 | + ) -> None: |
| 373 | + """Test delete by non-owner raises access denied and leaves the row.""" |
| 374 | + created = create_saved_prompt( |
| 375 | + "owner", "private", "body", max_prompts_per_user=50 |
| 376 | + ) |
| 377 | + |
| 378 | + with pytest.raises(SavedPromptAccessDeniedError) as exc_info: |
| 379 | + delete_saved_prompt_by_id_and_user(created.id, "intruder") |
| 380 | + |
| 381 | + assert str(exc_info.value) == "Saved prompt access denied" |
| 382 | + |
| 383 | + session_factory = sessionmaker( |
| 384 | + autocommit=False, autoflush=False, bind=sqlite_engine |
| 385 | + ) |
| 386 | + with session_factory() as session: |
| 387 | + assert session.get(SavedPrompt, created.id) is not None |
0 commit comments