from __future__ import annotations class TestCardCarousel: def test_build_carousel(self): from yuxi.channels.adapters.zalo_user.cards import ( ZaloCard, build_card_carousel, ) card1 = ZaloCard(title="Card 1", description="First card") card2 = ZaloCard(title="Card 2", description="Second card") payload = build_card_carousel("conv_123", [card1, card2]) assert payload["message_type"] == "card" assert payload["conversation_id"] == "conv_123" assert payload["cards"]["layout"] == "carousel" assert len(payload["cards"]["elements"]) == 2 def test_card_message_layouts(self): from yuxi.channels.adapters.zalo_user.cards import ( CardMessage, ZaloCard, ) horizontal = CardMessage(cards=[ZaloCard(title="Test")], layout="horizontal") assert horizontal.to_dict()["layout"] == "horizontal" carousel = CardMessage(cards=[ZaloCard(title="Test")], layout="carousel") assert carousel.to_dict()["layout"] == "carousel" class TestCardTemplates: def test_welcome_card(self): from yuxi.channels.adapters.zalo_user.cards import template_welcome_card card = template_welcome_card("MyBot", "I am an assistant.") assert "Welcome to MyBot" in card.title assert card.description == "I am an assistant." def test_confirmation_card(self): from yuxi.channels.adapters.zalo_user.cards import template_confirmation_card card = template_confirmation_card("Delete?", confirm_data="del_ok") assert card.title == "Delete?" assert card.buttons is not None def test_info_card(self): from yuxi.channels.adapters.zalo_user.cards import template_info_card card = template_info_card("User Info", {"name": "Alice", "age": "30"}) assert "Alice" in card.description assert "30" in card.description def test_product_card(self): from yuxi.channels.adapters.zalo_user.cards import template_product_card card = template_product_card("ProductX", "$99", buy_url="https://example.com") assert card.title == "ProductX" assert card.buttons is not None