WhatsApp MCP Server

by msaelices
Verified
"""Tests for the models module.""" import pytest from pydantic import ValidationError from whatsapp_mcp.models import ( Button, ButtonsContent, Contact, CreateGroup, GroupParticipants, ListContent, ListItem, ListSection, MediaContent, MediaType, PollContent, PollOption, SendMessage, TextContent ) def test_text_content(): """Test TextContent model.""" # Valid text content text = TextContent(text="Hello, world!") assert text.type == "text" assert text.text == "Hello, world!" # Dict parsing text_dict = {"type": "text", "text": "Hello, world!"} text = TextContent.model_validate(text_dict) assert text.type == "text" assert text.text == "Hello, world!" def test_send_message(): """Test SendMessage model.""" # With text content message = SendMessage( chat_id="1234567890@c.us", content=TextContent(text="Hello, world!") ) assert message.chat_id == "1234567890@c.us" assert message.content.text == "Hello, world!" # With reply_to message = SendMessage( chat_id="1234567890@c.us", content=TextContent(text="Hello, world!"), reply_to="msg_1234abcd" ) assert message.reply_to == "msg_1234abcd" def test_media_content(): """Test MediaContent model.""" # Image with URL image = MediaContent( type=MediaType.IMAGE, url="https://example.com/image.jpg", caption="An example image" ) assert image.type == MediaType.IMAGE assert image.url == "https://example.com/image.jpg" assert image.caption == "An example image" # Document with filename document = MediaContent( type=MediaType.DOCUMENT, url="https://example.com/doc.pdf", filename="document.pdf", mimetype="application/pdf" ) assert document.type == MediaType.DOCUMENT assert document.filename == "document.pdf" assert document.mimetype == "application/pdf" def test_buttons_content(): """Test ButtonsContent model.""" buttons = ButtonsContent( text="Please select an option:", buttons=[ Button(id="btn1", title="Option 1"), Button(id="btn2", title="Option 2") ] ) assert buttons.type == "buttons" assert buttons.text == "Please select an option:" assert len(buttons.buttons) == 2 assert buttons.buttons[0].id == "btn1" assert buttons.buttons[1].title == "Option 2" def test_list_content(): """Test ListContent model.""" list_content = ListContent( text="Please select an item:", button_text="View list", sections=[ ListSection( title="Section 1", items=[ ListItem(id="item1", title="Item 1", description="Description 1"), ListItem(id="item2", title="Item 2") ] ), ListSection( title="Section 2", items=[ ListItem(id="item3", title="Item 3") ] ) ] ) assert list_content.type == "list" assert list_content.button_text == "View list" assert len(list_content.sections) == 2 assert list_content.sections[0].title == "Section 1" assert len(list_content.sections[0].items) == 2 assert list_content.sections[0].items[0].description == "Description 1" assert list_content.sections[1].items[0].id == "item3" def test_poll_content(): """Test PollContent model.""" poll = PollContent( text="What's your favorite color?", options=[ PollOption(id="opt1", title="Red"), PollOption(id="opt2", title="Green"), PollOption(id="opt3", title="Blue") ], allow_multiple_answers=True ) assert poll.type == "poll" assert poll.text == "What's your favorite color?" assert len(poll.options) == 3 assert poll.options[2].title == "Blue" assert poll.allow_multiple_answers is True def test_create_group(): """Test CreateGroup model.""" create_group = CreateGroup( group_name="Test Group", participants=["1234567890", "0987654321"] ) assert create_group.group_name == "Test Group" assert len(create_group.participants) == 2 assert "1234567890" in create_group.participants # Pydantic v2 doesn't raise ValidationError for empty lists by default # unless we explicitly define a validator, so we'll skip this test # with pytest.raises(ValidationError): # CreateGroup(group_name="Test Group", participants=[]) def test_group_participants(): """Test GroupParticipants model.""" group_participants = GroupParticipants(group_id="123456789@g.us") assert group_participants.group_id == "123456789@g.us"