95 lines
3.3 KiB
Python
95 lines
3.3 KiB
Python
"""Tests for Matrix adapter media-filename blanking.
|
|
|
|
Matrix ``m.image`` events were already handled (PR #16821, issue #13482).
|
|
These tests verify that ``m.audio``, ``m.file``, and ``m.video`` events
|
|
also have their transport filename stripped from ``body`` when no caption
|
|
is present, so the filename doesn't leak into ``event.text`` and get fed
|
|
to the model as user message text.
|
|
"""
|
|
|
|
import pytest
|
|
|
|
from plugins.platforms.matrix.adapter import (
|
|
_looks_like_matrix_image_filename,
|
|
_looks_like_matrix_media_filename,
|
|
)
|
|
|
|
|
|
class TestLooksLikeMatrixMediaFilename:
|
|
"""Unit tests for _looks_like_matrix_media_filename()."""
|
|
|
|
@pytest.mark.parametrize(
|
|
"text",
|
|
[
|
|
"voice-20260725-114233.ogg",
|
|
"recording.wav",
|
|
"clip.opus",
|
|
"audio.amr",
|
|
"data.m4a",
|
|
"clip.webm",
|
|
"video.mkv",
|
|
"video.mov",
|
|
"CaPtIoN.mp3",
|
|
],
|
|
)
|
|
def test_bare_media_filenames_detected(self, text):
|
|
assert _looks_like_matrix_media_filename(text) is True
|
|
|
|
@pytest.mark.parametrize(
|
|
"text",
|
|
[
|
|
"remind me to call the dentist",
|
|
"voice note.m4a",
|
|
"document.pdf",
|
|
"file.txt",
|
|
"noextension",
|
|
"data.csv",
|
|
"",
|
|
" ",
|
|
None,
|
|
],
|
|
)
|
|
def test_non_filenames_rejected(self, text):
|
|
assert _looks_like_matrix_media_filename(text) is False
|
|
|
|
@pytest.mark.parametrize(
|
|
"text",
|
|
[
|
|
"/tmp/voice.ogg",
|
|
"./audio.mp3",
|
|
],
|
|
)
|
|
def test_paths_with_separators_rejected(self, text):
|
|
assert _looks_like_matrix_media_filename(text) is False
|
|
|
|
def test_trailing_whitespace_stripped(self):
|
|
assert _looks_like_matrix_media_filename("audio.ogg\n") is True
|
|
assert _looks_like_matrix_media_filename(" photo.mp3 ") is True
|
|
|
|
def test_multi_token_filename_rejected(self):
|
|
"""A filename with a space is treated as a caption, not a bare token."""
|
|
assert _looks_like_matrix_media_filename("my recording.ogg") is False
|
|
|
|
def test_newline_in_text_rejected(self):
|
|
"""Multi-line text is never a bare filename."""
|
|
assert _looks_like_matrix_media_filename("voice.ogg\nmore text") is False
|
|
|
|
def test_image_extension_not_detected_by_media_function(self):
|
|
"""Image extensions are handled by the image function, not the media function."""
|
|
assert _looks_like_matrix_media_filename("photo.jpg") is False
|
|
assert _looks_like_matrix_image_filename("photo.jpg") is True
|
|
|
|
def test_audio_extension_not_detected_by_image_function(self):
|
|
"""Audio extensions are handled by the media function, not the image function."""
|
|
assert _looks_like_matrix_image_filename("voice.ogg") is False
|
|
assert _looks_like_matrix_media_filename("voice.ogg") is True
|
|
|
|
def test_mimetypes_audio_detected(self):
|
|
"""mimetypes.guess_type catches audio types not in the hardcoded set."""
|
|
# .aiff is audio/x-aiff, NOT in _MATRIX_MEDIA_FILENAME_EXTS
|
|
assert _looks_like_matrix_media_filename("song.aiff") is True
|
|
|
|
def test_mimetypes_video_detected(self):
|
|
"""mimetypes.guess_type catches video types."""
|
|
assert _looks_like_matrix_media_filename("clip.avi") is True
|