Remove openlyrics tests for easier merging. They will be merged later.

This commit is contained in:
Martin Zibricky 2011-09-12 22:35:39 +02:00
parent 655245051a
commit fb664bed0c
10 changed files with 29 additions and 898 deletions

View File

@ -228,29 +228,26 @@ def main(args=None):
help='Set the Qt4 style (passed directly to Qt4).')
parser.add_option('--testing', dest='testing',
action='store_true', help='Run by testing framework')
# Set up logging
log_path = AppLocation.get_directory(AppLocation.CacheDir)
check_directory_exists(log_path)
filename = os.path.join(log_path, u'openlp.log')
logfile = logging.FileHandler(filename, u'w')
logfile.setFormatter(logging.Formatter(
u'%(asctime)s %(name)-55s %(levelname)-8s %(message)s'))
log.addHandler(logfile)
logging.addLevelName(15, u'Timer')
# Parse command line options and deal with them.
# Use args supplied programatically if possible.
(options, args) = parser.parse_args(args) if args else parser.parse_args()
# Set up logging
# In test mode it is skipped
if not options.testing:
log_path = AppLocation.get_directory(AppLocation.CacheDir)
check_directory_exists(log_path)
filename = os.path.join(log_path, u'openlp.log')
logfile = logging.FileHandler(filename, u'w')
logfile.setFormatter(logging.Formatter(
u'%(asctime)s %(name)-55s %(levelname)-8s %(message)s'))
log.addHandler(logfile)
logging.addLevelName(15, u'Timer')
if options.loglevel.lower() in ['d', 'debug']:
log.setLevel(logging.DEBUG)
print 'Logging to:', filename
elif options.loglevel.lower() in ['w', 'warning']:
log.setLevel(logging.WARNING)
else:
log.setLevel(logging.INFO)
# Deal with other command line options.
qt_args = []
if options.loglevel.lower() in ['d', 'debug']:
log.setLevel(logging.DEBUG)
print 'Logging to:', filename
elif options.loglevel.lower() in ['w', 'warning']:
log.setLevel(logging.WARNING)
else:
log.setLevel(logging.INFO)
if options.style:
qt_args.extend(['-style', options.style])
# Throw the rest of the arguments at Qt, just in case.

View File

