More unittests.

pull/61/head
Christian T. Jacobs 2017-06-24 15:08:20 +01:00
rodzic db1c050b78
commit 6b1caa1a3c
4 zmienionych plików z 76 dodań i 50 usunięć

Wyświetl plik

@ -28,7 +28,7 @@ def error(parent, message):
:arg str message: The message to display to the user. :arg str message: The message to display to the user.
""" """
logging.error(message) logging.error(message)
_handle_gtk_dialog(parent, Gtk.MessageType.ERROR, message, "Error") handle_gtk_dialog(parent, Gtk.MessageType.ERROR, message, "Error")
def info(parent, message): def info(parent, message):
@ -38,7 +38,7 @@ def info(parent, message):
:arg str message: The message to display to the user. :arg str message: The message to display to the user.
""" """
logging.debug(message) logging.debug(message)
_handle_gtk_dialog(parent, Gtk.MessageType.INFO, message, "Information") handle_gtk_dialog(parent, Gtk.MessageType.INFO, message, "Information")
def question(parent, message): def question(parent, message):
@ -49,10 +49,10 @@ def question(parent, message):
:returns: The 'yes'/'no' response from the user. :returns: The 'yes'/'no' response from the user.
:rtype: Gtk.ResponseType :rtype: Gtk.ResponseType
""" """
return _handle_gtk_dialog(parent, Gtk.MessageType.QUESTION, message, "Question") return handle_gtk_dialog(parent, Gtk.MessageType.QUESTION, message, "Question")
def _handle_gtk_dialog(parent, msgtype, message, title): def handle_gtk_dialog(parent, msgtype, message, title):
""" """
Instantiate and present a dialog to the user. Instantiate and present a dialog to the user.

Wyświetl plik

