openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #28224
[Merge] lp:~raoul-snyman/openlp/fix-tests into lp:openlp
Raoul Snyman has proposed merging lp:~raoul-snyman/openlp/fix-tests into lp:openlp.
Requested reviews:
OpenLP Core (openlp-core)
For more details, see:
https://code.launchpad.net/~raoul-snyman/openlp/fix-tests/+merge/281936
Fix tests. Sadly Windows tests are still broken.
Add this to your merge proposal:
--------------------------------
lp:~raoul-snyman/openlp/fix-tests (revision 2596)
[SUCCESS] https://ci.openlp.io/job/Branch-01-Pull/1215/
[SUCCESS] https://ci.openlp.io/job/Branch-02-Functional-Tests/1141/
[SUCCESS] https://ci.openlp.io/job/Branch-03-Interface-Tests/1080/
[FAILURE] https://ci.openlp.io/job/Branch-04a-Windows_Functional_Tests/920/
--
Your team OpenLP Core is requested to review the proposed merge of lp:~raoul-snyman/openlp/fix-tests into lp:openlp.
=== modified file 'openlp/core/lib/db.py'
--- openlp/core/lib/db.py 2015-12-31 22:46:06 +0000
+++ openlp/core/lib/db.py 2016-01-07 22:31:35 +0000
@@ -55,7 +55,7 @@
metadata = MetaData(bind=engine)
else:
base.metadata.bind = engine
- metadata = None
+ metadata = base.metadata
session = scoped_session(sessionmaker(autoflush=auto_flush, autocommit=auto_commit, bind=engine))
return session, metadata
@@ -227,13 +227,12 @@
"""
self.is_dirty = False
self.session = None
- # See if we're using declarative_base with a pre-existing session.
- log.debug('Manager: Testing for pre-existing session')
- if session is not None:
- log.debug('Manager: Using existing session')
- else:
- log.debug('Manager: Creating new session')
+ self.db_url = None
+ if db_file_name:
+ log.debug('Manager: Creating new DB url')
self.db_url = init_url(plugin_name, db_file_name)
+ else:
+ self.db_url = init_url(plugin_name)
if upgrade_mod:
try:
db_ver, up_ver = upgrade_db(self.db_url, upgrade_mod)
@@ -248,10 +247,13 @@
'not be loaded.\n\nDatabase: %s') % (db_ver, up_ver, self.db_url)
)
return
- try:
- self.session = init_schema(self.db_url)
- except (SQLAlchemyError, DBAPIError):
- handle_db_error(plugin_name, db_file_name)
+ if not session:
+ try:
+ self.session = init_schema(self.db_url)
+ except (SQLAlchemyError, DBAPIError):
+ handle_db_error(plugin_name, db_file_name)
+ else:
+ self.session = session
def save_object(self, object_instance, commit=True):
"""
@@ -344,13 +346,13 @@
for try_count in range(3):
try:
return self.session.query(object_class).filter(filter_clause).first()
- except OperationalError:
+ except OperationalError as oe:
# This exception clause is for users running MySQL which likes to terminate connections on its own
# without telling anyone. See bug #927473. However, other dbms can raise it, usually in a
# non-recoverable way. So we only retry 3 times.
+ if try_count >= 2 or 'MySQL has gone away' in str(oe):
+ raise
log.exception('Probably a MySQL issue, "MySQL has gone away"')
- if try_count >= 2:
- raise
def get_all_objects(self, object_class, filter_clause=None, order_by_ref=None):
"""
=== modified file 'openlp/core/lib/projector/db.py'
--- openlp/core/lib/projector/db.py 2015-12-31 22:46:06 +0000
+++ openlp/core/lib/projector/db.py 2016-01-07 22:31:35 +0000
@@ -20,18 +20,18 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
"""
- :mod:`openlp.core.lib.projector.db` module
-
- Provides the database functions for the Projector module.
-
- The Manufacturer, Model, Source tables keep track of the video source
- strings used for display of input sources. The Source table maps
- manufacturer-defined or user-defined strings from PJLink default strings
- to end-user readable strings; ex: PJLink code 11 would map "RGB 1"
- default string to "RGB PC (analog)" string.
- (Future feature).
-
- The Projector table keeps track of entries for controlled projectors.
+:mod:`openlp.core.lib.projector.db` module
+
+Provides the database functions for the Projector module.
+
+The Manufacturer, Model, Source tables keep track of the video source
+strings used for display of input sources. The Source table maps
+manufacturer-defined or user-defined strings from PJLink default strings
+to end-user readable strings; ex: PJLink code 11 would map "RGB 1"
+default string to "RGB PC (analog)" string.
+(Future feature).
+
+The Projector table keeps track of entries for controlled projectors.
"""
import logging
@@ -218,19 +218,19 @@
"""
def __init__(self, *args, **kwargs):
log.debug('ProjectorDB().__init__(args="%s", kwargs="%s")' % (args, kwargs))
- super().__init__(plugin_name='projector',
- init_schema=self.init_schema)
+ super().__init__(plugin_name='projector', init_schema=self.init_schema)
log.debug('ProjectorDB() Initialized using db url %s' % self.db_url)
+ log.debug('Session: %s', self.session)
- def init_schema(*args, **kwargs):
+ def init_schema(self, *args, **kwargs):
"""
Setup the projector database and initialize the schema.
Declarative uses table classes to define schema.
"""
- url = init_url('projector')
- session, metadata = init_db(url, base=Base)
- Base.metadata.create_all(checkfirst=True)
+ self.db_url = init_url('projector')
+ session, metadata = init_db(self.db_url, base=Base)
+ metadata.create_all(checkfirst=True)
return session
def get_projector_by_id(self, dbid):
=== modified file 'tests/functional/openlp_core_lib/__init__.py'
--- tests/functional/openlp_core_lib/__init__.py 2015-12-31 22:46:06 +0000
+++ tests/functional/openlp_core_lib/__init__.py 2016-01-07 22:31:35 +0000
@@ -22,26 +22,3 @@
"""
Module-level functions for the functional test suite
"""
-
-import os
-from tests.functional import patch
-
-from openlp.core.common import is_win
-
-from .test_projectordb import tmpfile
-
-
-def setUp():
- if not is_win():
- # Wine creates a sharing violation during tests. Ignore.
- try:
- os.remove(tmpfile)
- except:
- pass
-
-
-def tearDown():
- """
- Ensure test suite has been cleaned up after tests
- """
- patch.stopall()
=== modified file 'tests/functional/openlp_core_lib/test_projectordb.py'
--- tests/functional/openlp_core_lib/test_projectordb.py 2015-12-31 22:46:06 +0000
+++ tests/functional/openlp_core_lib/test_projectordb.py 2016-01-07 22:31:35 +0000
@@ -25,15 +25,13 @@
PREREQUISITE: add_record() and get_all() functions validated.
"""
-
+import os
from unittest import TestCase
+
+from openlp.core.lib.projector.db import Projector, ProjectorDB, ProjectorSource
+
from tests.functional import MagicMock, patch
-
-from openlp.core.lib.projector.db import Projector, ProjectorDB, ProjectorSource
-
-from tests.resources.projector.data import TEST1_DATA, TEST2_DATA, TEST3_DATA
-
-tmpfile = '/tmp/openlp-test-projectordb.sql'
+from tests.resources.projector.data import TEST_DB, TEST1_DATA, TEST2_DATA, TEST3_DATA
def compare_data(one, two):
@@ -60,15 +58,15 @@
one.text == two.text
-def add_records(self, test):
+def add_records(projector_db, test):
"""
Add record if not in database
"""
- record_list = self.projector.get_projector_all()
+ record_list = projector_db.get_projector_all()
if len(record_list) < 1:
added = False
for record in test:
- added = self.projector.add_projector(record) or added
+ added = projector_db.add_projector(record) or added
return added
for new_record in test:
@@ -76,7 +74,7 @@
for record in record_list:
if compare_data(record, new_record):
break
- added = self.projector.add_projector(new_record)
+ added = projector_db.add_projector(new_record)
return added
@@ -88,15 +86,17 @@
"""
Set up anything necessary for all tests
"""
- if not hasattr(self, 'projector'):
- with patch('openlp.core.lib.projector.db.init_url') as mocked_init_url:
- mocked_init_url.return_value = 'sqlite:///%s' % tmpfile
- self.projector = ProjectorDB()
+ with patch('openlp.core.lib.projector.db.init_url') as mocked_init_url:
+ if os.path.exists(TEST_DB):
+ os.unlink(TEST_DB)
+ mocked_init_url.return_value = 'sqlite:///%s' % TEST_DB
+ self.projector = ProjectorDB()
def tearDown(self):
"""
Clean up
"""
+ self.projector.session.close()
self.projector = None
def find_record_by_ip_test(self):
@@ -104,13 +104,13 @@
Test find record by IP
"""
# GIVEN: Record entries in database
- add_records(self, [TEST1_DATA, TEST2_DATA])
+ add_records(self.projector, [Projector(**TEST1_DATA), Projector(**TEST2_DATA)])
# WHEN: Search for record using IP
- record = self.projector.get_projector_by_ip(TEST2_DATA.ip)
+ record = self.projector.get_projector_by_ip(TEST2_DATA['ip'])
# THEN: Verify proper record returned
- self.assertTrue(compare_data(TEST2_DATA, record),
+ self.assertTrue(compare_data(Projector(**TEST2_DATA), record),
'Record found should have been test_2 data')
def find_record_by_name_test(self):
@@ -118,13 +118,13 @@
Test find record by name
"""
# GIVEN: Record entries in database
- add_records(self, [TEST1_DATA, TEST2_DATA])
+ add_records(self.projector, [Projector(**TEST1_DATA), Projector(**TEST2_DATA)])
# WHEN: Search for record using name
- record = self.projector.get_projector_by_name(TEST2_DATA.name)
+ record = self.projector.get_projector_by_name(TEST2_DATA['name'])
# THEN: Verify proper record returned
- self.assertTrue(compare_data(TEST2_DATA, record),
+ self.assertTrue(compare_data(Projector(**TEST2_DATA), record),
'Record found should have been test_2 data')
def record_delete_test(self):
@@ -132,14 +132,14 @@
Test record can be deleted
"""
# GIVEN: Record in database
- add_records(self, [TEST3_DATA, ])
- record = self.projector.get_projector_by_ip(TEST3_DATA.ip)
+ add_records(self.projector, [Projector(**TEST3_DATA), ])
+ record = self.projector.get_projector_by_ip(TEST3_DATA['ip'])
# WHEN: Record deleted
self.projector.delete_projector(record)
# THEN: Verify record not retrievable
- found = self.projector.get_projector_by_ip(TEST3_DATA.ip)
+ found = self.projector.get_projector_by_ip(TEST3_DATA['ip'])
self.assertFalse(found, 'test_3 record should have been deleted')
def record_edit_test(self):
@@ -147,34 +147,35 @@
Test edited record returns the same record ID with different data
"""
# GIVEN: Record entries in database
- add_records(self, [TEST1_DATA, TEST2_DATA])
+ add_records(self.projector, [Projector(**TEST1_DATA), Projector(**TEST2_DATA)])
# WHEN: We retrieve a specific record
- record = self.projector.get_projector_by_ip(TEST1_DATA.ip)
+ record = self.projector.get_projector_by_ip(TEST1_DATA['ip'])
record_id = record.id
# WHEN: Data is changed
- record.ip = TEST3_DATA.ip
- record.port = TEST3_DATA.port
- record.pin = TEST3_DATA.pin
- record.name = TEST3_DATA.name
- record.location = TEST3_DATA.location
- record.notes = TEST3_DATA.notes
+ record.ip = TEST3_DATA['ip']
+ record.port = TEST3_DATA['port']
+ record.pin = TEST3_DATA['pin']
+ record.name = TEST3_DATA['name']
+ record.location = TEST3_DATA['location']
+ record.notes = TEST3_DATA['notes']
updated = self.projector.update_projector(record)
self.assertTrue(updated, 'Save updated record should have returned True')
- record = self.projector.get_projector_by_ip(TEST3_DATA.ip)
+ record = self.projector.get_projector_by_ip(TEST3_DATA['ip'])
# THEN: Record ID should remain the same, but data should be changed
self.assertEqual(record_id, record.id, 'Edited record should have the same ID')
- self.assertTrue(compare_data(TEST3_DATA, record), 'Edited record should have new data')
+ self.assertTrue(compare_data(Projector(**TEST3_DATA), record), 'Edited record should have new data')
def source_add_test(self):
"""
Test source entry for projector item
"""
# GIVEN: Record entries in database
- self.projector.add_projector(TEST1_DATA)
- item = self.projector.get_projector_by_id(TEST1_DATA.id)
+ projector1 = Projector(**TEST1_DATA)
+ self.projector.add_projector(projector1)
+ item = self.projector.get_projector_by_id(projector1.id)
item_id = item.id
# WHEN: A source entry is saved for item
@@ -184,3 +185,4 @@
# THEN: Projector should have the same source entry
item = self.projector.get_projector_by_id(item_id)
self.assertTrue(compare_source(item.source_list[0], source))
+
=== modified file 'tests/functional/openlp_core_ui/test_maindisplay.py'
--- tests/functional/openlp_core_ui/test_maindisplay.py 2015-12-31 22:46:06 +0000
+++ tests/functional/openlp_core_ui/test_maindisplay.py 2016-01-07 22:31:35 +0000
@@ -22,7 +22,7 @@
"""
Package to test the openlp.core.ui.slidecontroller package.
"""
-from unittest import TestCase
+from unittest import TestCase, skipUnless
from PyQt5 import QtCore
@@ -141,13 +141,14 @@
mocked_songs_plugin.refresh_css.assert_called_with(main_display.frame)
mocked_bibles_plugin.refresh_css.assert_called_with(main_display.frame)
- @patch('openlp.core.ui.maindisplay.is_macosx')
+ @skipUnless(is_macosx(), 'Can only run test on Mac OS X due to pyobjc dependency.')
def macosx_display_window_flags_state_test(self, is_macosx):
"""
Test that on Mac OS X we set the proper window flags
"""
+ if not is_macosx():
+ self.skipTest('Can only run test on Mac OS X due to pyobjc dependency.')
# GIVEN: A new SlideController instance on Mac OS X.
- is_macosx.return_value = True
self.screens.set_current_display(0)
display = MagicMock()
@@ -159,12 +160,11 @@
main_display.windowFlags(),
'The window flags should be Qt.Window, and Qt.FramelessWindowHint.')
+ @skipUnless(is_macosx(), 'Can only run test on Mac OS X due to pyobjc dependency.')
def macosx_display_test(self):
"""
Test display on Mac OS X
"""
- if not is_macosx():
- self.skipTest('Can only run test on Mac OS X due to pyobjc dependency.')
# GIVEN: A new SlideController instance on Mac OS X.
self.screens.set_current_display(0)
display = MagicMock()
=== modified file 'tests/interfaces/openlp_core_ui/__init__.py'
--- tests/interfaces/openlp_core_ui/__init__.py 2015-12-31 22:46:06 +0000
+++ tests/interfaces/openlp_core_ui/__init__.py 2016-01-07 22:31:35 +0000
@@ -22,35 +22,3 @@
"""
Module-level functions for the functional test suite
"""
-
-import os
-
-from openlp.core.common import is_win
-
-from tests.interfaces import patch
-from .test_projectormanager import tmpfile
-
-
-def setUp():
- """
- Set up this module of tests
- """
- if not is_win():
- # Wine creates a sharing violation during tests. Ignore.
- try:
- os.remove(tmpfile)
- except:
- pass
-
-
-def tearDown():
- """
- Ensure test suite has been cleaned up after tests
- """
- patch.stopall()
- if not is_win():
- try:
- # In case of changed schema, remove old test file
- os.remove(tmpfile)
- except FileNotFoundError:
- pass
=== modified file 'tests/interfaces/openlp_core_ui/test_projectoreditform.py'
--- tests/interfaces/openlp_core_ui/test_projectoreditform.py 2015-12-31 22:46:06 +0000
+++ tests/interfaces/openlp_core_ui/test_projectoreditform.py 2016-01-07 22:31:35 +0000
@@ -23,7 +23,7 @@
Interface tests to test the openlp.core.ui.projector.editform.ProjectorEditForm()
class and methods.
"""
-
+import os
from unittest import TestCase
from openlp.core.common import Registry, Settings
@@ -32,7 +32,7 @@
from tests.functional import patch
from tests.helpers.testmixin import TestMixin
-from tests.resources.projector.data import TEST1_DATA, TEST2_DATA
+from tests.resources.projector.data import TEST_DB, TEST1_DATA, TEST2_DATA
class TestProjectorEditForm(TestCase, TestMixin):
@@ -49,7 +49,9 @@
self.setup_application()
Registry.create()
with patch('openlp.core.lib.projector.db.init_url') as mocked_init_url:
- mocked_init_url.return_value = 'sqlite://'
+ if os.path.exists(TEST_DB):
+ os.unlink(TEST_DB)
+ mocked_init_url.return_value = 'sqlite:///' + TEST_DB
self.projectordb = ProjectorDB()
self.projector_form = ProjectorEditForm(projectordb=self.projectordb)
@@ -93,11 +95,13 @@
with patch('openlp.core.ui.projector.editform.QDialog.exec'):
# WHEN: Calling edit form with existing projector instance
- self.projector_form.exec(projector=TEST1_DATA)
+ self.projector_form.exec(projector=Projector(**TEST1_DATA))
item = self.projector_form.projector
# THEN: Should be editing an existing entry
self.assertFalse(self.projector_form.new_projector,
'Projector edit form should be marked as existing entry')
- self.assertTrue((item.ip is TEST1_DATA.ip and item.name is TEST1_DATA.name),
+ self.assertTrue((item.ip is TEST1_DATA['ip'] and item.name is TEST1_DATA['name']),
'Projector edit form should have TEST1_DATA() instance to edit')
+
+
=== modified file 'tests/interfaces/openlp_core_ui/test_projectormanager.py'
--- tests/interfaces/openlp_core_ui/test_projectormanager.py 2015-12-31 22:46:06 +0000
+++ tests/interfaces/openlp_core_ui/test_projectormanager.py 2016-01-07 22:31:35 +0000
@@ -22,7 +22,6 @@
"""
Interface tests to test the themeManager class and related methods.
"""
-
import os
from unittest import TestCase
@@ -33,9 +32,7 @@
from openlp.core.ui import ProjectorManager, ProjectorEditForm
from openlp.core.lib.projector.db import Projector, ProjectorDB
-from tests.resources.projector.data import TEST1_DATA, TEST2_DATA, TEST3_DATA
-
-tmpfile = '/tmp/openlp-test-projectormanager.sql'
+from tests.resources.projector.data import TEST_DB, TEST1_DATA, TEST2_DATA, TEST3_DATA
class TestProjectorManager(TestCase, TestMixin):
@@ -49,12 +46,13 @@
self.build_settings()
self.setup_application()
Registry.create()
- if not hasattr(self, 'projector_manager'):
- with patch('openlp.core.lib.projector.db.init_url') as mocked_init_url:
- mocked_init_url.return_value = 'sqlite:///%s' % tmpfile
- self.projectordb = ProjectorDB()
- if not hasattr(self, 'projector_manager'):
- self.projector_manager = ProjectorManager(projectordb=self.projectordb)
+ with patch('openlp.core.lib.projector.db.init_url') as mocked_init_url:
+ if os.path.exists(TEST_DB):
+ os.unlink(TEST_DB)
+ mocked_init_url.return_value = 'sqlite:///%s' % TEST_DB
+ self.projectordb = ProjectorDB()
+ if not hasattr(self, 'projector_manager'):
+ self.projector_manager = ProjectorManager(projectordb=self.projectordb)
def tearDown(self):
"""
=== modified file 'tests/interfaces/openlp_core_ui/test_projectorsourceform.py'
--- tests/interfaces/openlp_core_ui/test_projectorsourceform.py 2015-12-31 22:46:06 +0000
+++ tests/interfaces/openlp_core_ui/test_projectorsourceform.py 2016-01-07 22:31:35 +0000
@@ -20,24 +20,24 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
"""
- :mod: `tests.interfaces.openlp_core_ui.test_projectorsourceform` module
+:mod: `tests.interfaces.openlp_core_ui.test_projectorsourceform` module
- Tests for the Projector Source Select form.
+Tests for the Projector Source Select form.
"""
import logging
log = logging.getLogger(__name__)
log.debug('test_projectorsourceform loaded')
-
+import os
from unittest import TestCase
+
from PyQt5.QtWidgets import QDialog
from tests.functional import patch
-from tests.functional.openlp_core_lib.test_projectordb import tmpfile
from tests.helpers.testmixin import TestMixin
from tests.resources.projector.data import TEST_DB, TEST1_DATA
from openlp.core.common import Registry, Settings
-from openlp.core.lib.projector.db import ProjectorDB
+from openlp.core.lib.projector.db import ProjectorDB, Projector
from openlp.core.lib.projector.constants import PJLINK_DEFAULT_CODES, PJLINK_DEFAULT_SOURCES
from openlp.core.ui.projector.sourceselectform import source_group, SourceSelectSingle
@@ -65,7 +65,9 @@
"""
Set up anything necessary for all tests
"""
- mocked_init_url.return_value = 'sqlite:///{}'.format(tmpfile)
+ if os.path.exists(TEST_DB):
+ os.unlink(TEST_DB)
+ mocked_init_url.return_value = 'sqlite:///{}'.format(TEST_DB)
self.build_settings()
self.setup_application()
Registry.create()
@@ -73,10 +75,10 @@
if not hasattr(self, 'projectordb'):
self.projectordb = ProjectorDB()
# Retrieve/create a database record
- self.projector = self.projectordb.get_projector_by_ip(TEST1_DATA.ip)
+ self.projector = self.projectordb.get_projector_by_ip(TEST1_DATA['ip'])
if not self.projector:
- self.projectordb.add_projector(projector=TEST1_DATA)
- self.projector = self.projectordb.get_projector_by_ip(TEST1_DATA.ip)
+ self.projectordb.add_projector(projector=Projector(**TEST1_DATA))
+ self.projector = self.projectordb.get_projector_by_ip(TEST1_DATA['ip'])
self.projector.dbid = self.projector.id
self.projector.db_item = self.projector
=== modified file 'tests/interfaces/openlp_plugins/bibles/test_lib_http.py'
--- tests/interfaces/openlp_plugins/bibles/test_lib_http.py 2015-12-31 22:46:06 +0000
+++ tests/interfaces/openlp_plugins/bibles/test_lib_http.py 2016-01-07 22:31:35 +0000
@@ -130,7 +130,7 @@
# THEN: The list should not be None, and some known bibles should be there
self.assertIsNotNone(bibles)
self.assertIn(('New Int. Readers Version', 'NIRV', 'en'), bibles)
- self.assertIn(('Българската Библия', 'BLG', 'bg'), bibles)
+ self.assertIn(('Священное Писание, Восточный перевод', 'CARS', 'ru'), bibles)
def biblegateway_get_bibles_test(self):
"""
=== modified file 'tests/resources/projector/data.py'
--- tests/resources/projector/data.py 2015-12-31 22:46:06 +0000
+++ tests/resources/projector/data.py 2016-01-07 22:31:35 +0000
@@ -24,28 +24,28 @@
"""
import os
-from openlp.core.lib.projector.db import Projector
+from tempfile import gettempdir
# Test data
-TEST_DB = os.path.join('tmp', 'openlp-test-projectordb.sql')
-
-TEST1_DATA = Projector(ip='111.111.111.111',
- port='1111',
- pin='1111',
- name='___TEST_ONE___',
- location='location one',
- notes='notes one')
-
-TEST2_DATA = Projector(ip='222.222.222.222',
- port='2222',
- pin='2222',
- name='___TEST_TWO___',
- location='location two',
- notes='notes two')
-
-TEST3_DATA = Projector(ip='333.333.333.333',
- port='3333',
- pin='3333',
- name='___TEST_THREE___',
- location='location three',
- notes='notes three')
+TEST_DB = os.path.join(gettempdir(), 'openlp-test-projectordb.sql')
+
+TEST1_DATA = dict(ip='111.111.111.111',
+ port='1111',
+ pin='1111',
+ name='___TEST_ONE___',
+ location='location one',
+ notes='notes one')
+
+TEST2_DATA = dict(ip='222.222.222.222',
+ port='2222',
+ pin='2222',
+ name='___TEST_TWO___',
+ location='location two',
+ notes='notes two')
+
+TEST3_DATA = dict(ip='333.333.333.333',
+ port='3333',
+ pin='3333',
+ name='___TEST_THREE___',
+ location='location three',
+ notes='notes three')
Follow ups