From 5f49ed79c29778d2b6e067def218d063dc309600 Mon Sep 17 00:00:00 2001
From: Nico Alt <nicoalt@posteo.org>
Date: Fri, 4 Oct 2019 11:07:07 +0200
Subject: [PATCH] Add unit tests for toolbar

---
 src/briar/gtk/toolbar.py        | 21 ++++++++++----
 tests/briar/gtk/test_toolbar.py | 50 +++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 5 deletions(-)
 create mode 100644 tests/briar/gtk/test_toolbar.py

diff --git a/src/briar/gtk/toolbar.py b/src/briar/gtk/toolbar.py
index 22fb2b0..f65c147 100644
--- a/src/briar/gtk/toolbar.py
+++ b/src/briar/gtk/toolbar.py
@@ -8,16 +8,17 @@
 
 from gi.repository import Gtk
 
+from briar.gtk.define import APPLICATION_NAME
+
 
 class Toolbar(Gtk.HeaderBar):
 
+    TOOLBAR_UI = "/app/briar/gtk/ui/toolbar_start.ui"
+
     def __init__(self):
         super().__init__()
-        self._builder = Gtk.Builder()
-        self._builder.add_from_resource("/app/briar/gtk/ui/toolbar_start.ui")
-        toolbar_start = self._builder.get_object("toolbar_start")
-        self.set_title("Briar")
-        self.pack_start(toolbar_start)
+        self._setup_builder()
+        self._setup_toolbar()
 
     def show_back_button(self, show, callback=None):
         back_button = self._builder.get_object("back_button")
@@ -28,3 +29,13 @@ class Toolbar(Gtk.HeaderBar):
             raise Exception("Callback needed when showing back button")
         back_button.show()
         back_button.connect("clicked", callback)
+
+    def _setup_builder(self):
+        self._builder = Gtk.Builder()
+
+    def _setup_toolbar(self):
+        self.set_title(APPLICATION_NAME)
+
+        self._builder.add_from_resource(self.TOOLBAR_UI)
+        toolbar_start = self._builder.get_object("toolbar_start")
+        self.pack_start(toolbar_start)
diff --git a/tests/briar/gtk/test_toolbar.py b/tests/briar/gtk/test_toolbar.py
new file mode 100644
index 0000000..065101a
--- /dev/null
+++ b/tests/briar/gtk/test_toolbar.py
@@ -0,0 +1,50 @@
+# Copyright (c) 2019 Nico Alt
+# SPDX-License-Identifier: AGPL-3.0-only
+# License-Filename: LICENSE.md
+
+import pytest
+from unittest.mock import Mock
+
+from briar.gtk.toolbar import Toolbar
+
+
+def test_show_back_button(mocker):
+    get_object_mock = mocker.patch("gi.repository.Gtk.Builder.get_object")
+    back_button_mock = get_object_mock.return_value
+    callback = Mock()
+    mocker.patch("briar.gtk.toolbar.Toolbar._setup_toolbar")
+
+    Toolbar().show_back_button(True, callback)
+
+    get_object_mock.assert_called_once_with("back_button")
+    back_button_mock.hide.assert_not_called()
+    back_button_mock.show.assert_called_once()
+    back_button_mock.connect.assert_called_once()
+
+
+def test_show_back_button_without_callback(mocker):
+    get_object_mock = mocker.patch("gi.repository.Gtk.Builder.get_object")
+    back_button_mock = get_object_mock.return_value
+    mocker.patch("briar.gtk.toolbar.Toolbar._setup_toolbar")
+
+    with pytest.raises(Exception,
+                       match="Callback needed when showing back button"):
+        Toolbar().show_back_button(True)
+
+    get_object_mock.assert_called_once_with("back_button")
+    back_button_mock.hide.assert_not_called()
+    back_button_mock.show.assert_not_called()
+    back_button_mock.connect.assert_not_called()
+
+
+def test_hide_back_button(mocker):
+    get_object_mock = mocker.patch("gi.repository.Gtk.Builder.get_object")
+    back_button_mock = get_object_mock.return_value
+    mocker.patch("briar.gtk.toolbar.Toolbar._setup_toolbar")
+
+    Toolbar().show_back_button(False)
+
+    get_object_mock.assert_called_once_with("back_button")
+    back_button_mock.hide.assert_called_once()
+    back_button_mock.show.assert_not_called()
+    back_button_mock.connect.assert_not_called()
-- 
GitLab