From 5686e85384c7218a8621bacedb3423d565739066 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 16 Dec 2014 07:47:46 +0000 Subject: [PATCH] Fix custom duplication bug --- openlp/plugins/custom/lib/mediaitem.py | 13 ++-- .../openlp_plugins/custom/__init__.py | 28 ++++++++ .../openlp_plugins/custom/test_mediaitem.py | 71 +++++++++++++++++++ 3 files changed, 108 insertions(+), 4 deletions(-) create mode 100644 tests/functional/openlp_plugins/custom/__init__.py create mode 100644 tests/functional/openlp_plugins/custom/test_mediaitem.py diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 9ecfac779..9b358453b 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -287,10 +287,15 @@ class CustomMediaItem(MediaManagerItem): log.debug('service_load') if self.plugin.status != PluginStatus.Active: return - custom = self.plugin.db_manager.get_object_filtered(CustomSlide, and_(CustomSlide.title == item.title, - CustomSlide.theme_name == item.theme, - CustomSlide.credits == - item.raw_footer[0][len(item.title) + 1:])) + if item.theme: + custom = self.plugin.db_manager.get_object_filtered(CustomSlide, and_(CustomSlide.title == item.title, + CustomSlide.theme_name == item.theme, + CustomSlide.credits == + item.raw_footer[0][len(item.title) + 1:])) + else: + custom = self.plugin.db_manager.get_object_filtered(CustomSlide, and_(CustomSlide.title == item.title, + CustomSlide.credits == + item.raw_footer[0][len(item.title) + 1:])) if custom: item.edit_id = custom.id return item diff --git a/tests/functional/openlp_plugins/custom/__init__.py b/tests/functional/openlp_plugins/custom/__init__.py new file mode 100644 index 000000000..6b241e7fc --- /dev/null +++ b/tests/functional/openlp_plugins/custom/__init__.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2014 Raoul Snyman # +# Portions copyright (c) 2008-2014 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. # +# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, # +# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, # +# Frode Woldsund, Martin Zibricky, Patrick Zimmermann # +# --------------------------------------------------------------------------- # +# 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; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### diff --git a/tests/functional/openlp_plugins/custom/test_mediaitem.py b/tests/functional/openlp_plugins/custom/test_mediaitem.py new file mode 100644 index 000000000..4624441aa --- /dev/null +++ b/tests/functional/openlp_plugins/custom/test_mediaitem.py @@ -0,0 +1,71 @@ +""" +This module contains tests for the lib submodule of the Songs plugin. +""" +from unittest import TestCase + +from PyQt4 import QtCore, QtGui + +from openlp.core.common import Registry, Settings +from openlp.core.lib import ServiceItem, PluginStatus +from openlp.plugins.custom.lib import CustomMediaItem +from tests.functional import patch, MagicMock +from tests.helpers.testmixin import TestMixin + + +class TestMediaItem(TestCase, TestMixin): + """ + Test the functions in the :mod:`lib` module. + """ + def setUp(self): + """ + Set up the components need for all tests. + """ + Registry.create() + Registry().register('service_list', MagicMock()) + Registry().register('main_window', MagicMock()) + with patch('openlp.core.lib.mediamanageritem.MediaManagerItem._setup'), \ + patch('openlp.core.lib.mediamanageritem.MediaManagerItem.setup_item'), \ + patch('openlp.plugins.custom.forms.editcustomform.EditCustomForm.__init__'), \ + patch('openlp.plugins.custom.lib.mediaitem.CustomMediaItem.setup_item'): + self.media_item = CustomMediaItem(None, MagicMock()) + self.setup_application() + self.build_settings() + QtCore.QLocale.setDefault(QtCore.QLocale('en_GB')) + + def tearDown(self): + """ + Delete all the C++ objects at the end so that we don't have a segfault + """ + self.destroy_settings() + + def service_load_inactive_test(self): + """ + Test the service load in custom with a default service item + """ + # GIVEN: An empty Service Item + service_item = ServiceItem(None) + + # WHEN: I search for the custom in the database + item = self.media_item.service_load(service_item) + + # THEN: the processing should be ignored + self.assertEqual(item, None, 'The Service item is inactive so processing should be bypassed') + + def service_load_basic_custom_test(self): + """ + Test the service load in custom with a default service item + """ + # GIVEN: An empty Service Item and an active plugin + service_item = ServiceItem(None) + self.media_item.plugin = MagicMock() + self.media_item.plugin.status = PluginStatus.Active + self.media_item.plugin.db_manager = MagicMock() + self.media_item.plugin.db_manager.get_object_filtered = MagicMock() + self.media_item.plugin.db_manager.get_object_filtered.return_value = None + + with patch('openlp.plugins.custom.lib.db.CustomSlide'): + # WHEN: I search for the custom in the database + item = self.media_item.service_load(service_item) + + # THEN: the processing should be ignored + self.assertEqual(item, None, 'The Service item is inactive so processing should be bypassed')