source: sasview/src/sas/qtgui/UnitTesting/GuiManagerTest.py @ f82ab8c

ESS_GUIESS_GUI_DocsESS_GUI_batch_fittingESS_GUI_bumps_abstractionESS_GUI_iss1116ESS_GUI_iss879ESS_GUI_iss959ESS_GUI_openclESS_GUI_orderingESS_GUI_sync_sascalc
Last change on this file since f82ab8c was f82ab8c, checked in by Piotr Rozyczko <piotr.rozyczko@…>, 8 years ago

More dialogs, drag and drop onto File Load

  • Property mode set to 100755
File size: 7.6 KB
Line 
1import sys
2import subprocess
3import unittest
4import webbrowser
5import logging
6
7from PyQt4.QtGui import *
8from PyQt4.QtTest import QTest
9from PyQt4.QtCore import *
10from PyQt4.QtWebKit import *
11from mock import MagicMock
12
13# Local
14from GuiManager import GuiManager
15from UI.MainWindowUI import MainWindow
16from UnitTesting.TestUtils import QtSignalSpy
17
18app = QApplication(sys.argv)
19
20class GuiManagerTest(unittest.TestCase):
21    '''Test the Main Window functionality'''
22    def setUp(self):
23        '''Create the tested object'''
24        class MainSasViewWindow(MainWindow):
25            # Main window of the application
26            def __init__(self, reactor, parent=None):
27                super(MainSasViewWindow, self).__init__(parent)
28       
29                # define workspace for dialogs.
30                self.workspace = QWorkspace(self)
31                self.setCentralWidget(self.workspace)
32
33        self.manager = GuiManager(MainSasViewWindow(None), None)
34
35    def tearDown(self):
36        '''Destroy the GUI'''
37        self.manager = None
38
39    def testDefaults(self):
40        '''Test the object in its default state'''
41        pass
42       
43    def testUpdatePerspective(self):
44        """
45        """
46        pass
47
48    def testUpdateStatusBar(self):
49        """
50        """
51        pass
52
53    def testSetData(self):
54        """
55        """
56        pass
57
58    def testSetData(self):
59        """
60        """
61        pass
62
63    def testQuitApplication(self):
64        """
65        Test that the custom exit method is called on shutdown
66        """
67        # Must mask sys.exit, otherwise the whole testing process stops.
68        sys.exit = MagicMock()
69
70        # Say No to the close dialog
71        QMessageBox.question = MagicMock(return_value=QMessageBox.No)
72
73        # Open, then close the manager
74        self.manager.quitApplication()
75
76        # See that the MessageBox method got called
77        self.assertTrue(QMessageBox.question.called)
78        # sys.exit() not called this time
79        self.assertFalse(sys.exit.called)
80
81        # Say Yes to the close dialog
82        QMessageBox.question = MagicMock(return_value=QMessageBox.Yes)
83
84        # Open, then close the manager
85        self.manager.quitApplication()
86
87        # See that the MessageBox method got called
88        self.assertTrue(QMessageBox.question.called)
89        # Also, sys.exit() called
90        self.assertTrue(sys.exit.called)
91
92    def testCheckUpdate(self):
93        """
94        Tests the SasView website version polling
95        """
96        self.manager.processVersion = MagicMock()
97        version = {'update_url'  : 'http://www.sasview.org/sasview.latestversion', 
98                   'version'     : '3.1.2',
99                   'download_url': 'https://github.com/SasView/sasview/releases'}
100        self.manager.checkUpdate()
101
102        self.manager.processVersion.assert_called_with(version)
103
104        pass
105
106    def testProcessVersion(self):
107        """
108        Tests the version checker logic
109        """
110        # 1. version = 0.0.0
111        version_info = {u'version' : u'0.0.0'}
112        spy_status_update = QtSignalSpy(self.manager, self.manager.communicate.statusBarUpdateSignal)
113
114        self.manager.processVersion(version_info)
115
116        self.assertEqual(spy_status_update.count(), 1)
117        message = 'Could not connect to the application server. Please try again later.'
118        self.assertIn(message, str(spy_status_update.signal(index=0)))
119
120        # 2. version < LocalConfig.__version__
121        version_info = {u'version' : u'0.0.1'}
122        spy_status_update = QtSignalSpy(self.manager, self.manager.communicate.statusBarUpdateSignal)
123
124        self.manager.processVersion(version_info)
125
126        self.assertEqual(spy_status_update.count(), 1)
127        message = 'You have the latest version of SasView'
128        self.assertIn(message, str(spy_status_update.signal(index=0)))
129
130        # 3. version > LocalConfig.__version__
131        version_info = {u'version' : u'999.0.0'}
132        spy_status_update = QtSignalSpy(self.manager, self.manager.communicate.statusBarUpdateSignal)
133        webbrowser.open = MagicMock()
134
135        self.manager.processVersion(version_info)
136
137        self.assertEqual(spy_status_update.count(), 1)
138        message = 'Version 999.0.0 is available!'
139        self.assertIn(message, str(spy_status_update.signal(index=0)))
140
141        webbrowser.open.assert_called_with("https://github.com/SasView/sasview/releases")
142
143        ## 4. version > LocalConfig.__version__ and standalone
144        #version_info = {u'version' : u'999.0.0'}
145        #spy_status_update = QtSignalSpy(self.manager, self.manager.communicate.statusBarUpdateSignal)
146        #webbrowser.open = MagicMock()
147
148        #self.manager.processVersion(version_info, standalone=True)
149
150        #self.assertEqual(spy_status_update.count(), 1)
151        #message = 'See the help menu to download it'
152        #self.assertIn(message, str(spy_status_update.signal(index=0)))
153
154        #self.assertFalse(webbrowser.open.called)
155
156        # 5. couldn't load version
157        version_info = {}
158        logging.error = MagicMock()
159        spy_status_update = QtSignalSpy(self.manager, self.manager.communicate.statusBarUpdateSignal)
160
161        self.manager.processVersion(version_info)
162
163        # Retrieve and compare arguments of the mocked call
164        message = "guiframe: could not get latest application version number"
165        args, _ = logging.error.call_args
166        self.assertIn(message, args[0])
167
168        # Check the signal message
169        message = 'Could not connect to the application server.'
170        self.assertIn(message, str(spy_status_update.signal(index=0)))
171
172    def testActions(self):
173        """
174        """
175        pass
176
177    def testActionLoadData(self):
178        """
179        Menu File/Load Data File(s)
180        """
181        # Mock the system file open method
182        QFileDialog.getOpenFileNames = MagicMock(return_value=None)
183
184        # invoke the action
185        self.manager.actionLoadData()
186
187        # Test the getOpenFileName() dialog called once
188        self.assertTrue(QFileDialog.getOpenFileNames.called)
189       
190    def testActionDocumentation(self):
191        """
192        Menu Help/Documentation
193        """
194        #Mock the QWebView method
195        QWebView.show = MagicMock()
196
197        # Assure the filename is correct
198        self.assertIn("index.html", self.manager._helpLocation)
199
200        # Invoke the action
201        self.manager.actionDocumentation()
202
203        # Check if show() got called
204        self.assertTrue(QWebView.show.called)
205
206    def testActionTutorial(self):
207        """
208        Menu Help/Tutorial
209        """
210        # Mock subprocess.Popen
211        subprocess.Popen = MagicMock()
212
213        tested_location = self.manager._tutorialLocation
214
215        # Assure the filename is correct
216        self.assertIn("Tutorial.pdf", tested_location)
217
218        # Invoke the action
219        self.manager.actionTutorial()
220
221        # Check if popen() got called
222        self.assertTrue(subprocess.Popen.called)
223
224        #Check the popen() call arguments
225        subprocess.Popen.assert_called_with([tested_location], shell=True)
226
227    def testActionAcknowledge(self):
228        """
229        Menu Help/Acknowledge
230        """
231        self.manager.actionAcknowledge()
232
233        # Check if the window is actually opened.
234        self.assertTrue(self.manager.ackWidget.isVisible())
235        self.assertIn("developers@sasview.org", self.manager.ackWidget.label.text())
236
237    def testActionCheck_for_update(self):
238        """
239        Menu Help/Check for update
240        """
241        # Just make sure checkUpdate is called.
242        self.manager.checkUpdate = MagicMock()
243
244        self.manager.actionCheck_for_update()
245
246        self.assertTrue(self.manager.checkUpdate.called)
247             
248       
249if __name__ == "__main__":
250    unittest.main()
251
Note: See TracBrowser for help on using the repository browser.