@ -127,9 +127,6 @@ class AppLocation(object):
CacheDir = 6
LanguageDir = 7
# Base path where data/config/cache dir is located
BaseDir = None
@staticmethod
def get_directory(dir_type=1):
"""
@ -155,8 +152,6 @@ class AppLocation(object):
os.path.abspath(os.path.split(sys.argv[0])[0]),
_get_os_dir_path(dir_type))
return os.path.join(app_path, u'i18n')
elif dir_type == AppLocation.DataDir and AppLocation.BaseDir:
return os.path.join(AppLocation.BaseDir, 'data')
else:
return _get_os_dir_path(dir_type)

View File

@ -30,137 +30,16 @@
Configuration file for pytest framework.
"""
import os
import sys
import subprocess
import logging
import py.path
from PyQt4 import QtCore
from sqlalchemy.orm import clear_mappers
from openlp.core import main as openlp_main
from openlp.core.utils import AppLocation
from openlp.core.lib.db import Manager
from openlp.plugins.songs.lib.db import init_schema
TESTS_PATH = os.path.dirname(os.path.abspath(__file__))
RESOURCES_PATH = os.path.join(TESTS_PATH, 'resources')
SONGS_PATH = os.path.join(RESOURCES_PATH, 'songs')
# class to setup and teardown settings for running openlp tests
class OpenLPRunner(object):
def __init__(self, tmpdir):
self.tmpdir = tmpdir
self._setup_qapp()
self._setup_logging()
self._cleanup_qsettings()
# override data dir of OpenLP - it points to tmpdir of a test case
AppLocation.BaseDir = tmpdir.strpath
def _setup_qapp(self):
QtCore.QCoreApplication.setOrganizationName(u'OpenLP')
QtCore.QCoreApplication.setOrganizationDomain(u'openlp.org')
QtCore.QCoreApplication.setApplicationName(u'TestOpenLP')
def _setup_logging(self):
# set up logging to stderr/stdout (console)
_handler = logging.StreamHandler(stream=None)
_handler.setFormatter(logging.Formatter(
u'%(asctime)s %(name)-55s %(levelname)-8s %(message)s'))
logging.addLevelName(15, u'Timer')
log = logging.getLogger()
log.addHandler(_handler)
log.setLevel(logging.DEBUG)
def _cleanup_qsettings(self):
# Clean up QSettings for all plugins
# The issue with QSettings is that is global for a running process
# and thus it is necessary to clean it before another test case.
# If it would not be cleaned up it could be saved in the system.
s = QtCore.QSettings()
keys = s.allKeys()
for k in keys:
s.setValue(k, None)
## Public interface
def get_songs_db(self, empty=False):
# return initialized db Manager with empty db or db containing
# some example songs
if not empty:
# copy test data to tmpdir
datadir = self.tmpdir.mkdir(u'data').mkdir(u'songs')
orig_db = py.path.local(SONGS_PATH).join('songs.sqlite')
orig_db.copy(datadir)
manager = Manager('songs', init_schema)
return manager
def get_app(self):
# return QGui.QApplication of OpenLP - this object allows
# running different gui tests and allows access to gui objects
# (e.g MainWindow etc.)
# To allow creating multiple instances of OpenLP in one process
# it would be necessary use diffrent configuration and data files.
# Created instance will use your OpenLP settings.
# Test function argument to make openlp gui instance persistent for all tests.
# All test cases have to access the same instance. To allow create multiple
# instances it would be necessary use diffrent configuraion and data files.
# Created instance will use your OpenLP settings.
def pytest_funcarg__openlpapp(request):
def setup():
return openlp_main(['--testing'])
def teardown(self):
# clean up code to run after running the test case
self._cleanup_qsettings()
# sqlalchemy allows to map classess to only one database at a time
clear_mappers()
# set data dir to original value
AppLocation.BaseDir = None
# Paths with resources for tests
def pytest_funcarg__pth(request):
def setup():
class Pth(object):
def __init__(self):
self.tests = py.path.local(TESTS_PATH)
self.resources = py.path.local(RESOURCES_PATH)
self.songs = py.path.local(SONGS_PATH)
return Pth()
return request.cached_setup(setup=setup, scope='session')
# Test function argument giving access to OpenLP runner
def pytest_funcarg__openlp_runner(request):
def setup():
return OpenLPRunner(request.getfuncargvalue('tmpdir'))
def teardown(openlp_runner):
openlp_runner.teardown()
return request.cached_setup(setup=setup, teardown=teardown, scope='function')
class OpenLyricsValidator(object):
"""Validate xml if it conformns to OpenLyrics xml schema."""
def __init__(self, script, schema):
self.cmd = [sys.executable, script, schema]
def validate(self, file_path):
self.cmd.append(file_path)
print self.cmd
retcode = subprocess.call(self.cmd)
if retcode == 0:
# xml conforms to schema
return True
else:
# xml has invalid syntax
return False
# Test function argument giving access to song database.
def pytest_funcarg__openlyrics_validator(request):
def setup():
script = os.path.join(RESOURCES_PATH, 'openlyrics', 'validate.py')
schema = os.path.join(RESOURCES_PATH, 'openlyrics',
'openlyrics_schema.rng')
return OpenLyricsValidator(script, schema)
return request.cached_setup(setup=setup, scope='session')
def teardown(app):
pass
return request.cached_setup(setup=setup, teardown=teardown, scope='session')

View File

