mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
Make the db and server tests locale independent
This commit is contained in:
parent
d1f94b510c
commit
2ed54d1782
@ -218,14 +218,14 @@ class AddRemoveTest(BaseTest):
|
|||||||
authors = cache.fields['authors'].table
|
authors = cache.fields['authors'].table
|
||||||
|
|
||||||
# Delete a single book, with no formats and check cleaning
|
# Delete a single book, with no formats and check cleaning
|
||||||
self.assertIn(_('Unknown'), set(itervalues(authors.id_map)))
|
self.assertIn('Unknown', set(itervalues(authors.id_map)))
|
||||||
olen = len(authors.id_map)
|
olen = len(authors.id_map)
|
||||||
item_id = {v:k for k, v in iteritems(authors.id_map)}[_('Unknown')]
|
item_id = {v:k for k, v in iteritems(authors.id_map)}['Unknown']
|
||||||
cache.remove_books((3,))
|
cache.remove_books((3,))
|
||||||
for c in (cache, self.init_cache()):
|
for c in (cache, self.init_cache()):
|
||||||
table = c.fields['authors'].table
|
table = c.fields['authors'].table
|
||||||
self.assertNotIn(3, c.all_book_ids())
|
self.assertNotIn(3, c.all_book_ids())
|
||||||
self.assertNotIn(_('Unknown'), set(itervalues(table.id_map)))
|
self.assertNotIn('Unknown', set(itervalues(table.id_map)))
|
||||||
self.assertNotIn(item_id, table.asort_map)
|
self.assertNotIn(item_id, table.asort_map)
|
||||||
self.assertNotIn(item_id, table.alink_map)
|
self.assertNotIn(item_id, table.alink_map)
|
||||||
ae(len(table.id_map), olen-1)
|
ae(len(table.id_map), olen-1)
|
||||||
|
@ -130,18 +130,18 @@ class LegacyTest(BaseTest):
|
|||||||
ans[label] = tuple(set(x.split(',')) if x else x for x in ans[label])
|
ans[label] = tuple(set(x.split(',')) if x else x for x in ans[label])
|
||||||
if label == 'series_sort':
|
if label == 'series_sort':
|
||||||
# The old db code did not take book language into account
|
# The old db code did not take book language into account
|
||||||
# when generating series_sort values (the first book has
|
# when generating series_sort values
|
||||||
# lang=deu)
|
ans[label] = None
|
||||||
ans[label] = ans[label][1:]
|
|
||||||
return ans
|
return ans
|
||||||
|
|
||||||
|
db = self.init_legacy()
|
||||||
|
new_vals = get_values(db)
|
||||||
|
db.close()
|
||||||
|
|
||||||
old = self.init_old()
|
old = self.init_old()
|
||||||
old_vals = get_values(old)
|
old_vals = get_values(old)
|
||||||
old.close()
|
old.close()
|
||||||
old = None
|
old = None
|
||||||
db = self.init_legacy()
|
|
||||||
new_vals = get_values(db)
|
|
||||||
db.close()
|
|
||||||
self.assertEqual(old_vals, new_vals)
|
self.assertEqual(old_vals, new_vals)
|
||||||
|
|
||||||
# }}}
|
# }}}
|
||||||
|
@ -12,10 +12,15 @@ from io import BytesIO
|
|||||||
from time import time
|
from time import time
|
||||||
|
|
||||||
from calibre.utils.date import utc_tz
|
from calibre.utils.date import utc_tz
|
||||||
|
from calibre.utils.localization import calibre_langcode_to_name
|
||||||
from calibre.db.tests.base import BaseTest
|
from calibre.db.tests.base import BaseTest
|
||||||
from polyglot.builtins import iteritems, itervalues, range
|
from polyglot.builtins import iteritems, itervalues, range
|
||||||
|
|
||||||
|
|
||||||
|
def p(x):
|
||||||
|
return datetime.datetime.strptime(x, '%Y-%m-%d').replace(tzinfo=utc_tz)
|
||||||
|
|
||||||
|
|
||||||
class ReadingTest(BaseTest):
|
class ReadingTest(BaseTest):
|
||||||
|
|
||||||
def test_read(self): # {{{
|
def test_read(self): # {{{
|
||||||
@ -130,6 +135,9 @@ class ReadingTest(BaseTest):
|
|||||||
'Test sorting'
|
'Test sorting'
|
||||||
cache = self.init_cache()
|
cache = self.init_cache()
|
||||||
ae = self.assertEqual
|
ae = self.assertEqual
|
||||||
|
|
||||||
|
lmap = {x:cache.field_for('languages', x) for x in (1, 2, 3)}
|
||||||
|
lq = sorted(lmap, key=lambda x: calibre_langcode_to_name((lmap[x] or ('',))[0]))
|
||||||
for field, order in iteritems({
|
for field, order in iteritems({
|
||||||
'title' : [2, 1, 3],
|
'title' : [2, 1, 3],
|
||||||
'authors': [2, 1, 3],
|
'authors': [2, 1, 3],
|
||||||
@ -143,7 +151,7 @@ class ReadingTest(BaseTest):
|
|||||||
'timestamp': [2, 1, 3],
|
'timestamp': [2, 1, 3],
|
||||||
'pubdate' : [1, 2, 3],
|
'pubdate' : [1, 2, 3],
|
||||||
'publisher': [3, 2, 1],
|
'publisher': [3, 2, 1],
|
||||||
'languages': [3, 2, 1],
|
'languages': lq,
|
||||||
'comments': [3, 2, 1],
|
'comments': [3, 2, 1],
|
||||||
'#enum' : [3, 2, 1],
|
'#enum' : [3, 2, 1],
|
||||||
'#authors' : [3, 2, 1],
|
'#authors' : [3, 2, 1],
|
||||||
@ -182,7 +190,6 @@ class ReadingTest(BaseTest):
|
|||||||
ae([2, 3, 1], cache.multisort([(field, False)], ids_to_sort=(1, 2, 3)))
|
ae([2, 3, 1], cache.multisort([(field, False)], ids_to_sort=(1, 2, 3)))
|
||||||
|
|
||||||
# Test tweak to sort dates by visible format
|
# Test tweak to sort dates by visible format
|
||||||
from calibre.utils.date import parse_only_date as p
|
|
||||||
from calibre.utils.config_base import Tweak
|
from calibre.utils.config_base import Tweak
|
||||||
ae(cache.set_field('pubdate', {1:p('2001-3-3'), 2:p('2002-2-3'), 3:p('2003-1-3')}), {1, 2, 3})
|
ae(cache.set_field('pubdate', {1:p('2001-3-3'), 2:p('2002-2-3'), 3:p('2003-1-3')}), {1, 2, 3})
|
||||||
ae([1, 2, 3], cache.multisort([('pubdate', True)]))
|
ae([1, 2, 3], cache.multisort([('pubdate', True)]))
|
||||||
@ -285,7 +292,7 @@ class ReadingTest(BaseTest):
|
|||||||
oldvals = {query:set(old.search_getting_ids(query, '')) for query in (
|
oldvals = {query:set(old.search_getting_ids(query, '')) for query in (
|
||||||
# Date tests
|
# Date tests
|
||||||
'date:9/6/2011', 'date:true', 'date:false', 'pubdate:1/9/2011',
|
'date:9/6/2011', 'date:true', 'date:false', 'pubdate:1/9/2011',
|
||||||
'#date:true', 'date:<100daysago', 'date:>9/6/2011',
|
'#date:true', 'date:<100_daysago', 'date:>9/6/2011',
|
||||||
'#date:>9/1/2011', '#date:=2011',
|
'#date:>9/1/2011', '#date:=2011',
|
||||||
|
|
||||||
# Number tests
|
# Number tests
|
||||||
@ -296,8 +303,8 @@ class ReadingTest(BaseTest):
|
|||||||
'series_index:<3',
|
'series_index:<3',
|
||||||
|
|
||||||
# Bool tests
|
# Bool tests
|
||||||
'#yesno:true', '#yesno:false', '#yesno:yes', '#yesno:no',
|
'#yesno:true', '#yesno:false', '#yesno:_yes', '#yesno:_no',
|
||||||
'#yesno:empty',
|
'#yesno:_empty',
|
||||||
|
|
||||||
# Keypair tests
|
# Keypair tests
|
||||||
'identifiers:true', 'identifiers:false', 'identifiers:test',
|
'identifiers:true', 'identifiers:false', 'identifiers:test',
|
||||||
@ -632,14 +639,13 @@ class ReadingTest(BaseTest):
|
|||||||
|
|
||||||
def test_composites(self): # {{{
|
def test_composites(self): # {{{
|
||||||
' Test sorting and searching in composite columns '
|
' Test sorting and searching in composite columns '
|
||||||
from calibre.utils.date import parse_only_date as p
|
|
||||||
cache = self.init_cache()
|
cache = self.init_cache()
|
||||||
cache.create_custom_column('mult', 'CC1', 'composite', True, display={'composite_template': 'b,a,c'})
|
cache.create_custom_column('mult', 'CC1', 'composite', True, display={'composite_template': 'b,a,c'})
|
||||||
cache.create_custom_column('single', 'CC2', 'composite', False, display={'composite_template': 'b,a,c'})
|
cache.create_custom_column('single', 'CC2', 'composite', False, display={'composite_template': 'b,a,c'})
|
||||||
cache.create_custom_column('number', 'CC3', 'composite', False, display={'composite_template': '{#float}', 'composite_sort':'number'})
|
cache.create_custom_column('number', 'CC3', 'composite', False, display={'composite_template': '{#float}', 'composite_sort':'number'})
|
||||||
cache.create_custom_column('size', 'CC4', 'composite', False, display={'composite_template': '{#float:human_readable()}', 'composite_sort':'number'})
|
cache.create_custom_column('size', 'CC4', 'composite', False, display={'composite_template': '{#float:human_readable()}', 'composite_sort':'number'})
|
||||||
cache.create_custom_column('ccdate', 'CC5', 'composite', False,
|
cache.create_custom_column('ccdate', 'CC5', 'composite', False,
|
||||||
display={'composite_template': '{pubdate:format_date(d-M-yy)}', 'composite_sort':'date'})
|
display={'composite_template': "{:'format_date(raw_field('pubdate'), 'dd-MM-yy')'}", 'composite_sort':'date'})
|
||||||
cache.create_custom_column('bool', 'CC6', 'composite', False, display={'composite_template': '{#yesno}', 'composite_sort':'bool'})
|
cache.create_custom_column('bool', 'CC6', 'composite', False, display={'composite_template': '{#yesno}', 'composite_sort':'bool'})
|
||||||
cache.create_custom_column('ccm', 'CC7', 'composite', True, display={'composite_template': '{#tags}'})
|
cache.create_custom_column('ccm', 'CC7', 'composite', True, display={'composite_template': '{#tags}'})
|
||||||
cache.create_custom_column('ccp', 'CC8', 'composite', True, display={'composite_template': '{publisher}'})
|
cache.create_custom_column('ccp', 'CC8', 'composite', True, display={'composite_template': '{publisher}'})
|
||||||
@ -659,7 +665,7 @@ class ReadingTest(BaseTest):
|
|||||||
self.assertEqual([1, 2, 3], cache.multisort([('#size', True)]))
|
self.assertEqual([1, 2, 3], cache.multisort([('#size', True)]))
|
||||||
|
|
||||||
# Test date sorting
|
# Test date sorting
|
||||||
cache.set_field('pubdate', {1:p('2001-2-6'), 2:p('2001-10-6'), 3:p('2001-6-6')})
|
cache.set_field('pubdate', {1:p('2001-02-06'), 2:p('2001-10-06'), 3:p('2001-06-06')})
|
||||||
self.assertEqual([1, 3, 2], cache.multisort([('#ccdate', True)]))
|
self.assertEqual([1, 3, 2], cache.multisort([('#ccdate', True)]))
|
||||||
|
|
||||||
# Test bool sorting
|
# Test bool sorting
|
||||||
@ -692,7 +698,7 @@ class ReadingTest(BaseTest):
|
|||||||
lm2.languages = ['eng']
|
lm2.languages = ['eng']
|
||||||
for mi, books in (
|
for mi, books in (
|
||||||
(Metadata('title one', ['author one']), {2}),
|
(Metadata('title one', ['author one']), {2}),
|
||||||
(Metadata(_('Unknown')), {3}),
|
(Metadata('Unknown', ['Unknown']), {3}),
|
||||||
(Metadata('title two', ['author one']), {1}),
|
(Metadata('title two', ['author one']), {1}),
|
||||||
(lm, {1}),
|
(lm, {1}),
|
||||||
(lm2, set()),
|
(lm2, set()),
|
||||||
|
@ -11,7 +11,7 @@ from collections import namedtuple
|
|||||||
from functools import partial
|
from functools import partial
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
from calibre.ebooks.metadata import author_to_author_sort
|
from calibre.ebooks.metadata import author_to_author_sort, title_sort
|
||||||
from calibre.utils.date import UNDEFINED_DATE
|
from calibre.utils.date import UNDEFINED_DATE
|
||||||
from calibre.db.tests.base import BaseTest, IMG
|
from calibre.db.tests.base import BaseTest, IMG
|
||||||
from polyglot.builtins import iteritems, itervalues
|
from polyglot.builtins import iteritems, itervalues
|
||||||
@ -237,7 +237,7 @@ class WritingTest(BaseTest):
|
|||||||
for name in ('authors', '#authors'):
|
for name in ('authors', '#authors'):
|
||||||
f = cache.fields[name]
|
f = cache.fields[name]
|
||||||
ae(len(f.table.id_map), 3)
|
ae(len(f.table.id_map), 3)
|
||||||
af(cache.set_field(name, {3:None if name == 'authors' else 'Unknown'}))
|
af(cache.set_field(name, {3:'Unknown'}))
|
||||||
ae(cache.set_field(name, {3:'Kovid Goyal & Divok Layog'}), {3})
|
ae(cache.set_field(name, {3:'Kovid Goyal & Divok Layog'}), {3})
|
||||||
ae(cache.set_field(name, {1:'', 2:'An, Author'}), {1,2})
|
ae(cache.set_field(name, {1:'', 2:'An, Author'}), {1,2})
|
||||||
cache2 = self.init_cache(cl)
|
cache2 = self.init_cache(cl)
|
||||||
@ -245,9 +245,9 @@ class WritingTest(BaseTest):
|
|||||||
ae(len(c.fields[name].table.id_map), 4 if name =='authors' else 3)
|
ae(len(c.fields[name].table.id_map), 4 if name =='authors' else 3)
|
||||||
ae(c.field_for(name, 3), ('Kovid Goyal', 'Divok Layog'))
|
ae(c.field_for(name, 3), ('Kovid Goyal', 'Divok Layog'))
|
||||||
ae(c.field_for(name, 2), ('An, Author',))
|
ae(c.field_for(name, 2), ('An, Author',))
|
||||||
ae(c.field_for(name, 1), ('Unknown',) if name=='authors' else ())
|
ae(c.field_for(name, 1), (_('Unknown'),) if name=='authors' else ())
|
||||||
if name == 'authors':
|
if name == 'authors':
|
||||||
ae(c.field_for('author_sort', 1), author_to_author_sort('Unknown'))
|
ae(c.field_for('author_sort', 1), author_to_author_sort(_('Unknown')))
|
||||||
ae(c.field_for('author_sort', 2), author_to_author_sort('An, Author'))
|
ae(c.field_for('author_sort', 2), author_to_author_sort('An, Author'))
|
||||||
ae(c.field_for('author_sort', 3), author_to_author_sort('Kovid Goyal') + ' & ' + author_to_author_sort('Divok Layog'))
|
ae(c.field_for('author_sort', 3), author_to_author_sort('Kovid Goyal') + ' & ' + author_to_author_sort('Divok Layog'))
|
||||||
del cache2
|
del cache2
|
||||||
@ -292,8 +292,8 @@ class WritingTest(BaseTest):
|
|||||||
ae(sf('title', {1:'The Moose', 2:'Cat'}), {1, 2})
|
ae(sf('title', {1:'The Moose', 2:'Cat'}), {1, 2})
|
||||||
cache2 = self.init_cache(cl)
|
cache2 = self.init_cache(cl)
|
||||||
for c in (cache, cache2):
|
for c in (cache, cache2):
|
||||||
ae(c.field_for('sort', 1), 'Moose, The')
|
ae(c.field_for('sort', 1), title_sort('The Moose'))
|
||||||
ae(c.field_for('sort', 2), 'Cat')
|
ae(c.field_for('sort', 2), title_sort('Cat'))
|
||||||
|
|
||||||
# Test setting with the same value repeated
|
# Test setting with the same value repeated
|
||||||
ae(sf('tags', {3: ('a', 'b', 'a')}), {3})
|
ae(sf('tags', {3: ('a', 'b', 'a')}), {3})
|
||||||
|
@ -346,7 +346,7 @@ class ResultCache(SearchQueryParser): # {{{
|
|||||||
untrans_daysago_len = len('_daysago')
|
untrans_daysago_len = len('_daysago')
|
||||||
|
|
||||||
def get_dates_matches(self, location, query, candidates):
|
def get_dates_matches(self, location, query, candidates):
|
||||||
matches = set([])
|
matches = set()
|
||||||
if len(query) < 2:
|
if len(query) < 2:
|
||||||
return matches
|
return matches
|
||||||
|
|
||||||
@ -395,7 +395,7 @@ class ResultCache(SearchQueryParser): # {{{
|
|||||||
qd = now()
|
qd = now()
|
||||||
field_count = 2
|
field_count = 2
|
||||||
elif query.endswith(self.local_daysago) or query.endswith(self.untrans_daysago):
|
elif query.endswith(self.local_daysago) or query.endswith(self.untrans_daysago):
|
||||||
num = query[0:-(self.local_daysago_len if query.endswith(self.local_daysago) else self.untrans_daysago_len)]
|
num = query[0:-(self.untrans_daysago_len if query.endswith(self.untrans_daysago) else self.local_daysago_len)]
|
||||||
try:
|
try:
|
||||||
qd = now() - timedelta(int(num))
|
qd = now() - timedelta(int(num))
|
||||||
except:
|
except:
|
||||||
|
@ -69,9 +69,9 @@ class ContentTest(LibraryBaseTest):
|
|||||||
self.ae(r.status, OK)
|
self.ae(r.status, OK)
|
||||||
self.ae(data, xdata)
|
self.ae(data, xdata)
|
||||||
names = {x['name']:x['url'] for x in data}
|
names = {x['name']:x['url'] for x in data}
|
||||||
for q in ('Newest', 'All books', 'Tags', 'Series', 'Authors', 'Enum', 'Composite Tags'):
|
for q in (_('Newest'), _('All books'), _('Tags'), _('Authors'), _('Enum'), _('Composite Tags')):
|
||||||
self.assertIn(q, names)
|
self.assertIn(q, names)
|
||||||
r, data = request(names['Tags'], prefix='')
|
r, data = request(names[_('Tags')], prefix='')
|
||||||
self.ae(r.status, OK)
|
self.ae(r.status, OK)
|
||||||
names = {x['name']:x['url'] for x in data['items']}
|
names = {x['name']:x['url'] for x in data['items']}
|
||||||
self.ae(set(names), set('Tag One,Tag Two,News'.split(',')))
|
self.ae(set(names), set('Tag One,Tag Two,News'.split(',')))
|
||||||
@ -128,7 +128,7 @@ class ContentTest(LibraryBaseTest):
|
|||||||
ae(set(r(url_for('/ajax/search?query=id:2'))['book_ids']), {2})
|
ae(set(r(url_for('/ajax/search?query=id:2'))['book_ids']), {2})
|
||||||
ae(set(r(url_for('/ajax/search?vl=1'))['book_ids']), {1})
|
ae(set(r(url_for('/ajax/search?vl=1'))['book_ids']), {1})
|
||||||
data = make_request(conn, '/ajax/search', username='inv', password='test', prefix='', method='GET')[1]
|
data = make_request(conn, '/ajax/search', username='inv', password='test', prefix='', method='GET')[1]
|
||||||
ae(data['bad_restriction'], 'Invalid syntax. Expected a lookup name or a word')
|
ae(data['bad_restriction'], _('Invalid syntax. Expected a lookup name or a word'))
|
||||||
|
|
||||||
# books.py
|
# books.py
|
||||||
nf(url_for('/book-manifest', book_id=3, fmt='TXT'))
|
nf(url_for('/book-manifest', book_id=3, fmt='TXT'))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user