mirror of
https://github.com/freedomofpress/dangerzone.git
synced 2025-04-28 18:02:38 +02:00
129 lines
4 KiB
Python
129 lines
4 KiB
Python
import platform
|
|
import subprocess
|
|
from unittest import mock
|
|
|
|
import pytest
|
|
|
|
from dangerzone.gui.logic import DangerzoneGui
|
|
|
|
if platform.system() == "Linux":
|
|
from xdg.DesktopEntry import DesktopEntry, ParsingError
|
|
|
|
|
|
@pytest.mark.skipif(platform.system() != "Linux", reason="Linux-only test")
|
|
def test_order_mime_handers() -> None:
|
|
"""
|
|
Given a default mime handler returned by xdg-mime,
|
|
ensure it is the first item available in the list
|
|
of compatible applications.
|
|
"""
|
|
mock_app = mock.MagicMock()
|
|
dummy = mock.MagicMock()
|
|
|
|
mock_desktop = mock.MagicMock(spec=DesktopEntry)
|
|
mock_desktop.getMimeTypes.return_value = "application/pdf"
|
|
mock_desktop.getExec.side_effect = [
|
|
"/usr/bin/madeup-evince",
|
|
"/usr/local/bin/madeup-mupdf",
|
|
"/usr/local/bin/madeup-libredraw",
|
|
]
|
|
mock_desktop.getName.side_effect = [
|
|
"Evince",
|
|
"MuPDF",
|
|
"LibreOffice",
|
|
]
|
|
|
|
with (
|
|
mock.patch(
|
|
"subprocess.check_output", return_value=b"libreoffice-draw.desktop"
|
|
) as mock_default_mime_hander,
|
|
mock.patch(
|
|
"os.listdir",
|
|
side_effect=[
|
|
["org.gnome.Evince.desktop"],
|
|
["org.pwmt.zathura-pdf-mupdf.desktop"],
|
|
["libreoffice-draw.desktop"],
|
|
],
|
|
) as mock_list,
|
|
mock.patch("dangerzone.gui.logic.DesktopEntry", return_value=mock_desktop),
|
|
):
|
|
dz = DangerzoneGui(mock_app, dummy)
|
|
|
|
mock_default_mime_hander.assert_called_once_with(
|
|
["xdg-mime", "query", "default", "application/pdf"]
|
|
)
|
|
mock_list.assert_called()
|
|
assert len(dz.pdf_viewers) == 3
|
|
assert dz.pdf_viewers.popitem(last=False)[0] == "LibreOffice"
|
|
|
|
|
|
@pytest.mark.skipif(platform.system() != "Linux", reason="Linux-only test")
|
|
def test_mime_handers_succeeds_no_default_found() -> None:
|
|
"""
|
|
Given a failure to return default mime handler,
|
|
ensure compatible applications are still returned.
|
|
"""
|
|
mock_app = mock.MagicMock()
|
|
dummy = mock.MagicMock()
|
|
|
|
mock_desktop = mock.MagicMock(spec=DesktopEntry)
|
|
mock_desktop.getMimeTypes.return_value = "application/pdf"
|
|
mock_desktop.getExec.side_effect = [
|
|
"/usr/bin/madeup-evince",
|
|
"/usr/local/bin/madeup-mupdf",
|
|
"/usr/local/bin/madeup-libredraw",
|
|
]
|
|
mock_desktop.getName.side_effect = [
|
|
"Evince",
|
|
"MuPDF",
|
|
"LibreOffice",
|
|
]
|
|
|
|
with (
|
|
mock.patch(
|
|
"subprocess.check_output",
|
|
side_effect=subprocess.CalledProcessError(1, "Oh no, xdg-mime error!)"),
|
|
) as mock_default_mime_hander,
|
|
mock.patch(
|
|
"os.listdir",
|
|
side_effect=[
|
|
["org.gnome.Evince.desktop"],
|
|
["org.pwmt.zathura-pdf-mupdf.desktop"],
|
|
["libreoffice-draw.desktop"],
|
|
],
|
|
) as mock_list,
|
|
mock.patch("dangerzone.gui.logic.DesktopEntry", return_value=mock_desktop),
|
|
):
|
|
dz = DangerzoneGui(mock_app, dummy)
|
|
|
|
mock_default_mime_hander.assert_called_once_with(
|
|
["xdg-mime", "query", "default", "application/pdf"]
|
|
)
|
|
mock_list.assert_called()
|
|
assert len(dz.pdf_viewers) == 3
|
|
assert dz.pdf_viewers.popitem(last=False)[0] == "Evince"
|
|
|
|
|
|
@pytest.mark.skipif(platform.system() != "Linux", reason="Linux-only test")
|
|
def test_malformed_desktop_entry_is_catched() -> None:
|
|
"""
|
|
Given a failure to read a desktop entry,
|
|
ensure that the exception is not thrown to the end-user.
|
|
"""
|
|
mock_app = mock.MagicMock()
|
|
dummy = mock.MagicMock()
|
|
|
|
with (
|
|
mock.patch("dangerzone.gui.logic.DesktopEntry") as mock_desktop,
|
|
mock.patch(
|
|
"os.listdir",
|
|
side_effect=[
|
|
["malformed.desktop", "another.desktop"],
|
|
[],
|
|
[],
|
|
],
|
|
),
|
|
):
|
|
mock_desktop.side_effect = ParsingError("Oh noes!", "malformed.desktop")
|
|
DangerzoneGui(mock_app, dummy)
|
|
mock_desktop.assert_called()
|