@ -1,472 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
ns="http://openlyrics.info/namespace/2009/song">
<!-- TOP LEVEL -->
<start>
<element name="song">
<ref name="songAttributes"/>
<ref name="properties"/>
<optional>
<ref name="format"/>
</optional>
<ref name="lyrics"/>
</element>
</start>
<define name="properties">
<element name="properties">
<interleave> <!-- allow occur in any order -->
<!-- at least one title is always required -->
<ref name="titles"/>
<!-- other properties items are optional -->
<optional>
<ref name="authors"/>
</optional>
<optional>
<ref name="copyright"/>
</optional>
<optional>
<ref name="ccliNo"/>
</optional>
<optional>
<ref name="releaseDate"/>
</optional>
<!-- Music Info -->
<optional>
<ref name="transposition"/>
</optional>
<optional>
<ref name="tempo"/>
</optional>
<optional>
<ref name="key"/>
</optional>
<!-- Other Info -->
<optional>
<ref name="variant"/>
</optional>
<optional>
<ref name="publisher"/>
</optional>
<optional>
<ref name="customVersion"/>
</optional>
<optional>
<ref name="keywords"/>
</optional>
<optional>
<ref name="verseOrder"/>
</optional>
<optional>
<ref name="songbooks"/>
</optional>
<optional>
<ref name="themes"/>
</optional>
<optional>
<ref name="comments"/>
</optional>
</interleave>
</element>
</define>
<define name="format">
<element name="format">
<ref name="formatTags"/>
</element>
</define>
<define name="lyrics">
<element name="lyrics">
<!-- at least one verse is required -->
<oneOrMore>
<ref name="verse"/>
</oneOrMore>
</element>
</define>
<!-- PROPERTIES -->
<define name="titles">
<element name="titles">
<oneOrMore>
<element name="title">
<ref name="nonEmptyContent"/>
<optional>
<ref name="langAttribute"/>
<optional>
<ref name="translitAttribute"/>
</optional>
</optional>
<optional>
<attribute name="original">
<data type="boolean"/>
</attribute>
</optional>
</element>
</oneOrMore>
</element>
</define>
<!-- AUTHOR info -->
<define name="authors">
<element name="authors">
<oneOrMore>
<element name="author">
<ref name="nonEmptyContent"/>
<optional>
<choice>
<attribute name="type">
<choice>
<value>words</value>
<value>music</value>
</choice>
</attribute>
<!-- when attrib 'type' value is 'translation' require attribute 'lang'.
'xml:lang' can't be used. xml:lang means in what language is the
content of an element and this is not the case. -->
<group>
<attribute name="type">
<value>translation</value>
</attribute>
<ref name="langAttribute"/>
</group>
</choice>
</optional>
</element>
</oneOrMore>
</element>
</define>
<define name="copyright">
<element name="copyright">
<ref name="nonEmptyContent"/>
</element>
</define>
<define name="ccliNo">
<element name="ccliNo">
<data type="positiveInteger"/>
</element>
</define>
<define name="releaseDate">
<element name="releaseDate">
<!-- allowed values
1779
1779-12
1779-12-31
1779-12-31T13:15:30+01:00 -->
<choice>
<data type="gYear"/>
<data type="gYearMonth"/>
<data type="date"/>
<data type="dateTime"/>
</choice>
</element>
</define>
<!-- MUSIC INFO -->
<define name="transposition">
<element name="transposition">
<data type="integer">
<param name="minInclusive">-99</param>
<param name="maxInclusive">99</param>
</data>
</element>
</define>
<define name="tempo">
<element name="tempo">
<choice>
<!-- attrib 'type' value 'bpm' - beatss per minute required -->
<group>
<data type="positiveInteger">
<param name="minInclusive">30</param>
<param name="maxInclusive">250</param>
</data>
<attribute name="type">
<value>bpm</value>
</attribute>
</group>
<!-- attrib 'type' value 'text' - any text -->
<group>
<ref name="nonEmptyContent"/>
<attribute name="type">
<value>text</value>
</attribute>
</group>
</choice>
</element>
</define>
<define name="key">
<element name="key">
<ref name="nonEmptyContent"/>
</element>
</define>
<!-- OTHER INFO -->
<define name="variant">
<element name="variant">
<ref name="nonEmptyContent"/>
</element>
</define>
<define name="publisher">
<element name="publisher">
<ref name="nonEmptyContent"/>
</element>
</define>
<define name="customVersion">
<element name="customVersion">
<ref name="nonEmptyContent"/>
</element>
</define>
<define name="keywords">
<element name="keywords">
<ref name="nonEmptyContent"/>
</element>
</define>
<define name="verseOrder">
<element name="verseOrder">
<list>
<oneOrMore>
<ref name="verseNameType"/>
</oneOrMore>
</list>
</element>
</define>
<define name="songbooks">
<element name="songbooks">
<oneOrMore>
<element name="songbook">
<attribute name="name">
<ref name="nonEmptyContent"/>
</attribute>
<optional>
<!-- 'entry' is like song number but song number must not
always be integer and it can contain letters.
examples: '153c' or '023', etc. -->
<attribute name="entry">
<ref name="nonEmptyContent"/>
</attribute>
</optional>
</element>
</oneOrMore>
</element>
</define>
<define name="themes">
<element name="themes">
<oneOrMore>
<element name="theme">
<ref name="nonEmptyContent"/>
<optional>
<!-- id: line in a ccli theme list from
http://www.ccli.com.au/owners/themes.cfm -->
<attribute name="id">
<data type="positiveInteger">
<param name="minInclusive">1</param>
<param name="maxInclusive">999</param>
</data>
</attribute>
</optional>
<optional>
<ref name="langAttribute"/>
<optional>
<ref name="translitAttribute"/>
</optional>
</optional>
</element>
</oneOrMore>
</element>
</define>
<define name="comments">
<element name="comments">
<oneOrMore>
<element name="comment">
<ref name="nonEmptyContent"/>
</element>
</oneOrMore>
</element>
</define>
<!-- FORMAT -->
<define name="formatTags">
<!-- Allow only one set of formatting tags for lyrics -->
<element name="tags">
<attribute name="application">
<ref name="nonEmptyContent"/>
</attribute>
<oneOrMore>
<ref name="formatTagsTag"/>
</oneOrMore>
</element>
</define>
<define name="formatTagsTag">
<element name="tag">
<attribute name="name">
<ref name="nonEmptyContent"/>
</attribute>
<element name="open">
<ref name="nonEmptyContent"/>
</element>
<element name="close">
<ref name="nonEmptyContent"/>
</element>
</element>
</define>
<!-- LYRICS -->
<define name="verse">
<element name="verse">
<ref name="verseAttributes"/>
<optional>
<ref name="langAttribute"/>
<optional>
<ref name="translitAttribute"/>
</optional>
</optional>
<oneOrMore>
<ref name="lines"/>
</oneOrMore>
</element>
</define>
<define name="lines">
<element name="lines">
<optional>
<attribute name="part">
<ref name="nonEmptyContent"/>
</attribute>
</optional>
<optional>
<attribute name="break">
<value>optional</value>
</attribute>
</optional>
<oneOrMore>
<optional>
<element name="comment">
<ref name="nonEmptyContent"/>
</element>
</optional>
<element name="line">
<!-- allow tag chord inside regular text - mixed content -->
<zeroOrMore>
<optional>
<ref name="chord"/>
</optional>
<!-- allow tag 'tag' inside regular text - mixed content -->
<optional>
<ref name="tag"/>
</optional>
<text/>
</zeroOrMore>
</element>
</oneOrMore>
</element>
</define>
<define name="chord">
<element name="chord">
<attribute name="name">
<ref name="nonEmptyContent"/>
</attribute>
<empty/>
</element>
</define>
<define name="tag">
<element name="tag">
<attribute name="name">
<ref name="nonEmptyContent"/>
</attribute>
<!-- allow using more formatting tags for text -->
<!-- e.g. <tag name="bold"><tag name="red">my text</tag></tag> -->
<choice>
<ref name="nonEmptyContent"/>
<ref name="tag"/>
</choice>
</element>
</define>
<define name="verseAttributes">
<attribute name="name">
<ref name="verseNameType"/>
</attribute>
</define>
<define name="songAttributes">
<!-- by default: value of type string is required in attr -->
<attribute name="version">
<data type="NMTOKEN"> <!-- one word value -->
<!-- allow only values like: '0.1' '11.2' '13.14.15' -->
<param name="pattern">[0-9]+\.[0-9]+(\.[0-9]+)?</param>
</data>
</attribute>
<attribute name="createdIn">
<ref name="nonEmptyContent"/>
</attribute>
<attribute name="modifiedIn">
<ref name="nonEmptyContent"/>
</attribute>
<attribute name="modifiedDate">
<!-- date format: ISO 8601 -->
<data type="dateTime"/>
</attribute>
</define>
<define name="verseNameType">
<choice>
<data type="NMTOKEN">
<param name="minLength">1</param>
<!-- verse - v1, v2, v1a, ... 3 letters: [verse][verse_number][verse_part]
chorus c, c1, c2, c1a, ca, ...
pre-chorus - p, p1, p2, p1a, pa, ...
bridge - b, b1, b2, b1a, ba, ...
ending - e, e1, e2, e1a, ea, ... -->
<param name="pattern">(v[1-9]\d?[a-z]?)|([cpb][a-z]?)|([cpbe][1-9]\d?[a-z]?)</param>
</data>
<!-- custom values of verse name - one word name -->
<data type="NMTOKEN"/>
</choice>
</define>
<define name="langAttribute">
<attribute name="lang">
<data type="language"/>
</attribute>
</define>
<!-- transliteration -->
<define name="translitAttribute">
<attribute name="translit">
<data type="language"/>
</attribute>
</define>
<define name="nonEmptyContent">
<data type="string">
<param name="minLength">1</param>
</data>
</define>
</grammar>

