Files
allhaileris afb81b8278
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled
init
2026-02-16 15:50:16 +03:00

592 lines
18 KiB
Python

# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is formatted with Python Black
import tests as xdp
import dbus
import pytest
FILECHOOSER_RESULTS = {
"uris": ["file:///test.txt", "file:///example/test2.txt"],
"choices": [("encoding", "utf8"), ("reencode", "true"), ("third", "a")],
}
@pytest.fixture
def required_templates():
return {
"filechooser": {
"results": dbus.Dictionary(FILECHOOSER_RESULTS, signature="sv"),
},
"lockdown": {},
}
class TestFilechooser:
def test_version(self, portals, dbus_con):
xdp.check_version(dbus_con, "FileChooser", 4)
def test_open_file_basic(self, portals, dbus_con, app_id):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
title = "Test"
accept_label = "Accept"
multiple = True
options = {
"accept_label": accept_label,
"multiple": multiple,
}
request = xdp.Request(dbus_con, filechooser_intf)
response = request.call(
"OpenFile",
parent_window="",
title=title,
options=options,
)
assert response
assert response.response == 0
assert response.results["uris"] == FILECHOOSER_RESULTS["uris"]
# Check the impl portal was called with the right args
method_calls = mock_intf.GetMethodCalls("OpenFile")
assert len(method_calls) == 1
_, args = method_calls.pop()
assert args[1] == app_id
assert args[2] == "" # parent window
assert args[3] == title
assert args[4]["accept_label"] == accept_label
assert args[4]["multiple"] == multiple
@pytest.mark.parametrize("template_params", ({"filechooser": {"response": 1}},))
def test_open_file_cancel(self, portals, dbus_con, app_id):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
title = "Test"
accept_label = "Accept"
multiple = True
options = {
"accept_label": accept_label,
"multiple": multiple,
}
request = xdp.Request(dbus_con, filechooser_intf)
response = request.call(
"OpenFile",
parent_window="",
title=title,
options=options,
)
assert response
assert response.response == 1
# Check the impl portal was called with the right args
method_calls = mock_intf.GetMethodCalls("OpenFile")
assert len(method_calls) == 1
_, args = method_calls.pop()
assert args[1] == app_id
assert args[2] == "" # parent window
assert args[3] == title
assert args[4]["accept_label"] == accept_label
assert args[4]["multiple"] == multiple
@pytest.mark.parametrize(
"template_params", ({"filechooser": {"expect-close": True}},)
)
def test_open_file_close(self, portals, dbus_con, app_id):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
title = "Test"
accept_label = "Accept"
multiple = True
options = {
"accept_label": accept_label,
"multiple": multiple,
}
request = xdp.Request(dbus_con, filechooser_intf)
request.schedule_close(1000)
request.call(
"OpenFile",
parent_window="",
title=title,
options=options,
)
# Only true if the impl.Request was closed too
assert request.closed
# Check the impl portal was called with the right args
method_calls = mock_intf.GetMethodCalls("OpenFile")
assert len(method_calls) == 1
_, args = method_calls.pop()
assert args[1] == app_id
assert args[2] == "" # parent window
assert args[3] == title
assert args[4]["accept_label"] == accept_label
assert args[4]["multiple"] == multiple
def test_open_file_filter1(self, portals, dbus_con):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
options = {
"filters": [
(
"Images",
[
(dbus.UInt32(0), "*ico"),
(dbus.UInt32(1), "image/png"),
],
),
(
"Text",
[
(dbus.UInt32(0), "*.txt"),
],
),
],
}
request = xdp.Request(dbus_con, filechooser_intf)
response = request.call(
"OpenFile",
parent_window="",
title="Test",
options=options,
)
assert response
assert response.response == 0
assert response.results["uris"] == FILECHOOSER_RESULTS["uris"]
method_calls = mock_intf.GetMethodCalls("OpenFile")
assert len(method_calls) == 1
def test_open_file_filter2(self, portals, dbus_con):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
options = {
"filters": [
(
"Text",
[
# Invalid filter type
(dbus.UInt32(4), "*.txt"),
],
),
],
}
request = xdp.Request(dbus_con, filechooser_intf)
with pytest.raises(dbus.exceptions.DBusException) as excinfo:
request.call(
"OpenFile",
parent_window="",
title="Test",
options=options,
)
assert (
excinfo.value.get_dbus_name()
== "org.freedesktop.portal.Error.InvalidArgument"
)
def test_open_file_current_filter1(self, portals, dbus_con):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
options = {
"filters": [
(
"Images",
[
(dbus.UInt32(0), "*ico"),
(dbus.UInt32(1), "image/png"),
],
),
(
"Text",
[
(dbus.UInt32(0), "*.txt"),
],
),
],
"current_filter": (
"Text",
[
(dbus.UInt32(0), "*.txt"),
],
),
}
request = xdp.Request(dbus_con, filechooser_intf)
response = request.call(
"OpenFile",
parent_window="",
title="Test",
options=options,
)
assert response
assert response.response == 0
assert response.results["uris"] == FILECHOOSER_RESULTS["uris"]
method_calls = mock_intf.GetMethodCalls("OpenFile")
assert len(method_calls) == 1
_, args = method_calls.pop()
assert args[4]["current_filter"] == options["current_filter"]
def test_open_file_current_filter2(self, portals, dbus_con):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
options = {
"current_filter": (
"Text",
[
(dbus.UInt32(0), "*.txt"),
],
),
}
request = xdp.Request(dbus_con, filechooser_intf)
response = request.call(
"OpenFile",
parent_window="",
title="Test",
options=options,
)
assert response
assert response.response == 0
assert response.results["uris"] == FILECHOOSER_RESULTS["uris"]
method_calls = mock_intf.GetMethodCalls("OpenFile")
assert len(method_calls) == 1
_, args = method_calls.pop()
assert args[4]["current_filter"] == options["current_filter"]
def test_open_file_current_filter3(self, portals, dbus_con):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
options = {
"current_filter": (
"Text",
[
# Invalid filter type
(dbus.UInt32(6), "*.txt"),
],
),
}
request = xdp.Request(dbus_con, filechooser_intf)
with pytest.raises(dbus.exceptions.DBusException) as excinfo:
request.call(
"OpenFile",
parent_window="",
title="Test",
options=options,
)
assert (
excinfo.value.get_dbus_name()
== "org.freedesktop.portal.Error.InvalidArgument"
)
def test_open_file_current_filter4(self, portals, dbus_con):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
options = {
"filters": [
(
"Images",
[
(dbus.UInt32(0), "*ico"),
(dbus.UInt32(1), "image/png"),
],
),
(
"Text",
[
(dbus.UInt32(0), "*.txt"),
],
),
],
"current_filter": (
"Something else",
[
(dbus.UInt32(0), "*.sth.else"),
],
),
}
request = xdp.Request(dbus_con, filechooser_intf)
with pytest.raises(dbus.exceptions.DBusException) as excinfo:
request.call(
"OpenFile",
parent_window="",
title="Test",
options=options,
)
assert (
excinfo.value.get_dbus_name()
== "org.freedesktop.portal.Error.InvalidArgument"
)
def test_open_file_choices1(self, portals, dbus_con):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
options = {
"choices": [
(
"encoding",
"Encoding",
[
("utf8", "Unicode"),
("latin15", "Western"),
],
"latin15",
),
(
"reencode",
"Reencode",
[],
"false",
),
(
"third",
"Third",
[("a", "A"), ("b", "B")],
"",
),
],
}
request = xdp.Request(dbus_con, filechooser_intf)
response = request.call(
"OpenFile",
parent_window="",
title="Test",
options=options,
)
assert response
assert response.response == 0
assert response.results["uris"] == FILECHOOSER_RESULTS["uris"]
method_calls = mock_intf.GetMethodCalls("OpenFile")
assert len(method_calls) == 1
_, args = method_calls.pop()
assert args[4]["choices"] == options["choices"]
def test_open_file_choices_invalid(self, portals, dbus_con):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
invalid_choices = [
(
"encoding",
"Encoding",
[
("utf8", ""),
("latin15", "Western"),
],
"latin15",
),
(
"encoding",
"Encoding",
[
("", "Unicode"),
("latin15", "Western"),
],
"latin15",
),
(
"",
"Encoding",
[
("utf8", "Unicode"),
("latin15", "Western"),
],
"latin15",
),
]
for choice in invalid_choices:
request = xdp.Request(dbus_con, filechooser_intf)
with pytest.raises(dbus.exceptions.DBusException) as excinfo:
options = {
"choices": [choice],
}
request.call(
"OpenFile",
parent_window="",
title="Test",
options=options,
)
assert (
excinfo.value.get_dbus_name()
== "org.freedesktop.portal.Error.InvalidArgument"
)
def test_save_file_basic(self, portals, dbus_con, app_id):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
title = "Test"
accept_label = "Accept"
current_name = "File Name"
options = {
"accept_label": accept_label,
"current_name": current_name,
}
request = xdp.Request(dbus_con, filechooser_intf)
response = request.call(
"SaveFile",
parent_window="",
title=title,
options=options,
)
assert response
assert response.response == 0
assert response.results["uris"] == FILECHOOSER_RESULTS["uris"]
# Check the impl portal was called with the right args
method_calls = mock_intf.GetMethodCalls("SaveFile")
assert len(method_calls) == 1
_, args = method_calls.pop()
assert args[1] == app_id
assert args[2] == "" # parent window
assert args[3] == title
assert args[4]["accept_label"] == accept_label
assert args[4]["current_name"] == current_name
@pytest.mark.parametrize("template_params", ({"filechooser": {"response": 1}},))
def test_save_file_cancel(self, portals, dbus_con, app_id):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
title = "Test"
accept_label = "Accept"
current_name = "File Name"
options = {
"accept_label": accept_label,
"current_name": current_name,
}
request = xdp.Request(dbus_con, filechooser_intf)
response = request.call(
"SaveFile",
parent_window="",
title=title,
options=options,
)
assert response
assert response.response == 1
# Check the impl portal was called with the right args
method_calls = mock_intf.GetMethodCalls("SaveFile")
assert len(method_calls) == 1
_, args = method_calls.pop()
assert args[1] == app_id
assert args[2] == "" # parent window
assert args[3] == title
assert args[4]["accept_label"] == accept_label
assert args[4]["current_name"] == current_name
@pytest.mark.parametrize(
"template_params", ({"filechooser": {"expect-close": True}},)
)
def test_save_file_close(self, portals, dbus_con, app_id):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
title = "Test"
accept_label = "Accept"
current_name = "File Name"
options = {
"accept_label": accept_label,
"current_name": current_name,
}
request = xdp.Request(dbus_con, filechooser_intf)
request.schedule_close(1000)
request.call(
"SaveFile",
parent_window="",
title=title,
options=options,
)
# Only true if the impl.Request was closed too
assert request.closed
# Check the impl portal was called with the right args
method_calls = mock_intf.GetMethodCalls("SaveFile")
assert len(method_calls) == 1
_, args = method_calls.pop()
assert args[1] == app_id
assert args[2] == "" # parent window
assert args[3] == title
assert args[4]["accept_label"] == accept_label
assert args[4]["current_name"] == current_name
def test_save_file_filters(self, portals, dbus_con, app_id):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
options = {
"filters": [
(
"Images",
[
(dbus.UInt32(0), "*ico"),
(dbus.UInt32(1), "image/png"),
],
),
(
"Text",
[
(dbus.UInt32(0), "*.txt"),
],
),
],
}
request = xdp.Request(dbus_con, filechooser_intf)
response = request.call(
"SaveFile",
parent_window="",
title="Title",
options=options,
)
assert response
assert response.response == 0
assert response.results["uris"] == FILECHOOSER_RESULTS["uris"]
# Check the impl portal was called with the right args
method_calls = mock_intf.GetMethodCalls("SaveFile")
assert len(method_calls) == 1
_, args = method_calls.pop()
assert args[4]["filters"] == options["filters"]
@pytest.mark.parametrize(
"template_params", ({"lockdown": {"disable-save-to-disk": True}},)
)
def test_save_file_lockdown(self, portals, dbus_con, app_id):
filechooser_intf = xdp.get_portal_iface(dbus_con, "FileChooser")
mock_intf = xdp.get_mock_iface(dbus_con)
request = xdp.Request(dbus_con, filechooser_intf)
with pytest.raises(dbus.exceptions.DBusException) as excinfo:
request.call(
"SaveFile",
parent_window="",
title="Title",
options={},
)
assert (
excinfo.value.get_dbus_name() == "org.freedesktop.portal.Error.NotAllowed"
)
# Check the impl portal was not called
method_calls = mock_intf.GetMethodCalls("FileChooser")
assert len(method_calls) == 0