test_conversations.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import uuid
  2. import pytest
  3. from core.base import Message, R2RException
  4. from shared.api.models.management.responses import (
  5. ConversationResponse,
  6. MessageResponse,
  7. )
  8. @pytest.mark.asyncio
  9. async def test_create_conversation(conversations_handler):
  10. resp = await conversations_handler.create_conversation()
  11. assert isinstance(resp, ConversationResponse)
  12. assert resp.id is not None
  13. assert resp.created_at is not None
  14. @pytest.mark.asyncio
  15. async def test_create_conversation_with_user_and_name(conversations_handler):
  16. user_id = uuid.uuid4()
  17. resp = await conversations_handler.create_conversation(user_id=user_id,
  18. name="Test Conv")
  19. assert resp.id is not None
  20. assert resp.created_at is not None
  21. # There's no direct field for user_id in ConversationResponse,
  22. # but we can verify by fetch:
  23. # Just trust it for now since the handler doesn't return user_id directly.
  24. @pytest.mark.asyncio
  25. async def test_add_message(conversations_handler):
  26. conv = await conversations_handler.create_conversation()
  27. conv_id = conv.id
  28. msg = Message(role="user", content="Hello!")
  29. resp = await conversations_handler.add_message(conv_id, msg)
  30. assert isinstance(resp, MessageResponse)
  31. assert resp.id is not None
  32. assert resp.message.content == "Hello!"
  33. @pytest.mark.asyncio
  34. async def test_add_message_with_parent(conversations_handler):
  35. conv = await conversations_handler.create_conversation()
  36. conv_id = conv.id
  37. parent_msg = Message(role="user", content="Parent message")
  38. parent_resp = await conversations_handler.add_message(conv_id, parent_msg)
  39. parent_id = parent_resp.id
  40. child_msg = Message(role="assistant", content="Child reply")
  41. child_resp = await conversations_handler.add_message(conv_id,
  42. child_msg,
  43. parent_id=parent_id)
  44. assert child_resp.id is not None
  45. assert child_resp.message.content == "Child reply"
  46. @pytest.mark.asyncio
  47. async def test_edit_message(conversations_handler):
  48. conv = await conversations_handler.create_conversation()
  49. conv_id = conv.id
  50. original_msg = Message(role="user", content="Original")
  51. resp = await conversations_handler.add_message(conv_id, original_msg)
  52. msg_id = resp.id
  53. updated = await conversations_handler.edit_message(msg_id,
  54. "Edited content")
  55. assert updated["message"].content == "Edited content"
  56. assert updated["metadata"]["edited"] is True
  57. @pytest.mark.asyncio
  58. async def test_update_message_metadata(conversations_handler):
  59. conv = await conversations_handler.create_conversation()
  60. conv_id = conv.id
  61. msg = Message(role="user", content="Meta-test")
  62. resp = await conversations_handler.add_message(conv_id, msg)
  63. msg_id = resp.id
  64. await conversations_handler.update_message_metadata(
  65. msg_id, {"test_key": "test_value"})
  66. # Verify metadata updated
  67. full_conversation = await conversations_handler.get_conversation(conv_id)
  68. for m in full_conversation:
  69. if m.id == str(msg_id):
  70. assert m.metadata["test_key"] == "test_value"
  71. break
  72. @pytest.mark.asyncio
  73. async def test_get_conversation(conversations_handler):
  74. conv = await conversations_handler.create_conversation()
  75. conv_id = conv.id
  76. msg1 = Message(role="user", content="Msg1")
  77. msg2 = Message(role="assistant", content="Msg2")
  78. await conversations_handler.add_message(conv_id, msg1)
  79. await conversations_handler.add_message(conv_id, msg2)
  80. messages = await conversations_handler.get_conversation(conv_id)
  81. assert len(messages) == 2
  82. assert messages[0].message.content == "Msg1"
  83. assert messages[1].message.content == "Msg2"
  84. @pytest.mark.asyncio
  85. async def test_delete_conversation(conversations_handler):
  86. conv = await conversations_handler.create_conversation()
  87. conv_id = conv.id
  88. msg = Message(role="user", content="To be deleted")
  89. await conversations_handler.add_message(conv_id, msg)
  90. await conversations_handler.delete_conversation(conv_id)
  91. with pytest.raises(R2RException) as exc:
  92. await conversations_handler.get_conversation(conv_id)
  93. assert exc.value.status_code == 404, (
  94. "Conversation should be deleted and not found")