View File

@ -1,26 +0,0 @@
#!/usr/bin/env python
import sys
try:
from lxml import etree
except ImportError:
print('Python module "lxml" is required')
exit(1)
if len(sys.argv) != 3:
print('Usage: python %s openlyrics_schema.rng xmlfile.xml' % __file__)
exit(1)
relaxng_file = sys.argv[1]
xml_file = sys.argv[2]
relaxng_doc = etree.parse(relaxng_file)
xml_doc = etree.parse(xml_file)
relaxng = etree.RelaxNG(relaxng_doc)
relaxng.assertValid(xml_doc)

View File

@ -1,102 +0,0 @@
<?xml version='1.0' encoding='utf-8'?>
<song xmlns="http://openlyrics.info/namespace/2009/song" version="0.8" createdIn="OpenLP 1.9.5" modifiedIn="OpenLP 1.9.5" modifiedDate="2011-09-06T20:49:59">
<properties>
<titles>
<title>Jezu Kriste, štědrý kněže</title>
</titles>
<authors>
<author>M. Jan Hus</author>
</authors>
<songbooks>
<songbook name="Jistebnický kancionál"/>
</songbooks>
</properties>
<format>
<tags application="OpenLP">
<tag name="r">
<open>&lt;span style="-webkit-text-fill-color:red"&gt;</open>
<close>&lt;/span&gt;</close>
</tag>
<tag name="bl">
<open>&lt;span style="-webkit-text-fill-color:blue"&gt;</open>
<close>&lt;/span&gt;</close>
</tag>
<tag name="y">
<open>&lt;span style="-webkit-text-fill-color:yellow"&gt;</open>
<close>&lt;/span&gt;</close>
</tag>
<tag name="o">
<open>&lt;span style="-webkit-text-fill-color:#FFA500"&gt;</open>
<close>&lt;/span&gt;</close>
</tag>
<tag name="st">
<open>&lt;strong&gt;</open>
<close>&lt;/strong&gt;</close>
</tag>
<tag name="it">
<open>&lt;em&gt;</open>
<close>&lt;/em&gt;</close>
</tag>
<tag name="g">
<open>&lt;span style="-webkit-text-fill-color:green"&gt;</open>
<close>&lt;/span&gt;</close>
</tag>
</tags>
</format>
<lyrics>
<verse name="v1">
<lines>
<line><tag name="r">Jezu Kriste</tag>, štědrý kněže,</line>
<line>s <tag name="bl">Otcem, Duchem</tag> jeden <tag name="y">Bože</tag>,</line>
<line>štědrost Tvá je naše zboží,</line>
<line>z <tag name="o"><tag name="st">Tvé</tag></tag> <tag name="it">milosti</tag>.</line>
</lines>
</verse>
<verse name="v2">
<lines>
<line><tag name="bl">Ty</tag> jsi v světě, bydlil s námi,</line>
<line>Tvé tělo trpělo rány</line>
<line>za nás za hříšné křesťany,</line>
<line>z <tag name="bl">Tvé</tag> milosti.</line>
</lines>
</verse>
<verse name="v3">
<lines>
<line>Ó, <tag name="g">Tvá dobroto</tag> důstojná</line>
<line>a k nám milosti přehojná!</line>
<line>Dáváš nám bohatství mnohá</line>
<line>
<tag name="st">
<tag name="y">z Tvé milosti.</tag>
</tag>
</line>
</lines>
</verse>
<verse name="v4">
<lines>
<line>Ráčils nás sám zastoupiti,</line>
<line>
<tag name="it">život za nás položiti,</tag>
</line>
<line>tak smrt věčnou zahladiti,</line>
<line>z Tvé milosti.</line>
</lines>
</verse>
<verse name="v5">
<lines>
<line>Ó, křesťané, z bludů vstaňme,</line>
<line>dané dobro nám poznejme,</line>
<line>k Synu Božímu chvátejme,</line>
<line>k té milosti!</line>
</lines>
</verse>
<verse name="v6">
<lines>
<line>Chvála budiž Bohu Otci,</line>
<line>Synu jeho téže moci,</line>
<line>Duchu jeho rovné moci,</line>
<line>z též milosti!</line>
</lines>
</verse>
</lyrics>
</song>

