Source code for gui.test_is_keywords_dialog

"""
InaSAFE Disaster risk assessment tool developed by AusAid and World Bank
- **GUI Test Cases.**

Contact : ole.moller.nielsen@gmail.com

.. note:: This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
     (at your option) any later version.

"""

__author__ = 'tim@linfiniti.com'
__version__ = '0.3.1'
__date__ = '21/02/2011'
__copyright__ = ('Copyright 2012, Australia Indonesia Facility for '
                 'Disaster Reduction')

import unittest
import sys
import os

# Add PARENT directory to path to make test aware of other modules
pardir = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(pardir)

from PyQt4 import QtGui, QtCore
from PyQt4.QtTest import QTest
from utilities_test import getQgisTestApp
from is_keywords_dialog import ISKeywordsDialog

from qgis.core import (QgsRasterLayer,
                       QgsMapLayerRegistry)
from storage.utilities_test import TESTDATA
from odict import OrderedDict
# Get QGis app handle
QGISAPP, CANVAS, IFACE, PARENT = getQgisTestApp()


[docs]def makePadangLayer(): """Helper function that returns a single predefined layer""" myFile = 'Shakemap_Padang_2009.asc' myPath = os.path.join(TESTDATA, myFile) myBaseName = os.path.splitext(myFile)[0] myLayer = QgsRasterLayer(myPath, myBaseName) QgsMapLayerRegistry.instance().addMapLayer(myLayer) return myLayer
[docs]def clearLayers(): """Clear all the loaded layers""" for myLayer in QgsMapLayerRegistry.instance().mapLayers(): QgsMapLayerRegistry.instance().removeMapLayer(myLayer)
[docs]class ISKeywordsDialogTest(unittest.TestCase): """Test the InaSAFE keywords GUI"""
[docs] def setUp(self): """Create fresh dialog for each test"""
[docs] def tearDown(self): """Destroy the dialog after each test""" clearLayers()
[docs] def test_showHelp(self): """Test that help button works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myButton = myDialog.buttonBox.button(QtGui.QDialogButtonBox.Help) QTest.mouseClick(myButton, QtCore.Qt.LeftButton) myMessage = 'Help dialog was not created when help button pressed' assert myDialog.helpDialog is not None, myMessage
[docs] def test_on_pbnAdvanced_toggled(self): """Test advanced button toggle behaviour works""" makePadangLayer() myDialog = ISKeywordsDialog(PARENT, IFACE) myButton = myDialog.pbnAdvanced myButton.setChecked(False) QTest.mouseClick(myButton, QtCore.Qt.LeftButton) myState = myDialog.grpAdvanced.isHidden() myExpectedState = False myMessage = ('Advanced options did not become visible when' ' the advanced button was clicked\nGot' '%s\nExpected\%s\n' % (myState, myExpectedState)) assert myState == myExpectedState, myMessage # Now hide advanced again and test... QTest.mouseClick(myButton, QtCore.Qt.LeftButton) myState = myDialog.grpAdvanced.isHidden() myExpectedState = True myMessage = ('Advanced options did not become hidden when' ' the advanced button was clicked again\nGot' '%s\nExpected\%s\n' % (myState, myExpectedState)) assert not myDialog.grpAdvanced.isVisible(), myMessage
[docs] def test_on_radHazard_toggled(self): """Test hazard radio button toggle behaviour works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myButton = myDialog.radHazard myButton.setChecked(False) QTest.mouseClick(myButton, QtCore.Qt.LeftButton) myMessage = ('Toggling the hazard radio did not add a category ' 'to the keywords list.') assert myDialog.getValueForKey('category') == 'hazard', myMessage
[docs] def Xtest_on_radExposure_toggled(self): """Test exposure radio button toggle behaviour works""" # Cannot get this test to work, but it works fine in the gui myDialog = ISKeywordsDialog(PARENT, IFACE) myButton = myDialog.radExposure myButton.setChecked(False) QTest.mouseClick(myButton, QtCore.Qt.LeftButton) myMessage = ('Toggling the exposure radio did not add a category ' 'to the keywords list.') assert myDialog.getValueForKey('category') == 'exposure', myMessage
[docs] def test_on_cboSubcategory_currentIndexChanged(self): """Test subcategory combo change event works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myButton = myDialog.radHazard myButton.setChecked(True) myButton = myDialog.radExposure QTest.mouseClick(myButton, QtCore.Qt.LeftButton) myCombo = myDialog.cboSubcategory QTest.mouseClick(myCombo, QtCore.Qt.LeftButton) QTest.keyClick(myCombo, QtCore.Qt.Key_Up) QTest.keyClick(myCombo, QtCore.Qt.Key_Enter) myMessage = ('Changing the subcategory did not add ' 'to the keywords list for %s' % myCombo.currentText()) myKey = myDialog.getValueForKey('subcategory') assert myKey is not None, myMessage assert myKey in str(myCombo.currentText()), myMessage
[docs] def test_setSubcategoryList(self): """Test set subcategory list works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myList = OrderedDict([('population [density]', 'population [density]'), ('population [count]', 'population [count]'), ('building', 'building'), ('building [osm]', 'building [osm]'), ('building [sigab]', 'building [sigab]'), ('roads', 'roads')]) mySelectedItem = 'building' myDialog.setSubcategoryList(myList, mySelectedItem) myResult = str(myDialog.cboSubcategory.currentText()) myMessage = ('\nGot: %s\nExpected: %s\n' % (myResult, mySelectedItem)) assert myResult == mySelectedItem, myMessage
[docs] def test_on_pbnAddToList1_clicked(self): """Test adding an item to the list using predefined form works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myDialog.reset(False) myDialog.radPredefined.setChecked(True) myDialog.cboKeyword.setCurrentIndex(2) myExpectedResult = 'foo' myDialog.lePredefinedValue.setText(myExpectedResult) # Work around for commented out line below myDialog.on_pbnAddToList1_clicked() #QTest.mouseClick(myDialog.pbnAddToList1, QtCore.Qt.LeftButton) myResult = myDialog.getValueForKey('datatype') myMessage = ('\nGot: %s\nExpected: %s\n' % (myResult, myExpectedResult)) assert myResult == myExpectedResult, myMessage
[docs] def test_on_pbnAddToList2_clicked(self): """Test adding an item to the list using user defened form works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myDialog.reset(False) myDialog.radUserDefined.setChecked(True) myDialog.leKey.setText('foo') myDialog.leValue.setText('bar') myExpectedResult = 'bar' myDialog.lePredefinedValue.setText(myExpectedResult) # Work around for commented out line below myDialog.on_pbnAddToList2_clicked() #QTest.mouseClick(myDialog.pbnAddToList2, QtCore.Qt.LeftButton) myResult = myDialog.getValueForKey('foo') myMessage = ('\nGot: %s\nExpected: %s\n' % (myResult, myExpectedResult)) print 'Dict', myDialog.getKeywords() assert myResult == myExpectedResult, myMessage
[docs] def test_on_pbnRemove_clicked(self): """Test pressing remove works on key list""" myDialog = ISKeywordsDialog(PARENT, IFACE) myDialog.reset(False) myResult = myDialog.lstKeywords.count() myExpectedResult = 0 myMessage = ('\nGot: %s\nExpected: %s\n' % (myResult, myExpectedResult)) #print 'Dict', myDialog.getKeywords() assert myResult == myExpectedResult, myMessage myDialog.addListEntry('bar', 'foo') myResult = myDialog.lstKeywords.count() myExpectedResult = 1 myMessage = ('\nGot: %s\nExpected: %s\n' % (myResult, myExpectedResult)) #print 'Dict', myDialog.getKeywords() assert myResult == myExpectedResult, myMessage
[docs] def test_addListEntry(self): """Test add entry to list works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myDialog.reset(False) myDialog.addListEntry('bar', 'foo') myResult = myDialog.getValueForKey('bar') myExpectedResult = 'foo' myMessage = ('\nGot: %s\nExpected: %s\n' % (myResult, myExpectedResult)) #print 'Dict', myDialog.getKeywords() assert myResult == myExpectedResult, myMessage
[docs] def test_addWarningsForColons(self): """Test add entry to list works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myDialog.reset(False) myDialog.addListEntry('bar', 'fo:o') myResult = myDialog.getValueForKey('bar') myExpectedResult = 'fo.o' myMessage = ('\nGot: %s\nExpected: %s\n' % (myResult, myExpectedResult)) #print 'Dict', myDialog.getKeywords() assert myResult == myExpectedResult, myMessage # # Check the user gets a message if they put colons in the value # myExpectedResult = 'Colons are not allowed, replaced with "."' myResult = str(myDialog.lblMessage.text()) myMessage = ('lblMessage error \nGot: %s\nExpected: %s\n' % (myResult, myExpectedResult)) #print 'Dict', myDialog.getKeywords() assert myResult == myExpectedResult, myMessage # # Check the user gets a message if they put colons in the key # myDialog.addListEntry('ba:r', 'foo') myExpectedResult = 'Colons are not allowed, replaced with "."' myResult = str(myDialog.lblMessage.text()) myMessage = ('lblMessage error \nGot: %s\nExpected: %s\n' % (myResult, myExpectedResult)) #print 'Dict', myDialog.getKeywords() assert myResult == myExpectedResult, myMessage
[docs] def test_setCategory(self): """Test set category works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myDialog.reset(False) myDialog.setCategory('hazard') myExpectedResult = 'hazard' myResult = myDialog.getValueForKey('category') myMessage = ('\nGot: %s\nExpected: %s\n' % (myResult, myExpectedResult)) #print 'Dict', myDialog.getKeywords() assert myResult == myExpectedResult, myMessage
[docs] def test_reset(self, thePrimaryKeywordsOnlyFlag=True): """Test form reset works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myDialog.leTitle.setText('Foo') myDialog.reset(False) myExpectedResult = '' myResult = myDialog.leTitle.text() myMessage = ('\nGot: %s\nExpected: %s\n' % (myResult, myExpectedResult)) assert myResult == myExpectedResult, myMessage
[docs] def test_removeItemByKey(self): """Test remove item by its key works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myDialog.reset(False) myDialog.addListEntry('bar', 'foo') myDialog.removeItemByKey('bar') myResult = myDialog.lstKeywords.count() myExpectedResult = 0 myMessage = ('\nGot: %s\nExpected: %s\n' % (myResult, myExpectedResult)) #print 'Dict', myDialog.getKeywords() assert myResult == myExpectedResult, myMessage
[docs] def test_removeItemByValue(self): """Test remove item by its value works""" makePadangLayer() myDialog = ISKeywordsDialog(PARENT, IFACE) myDialog.removeItemByValue('hazard') myKeywords = myDialog.getKeywords() myExpectedKeywords = {'title': 'Shakemap_Padang_2009', 'subcategory': 'earthquake', 'unit': 'MMI'} myMessage = ('\nGot: %s\nExpected: %s\n' % (myKeywords, myExpectedKeywords)) assert myKeywords == myExpectedKeywords, myMessage
[docs] def test_getValueForKey(self): """Test get value for key works""" makePadangLayer() myDialog = ISKeywordsDialog(PARENT, IFACE) myExpectedValue = 'hazard' myValue = myDialog.getValueForKey('category') myMessage = ('\nExpected key value of %s\nGot %s' % (myExpectedValue, myValue)) assert myValue == myExpectedValue, myMessage
[docs] def test_loadStateFromKeywords(self): """Test load state from keywords works""" myDialog = ISKeywordsDialog(PARENT, IFACE) myLayer = makePadangLayer() myDialog.layer = myLayer myDialog.loadStateFromKeywords() myKeywords = myDialog.getKeywords() myExpectedKeywords = {'title': 'Shakemap_Padang_2009', 'category': 'hazard', 'subcategory': 'earthquake', 'unit': 'MMI'} myMessage = ('\nGot: %s\nExpected: %s\n' % (myKeywords, myExpectedKeywords)) assert myKeywords == myExpectedKeywords, myMessage #check that a default title is given (see #https://github.com/AIFDR/inasafe/issues/111) myMessage = ('Expected title to be defaulted from ' 'filename but it was not.') assert myDialog.leTitle.text() == myDialog.layer.name(), myMessage
if __name__ == '__main__': suite = unittest.makeSuite(ISKeywordsDialogTest, 'test') runner = unittest.TextTestRunner(verbosity=2) runner.run(suite)