============================= test session starts ============================= platform win32 -- Python 3.13.12, pytest-9.0.3, pluggy-1.6.0 -- C:\Users\simon\.workbuddy\binaries\python\versions\3.13.12\python.exe cachedir: .pytest_cache rootdir: C:\Users\simon\wecom_it_smart_desk\backend configfile: pytest.ini plugins: anyio-4.13.0, asyncio-1.4.0 asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=None, asyncio_default_test_loop_scope=function collecting ... collected 49 items tests/test_nontext_message.py::TestGetNonTextDisplay::test_image_display PASSED [ 2%] tests/test_nontext_message.py::TestGetNonTextDisplay::test_voice_display PASSED [ 4%] tests/test_nontext_message.py::TestGetNonTextDisplay::test_video_display PASSED [ 6%] tests/test_nontext_message.py::TestGetNonTextDisplay::test_location_display PASSED [ 8%] tests/test_nontext_message.py::TestGetNonTextDisplay::test_file_display_with_name PASSED [ 10%] tests/test_nontext_message.py::TestGetNonTextDisplay::test_file_display_without_name PASSED [ 12%] tests/test_nontext_message.py::TestGetNonTextDisplay::test_unknown_type_display PASSED [ 14%] tests/test_nontext_message.py::TestGetNonTextReply::test_image_reply_suggests_description PASSED [ 16%] tests/test_nontext_message.py::TestGetNonTextReply::test_voice_reply_says_unsupported PASSED [ 18%] tests/test_nontext_message.py::TestGetNonTextReply::test_video_reply_says_unsupported PASSED [ 20%] tests/test_nontext_message.py::TestGetNonTextReply::test_file_reply_says_unsupported PASSED [ 22%] tests/test_nontext_message.py::TestGetNonTextReply::test_location_reply_says_unsupported PASSED [ 24%] tests/test_nontext_message.py::TestGetNonTextReply::test_unknown_type_fallback_reply PASSED [ 26%] tests/test_nontext_message.py::TestHandleNonTextMessage::test_image_message_storage_and_reply PASSED [ 28%] tests/test_nontext_message.py::TestHandleNonTextMessage::test_voice_message_storage_and_reply PASSED [ 30%] tests/test_nontext_message.py::TestHandleNonTextMessage::test_video_message_storage_and_reply PASSED [ 32%] tests/test_nontext_message.py::TestHandleNonTextMessage::test_file_message_storage_with_metadata PASSED [ 34%] tests/test_nontext_message.py::TestHandleNonTextMessage::test_file_message_without_name PASSED [ 36%] tests/test_nontext_message.py::TestHandleNonTextMessage::test_location_message_storage PASSED [ 38%] tests/test_nontext_message.py::TestNonTextDoesNotTriggerAI::test_non_text_does_not_change_status PASSED [ 40%] tests/test_nontext_message.py::TestNonTextDoesNotTriggerAI::test_non_text_does_not_call_ai_handler PASSED [ 42%] tests/test_nontext_message.py::TestNonTextDoesNotTriggerAI::test_non_text_reuses_existing_conversation PASSED [ 44%] tests/test_nontext_message.py::TestTextMessageUnaffected::test_text_message_routes_normally PASSED [ 46%] tests/test_nontext_message.py::TestTextMessageUnaffected::test_text_message_with_hand_raise_still_works PASSED [ 48%] tests/test_nontext_message.py::TestTextMessageUnaffected::test_text_message_creates_new_conversation PASSED [ 51%] tests/test_nontext_message.py::TestTextMessageUnaffected::test_text_message_sets_correct_status PASSED [ 53%] tests/test_nontext_message.py::TestWebSocketBroadcastFormat::test_image_broadcast_contains_media_fields PASSED [ 55%] tests/test_nontext_message.py::TestWebSocketBroadcastFormat::test_file_broadcast_contains_file_fields PASSED [ 57%] tests/test_nontext_message.py::TestWebSocketBroadcastFormat::test_text_broadcast_does_not_contain_media_fields PASSED [ 59%] tests/test_nontext_message.py::TestWebSocketBroadcastFormat::test_broadcast_failure_does_not_block PASSED [ 61%] tests/test_nontext_message.py::TestWecomCallbackFieldExtraction::test_image_fields_mapped_correctly PASSED [ 63%] tests/test_nontext_message.py::TestWecomCallbackFieldExtraction::test_voice_fields_mapped_correctly PASSED [ 65%] tests/test_nontext_message.py::TestWecomCallbackFieldExtraction::test_video_fields_mapped_correctly PASSED [ 67%] tests/test_nontext_message.py::TestWecomCallbackFieldExtraction::test_file_fields_mapped_correctly PASSED [ 69%] tests/test_nontext_message.py::TestWecomCallbackFieldExtraction::test_location_fields_mapped_correctly PASSED [ 71%] tests/test_nontext_message.py::TestWecomCallbackFieldExtraction::test_text_message_passes_through PASSED [ 73%] tests/test_nontext_message.py::TestWecomCallbackFieldExtraction::test_empty_media_id_maps_to_none PASSED [ 75%] tests/test_nontext_message.py::TestWecomCallbackFieldExtraction::test_empty_file_size_not_converted PASSED [ 77%] tests/test_nontext_message.py::TestWecomCallbackFieldExtraction::test_file_size_converts_to_int PASSED [ 79%] tests/test_nontext_message.py::TestFrontendRenderingLogic::test_text_msg_type_renders_text PASSED [ 81%] tests/test_nontext_message.py::TestFrontendRenderingLogic::test_non_text_msg_type_renders_media_card PASSED [ 83%] tests/test_nontext_message.py::TestFrontendRenderingLogic::test_media_icons_match_expected PASSED [ 85%] tests/test_nontext_message.py::TestFrontendRenderingLogic::test_media_type_labels_match_expected PASSED [ 87%] tests/test_nontext_message.py::TestFrontendRenderingLogic::test_format_file_size_correct PASSED [ 89%] tests/test_nontext_message.py::TestFrontendRenderingLogic::test_media_card_template_shows_file_info PASSED [ 91%] tests/test_nontext_message.py::TestFrontendRenderingLogic::test_sender_type_not_affected PASSED [ 93%] tests/test_nontext_message.py::TestFrontendRenderingLogic::test_unknown_msg_type_fallback_icon PASSED [ 95%] tests/test_nontext_message.py::TestFrontendRenderingLogic::test_unknown_msg_type_fallback_label PASSED [ 97%] tests/test_nontext_message.py::TestFrontendRenderingLogic::test_message_interface_has_media_fields PASSED [100%] ============================= 49 passed in 0.34s ==============================