From fa6fb93db1b37370e9bbdaac57d1e9a7c37a9ae6 Mon Sep 17 00:00:00 2001
From: Alice Russell <Alice.Russell@tessella.com>
Date: Fri, 14 Feb 2020 11:21:40 +0000
Subject: [PATCH] Re #27587 Make suggested changes

- Add test to the cmakelist
- Remove inheritance from qt widgets
- Patch view in test so QApplication is no longer needed
---
 qt/python/CMakeLists.txt                      |  1 +
 .../addfunctiondialog/presenter.py            | 13 ++-----
 .../test/test_addfunctiondialogpresenter.py   | 37 ++++++++-----------
 .../addfunctiondialog/view.py                 |  8 ++--
 .../fitpropertybrowser/interactive_tool.py    |  6 +--
 5 files changed, 28 insertions(+), 37 deletions(-)

diff --git a/qt/python/CMakeLists.txt b/qt/python/CMakeLists.txt
index bb453e4c5d7..88c5126d5b5 100644
--- a/qt/python/CMakeLists.txt
+++ b/qt/python/CMakeLists.txt
@@ -123,6 +123,7 @@ if(ENABLE_WORKBENCH OR ENABLE_WORKBENCH)
       mantidqt/widgets/codeeditor/test/test_multifileinterpreter_view.py
       mantidqt/widgets/codeeditor/tab_widget/test/test_codeeditor_tab_presenter.py
       mantidqt/widgets/codeeditor/tab_widget/test/test_codeeditor_tab_view.py
+      mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/test_addfunctiondialogpresenter.py
       mantidqt/widgets/instrumentview/test/test_instrumentview_io.py
       mantidqt/widgets/instrumentview/test/test_instrumentview_view.py
       mantidqt/widgets/plotconfigdialog/axestabwidget/test/test_axestabwidgetpresenter.py
diff --git a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/presenter.py b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/presenter.py
index d2ffb4ce84b..73b6b8d98d2 100644
--- a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/presenter.py
+++ b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/presenter.py
@@ -6,27 +6,22 @@
 # SPDX - License - Identifier: GPL - 3.0 +
 from __future__ import (absolute_import, unicode_literals)
 
-from qtpy.QtCore import Qt, Signal
-from qtpy.QtWidgets import QDialog
-
 from .view import AddFunctionDialogView
 
 
-class AddFunctionDialog(QDialog):
+class AddFunctionDialog(object):
     """
     Dialog to add function to fit property browser
     """
-    function_added = Signal(str)
 
     def __init__(self, parent = None, function_names = None, view=None):
-        super(AddFunctionDialog, self).__init__(parent)
         self.view = view if view else AddFunctionDialogView(parent, function_names)
-        self.view.ui.buttonBox.accepted.connect(self.action_add_function)
+        self.view.ui.buttonBox.accepted.connect(lambda: self.action_add_function())
 
     def action_add_function(self):
         current_function = self.view.ui.functionBox.currentText()
-        if self.view.ui.functionBox.findText(current_function, Qt.MatchExactly) != -1:
-            self.function_added.emit(current_function)
+        if self.view.is_text_in_function_list(current_function):
+            self.view.function_added.emit(current_function)
             self.view.accept()
         else:
             self.view.set_error_message("Function %s not found " % current_function)
diff --git a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/test_addfunctiondialogpresenter.py b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/test_addfunctiondialogpresenter.py
index 7cafd0b5d01..b954e15eb25 100644
--- a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/test_addfunctiondialogpresenter.py
+++ b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/test/test_addfunctiondialogpresenter.py
@@ -8,36 +8,31 @@
 
 import unittest
 
-from mantid.py3compat.mock import MagicMock, patch
-from mantidqt.utils.qt.testing import start_qapplication
+from mantid.py3compat.mock import patch
 from mantidqt.widgets.fitpropertybrowser.addfunctiondialog.presenter import AddFunctionDialog
 from testhelpers import assertRaisesNothing
 
 
-@start_qapplication
+@patch('mantidqt.widgets.fitpropertybrowser.addfunctiondialog.view.AddFunctionDialogView')
 class AddFunctionDialogPresenterTest(unittest.TestCase):
 
-    def test_initialization_does_not_raise(self):
-        assertRaisesNothing(self, AddFunctionDialog)
+    def test_initialization_does_not_raise(self, mock_view):
+        assertRaisesNothing(self, AddFunctionDialog, view=mock_view)
 