Binary file not shown.

View File

@ -26,18 +26,11 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
"""
GUI tests
"""
from openlp.core import OpenLP
from openlp.core.ui.mainwindow import MainWindow
# TODO Uncommend when using custom OpenLP configuration is implemented.
# Otherwise it would mess up user's OpenLP settings
#def test_start_app(openlp_runner):
#app = openlp_runner.get_app()
#assert type(app) == OpenLP
#assert type(app.mainWindow) == MainWindow
#assert unicode(app.mainWindow.windowTitle()) == u'OpenLP 2.0'
def test_start_app(openlpapp):
assert type(openlpapp) == OpenLP
assert type(openlpapp.mainWindow) == MainWindow
assert unicode(openlpapp.mainWindow.windowTitle()) == u'OpenLP 2.0'

View File

@ -1,57 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
# Copyright (c) 2008-2011 Raoul Snyman #
# Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan #
# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, #
# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias #
# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund #
# --------------------------------------------------------------------------- #
# 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 #
###############################################################################
"""
OpenLyrics import/export tests
"""
from lxml import etree
from openlp.plugins.songs.lib.db import Song
from openlp.plugins.songs.lib import OpenLyrics
def test_openlyrics_export(openlp_runner, openlyrics_validator, pth, tmpdir):
# export song to file
f = tmpdir.join('out.xml')
db = openlp_runner.get_songs_db()
s = db.get_all_objects(Song)[0]
o = OpenLyrics(db)
xml = o.song_to_xml(s)
tree = etree.ElementTree(etree.fromstring(xml))
tree.write(open(f.strpath, u'w'), encoding=u'utf-8', xml_declaration=True,
pretty_print=True)
# validate file
assert openlyrics_validator.validate(f.strpath) == True
# string comparison with original file line by line
f_orig = pth.songs.join('openlyrics_test_1.xml')
for l, l_orig in zip(f.readlines(), f_orig.readlines()):
# skip line with item modifiedDate - it is unique everytime
if l.startswith('<song xmlns='):
continue
assert l == l_orig

