import importlib import types import pytest from models.model import Message @pytest.fixture(autouse=True) def patch_file_helpers(monkeypatch: pytest.MonkeyPatch): """ Patch file_helpers.get_signed_file_url to a deterministic stub. """ model_module = importlib.import_module("models.model") dummy = types.SimpleNamespace(get_signed_file_url=lambda fid: f"https://signed.example/{fid}") # Inject/override file_helpers on models.model monkeypatch.setattr(model_module, "file_helpers", dummy, raising=False) def _wrap_md(url: str) -> str: """ Wrap a raw URL into the markdown that re_sign_file_url_answer expects: [link]() """ return f"please click [file]({url}) to download." def test_file_preview_valid_replaced(): """ Valid file-preview URL must be re-signed: - Extract upload_file_id correctly - Replace the original URL with the signed URL """ upload_id = "abc-123" url = f"/files/{upload_id}/file-preview?timestamp=111&nonce=222&sign=333" msg = Message(answer=_wrap_md(url)) out = msg.re_sign_file_url_answer assert f"https://signed.example/{upload_id}" in out assert url not in out def test_file_preview_misspelled_not_replaced(): """ Misspelled endpoint 'file-previe?timestamp=' should NOT be rewritten. """ upload_id = "zzz-001" # path deliberately misspelled: file-previe? (missing 'w') # and we append ¬e=file-preview to trick the old `"file-preview" in url` check. url = f"/files/{upload_id}/file-previe?timestamp=111&nonce=222&sign=333¬e=file-preview" original = _wrap_md(url) msg = Message(answer=original) out = msg.re_sign_file_url_answer # Expect NO replacement, should not rewrite misspelled file-previe URL assert out == original def test_image_preview_valid_replaced(): """ Valid image-preview URL must be re-signed. """ upload_id = "img-789" url = f"/files/{upload_id}/image-preview?timestamp=123&nonce=456&sign=789" msg = Message(answer=_wrap_md(url)) out = msg.re_sign_file_url_answer assert f"https://signed.example/{upload_id}" in out assert url not in out def test_image_preview_misspelled_not_replaced(): """ Misspelled endpoint 'image-previe?timestamp=' should NOT be rewritten. """ upload_id = "img-err-42" url = f"/files/{upload_id}/image-previe?timestamp=1&nonce=2&sign=3¬e=image-preview" original = _wrap_md(url) msg = Message(answer=original) out = msg.re_sign_file_url_answer # Expect NO replacement, should not rewrite misspelled image-previe URL assert out == original