forked from openlp/openlp
Remove pickle from the code now 2.0.2 is in
This commit is contained in:
parent
208e1c2e1e
commit
ba111776ed
@ -28,8 +28,8 @@
|
||||
###############################################################################
|
||||
"""
|
||||
The :mod:`formattingtagform` provides an Tag Edit facility. The Base set are protected and included each time loaded.
|
||||
Custom tags can be defined and saved. The Custom Tag arrays are saved in a pickle so QSettings works on them. Base Tags
|
||||
cannot be changed.
|
||||
Custom tags can be defined and saved. The Custom Tag arrays are saved in a json string so QSettings works on them.
|
||||
Base Tags cannot be changed.
|
||||
"""
|
||||
from PyQt4 import QtGui
|
||||
|
||||
|
@ -30,7 +30,6 @@
|
||||
The service manager sets up, loads, saves and manages services.
|
||||
"""
|
||||
import cgi
|
||||
import cPickle
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
@ -706,7 +705,9 @@ class ServiceManager(QtGui.QWidget, ServiceManagerDialog):
|
||||
if p_file.endswith(u'osj'):
|
||||
items = json.load(file_to)
|
||||
else:
|
||||
items = cPickle.load(file_to)
|
||||
critical_error_message_box(message=translate('OpenLP.ServiceManager',
|
||||
'File is not in a supported format.\n The use OpenLP 2.0.2 or greater to create file.'))
|
||||
return
|
||||
file_to.close()
|
||||
self.new_file()
|
||||
self.set_file_name(file_name)
|
||||
|
@ -1,14 +1,16 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Package to test the openlp.core.lib package.
|
||||
"""
|
||||
import os
|
||||
import json
|
||||
import tempfile
|
||||
from unittest import TestCase
|
||||
from mock import MagicMock, patch
|
||||
|
||||
from openlp.core.lib import ItemCapabilities, ServiceItem, Registry
|
||||
from tests.utils.osdinteraction import read_service_from_file
|
||||
from tests.utils.constants import TEST_RESOURCES_PATH
|
||||
|
||||
from lxml import objectify, etree
|
||||
|
||||
VERSE = u'The Lord said to {r}Noah{/r}: \n'\
|
||||
'There\'s gonna be a {su}floody{/su}, {sb}floody{/sb}\n'\
|
||||
@ -19,6 +21,8 @@ VERSE = u'The Lord said to {r}Noah{/r}: \n'\
|
||||
'r{/pk}{o}e{/o}{pp}n{/pp} of the Lord\n'
|
||||
FOOTER = [u'Arky Arky (Unknown)', u'Public Domain', u'CCLI 123456']
|
||||
|
||||
TEST_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), u'..', u'..', u'resources'))
|
||||
|
||||
|
||||
class TestServiceItem(TestCase):
|
||||
|
||||
@ -45,136 +49,17 @@ class TestServiceItem(TestCase):
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
assert service_item.missing_frames() is True, u'There should not be any frames in the service item'
|
||||
|
||||
def serviceitem_add_text_test(self):
|
||||
"""
|
||||
Test the Service Item - add text test
|
||||
"""
|
||||
# GIVEN: A new service item
|
||||
service_item = ServiceItem(None)
|
||||
|
||||
# WHEN: adding text to a service item
|
||||
service_item.add_from_text(VERSE)
|
||||
service_item.raw_footer = FOOTER
|
||||
|
||||
# THEN: We should get back a valid service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
assert service_item.missing_frames() is False, u'check frames loaded '
|
||||
|
||||
# WHEN: Render called
|
||||
assert len(service_item._display_frames) == 0, u'A blank Service Item with no display frames'
|
||||
service_item.render(True)
|
||||
|
||||
# THEN: We should have a page of output.
|
||||
assert len(service_item._display_frames) == 1, u'A valid rendered Service Item has 1 display frame'
|
||||
assert service_item.get_rendered_frame(0) == VERSE.split(u'\n')[0], u'A output has rendered correctly.'
|
||||
|
||||
def serviceitem_add_image_test(self):
|
||||
"""
|
||||
Test the Service Item - add image test
|
||||
"""
|
||||
# GIVEN: A new service item and a mocked renderer
|
||||
service_item = ServiceItem(None)
|
||||
service_item.name = u'test'
|
||||
|
||||
# WHEN: adding image to a service item
|
||||
test_image = os.path.join(TEST_RESOURCES_PATH, u'church.jpg')
|
||||
service_item.add_from_image(test_image, u'Image Title')
|
||||
|
||||
# THEN: We should get back a valid service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
assert len(service_item._display_frames) == 0, u'The service item has no display frames'
|
||||
|
||||
# THEN: We should have a page of output.
|
||||
assert len(service_item._raw_frames) == 1, u'A valid rendered Service Item has display frames'
|
||||
assert service_item.get_rendered_frame(0) == test_image
|
||||
|
||||
# WHEN: adding a second image to a service item
|
||||
service_item.add_from_image(test_image, u'Image1 Title')
|
||||
|
||||
# THEN: We should have an increased page of output.
|
||||
assert len(service_item._raw_frames) == 2, u'A valid rendered Service Item has display frames'
|
||||
assert service_item.get_rendered_frame(0) == test_image
|
||||
assert service_item.get_rendered_frame(0) == service_item.get_rendered_frame(1)
|
||||
|
||||
# WHEN requesting a saved service item
|
||||
service = service_item.get_service_repr(True)
|
||||
|
||||
# THEN: We should have two parts of the service.
|
||||
assert len(service) == 2, u'A saved service should have two parts'
|
||||
assert service[u'header'][u'name'] == u'test', u'A test plugin should have been returned'
|
||||
assert service[u'data'][0][u'title'] == u'Image Title', u'"Image Title" should be returned as the title'
|
||||
assert service[u'data'][0][u'path'] == test_image, u'The returned path should match the inputted path'
|
||||
assert service[u'data'][0][u'title'] != service[u'data'][1][u'title'], \
|
||||
u'The individual slide titles should not match'
|
||||
assert service[u'data'][0][u'path'] == service[u'data'][1][u'path'], u'The file paths should match'
|
||||
|
||||
# WHEN validating a service item
|
||||
service_item.validate_item([u'jpg'])
|
||||
|
||||
# THEN the service item should be valid
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
|
||||
# WHEN: adding a second image to a service item
|
||||
service_item.add_from_image(u'resources/church1.jpg', u'Image1 Title')
|
||||
|
||||
# WHEN validating a service item
|
||||
service_item.validate_item([u'jpg'])
|
||||
|
||||
# THEN the service item should be valid
|
||||
assert service_item.is_valid is False, u'The service item should not be valid due to validation changes'
|
||||
|
||||
def serviceitem_add_command_test(self):
|
||||
"""
|
||||
Test the Service Item - add command test
|
||||
"""
|
||||
# GIVEN: A new service item and a mocked renderer
|
||||
service_item = ServiceItem(None)
|
||||
service_item.name = u'test'
|
||||
|
||||
# WHEN: adding image to a service item
|
||||
test_file = os.path.join(TEST_RESOURCES_PATH, u'church.jpg')
|
||||
service_item.add_from_command(TEST_RESOURCES_PATH, u'church.jpg', test_file)
|
||||
|
||||
# THEN: We should get back a valid service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
assert len(service_item._display_frames) == 0, u'The service item should have no display frames '
|
||||
|
||||
# THEN: We should have a page of output.
|
||||
assert len(service_item._raw_frames) == 1, u'A valid rendered Service Item should have one raw frame'
|
||||
assert service_item.get_rendered_frame(0) == test_file, u'The image should match the input'
|
||||
|
||||
# WHEN requesting a saved service item
|
||||
service = service_item.get_service_repr(True)
|
||||
|
||||
# THEN: We should have two parts of the service.
|
||||
assert len(service) == 2, u'The saved service should have two parts'
|
||||
assert service[u'header'][u'name'] == u'test', u'A test plugin should be returned'
|
||||
assert service[u'data'][0][u'title'] == u'church.jpg', u'The first title name should be "church,jpg"'
|
||||
assert service[u'data'][0][u'path'] == TEST_RESOURCES_PATH, u'The path should match the input path'
|
||||
assert service[u'data'][0][u'image'] == test_file, u'The image should match the full path to image'
|
||||
|
||||
# WHEN validating a service item
|
||||
service_item.validate_item([u'jpg'])
|
||||
|
||||
# THEN the service item should be valid
|
||||
assert service_item.is_valid is True, u'The service item should be valid'
|
||||
|
||||
# WHEN validating a service item with a different suffix
|
||||
service_item.validate_item([u'png'])
|
||||
|
||||
# THEN the service item should not be valid
|
||||
assert service_item.is_valid is False, u'The service item should not be valid'
|
||||
|
||||
def serviceitem_load_custom_from_service_test(self):
|
||||
"""
|
||||
Test the Service Item - adding a custom slide from a saved service
|
||||
"""
|
||||
# GIVEN: A new service item
|
||||
# GIVEN: A new service item and a mocked add icon function
|
||||
service_item = ServiceItem(None)
|
||||
service_item.add_icon = MagicMock()
|
||||
|
||||
# WHEN: adding a custom from a saved Service
|
||||
service = read_service_from_file(u'serviceitem_custom_1.osd')
|
||||
service_item.set_from_service(service[0])
|
||||
line = self.convert_file_service_item(u'serviceitem_custom_1.osj')
|
||||
service_item.set_from_service(line)
|
||||
|
||||
# THEN: We should get back a valid service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
@ -193,17 +78,19 @@ class TestServiceItem(TestCase):
|
||||
"""
|
||||
Test the Service Item - adding an image from a saved service
|
||||
"""
|
||||
# GIVEN: A new service item
|
||||
# GIVEN: A new service item and a mocked add icon function
|
||||
image_name = u'image_1.jpg'
|
||||
test_file = os.path.join(TEST_RESOURCES_PATH, image_name)
|
||||
test_file = os.path.join(TEST_PATH, image_name)
|
||||
frame_array = {u'path': test_file, u'title': image_name}
|
||||
|
||||
service_item = ServiceItem(None)
|
||||
service_item.add_icon = MagicMock()
|
||||
|
||||
# WHEN: adding an image from a saved Service and mocked exists
|
||||
service = read_service_from_file(u'serviceitem_image_1.osd')
|
||||
with patch('os.path.exists'):
|
||||
service_item.set_from_service(service[0], TEST_RESOURCES_PATH)
|
||||
line = self.convert_file_service_item(u'serviceitem_image_1.osj')
|
||||
with patch(u'openlp.core.ui.servicemanager.os.path.exists') as mocked_exists:
|
||||
mocked_exists.return_value = True
|
||||
service_item.set_from_service(line, TEST_PATH)
|
||||
|
||||
# THEN: We should get back a valid service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
@ -226,7 +113,7 @@ class TestServiceItem(TestCase):
|
||||
"""
|
||||
Test the Service Item - adding an image from a saved local service
|
||||
"""
|
||||
# GIVEN: A new service item
|
||||
# GIVEN: A new service item and a mocked add icon function
|
||||
image_name1 = u'image_1.jpg'
|
||||
image_name2 = u'image_2.jpg'
|
||||
test_file1 = os.path.join(u'/home/openlp', image_name1)
|
||||
@ -235,23 +122,36 @@ class TestServiceItem(TestCase):
|
||||
frame_array2 = {u'path': test_file2, u'title': image_name2}
|
||||
|
||||
service_item = ServiceItem(None)
|
||||
service_item.add_icon = MagicMock()
|
||||
|
||||
service_item2 = ServiceItem(None)
|
||||
service_item2.add_icon = MagicMock()
|
||||
|
||||
# WHEN: adding an image from a saved Service and mocked exists
|
||||
service = read_service_from_file(u'serviceitem_image_2.osd')
|
||||
with patch('os.path.exists'):
|
||||
service_item.set_from_service(service[0])
|
||||
line = self.convert_file_service_item(u'serviceitem_image_2.osj')
|
||||
line2 = self.convert_file_service_item(u'serviceitem_image_2.osj', 1)
|
||||
|
||||
with patch(u'openlp.core.ui.servicemanager.os.path.exists') as mocked_exists:
|
||||
mocked_exists.return_value = True
|
||||
service_item2.set_from_service(line2)
|
||||
service_item.set_from_service(line)
|
||||
|
||||
|
||||
# THEN: We should get back a valid service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
|
||||
# This test is copied from service_item.py, but is changed since to conform to
|
||||
# new layout of service item. The layout use in serviceitem_image_2.osd is actually invalid now.
|
||||
assert service_item.is_valid is True, u'The first service item should be valid'
|
||||
assert service_item2.is_valid is True, u'The second service item should be valid'
|
||||
assert service_item.get_rendered_frame(0) == test_file1, u'The first frame should match the path to the image'
|
||||
assert service_item.get_rendered_frame(1) == test_file2, u'The Second frame should match the path to the image'
|
||||
assert service_item2.get_rendered_frame(0) == test_file2, u'The Second frame should match the path to the image'
|
||||
assert service_item.get_frames()[0] == frame_array1, u'The return should match the frame array1'
|
||||
assert service_item.get_frames()[1] == frame_array2, u'The return should match the frame array2'
|
||||
assert service_item2.get_frames()[0] == frame_array2, u'The return should match the frame array2'
|
||||
assert service_item.get_frame_path(0) == test_file1, u'The frame path should match the full path to the image'
|
||||
assert service_item.get_frame_path(1) == test_file2, u'The frame path should match the full path to the image'
|
||||
assert service_item2.get_frame_path(0) == test_file2, u'The frame path should match the full path to the image'
|
||||
assert service_item.get_frame_title(0) == image_name1, u'The 1st frame title should match the image name'
|
||||
assert service_item.get_frame_title(1) == image_name2, u'The 2nd frame title should match the image name'
|
||||
assert service_item.get_display_title().lower() == service_item.name, \
|
||||
assert service_item2.get_frame_title(0) == image_name2, u'The 2nd frame title should match the image name'
|
||||
assert service_item.title.lower() == service_item.name, \
|
||||
u'The plugin name should match the display title, as there are > 1 Images'
|
||||
assert service_item.is_image() is True, u'This service item should be of an "image" type'
|
||||
assert service_item.is_capable(ItemCapabilities.CanMaintain) is True, \
|
||||
@ -263,22 +163,15 @@ class TestServiceItem(TestCase):
|
||||
assert service_item.is_capable(ItemCapabilities.CanAppend) is True, \
|
||||
u'This service item should be able to have new items added to it'
|
||||
|
||||
def serviceitem_migrate_test_20_22(self):
|
||||
"""
|
||||
Test the Service Item - migrating a media only service item from 2.0 to 2.2 format
|
||||
"""
|
||||
# GIVEN: A new service item and a mocked add icon function
|
||||
service_item = ServiceItem(None)
|
||||
service_item.add_icon = MagicMock()
|
||||
def convert_file_service_item(self, name, row=0):
|
||||
service_file = os.path.join(TEST_PATH, name)
|
||||
try:
|
||||
open_file = open(service_file, u'r')
|
||||
items = json.load(open_file)
|
||||
first_line = items[row]
|
||||
except IOError:
|
||||
first_line = u''
|
||||
finally:
|
||||
open_file.close()
|
||||
return first_line
|
||||
|
||||
# WHEN: adding an media from a saved Service and mocked exists
|
||||
line = read_service_from_file(u'migrate_video_20_22.osd')
|
||||
with patch('os.path.exists'):
|
||||
service_item.set_from_service(line[0], TEST_RESOURCES_PATH)
|
||||
|
||||
# THEN: We should get back a converted service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
assert service_item.processor == u'VLC', u'The Processor should have been set'
|
||||
assert service_item.title is not None, u'The title should be set to a value'
|
||||
assert service_item.is_capable(ItemCapabilities.HasDetailedTitleDisplay) is False, \
|
||||
u'The Capability should have been removed'
|
||||
|
@ -1,261 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Package to test the openlp.core.lib package.
|
||||
"""
|
||||
import os
|
||||
import io
|
||||
import cPickle
|
||||
import json
|
||||
import tempfile
|
||||
from unittest import TestCase
|
||||
from mock import MagicMock, patch
|
||||
|
||||
from openlp.core.lib import ItemCapabilities, ServiceItem, Registry
|
||||
from lxml import objectify, etree
|
||||
|
||||
VERSE = u'The Lord said to {r}Noah{/r}: \n'\
|
||||
'There\'s gonna be a {su}floody{/su}, {sb}floody{/sb}\n'\
|
||||
'The Lord said to {g}Noah{/g}:\n'\
|
||||
'There\'s gonna be a {st}floody{/st}, {it}floody{/it}\n'\
|
||||
'Get those children out of the muddy, muddy \n'\
|
||||
'{r}C{/r}{b}h{/b}{bl}i{/bl}{y}l{/y}{g}d{/g}{pk}'\
|
||||
'r{/pk}{o}e{/o}{pp}n{/pp} of the Lord\n'
|
||||
FOOTER = [u'Arky Arky (Unknown)', u'Public Domain', u'CCLI 123456']
|
||||
|
||||
TEST_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), u'..', u'..', u'resources'))
|
||||
|
||||
|
||||
class TestServiceItem(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
"""
|
||||
Set up the Registry
|
||||
"""
|
||||
Registry.create()
|
||||
mocked_renderer = MagicMock()
|
||||
mocked_renderer.format_slide.return_value = [VERSE]
|
||||
Registry().register(u'renderer', mocked_renderer)
|
||||
Registry().register(u'image_manager', MagicMock())
|
||||
|
||||
def serviceitem_basic_test(self):
|
||||
"""
|
||||
Test the Service Item - basic test
|
||||
"""
|
||||
# GIVEN: A new service item
|
||||
|
||||
# WHEN: A service item is created (without a plugin)
|
||||
service_item = ServiceItem(None)
|
||||
|
||||
# THEN: We should get back a valid service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
assert service_item.missing_frames() is True, u'There should not be any frames in the service item'
|
||||
|
||||
def serviceitem_load_custom_from_service_test(self):
|
||||
"""
|
||||
Test the Service Item - adding a custom slide from a saved service
|
||||
"""
|
||||
# GIVEN: A new service item and a mocked add icon function
|
||||
service_item = ServiceItem(None)
|
||||
service_item.add_icon = MagicMock()
|
||||
|
||||
# WHEN: adding a custom from a saved Service
|
||||
line = self.convert_file_service_item(u'serviceitem_custom_1.osj')
|
||||
service_item.set_from_service(line)
|
||||
|
||||
# THEN: We should get back a valid service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
assert len(service_item._display_frames) == 0, u'The service item should have no display frames'
|
||||
assert len(service_item.capabilities) == 5, u'There should be 5 default custom item capabilities'
|
||||
service_item.render(True)
|
||||
assert service_item.get_display_title() == u'Test Custom', u'The title should be "Test Custom"'
|
||||
assert service_item.get_frames()[0][u'text'] == VERSE[:-1], \
|
||||
u'The returned text matches the input, except the last line feed'
|
||||
assert service_item.get_rendered_frame(1) == VERSE.split(u'\n', 1)[0], u'The first line has been returned'
|
||||
assert service_item.get_frame_title(0) == u'Slide 1', u'"Slide 1" has been returned as the title'
|
||||
assert service_item.get_frame_title(1) == u'Slide 2', u'"Slide 2" has been returned as the title'
|
||||
assert service_item.get_frame_title(2) == u'', u'Blank has been returned as the title of slide 3'
|
||||
|
||||
def serviceitem_load_image_from_service_test(self):
|
||||
"""
|
||||
Test the Service Item - adding an image from a saved service
|
||||
"""
|
||||
# GIVEN: A new service item and a mocked add icon function
|
||||
image_name = u'image_1.jpg'
|
||||
test_file = os.path.join(TEST_PATH, image_name)
|
||||
frame_array = {u'path': test_file, u'title': image_name}
|
||||
|
||||
service_item = ServiceItem(None)
|
||||
service_item.add_icon = MagicMock()
|
||||
|
||||
# WHEN: adding an image from a saved Service and mocked exists
|
||||
line = self.convert_file_service_item(u'serviceitem_image_1.osj')
|
||||
with patch(u'openlp.core.ui.servicemanager.os.path.exists') as mocked_exists:
|
||||
mocked_exists.return_value = True
|
||||
service_item.set_from_service(line, TEST_PATH)
|
||||
|
||||
# THEN: We should get back a valid service item
|
||||
assert service_item.is_valid is True, u'The new service item should be valid'
|
||||
assert service_item.get_rendered_frame(0) == test_file, u'The first frame should match the path to the image'
|
||||
assert service_item.get_frames()[0] == frame_array, u'The return should match frame array1'
|
||||
assert service_item.get_frame_path(0) == test_file, u'The frame path should match the full path to the image'
|
||||
assert service_item.get_frame_title(0) == image_name, u'The frame title should match the image name'
|
||||
assert service_item.get_display_title() == image_name, u'The display title should match the first image name'
|
||||
assert service_item.is_image() is True, u'This service item should be of an "image" type'
|
||||
assert service_item.is_capable(ItemCapabilities.CanMaintain) is True, \
|
||||
u'This service item should be able to be Maintained'
|
||||
assert service_item.is_capable(ItemCapabilities.CanPreview) is True, \
|
||||
u'This service item should be able to be be Previewed'
|
||||
assert service_item.is_capable(ItemCapabilities.CanLoop) is True, \
|
||||
u'This service item should be able to be run in a can be made to Loop'
|
||||
assert service_item.is_capable(ItemCapabilities.CanAppend) is True, \
|
||||
u'This service item should be able to have new items added to it'
|
||||
|
||||
def serviceitem_load_image_from_local_service_test(self):
|
||||
"""
|
||||
Test the Service Item - adding an image from a saved local service
|
||||
"""
|
||||
# GIVEN: A new service item and a mocked add icon function
|
||||
image_name1 = u'image_1.jpg'
|
||||
image_name2 = u'image_2.jpg'
|
||||
test_file1 = os.path.join(u'/home/openlp', image_name1)
|
||||
test_file2 = os.path.join(u'/home/openlp', image_name2)
|
||||
frame_array1 = {u'path': test_file1, u'title': image_name1}
|
||||
frame_array2 = {u'path': test_file2, u'title': image_name2}
|
||||
|
||||
service_item = ServiceItem(None)
|
||||
service_item.add_icon = MagicMock()
|
||||
|
||||
service_item2 = ServiceItem(None)
|
||||
service_item2.add_icon = MagicMock()
|
||||
|
||||
# WHEN: adding an image from a saved Service and mocked exists
|
||||
line = self.convert_file_service_item(u'serviceitem_image_2.osj')
|
||||
line2 = self.convert_file_service_item(u'serviceitem_image_2.osj', 1)
|
||||
|
||||
with patch(u'openlp.core.ui.servicemanager.os.path.exists') as mocked_exists:
|
||||
mocked_exists.return_value = True
|
||||
service_item2.set_from_service(line2)
|
||||
service_item.set_from_service(line)
|
||||
|
||||
|
||||
# THEN: We should get back a valid service item
|
||||
|
||||
# This test is copied from service_item.py, but is changed since to conform to
|
||||
# new layout of service item. The layout use in serviceitem_image_2.osd is actually invalid now.
|
||||
assert service_item.is_valid is True, u'The first service item should be valid'
|
||||
assert service_item2.is_valid is True, u'The second service item should be valid'
|
||||
assert service_item.get_rendered_frame(0) == test_file1, u'The first frame should match the path to the image'
|
||||
assert service_item2.get_rendered_frame(0) == test_file2, u'The Second frame should match the path to the image'
|
||||
assert service_item.get_frames()[0] == frame_array1, u'The return should match the frame array1'
|
||||
assert service_item2.get_frames()[0] == frame_array2, u'The return should match the frame array2'
|
||||
assert service_item.get_frame_path(0) == test_file1, u'The frame path should match the full path to the image'
|
||||
assert service_item2.get_frame_path(0) == test_file2, u'The frame path should match the full path to the image'
|
||||
assert service_item.get_frame_title(0) == image_name1, u'The 1st frame title should match the image name'
|
||||
assert service_item2.get_frame_title(0) == image_name2, u'The 2nd frame title should match the image name'
|
||||
assert service_item.title.lower() == service_item.name, \
|
||||
u'The plugin name should match the display title, as there are > 1 Images'
|
||||
assert service_item.is_image() is True, u'This service item should be of an "image" type'
|
||||
assert service_item.is_capable(ItemCapabilities.CanMaintain) is True, \
|
||||
u'This service item should be able to be Maintained'
|
||||
assert service_item.is_capable(ItemCapabilities.CanPreview) is True, \
|
||||
u'This service item should be able to be be Previewed'
|
||||
assert service_item.is_capable(ItemCapabilities.CanLoop) is True, \
|
||||
u'This service item should be able to be run in a can be made to Loop'
|
||||
assert service_item.is_capable(ItemCapabilities.CanAppend) is True, \
|
||||
u'This service item should be able to have new items added to it'
|
||||
|
||||
def serviceitem_convert_osd2osj_test(self):
|
||||
"""
|
||||
Test the Service Item - load a osd to service_item, convert to json,
|
||||
load again to service_item and compare the old and new service_item.
|
||||
"""
|
||||
# GIVEN: A valid osd (python pickle format) service in file
|
||||
service_file = os.path.join(TEST_PATH, u'serviceitem_osd2osj.osd')
|
||||
osd_service_items = []
|
||||
try:
|
||||
open_file = open(service_file, u'r')
|
||||
osd_service_items = cPickle.load(open_file)
|
||||
except IOError:
|
||||
osd_service_items = []
|
||||
finally:
|
||||
open_file.close()
|
||||
|
||||
# WHEN: Dumping loaded osd service to json format, and save to file and reloading to service
|
||||
json_service_content = json.dumps(osd_service_items)
|
||||
open_file = None
|
||||
open_filename = u''
|
||||
try:
|
||||
(open_filep, open_filename) = tempfile.mkstemp()
|
||||
open_file = open(open_filename, u'w')
|
||||
open_file.write(json_service_content)
|
||||
open_file.close()
|
||||
open_file = open(open_filename, u'r')
|
||||
json_service_content = open_file.read()
|
||||
except IOError:
|
||||
json_service_content = u''
|
||||
finally:
|
||||
open_file.close()
|
||||
os.remove(open_filename)
|
||||
osj_service_items = json.loads(json_service_content)
|
||||
|
||||
# THEN: The service loaded from osj (json format) should be the same as the service loaded from the original osd (python pickle format)
|
||||
|
||||
# Loop over every item and compare the osj with osd version
|
||||
for osd_item, osj_item in zip(osd_service_items, osj_service_items):
|
||||
# Create service item objects
|
||||
service_item_osd = ServiceItem()
|
||||
service_item_osd.add_icon = MagicMock()
|
||||
|
||||
service_item_osj = ServiceItem()
|
||||
service_item_osj.add_icon = MagicMock()
|
||||
|
||||
with patch(u'openlp.core.ui.servicemanager.os.path.exists') as mocked_exists:
|
||||
mocked_exists.return_value = True
|
||||
service_item_osd.set_from_service(osd_item, TEST_PATH)
|
||||
service_item_osj.set_from_service(osj_item, TEST_PATH)
|
||||
|
||||
# Check that the exported/imported attributes are the same
|
||||
assert service_item_osj.is_valid is True, u'The osj service item should be valid'
|
||||
assert service_item_osd.is_valid is True, u'The osd service item should be valid'
|
||||
assert service_item_osj.name == service_item_osd.name , u'The osd and the osj attribute name should be the same!'
|
||||
assert service_item_osj.theme == service_item_osd.theme , u'The osd and the osj attribute theme should be the same!'
|
||||
assert service_item_osj.title == service_item_osd.title , u'The osd and the osj attribute title should be the same!'
|
||||
assert service_item_osj.icon == service_item_osd.icon , u'The osd and the osj attribute icon should be the same!'
|
||||
assert service_item_osj.raw_footer == service_item_osd.raw_footer , u'The osd and the osj attribute raw_footer should be the same!'
|
||||
assert service_item_osj.service_item_type == service_item_osd.service_item_type , u'The osd and the osj attribute service_item_type should be the same!'
|
||||
assert service_item_osj.audit == service_item_osd.audit , u'The osd and the osj attribute audit should be the same!'
|
||||
assert service_item_osj.notes == service_item_osd.notes , u'The osd and the osj attribute notes should be the same!'
|
||||
assert service_item_osj.from_plugin == service_item_osd.from_plugin , u'The osd and the osj attribute from_plugin should be the same!'
|
||||
assert service_item_osj.capabilities == service_item_osd.capabilities , u'The osd and the osj attribute capabilities should be the same!'
|
||||
assert service_item_osj.search_string == service_item_osd.search_string , u'The osd and the osj attribute search_string should be the same!'
|
||||
assert service_item_osj.data_string == service_item_osd.data_string , u'The osd and the osj attribute data_string should be the same!'
|
||||
# Notice that xml_version from osd needs to be utf-8 decoded, since unicode-characters
|
||||
# is written as byte-codes by pickle, while json can escape unicode-characters
|
||||
if service_item_osd.xml_version:
|
||||
assert service_item_osj.xml_version == service_item_osd.xml_version.decode(u'utf-8') , u'The osd and the osj attribute xml_version should be the same!'
|
||||
assert service_item_osj.auto_play_slides_once == service_item_osd.auto_play_slides_once , u'The osd and the osj attribute auto_play_slides_once should be the same!'
|
||||
assert service_item_osj.auto_play_slides_loop == service_item_osd.auto_play_slides_loop , u'The osd and the osj attribute auto_play_slides_loop should be the same!'
|
||||
assert service_item_osj.timed_slide_interval == service_item_osd.timed_slide_interval , u'The osd and the osj attribute timed_slide_interval should be the same!'
|
||||
assert service_item_osj.start_time == service_item_osd.start_time , u'The osd and the osj attribute start_time should be the same!'
|
||||
assert service_item_osj.end_time == service_item_osd.end_time , u'The osd and the osj attribute end_time should be the same!'
|
||||
assert service_item_osj.media_length == service_item_osd.media_length , u'The osd and the osj attribute media_length should be the same!'
|
||||
assert service_item_osj.background_audio == service_item_osd.background_audio , u'The osd and the osj attribute background_audio should be the same!'
|
||||
assert service_item_osj.theme_overwritten == service_item_osd.theme_overwritten , u'The osd and the osj attribute theme_overwritten should be the same!'
|
||||
assert service_item_osj.will_auto_start == service_item_osd.will_auto_start , u'The osd and the osj attribute will_auto_start should be the same!'
|
||||
assert service_item_osj.processor == service_item_osd.processor , u'The osd and the osj attribute processor should be the same!'
|
||||
|
||||
|
||||
|
||||
def convert_file_service_item(self, name, row=0):
|
||||
service_file = os.path.join(TEST_PATH, name)
|
||||
try:
|
||||
open_file = open(service_file, u'r')
|
||||
items = json.load(open_file)
|
||||
first_line = items[row]
|
||||
except IOError:
|
||||
first_line = u''
|
||||
finally:
|
||||
open_file.close()
|
||||
return first_line
|
||||
|
@ -11,6 +11,7 @@ from openlp.core.lib import Registry, ServiceItem
|
||||
from openlp.core.ui import listpreviewwidget
|
||||
from tests.utils.osdinteraction import read_service_from_file
|
||||
|
||||
|
||||
class TestListPreviewWidget(TestCase):
|
||||
|
||||
def setUp(self):
|
||||
@ -41,8 +42,7 @@ class TestListPreviewWidget(TestCase):
|
||||
# GIVEN: A new ListPreviewWidget instance.
|
||||
# WHEN: No SlideItem has been added yet.
|
||||
# THEN: The count of items should be zero.
|
||||
self.assertEqual(self.preview_widget.slide_count(), 0,
|
||||
u'The slide list should be empty.')
|
||||
self.assertEqual(self.preview_widget.slide_count(), 0, u'The slide list should be empty.')
|
||||
|
||||
def initial_slide_number_test(self):
|
||||
"""
|
||||
@ -51,8 +51,7 @@ class TestListPreviewWidget(TestCase):
|
||||
# GIVEN: A new ListPreviewWidget instance.
|
||||
# WHEN: No SlideItem has been added yet.
|
||||
# THEN: The number of the current item should be -1.
|
||||
self.assertEqual(self.preview_widget.current_slide_number(), -1,
|
||||
u'The slide number should be -1.')
|
||||
self.assertEqual(self.preview_widget.current_slide_number(), -1, u'The slide number should be -1.')
|
||||
|
||||
def replace_service_item_test(self):
|
||||
"""
|
||||
@ -60,16 +59,14 @@ class TestListPreviewWidget(TestCase):
|
||||
"""
|
||||
# GIVEN: A ServiceItem with two frames.
|
||||
service_item = ServiceItem(None)
|
||||
service = read_service_from_file(u'serviceitem_image_2.osd')
|
||||
service = read_service_from_file(u'serviceitem_image_3.osj')
|
||||
with patch('os.path.exists'):
|
||||
service_item.set_from_service(service[0])
|
||||
# WHEN: Added to the preview widget.
|
||||
self.preview_widget.replace_service_item(service_item, 1, 1)
|
||||
# THEN: The slide count and number should fit.
|
||||
self.assertEqual(self.preview_widget.slide_count(), 2,
|
||||
u'The slide count should be 2.')
|
||||
self.assertEqual(self.preview_widget.current_slide_number(), 1,
|
||||
u'The current slide number should be 1.')
|
||||
self.assertEqual(self.preview_widget.slide_count(), 2, u'The slide count should be 2.')
|
||||
self.assertEqual(self.preview_widget.current_slide_number(), 1, u'The current slide number should be 1.')
|
||||
|
||||
def change_slide_test(self):
|
||||
"""
|
||||
@ -77,12 +74,11 @@ class TestListPreviewWidget(TestCase):
|
||||
"""
|
||||
# GIVEN: A ServiceItem with two frames content.
|
||||
service_item = ServiceItem(None)
|
||||
service = read_service_from_file(u'serviceitem_image_2.osd')
|
||||
service = read_service_from_file(u'serviceitem_image_3.osj')
|
||||
with patch('os.path.exists'):
|
||||
service_item.set_from_service(service[0])
|
||||
# WHEN: Added to the preview widget and switched to the second frame.
|
||||
self.preview_widget.replace_service_item(service_item, 1, 0)
|
||||
self.preview_widget.change_slide(1)
|
||||
# THEN: The current_slide_number should reflect the change.
|
||||
self.assertEqual(self.preview_widget.current_slide_number(), 1,
|
||||
u'The current slide number should be 1.')
|
||||
self.assertEqual(self.preview_widget.current_slide_number(), 1, u'The current slide number should be 1.')
|
||||
|
@ -1,96 +0,0 @@
|
||||
(lp1
|
||||
(dp2
|
||||
Vserviceitem
|
||||
p3
|
||||
(dp4
|
||||
Vheader
|
||||
p5
|
||||
(dp6
|
||||
Vfooter
|
||||
p7
|
||||
(lp8
|
||||
VTest Custom Credits
|
||||
p9
|
||||
asVaudit
|
||||
p10
|
||||
V
|
||||
sVsearch
|
||||
p11
|
||||
V
|
||||
sVwill_auto_start
|
||||
p12
|
||||
I00
|
||||
sVname
|
||||
p13
|
||||
Vcustom
|
||||
p14
|
||||
sVplugin
|
||||
p15
|
||||
g14
|
||||
sVdata
|
||||
p16
|
||||
V
|
||||
sVnotes
|
||||
p17
|
||||
V
|
||||
sVtitle
|
||||
p18
|
||||
VTest Custom
|
||||
p19
|
||||
sVfrom_plugin
|
||||
p20
|
||||
I00
|
||||
sVcapabilities
|
||||
p21
|
||||
(lp22
|
||||
I2
|
||||
aI1
|
||||
aI5
|
||||
aI13
|
||||
aI8
|
||||
asVmedia_length
|
||||
p23
|
||||
I0
|
||||
sVtheme_overwritten
|
||||
p24
|
||||
I00
|
||||
sVtheme
|
||||
p25
|
||||
NsVxml_version
|
||||
p26
|
||||
NsVend_time
|
||||
p27
|
||||
I0
|
||||
sVbackground_audio
|
||||
p28
|
||||
(lp29
|
||||
sVtype
|
||||
p30
|
||||
I1
|
||||
sVstart_time
|
||||
p31
|
||||
I0
|
||||
sVicon
|
||||
p32
|
||||
V:/plugins/plugin_custom.png
|
||||
p33
|
||||
ssg16
|
||||
(lp34
|
||||
(dp35
|
||||
VverseTag
|
||||
p36
|
||||
NsVraw_slide
|
||||
p37
|
||||
VSlide 1
|
||||
p38
|
||||
sVtitle
|
||||
p39
|
||||
g38
|
||||
sa(dp40
|
||||
g36
|
||||
Nsg37
|
||||
VSlide 2
|
||||
p41
|
||||
sg39
|
||||
g41
|
||||
sassa.
|
@ -1,79 +0,0 @@
|
||||
(lp1
|
||||
(dp2
|
||||
Vserviceitem
|
||||
p3
|
||||
(dp4
|
||||
Vheader
|
||||
p5
|
||||
(dp6
|
||||
Vfooter
|
||||
p7
|
||||
(lp8
|
||||
sVaudit
|
||||
p9
|
||||
V
|
||||
sVsearch
|
||||
p10
|
||||
V
|
||||
sVwill_auto_start
|
||||
p11
|
||||
I00
|
||||
sVname
|
||||
p12
|
||||
Vimages
|
||||
p13
|
||||
sVplugin
|
||||
p14
|
||||
g13
|
||||
sVdata
|
||||
p15
|
||||
V
|
||||
sVnotes
|
||||
p16
|
||||
V
|
||||
sVtitle
|
||||
p17
|
||||
VImages
|
||||
p18
|
||||
sVfrom_plugin
|
||||
p19
|
||||
I00
|
||||
sVcapabilities
|
||||
p20
|
||||
(lp21
|
||||
I3
|
||||
aI1
|
||||
aI5
|
||||
aI6
|
||||
asVmedia_length
|
||||
p22
|
||||
I0
|
||||
sVtheme_overwritten
|
||||
p23
|
||||
I00
|
||||
sVtheme
|
||||
p24
|
||||
I-1
|
||||
sVxml_version
|
||||
p25
|
||||
NsVend_time
|
||||
p26
|
||||
I0
|
||||
sVbackground_audio
|
||||
p27
|
||||
(lp28
|
||||
sVtype
|
||||
p29
|
||||
I2
|
||||
sVstart_time
|
||||
p30
|
||||
I0
|
||||
sVicon
|
||||
p31
|
||||
V:/plugins/plugin_images.png
|
||||
p32
|
||||
ssg15
|
||||
(lp33
|
||||
Vimage_1.jpg
|
||||
p34
|
||||
assa.
|
@ -1,101 +0,0 @@
|
||||
(lp1
|
||||
(dp2
|
||||
Vserviceitem
|
||||
p3
|
||||
(dp4
|
||||
Vheader
|
||||
p5
|
||||
(dp6
|
||||
Vxml_version
|
||||
p7
|
||||
NsVauto_play_slides_loop
|
||||
p8
|
||||
I00
|
||||
sVauto_play_slides_once
|
||||
p9
|
||||
I00
|
||||
sVwill_auto_start
|
||||
p10
|
||||
I00
|
||||
sVtitle
|
||||
p11
|
||||
VImages
|
||||
p12
|
||||
sVcapabilities
|
||||
p13
|
||||
(lp14
|
||||
I3
|
||||
aI1
|
||||
aI5
|
||||
aI6
|
||||
asVtheme
|
||||
p15
|
||||
I-1
|
||||
sVbackground_audio
|
||||
p16
|
||||
(lp17
|
||||
sVicon
|
||||
p18
|
||||
V:/plugins/plugin_images.png
|
||||
p19
|
||||
sVtype
|
||||
p20
|
||||
I2
|
||||
sVstart_time
|
||||
p21
|
||||
I0
|
||||
sVfrom_plugin
|
||||
p22
|
||||
I00
|
||||
sVmedia_length
|
||||
p23
|
||||
I0
|
||||
sVdata
|
||||
p24
|
||||
V
|
||||
sVtimed_slide_interval
|
||||
p25
|
||||
I0
|
||||
sVaudit
|
||||
p26
|
||||
V
|
||||
sVsearch
|
||||
p27
|
||||
V
|
||||
sVname
|
||||
p28
|
||||
Vimages
|
||||
p29
|
||||
sVfooter
|
||||
p30
|
||||
(lp31
|
||||
sVnotes
|
||||
p32
|
||||
V
|
||||
sVplugin
|
||||
p33
|
||||
g29
|
||||
sVtheme_overwritten
|
||||
p34
|
||||
I00
|
||||
sVend_time
|
||||
p35
|
||||
I0
|
||||
ssg24
|
||||
(lp36
|
||||
(dp37
|
||||
Vpath
|
||||
p38
|
||||
V/home/openlp/image_1.jpg
|
||||
p39
|
||||
sg11
|
||||
Vimage_1.jpg
|
||||
p40
|
||||
sa(dp41
|
||||
g38
|
||||
V/home/openlp/image_2.jpg
|
||||
p42
|
||||
sg11
|
||||
Vimage_2.jpg
|
||||
p43
|
||||
sassa.
|
1
tests/resources/serviceitem_image_3.osj
Normal file
1
tests/resources/serviceitem_image_3.osj
Normal file
@ -0,0 +1 @@
|
||||
[{"serviceitem": {"header": {"xml_version": null, "auto_play_slides_loop": false, "auto_play_slides_once": false, "will_auto_start": false, "title": "Images", "capabilities": [3, 1, 5, 6, 3, 1, 5, 6], "theme": -1, "background_audio": [], "icon": ":/plugins/plugin_images.png", "type": 2, "start_time": 0, "from_plugin": false, "media_length": 0, "data": "", "timed_slide_interval": 0, "audit": "", "search": "", "name": "images", "footer": [], "notes": "", "plugin": "images", "theme_overwritten": false, "end_time": 0, "processor": null}, "data": [{"path": "/home/tim/Pictures/Holiday_base/11 November/Holiday - Jon/IMG_7445.JPG", "title": "IMG_7445.JPG"}, {"path": "/home/tim/Pictures/Holiday_base/11 November/Holiday - Jon/IMG_7478.JPG", "title": "IMG_7478.JPG"}]}}]
|
File diff suppressed because it is too large
Load Diff
@ -30,9 +30,8 @@
|
||||
The :mod:`osdinteraction` provides miscellaneous functions for interacting with
|
||||
OSD files.
|
||||
"""
|
||||
|
||||
import os
|
||||
import cPickle
|
||||
import json
|
||||
|
||||
from tests.utils.constants import TEST_RESOURCES_PATH
|
||||
|
||||
@ -45,5 +44,5 @@ def read_service_from_file(file_name):
|
||||
"""
|
||||
service_file = os.path.join(TEST_RESOURCES_PATH, file_name)
|
||||
with open(service_file, u'r') as open_file:
|
||||
service = cPickle.load(open_file)
|
||||
service = json.load(open_file)
|
||||
return service
|
||||
|
Loading…
Reference in New Issue
Block a user