-    @patch('mantidqt.widgets.fitpropertybrowser.addfunctiondialog.presenter.AddFunctionDialog.function_added')
-    def test_add_function(self, function_added_mock):
-        dialog = AddFunctionDialog(function_names = ["Lorenzian", "Gaussian", "FlatBackground"])
-        dialog.view.accept = MagicMock()
-        with patch.object(dialog.view.ui.functionBox, 'currentText', lambda: "Gaussian"):
-            dialog.action_add_function()
-            function_added_mock.emit.assert_called_once_with("Gaussian")
-            self.assertEqual(1, dialog.view.accept.call_count)
-
-    @patch('mantidqt.widgets.fitpropertybrowser.addfunctiondialog.presenter.AddFunctionDialog.function_added')
-    def test_add_function_give_error_if_function_not_valid(self, function_added_mock):
-        dialog = AddFunctionDialog(function_names=["Lorenzian", "Gaussian", "FlatBackground"])
-        dialog.view.accept = MagicMock()
-        dialog.view.set_error_message = MagicMock()
-        with patch.object(dialog.view.ui.functionBox, 'currentText', lambda: "Function"):
+    def test_add_function(self, mock_view):
+        dialog = AddFunctionDialog(view=mock_view)
+        with patch.object(mock_view.ui.functionBox, 'currentText', lambda: "Gaussian"):
+            with patch.object(mock_view, 'is_text_in_function_list', lambda x: True):
+                dialog.action_add_function()
+                mock_view.function_added.emit.assert_called_once_with("Gaussian")
+                self.assertEqual(1, dialog.view.accept.call_count)
+
+    def test_add_function_give_error_if_function_not_valid(self, mock_view):
+        dialog = AddFunctionDialog(view=mock_view)
+        with patch.object(mock_view, 'is_text_in_function_list', lambda x: False):
             dialog.action_add_function()
             self.assertEqual(1, dialog.view.set_error_message.call_count)
-            self.assertEqual(0, function_added_mock.emit.call_count)
+            self.assertEqual(0, mock_view.function_added.emit.call_count)
             self.assertEqual(0, dialog.view.accept.call_count)
 
 
diff --git a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/view.py b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/view.py
index 93a6846c9fc..a01676c6f8f 100644
--- a/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/view.py
+++ b/qt/python/mantidqt/widgets/fitpropertybrowser/addfunctiondialog/view.py
@@ -6,7 +6,7 @@
 # SPDX - License - Identifier: GPL - 3.0 +
 from __future__ import (absolute_import, unicode_literals)
 
-from qtpy.QtCore import Qt
+from qtpy.QtCore import Qt, Signal
 from qtpy.QtGui import QIcon
 from qtpy.QtWidgets import QCompleter, QDialog
 
@@ -14,6 +14,7 @@ from mantidqt.utils.qt import load_ui
 
 
 class AddFunctionDialogView(QDialog):
+    function_added = Signal(str)
 
     def __init__(self, parent = None, function_names = None):
         super(AddFunctionDialogView, self).__init__(parent)
@@ -30,9 +31,8 @@ class AddFunctionDialogView(QDialog):
         function_box.completer().setFilterMode(Qt.MatchContains)
         self.ui.errorMessage.hide()
 
-    def acceptFunction(self, function):
-        self.function_added.emit(function)
-        self.accept()
+    def is_text_in_function_list(self, function):
+        return self.ui.functionBox.findText(function, Qt.MatchExactly) != -1
 
     def set_error_message(self, text):
         self.ui.errorMessage.setText("<span style='color:red'> %s </span>" % text)
diff --git a/qt/python/mantidqt/widgets/fitpropertybrowser/interactive_tool.py b/qt/python/mantidqt/widgets/fitpropertybrowser/interactive_tool.py
index d0a7c27c95e..721a492aa77 100644
--- a/qt/python/mantidqt/widgets/fitpropertybrowser/interactive_tool.py
+++ b/qt/python/mantidqt/widgets/fitpropertybrowser/interactive_tool.py
@@ -204,7 +204,7 @@ class FitInteractiveTool(QObject):
         """
         dialog = AddFunctionDialog(self.canvas, self.peak_names)
         dialog.view.ui.functionBox.setCurrentText(self.current_peak_type)
-        dialog.function_added.connect(self.action_peak_added)
+        dialog.view.function_added.connect(self.action_peak_added)
         dialog.view.open()
 
     def action_peak_added(self, function_name):
@@ -217,7 +217,7 @@ class FitInteractiveTool(QObject):
         browser.
         """
         dialog = AddFunctionDialog(self.canvas, self.background_names)
-        dialog.function_added.connect(self.add_background_requested)
+        dialog.view.function_added.connect(self.add_background_requested)
         dialog.view.open()
 
     def add_other_dialog(self):
@@ -226,7 +226,7 @@ class FitInteractiveTool(QObject):
         function is added to the browser.
         """
         dialog = AddFunctionDialog(self.canvas, self.other_names)
-        dialog.function_added.connect(self.add_other_requested)
+        dialog.view.function_added.connect(self.add_other_requested)
         dialog.view.open()
 
     def add_peak_marker(self, x, y_top, y_bottom=0.0, fwhm=None):
-- 
GitLab