View File

@ -1,76 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
# Copyright (c) 2008-2011 Raoul Snyman #
# Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan #
# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, #
# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias #
# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund #
# --------------------------------------------------------------------------- #
# 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 #
###############################################################################
"""
Songs database tests
"""
import pytest
from sqlalchemy.exc import InvalidRequestError
from sqlalchemy.orm.exc import UnmappedInstanceError
from openlp.plugins.songs.lib.db import Author, Book, MediaFile, Song, Topic
def test_empty_songdb(openlp_runner):
db = openlp_runner.get_songs_db(empty=True)
g = db.get_all_objects
assert g(Author) == []
assert g(Book) == []
assert g(MediaFile) == []
assert g(Song) == []
assert g(Topic) == []
c = db.get_object_count
assert c(Author) == 0
assert c(Book) == 0
assert c(MediaFile) == 0
assert c(Song) == 0
assert c(Topic) == 0
def test_unmapped_class(openlp_runner):
# test class not mapped to any sqlalchemy table
class A(object):
pass
db = openlp_runner.get_songs_db(empty=True)
assert db.save_object(A()) == False
assert db.save_objects([A(), A()]) == False
# no key - new object instance is created from supplied class
assert type(db.get_object(A, key=None)) == A
with pytest.raises(InvalidRequestError):
db.get_object(A, key=1)
with pytest.raises(InvalidRequestError):
db.get_object_filtered(A, filter_clause=None)
with pytest.raises(InvalidRequestError):
db.get_all_objects(A)
with pytest.raises(InvalidRequestError):
db.get_object_count(A)
assert db.delete_object(A, key=None) == False
assert db.delete_all_objects(A) == False