@ -58,7 +58,11 @@ class Logbook:
return return
def new(self, widget=None): def new(self, widget=None):
""" Create a new logbook, and open it. """ """ Create a new logbook, and open it.
:returns: True if the new logbook is successfully opened, and False otherwise.
:rtype: bool
"""
# Get the new file's path from a dialog. # Get the new file's path from a dialog.
dialog = Gtk.FileChooserDialog("Create a New SQLite Database File", dialog = Gtk.FileChooserDialog("Create a New SQLite Database File",
@ -82,13 +86,16 @@ class Logbook:
# Clear the contents of the file, in case the file exists already. # Clear the contents of the file, in case the file exists already.
open(path, 'w').close() open(path, 'w').close()
# Open the new logbook, ready for use. # Open the new logbook, ready for use.
self.open(path=path) opened = self.open(path=path)
return return opened
def open(self, widget=None, path=None): def open(self, widget=None, path=None, render=True):
""" Open a logbook, and render all the logs within it. """ Open a logbook, and render all the logs within it.
:arg str path: An optional argument containing the database file location, if already known. If this is None, a file selection dialog will appear. :arg str path: An optional argument containing the database file location, if already known. If this is None, a file selection dialog will appear.
:arg bool render: An optional argument to specify whether or not the logs should be rendered in the logbook. By default this is True, but is sometimes set to False for unit testing purposes.
:returns: True if the logbook is successfully opened, and False otherwise.
:rtype: bool
""" """
if(path is None): if(path is None):
@ -106,7 +113,7 @@ class Logbook:
if(path is None): # If the Cancel button has been clicked, path will still be None if(path is None): # If the Cancel button has been clicked, path will still be None
logging.debug("No file path specified.") logging.debug("No file path specified.")
return return False
connected = self.db_connect(path) connected = self.db_connect(path)
if(connected): if(connected):
@ -118,46 +125,52 @@ class Logbook:
self.logs = self.get_logs() self.logs = self.get_logs()
if(self.logs is None): if(self.logs is None):
error(parent=self.application.window, message="Could not open logbook. Something went wrong when trying to retrieve the logs. Perhaps the logbook file is encrypted, corrupted, or in the wrong format?") error(parent=self.application.window, message="Could not open logbook. Something went wrong when trying to retrieve the logs. Perhaps the logbook file is encrypted, corrupted, or in the wrong format?")
return return False
else: else:
logging.debug("All logs retrieved successfully.") logging.debug("All logs retrieved successfully.")
logging.debug("Rendering logs...") if(render):
# For rendering the logs. One treeview and one treeselection per Log. logging.debug("Rendering logs...")
self.treeview = [] # For rendering the logs. One treeview and one treeselection per Log.
self.treeselection = [] self.treeview = []
self.sorter = [] self.treeselection = []
self.filter = [] self.sorter = []
self.summary = Summary(self.application) self.filter = []
self.blank = Blank(self.application) self.summary = Summary(self.application)
self.blank = Blank(self.application)
# FIXME: This is an unfortunate work-around. If the area around the "+/New Log" button # FIXME: This is an unfortunate work-around. If the area around the "+/New Log" button
# is clicked, PyQSO will change to an empty page. This signal is used to stop this from happening. # is clicked, PyQSO will change to an empty page. This signal is used to stop this from happening.
self.notebook.connect("switch-page", self.on_switch_page) self.notebook.connect("switch-page", self.on_switch_page)
for i in range(len(self.logs)): for i in range(len(self.logs)):
self.render_log(i) self.render_log(i)
logging.debug("All logs rendered successfully.") logging.debug("All logs rendered successfully.")
self.summary.update() self.summary.update()
self.application.toolbox.awards.count(self) self.application.toolbox.awards.count(self)
context_id = self.application.statusbar.get_context_id("Status") context_id = self.application.statusbar.get_context_id("Status")
self.application.statusbar.push(context_id, "Logbook: %s" % self.path) self.application.statusbar.push(context_id, "Logbook: %s" % self.path)
self.application.toolbar.set_logbook_button_sensitive(False) self.application.toolbar.set_logbook_button_sensitive(False)
self.application.menu.set_logbook_item_sensitive(False) self.application.menu.set_logbook_item_sensitive(False)
self.application.menu.set_log_items_sensitive(True) self.application.menu.set_log_items_sensitive(True)
self.application.toolbar.filter_source.set_sensitive(True) self.application.toolbar.filter_source.set_sensitive(True)
self.notebook.show_all() self.notebook.show_all()
else: else:
logging.debug("Not connected to a logbook. No logs were opened.") logging.debug("Not connected to a logbook. No logs were opened.")
return False
return return True
def close(self, widget=None): def close(self, widget=None):
""" Close the logbook that is currently open. """ """ Close the logbook that is currently open.
:returns: True if the logbook is successfully closed, and False otherwise.
:rtype: bool
"""
disconnected = self.db_disconnect() disconnected = self.db_disconnect()
if(disconnected): if(disconnected):
@ -176,7 +189,9 @@ class Logbook:
self.application.toolbar.filter_source.set_sensitive(False) self.application.toolbar.filter_source.set_sensitive(False)
else: else:
logging.debug("Unable to disconnect from the database. No logs were closed.") logging.debug("Unable to disconnect from the database. No logs were closed.")
return return False
return True
def db_connect(self, path): def db_connect(self, path):
""" Create an SQL database connection to the Logbook's data source. """ Create an SQL database connection to the Logbook's data source.

Wyświetl plik

@ -32,25 +32,36 @@ class TestLogbook(unittest.TestCase):
def setUp(self): def setUp(self):
""" Set up the Logbook object and connection to the test database needed for the unit tests. """ """ Set up the Logbook object and connection to the test database needed for the unit tests. """
self.logbook = Logbook(application=mock.MagicMock()) self.logbook = Logbook(application=mock.MagicMock())
# Open the test database file.
path_to_test_database = os.path.join(os.path.realpath(os.path.dirname(__file__)), os.pardir, "res/test.db") path_to_test_database = os.path.join(os.path.realpath(os.path.dirname(__file__)), os.pardir, "res/test.db")
success = self.logbook.db_connect(path_to_test_database) opened = self.logbook.open(path=path_to_test_database, render=False)
assert(success) assert(opened)
self.logbook.logs = self.logbook.get_logs() assert(self.logbook.connection is not None)
assert(self.logbook.logs is not None)
# Check that the logs have been retrieved. # Check that the logs have been retrieved.
temp = [] assert(len(self.logbook.logs) == 2)
for log_name in ["test", "test2"]: assert(self.logbook.logs[0].name == "test")
l = Log(self.logbook.connection, log_name) assert(self.logbook.logs[1].name == "test2")
l.populate()
temp.append(l)
assert(self.logbook.logs[0].name == temp[0].name)
assert(self.logbook.logs[1].name == temp[1].name)
def tearDown(self): def tearDown(self):
""" Disconnect from the test database. """ """ Disconnect from the test database. """
success = self.logbook.db_disconnect() self.logbook.notebook.get_n_pages.return_value = 0
assert(success) closed = self.logbook.close()
assert(closed)
@mock.patch('pyqso.auxiliary_dialogs.handle_gtk_dialog')
def test_open_invalid_log(self, mock_handle_gtk_dialog):
""" Open an invalid database file and check that an error occurs. """
path_to_invalid_database = "Logbook.test_setUp_invalid.txt"
f = open("Logbook.test_setUp_invalid.txt", 'w')
f.write("This is a plain text file. Trying to open this file in PyQSO should case an error, since it is not a valid database file.")
f.close()
opened = self.logbook.open(path=path_to_invalid_database, render=False)
assert(not opened)
assert(self.logbook.logs is None)
def test_log_name_exists(self): def test_log_name_exists(self):
""" Check that only the log called 'test' exists. """ """ Check that only the log called 'test' exists. """

Wyświetl plik

@ -57,7 +57,7 @@ class TestRecordDialog(unittest.TestCase):
def test_convert_frequency(self): def test_convert_frequency(self):
""" Check that a frequency can be successfully converted from one unit to another. """ """ Check that a frequency can be successfully converted from one unit to another. """
frequency = "7.140" # In MHz frequency = "7.140" # In MHz
converted = self.record_dialog.convert_frequency(frequency, from_unit="MHz", to_unit="AHz") # Unknown to_unit. This should return the input unmodified. converted = self.record_dialog.convert_frequency(frequency, from_unit="MHz", to_unit="AHz") # Unknown to_unit. This should return the input unmodified (and give an error message).
assert(converted == frequency) assert(converted == frequency)
converted = self.record_dialog.convert_frequency(frequency, from_unit="MHz", to_unit="kHz") # Convert from MHz to kHz. converted = self.record_dialog.convert_frequency(frequency, from_unit="MHz", to_unit="kHz") # Convert from MHz to kHz.
assert(float(converted) == 1e3*float(frequency)) assert(float(converted) == 1e3*float(frequency))