diff --git a/requirements-dev.txt b/requirements-dev.txt index 6b201400e4f49f32b149f0b26358438c85e9c823..e3e1a8afba42af7165df7971f786361c8e511377 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -7,4 +7,5 @@ pycodestyle>=2.5.0 pylint>=2.3.1 pytest>=4.6.2 pytest-cov>=2.7.1 +pytest-mock>=1.11.0 requests_mock>=1.6.0 diff --git a/src/briar/gtk/application.py b/src/briar/gtk/application.py index ec5d00a88e12ec05484dfacd80d3fbf03fb7ccfc..95e57e4074434d0a943f9406664b2b65db04f132 100644 --- a/src/briar/gtk/application.py +++ b/src/briar/gtk/application.py @@ -11,20 +11,20 @@ from gi.repository import Gdk, Gio, GLib, Gtk from briar.api.api import Api from briar.gtk.define import APPLICATION_ID, APPLICATION_NAME -from briar.gtk.define import BRIAR_HEADLESS_JAR +from briar.gtk.define import APPLICATION_STYLING, BRIAR_HEADLESS_JAR from briar.gtk.window import Window class Application(Gtk.Application): def __init__(self): - Application._set_application_name() + Application._set_application_name(APPLICATION_NAME) super().__init__(application_id=APPLICATION_ID) # pylint: disable=arguments-differ def do_startup(self): Gtk.Application.do_startup(self) - Application._setup_styling() + Application._setup_styling(APPLICATION_STYLING) self._setup_api() # pylint: disable=arguments-differ @@ -38,14 +38,13 @@ class Application(Gtk.Application): Gio.Application.quit(self) @staticmethod - def _set_application_name(): - GLib.set_application_name(APPLICATION_NAME) - GLib.set_prgname(APPLICATION_NAME) + def _set_application_name(name): + GLib.set_application_name(name) + GLib.set_prgname(name) @staticmethod - def _setup_styling(): - css_provider_file = Gio.File.new_for_uri( - "resource:///app/briar/gtk/ui/application.css") + def _setup_styling(styling): + css_provider_file = Gio.File.new_for_uri(styling) css_provider = Gtk.CssProvider() css_provider.load_from_file(css_provider_file) diff --git a/src/briar/gtk/define.py b/src/briar/gtk/define.py index af9edb3e4624b621c5427be31adf90c91d8efdf1..b7d069beaf936cc76c9b1d69042b1d33febadf57 100644 --- a/src/briar/gtk/define.py +++ b/src/briar/gtk/define.py @@ -10,6 +10,7 @@ from gi.repository import Gio APPLICATION_ID = "app.briar.gtk" APPLICATION_NAME = "Briar" +APPLICATION_STYLING = "resource:///app/briar/gtk/ui/application.css" BRIAR_HEADLESS_JAR = "/app/briar/briar-headless.jar" App = Gio.Application.get_default # pylint: disable=invalid-name diff --git a/tests/briar/gtk/test_application.py b/tests/briar/gtk/test_application.py new file mode 100644 index 0000000000000000000000000000000000000000..5c20aff10dd152be8e4039aa9f0dcb5af1a586a8 --- /dev/null +++ b/tests/briar/gtk/test_application.py @@ -0,0 +1,140 @@ +# Copyright (c) 2019 Nico Alt +# SPDX-License-Identifier: AGPL-3.0-only +# License-Filename: LICENSE.md + +from unittest.mock import Mock + +from briar.api.api import Api +from briar.gtk.application import Application +from briar.gtk.define import APPLICATION_NAME, APPLICATION_STYLING +from briar.gtk.define import BRIAR_HEADLESS_JAR +from briar.gtk.window import Window + + +def test_do_startup(mocker): + do_startup_mock = mocker.patch("gi.repository.Gtk.Application.do_startup") + _setup_styling_mock = mocker.patch( + "briar.gtk.application.Application._setup_styling") + _setup_api_mock = mocker.patch( + "briar.gtk.application.Application._setup_api") + + Application().do_startup() + + do_startup_mock.assert_called_once() + _setup_styling_mock.assert_called_once_with(APPLICATION_STYLING) + _setup_api_mock.assert_called_once() + + +def test_do_activate(mocker): + _setup_window_mock = mocker.patch( + "briar.gtk.application.Application._setup_window") + + Application().do_activate() + + _setup_window_mock.assert_called_once() + + +def test_quit(mocker): + api_mock = mocker.patch("briar.api.api.Api") + api_stop_mock = mocker.patch("briar.api.api.Api.stop") + window_mock = mocker.patch("briar.gtk.window.Window") + window_hide_mock = mocker.patch("briar.gtk.window.Window.hide") + quit_mock = mocker.patch("gi.repository.Gio.Application.quit") + + application = Application() + application.api = api_mock + application.window = window_mock + + application.quit() + + api_stop_mock.assert_called_once() + window_hide_mock.assert_called_once() + quit_mock.assert_called_once() + + +def test_set_application_name(mocker): + set_application_name_mock = mocker.patch( + "gi.repository.GLib.set_application_name") + set_prgname_mock = mocker.patch("gi.repository.GLib.set_prgname") + name_mock = "Mock" + + Application._set_application_name(name_mock) + + set_application_name_mock.assert_called_once_with(name_mock) + set_prgname_mock.assert_called_once_with(name_mock) + + +def test_set_application_name_implicit(mocker): + set_application_name_mock = mocker.patch( + "gi.repository.GLib.set_application_name") + set_prgname_mock = mocker.patch("gi.repository.GLib.set_prgname") + + Application() + + set_application_name_mock.assert_called_once_with(APPLICATION_NAME) + set_prgname_mock.assert_called_once_with(APPLICATION_NAME) + + +def test_setup_styling(mocker): + new_for_uri_mock = mocker.patch("gi.repository.Gio.File.new_for_uri") + load_from_file_mock = mocker.patch( + "gi.repository.Gtk.CssProvider.load_from_file") + get_default_mock = mocker.patch("gi.repository.Gdk.Screen.get_default") + add_provider_for_screen_mock = mocker.patch( + "gi.repository.Gtk.StyleContext.add_provider_for_screen") + + Application._setup_styling(APPLICATION_STYLING) + + new_for_uri_mock.assert_called_with(APPLICATION_STYLING) + load_from_file_mock.assert_called_once() + get_default_mock.assert_called_once() + add_provider_for_screen_mock.assert_called_once() + + +def test_setup_api(mocker): + application = Application() + + assert not hasattr(application, "api") + + application._setup_api() + + assert isinstance(application.api, Api) + assert application.api._command == ["java", "-jar", BRIAR_HEADLESS_JAR] + + +def test_setup_window(mocker): + mocker.patch("briar.gtk.window.Window.__init__").return_value = None + window_show_mock = mocker.patch("briar.gtk.window.Window.show") + window_present_mock = mocker.patch("briar.gtk.window.Window.present") + + Application()._setup_window() + + window_show_mock.assert_called_once() + window_present_mock.assert_called_once() + + +def test_setup_window_has_attribute(mocker): + mocker.patch("briar.gtk.window.Window.__init__").return_value = None + window_mock = Mock() + + application = Application() + application.window = window_mock + + application._setup_window() + + window_mock.show.assert_not_called() + window_mock.present.assert_called_once() + + +def test_setup_window_has_none_attribute(mocker): + mocker.patch("briar.gtk.window.Window.__init__").return_value = None + window_show_mock = mocker.patch("briar.gtk.window.Window.show") + window_present_mock = mocker.patch("briar.gtk.window.Window.present") + + application = Application() + application.window = None + + application._setup_window() + + window_show_mock.assert_called_once() + window_present_mock.assert_called_once()