def setUp(self):
     from Products.LinguaPlone.LanguageIndex import LanguageIndex
     self.index = LanguageIndex('foo')
class TestLanguageIndex(TestCase):

    def setUp(self):
        from Products.LinguaPlone.LanguageIndex import LanguageIndex
        self.index = LanguageIndex('foo')

    def indexData(self):
        for i, entry in enumerate(testdata):
            self.index.index_object(i, entry)

    def search(self, tag, doIndex=True, fallback=None):
        if doIndex:
            self.indexData()
        query = dict(foo=tag)
        if fallback is not None:
            query['foo'] = dict(query=tag, fallback=fallback)
        result = list(self.index._apply_index(query)[0])
        result.sort()
        return result

    def testEmpty(self):
        self.assertEqual(len(self.index), 0)
        self.assertEqual(self.index.numObjects(), 0)
        self.assertEqual(self.index.indexSize(), 0)

        self.assertTrue(self.index.getEntryForObject(1234) is None)
        self.assertTrue(self.index._apply_index({'baz': 'bar'}) is None)

        result, attrs = self.index._apply_index({'foo': 'bar'})
        self.assertTrue(not result)
        self.assertEqual(attrs, ('Language', ))

    def testEntryForObject(self):
        self.indexData()

        for i, dummy in enumerate(testdata):
            entry = self.index.getEntryForObject(i)
            self.assertEqual(str(entry), dummy.Language())
            self.assertEqual(entry.cid, dummy.UID())

    def testGetIndexSourceNames(self):
        sources = self.index.getIndexSourceNames()
        self.assertEquals(sources, None)

    def testSimpleSearch(self):
        self.assertEqual(self.search('fr'),
                         [0, 5, 8]) # All the 'fr' translations

    def testSubtagNoFallbacks(self):
        self.assertEqual(self.search('en-gb'),
                         [2, 7, 9]) # All the 'en-gb' translations

    def testSubtagFallbacks(self):
        self.assertEqual(self.search('en-us'),
                         [3, 6, 10]) # 'en-us', 'en' and 'en-ca'

    def testMainFallbacks(self):
        self.assertEqual(self.search('en'),
                         [1, 6, 10]) # 'en', 'en' and 'en-ca'

    def testUnindex(self):
        self.indexData()
        self.assertEqual(len(self.index), 11)

        self.index.unindex_object(0)
        self.index.unindex_object(5)
        self.index.unindex_object(8)

        self.assertEqual(len(self.index), 8)
        self.assertEqual(self.search('fr', False), [])

        self.index.unindex_object(999)
        self.assertEqual(len(self.index), 8)

    def testReindex(self):
        self.indexData()
        self.assertEqual(len(self.index), 11)

        self.index.index_object(0, Dummy('abc', 'de'))
        self.assertEqual(self.search('de', False), [0])
        self.assertEqual(self.search('fr', False), [5, 8])

    def test_remove(self):
        self.indexData()
        entry = self.index._unindex[0]
        self.assert_(entry in self.index._index['fr'][None])
        self.index._remove(entry)
        self.assert_(entry not in self.index._index['fr'][None])

    def test_remove_invalid(self):
        self.indexData()
        entry = IndexEntry(999, 'no', None, 0)
        self.assert_('no' not in self.index._index)
        self.index._remove(entry)
        self.assert_('no' not in self.index._index)

    def test_remove_broken_internals(self):
        self.indexData()
        entry = self.index._unindex[0]
        self.assert_(entry in self.index._index['fr'][None])
        self.index._index[entry.main][entry.sub].remove(entry)
        self.assert_(entry not in self.index._index['fr'][None])
        self.index._remove(entry)
        self.assert_(entry not in self.index._index['fr'][None])

    def testQueryWithFallback(self):
        self.assertEqual(self.search('en', fallback=False), [1, 6])
        self.assertEqual(self.search('en', False, fallback=True), [1, 6, 10])

    def testFallbackProperty(self):
        self.index.fallback = False
        self.assertEqual(self.search('en'), [1, 6])
        self.assertEqual(self.search('en', False, fallback=False), [1, 6])
        self.assertEqual(self.search('en', False, fallback=True), [1, 6, 10])

    def testUniqueValues(self):
        self.indexData()
        self.assert_(self.index.hasUniqueValuesFor(self.index.id))
        result = list(self.index.uniqueValues(name='notme'))
        self.assertEqual(result, [])

        result = list(self.index.uniqueValues())
        result.sort()
        self.assertEqual(result, ['en', 'en-ca', 'en-gb', 'en-us', 'fr'])

        self.index.unindex_object(0)
        self.index.unindex_object(5)
        self.index.unindex_object(8)

        result = list(self.index.uniqueValues())
        result.sort()
        self.assertEqual(result, ['en', 'en-ca', 'en-gb', 'en-us'])

    def testUniqueValuesLengths(self):
        self.indexData()
        result = list(self.index.uniqueValues(withLengths=True))
        result.sort()
        self.assertEqual(result, [('en', 2), ('en-ca', 2), ('en-gb', 3),
                                  ('en-us', 1), ('fr', 3)])

    def testKeyForDocument(self):
        self.indexData()
        self.assertEqual(self.index.keyForDocument(0), 'fr')
        self.assertEqual(self.index.keyForDocument(4), 'en-ca')

    def testDocumentToKeyMap(self):
        self.indexData()
        map = self.index.documentToKeyMap()
        data = list(map.items())
        data.sort()
        self.assertEqual(data,
                         [(0, 'fr'), (1, 'en'), (2, 'en-gb'), (3, 'en-us'),
                          (4, 'en-ca'), (5, 'fr'), (6, 'en'), (7, 'en-gb'),
                          (8, 'fr'), (9, 'en-gb'), (10, 'en-ca')])

    def testIndexableWrapper(self):
        dummy = Dummy('abc', 'en')
        wrapper = DummyIndexableObjectWrapper(dummy)

        self.assertEqual(self.index.index_object(0, wrapper), 1)

        del wrapper._IndexableObjectWrapper__ob
        self.assertEqual(self.index.index_object(0, wrapper), 1)

        del wrapper._obj
        self.assertEqual(self.index.index_object(0, wrapper), 0)

    def testNoLanguageMethod(self):
        class NoLanguageDummy(Dummy):
            def Language(self):
                raise AttributeError('Language')

        dummy = NoLanguageDummy('abc', None)
        self.assertEqual(self.index.index_object(0, dummy), 0)

    def testNoCallableLanguage(self):
        class NoCallableDummy(Dummy):
            Language = None

        dummy = NoCallableDummy('abc', None)
        self.assertEqual(self.index.index_object(0, dummy), 1)

    def testPathologicalIndex(self):
        # This issue surfaced because collective.indexing allowed
        # operations to take place in random order, potentially causing a
        # moved item to disappear from the index (depending on the order
        # of keys in a dict, no less).

        self.index.index_object(0, Dummy('abc', 'de'))
        self.assertEqual(self.search('de', False), [0])

        # Now watch this: We index an object with a new documentId
        # but the same cid and language, e.g. a moved object at its
        # new location.
        self.index.index_object(23, Dummy('abc', 'de'))

        # It doesn't get indexed because hash('abc') already exists
        # in the set at self.index._index['de'][None].
        self.assertEqual(self.search('de', False), [0])
Пример #3
0
 def setUp(self):
     from Products.LinguaPlone.LanguageIndex import LanguageIndex
     self.index = LanguageIndex('foo')
Пример #4
0
class TestLanguageIndex(TestCase):

    def setUp(self):
        from Products.LinguaPlone.LanguageIndex import LanguageIndex
        self.index = LanguageIndex('foo')

    def indexData(self):
        for i, entry in enumerate(testdata):
            self.index.index_object(i, entry)

    def search(self, tag, doIndex=True, fallback=None):
        if doIndex:
            self.indexData()
        query = dict(foo=tag)
        if fallback is not None:
            query['foo'] = dict(query=tag, fallback=fallback)
        result = list(self.index._apply_index(query)[0])
        result.sort()
        return result

    def testEmpty(self):
        self.assertEqual(len(self.index), 0)
        self.assertEqual(self.index.numObjects(), 0)
        self.assertEqual(self.index.indexSize(), 0)

        self.assertTrue(self.index.getEntryForObject(1234) is None)
        self.assertTrue(self.index._apply_index({'baz': 'bar'}) is None)

        result, attrs = self.index._apply_index({'foo': 'bar'})
        self.assertTrue(not result)
        self.assertEqual(attrs, ('Language', ))

    def testEntryForObject(self):
        self.indexData()

        for i, dummy in enumerate(testdata):
            entry = self.index.getEntryForObject(i)
            self.assertEqual(str(entry), dummy.Language())
            self.assertEqual(entry.cid, dummy.UID())

    def testGetIndexSourceNames(self):
        sources = self.index.getIndexSourceNames()
        self.assertEquals(sources, None)

    def testSimpleSearch(self):
        self.assertEqual(self.search('fr'),
                         [0, 5, 8]) # All the 'fr' translations

    def testSubtagNoFallbacks(self):
        self.assertEqual(self.search('en-gb'),
                         [2, 7, 9]) # All the 'en-gb' translations

    def testSubtagFallbacks(self):
        self.assertEqual(self.search('en-us'),
                         [3, 6, 10]) # 'en-us', 'en' and 'en-ca'

    def testMainFallbacks(self):
        self.assertEqual(self.search('en'),
                         [1, 6, 10]) # 'en', 'en' and 'en-ca'

    def testUnindex(self):
        self.indexData()
        self.assertEqual(len(self.index), 11)

        self.index.unindex_object(0)
        self.index.unindex_object(5)
        self.index.unindex_object(8)

        self.assertEqual(len(self.index), 8)
        self.assertEqual(self.search('fr', False), [])

        self.index.unindex_object(999)
        self.assertEqual(len(self.index), 8)

    def testReindex(self):
        self.indexData()
        self.assertEqual(len(self.index), 11)

        self.index.index_object(0, Dummy('abc', 'de'))
        self.assertEqual(self.search('de', False), [0])
        self.assertEqual(self.search('fr', False), [5, 8])

    def test_remove(self):
        self.indexData()
        entry = self.index._unindex[0]
        self.assert_(entry in self.index._index['fr'][None])
        self.index._remove(entry)
        self.assert_(entry not in self.index._index['fr'][None])

    def test_remove_invalid(self):
        self.indexData()
        entry = IndexEntry(999, 'no', None, 0)
        self.assert_('no' not in self.index._index)
        self.index._remove(entry)
        self.assert_('no' not in self.index._index)

    def test_remove_broken_internals(self):
        self.indexData()
        entry = self.index._unindex[0]
        self.assert_(entry in self.index._index['fr'][None])
        self.index._index[entry.main][entry.sub].remove(entry)
        self.assert_(entry not in self.index._index['fr'][None])
        self.index._remove(entry)
        self.assert_(entry not in self.index._index['fr'][None])

    def testQueryWithFallback(self):
        self.assertEqual(self.search('en', fallback=False), [1, 6])
        self.assertEqual(self.search('en', False, fallback=True), [1, 6, 10])

    def testFallbackProperty(self):
        self.index.fallback = False
        self.assertEqual(self.search('en'), [1, 6])
        self.assertEqual(self.search('en', False, fallback=False), [1, 6])
        self.assertEqual(self.search('en', False, fallback=True), [1, 6, 10])

    def testUniqueValues(self):
        self.indexData()
        self.assert_(self.index.hasUniqueValuesFor(self.index.id))
        result = list(self.index.uniqueValues(name='notme'))
        self.assertEqual(result, [])

        result = list(self.index.uniqueValues())
        result.sort()
        self.assertEqual(result, ['en', 'en-ca', 'en-gb', 'en-us', 'fr'])

        self.index.unindex_object(0)
        self.index.unindex_object(5)
        self.index.unindex_object(8)

        result = list(self.index.uniqueValues())
        result.sort()
        self.assertEqual(result, ['en', 'en-ca', 'en-gb', 'en-us'])

    def testUniqueValuesLengths(self):
        self.indexData()
        result = list(self.index.uniqueValues(withLengths=True))
        result.sort()
        self.assertEqual(result, [('en', 2), ('en-ca', 2), ('en-gb', 3),
                                  ('en-us', 1), ('fr', 3)])

    def testKeyForDocument(self):
        self.indexData()
        self.assertEqual(self.index.keyForDocument(0), 'fr')
        self.assertEqual(self.index.keyForDocument(4), 'en-ca')

    def testDocumentToKeyMap(self):
        self.indexData()
        map = self.index.documentToKeyMap()
        data = list(map.items())
        data.sort()
        self.assertEqual(data,
                         [(0, 'fr'), (1, 'en'), (2, 'en-gb'), (3, 'en-us'),
                          (4, 'en-ca'), (5, 'fr'), (6, 'en'), (7, 'en-gb'),
                          (8, 'fr'), (9, 'en-gb'), (10, 'en-ca')])

    def testIndexableWrapper(self):
        dummy = Dummy('abc', 'en')
        wrapper = DummyIndexableObjectWrapper(dummy)

        self.assertEqual(self.index.index_object(0, wrapper), 1)

        del wrapper._IndexableObjectWrapper__ob
        self.assertEqual(self.index.index_object(0, wrapper), 1)

        del wrapper._obj
        self.assertEqual(self.index.index_object(0, wrapper), 0)

    def testNoLanguageMethod(self):
        class NoLanguageDummy(Dummy):
            def Language(self):
                raise AttributeError('Language')

        dummy = NoLanguageDummy('abc', None)
        self.assertEqual(self.index.index_object(0, dummy), 0)

    def testNoCallableLanguage(self):
        class NoCallableDummy(Dummy):
            Language = None

        dummy = NoCallableDummy('abc', None)
        self.assertEqual(self.index.index_object(0, dummy), 1)

    def testPathologicalIndex(self):
        # This issue surfaced because collective.indexing allowed
        # operations to take place in random order, potentially causing a
        # moved item to disappear from the index (depending on the order
        # of keys in a dict, no less).

        self.index.index_object(0, Dummy('abc', 'de'))
        self.assertEqual(self.search('de', False), [0])

        # Now watch this: We index an object with a new documentId
        # but the same cid and language, e.g. a moved object at its
        # new location.
        self.index.index_object(23, Dummy('abc', 'de'))

        # It doesn't get indexed because hash('abc') already exists
        # in the set at self.index._index['de'][None].
        self.assertEqual(self.search('de', False), [0])
 def setUp(self):
     from Products.LinguaPlone.LanguageIndex import LanguageIndex
     self._obj = LanguageIndex('foo_language')
     self._XML = _LANGUAGE_XML
Пример #6
0
class TestLanguageIndex(TestCase):
    def setUp(self):
        from Products.LinguaPlone.LanguageIndex import LanguageIndex
        self.index = LanguageIndex('foo')
        
    def indexData(self):
        for i, entry in enumerate(testdata):
            self.index.index_object(i, entry)
            
    def search(self, tag, doIndex=True, fallback=None):
        if doIndex:
            self.indexData()
        query = dict(foo=tag)
        if fallback is not None:
            query['foo'] = dict(query=tag, fallback=fallback)
        result = list(self.index._apply_index(query)[0])
        result.sort()
        return result
        
    def testEmpty(self):
        self.assertEqual(len(self.index), 0)
        self.assertEqual(self.index.numObjects(), 0)
        self.assertEqual(self.index.indexSize(), 0)
        
        self.assertTrue(self.index.getEntryForObject(1234) is None)
        self.assertTrue(self.index._apply_index({'baz': 'bar'}) is None)
        
        result, attrs = self.index._apply_index({'foo': 'bar'})
        self.assertTrue(not result)
        self.assertEqual(attrs, ('Language',))
        
    def testEntryForObject(self):
        self.indexData()
        
        for i, dummy in enumerate(testdata):
            entry = self.index.getEntryForObject(i)
            self.assertEqual(str(entry), dummy.Language())
            self.assertEqual(entry.cid, dummy.UID())
        
    def testSimpleSearch(self):
        self.assertEqual(self.search('fr'), 
                         [0, 5, 8]) # All the 'fr' translations
        
    def testSubtagNoFallbacks(self):
        self.assertEqual(self.search('en-gb'), 
                         [2, 7, 9]) # All the 'en-gb' translations
        
    def testSubtagFallbacks(self):
        self.assertEqual(self.search('en-us'), 
                         [3, 6, 10]) # 'en-us', 'en' and 'en-ca'
        
    def testMainFallbacks(self):
        self.assertEqual(self.search('en'),
                         [1, 6, 10]) # 'en', 'en' and 'en-ca'
        
    def testUnindex(self):
        self.indexData()

        self.assertEqual(len(self.index), 11)
        
        self.index.unindex_object(0)
        self.index.unindex_object(5)
        self.index.unindex_object(8)
        
        self.assertEqual(len(self.index), 8)
        self.assertEqual(self.search('fr', False), [])
        
    def testReindex(self):
        self.indexData()
        self.index.index_object(0, testdata[0])
        
        self.assertEqual(len(self.index), 11)
        
        self.index.index_object(0, Dummy('abc', 'de'))
        self.assertEqual(self.search('de', False), [0])
        self.assertEqual(self.search('fr', False), [5, 8])
        
    def testQueryWithFallback(self):
        self.assertEqual(self.search('en', fallback=False), [1, 6])
        self.assertEqual(self.search('en', False, fallback=True), [1, 6, 10])
        
    def testFallbackProperty(self):
        self.index.fallback = False
        self.assertEqual(self.search('en'), [1, 6])
        self.assertEqual(self.search('en', False, fallback=False), [1, 6])
        self.assertEqual(self.search('en', False, fallback=True), [1, 6, 10])
        
    def testUniqueValues(self):
        self.indexData()
        result = list(self.index.uniqueValues())
        result.sort()
        self.assertEqual(result, ['en', 'en-ca', 'en-gb', 'en-us', 'fr'])
        
        self.index.unindex_object(0)
        self.index.unindex_object(5)
        self.index.unindex_object(8)
        
        result = list(self.index.uniqueValues())
        result.sort()
        self.assertEqual(result, ['en', 'en-ca', 'en-gb', 'en-us'])
        
    def testUniqueValuesLengths(self):
        self.indexData()
        result = list(self.index.uniqueValues(withLengths=True))
        result.sort()
        self.assertEqual(result, [('en', 2), ('en-ca', 2), ('en-gb', 3), 
                                  ('en-us', 1), ('fr', 3)])
        
    def testKeyForDocument(self):
        self.indexData()
        self.assertEqual(self.index.keyForDocument(0), 'fr')
        self.assertEqual(self.index.keyForDocument(4), 'en-ca')
        
    def testDocumentToKeyMap(self):
        self.indexData()
        map = self.index.documentToKeyMap()
        data = list(map.items())
        data.sort()
        self.assertEqual(data, 
                         [(0, 'fr'), (1, 'en'), (2, 'en-gb'), (3, 'en-us'),
                          (4, 'en-ca'), (5, 'fr'), (6, 'en'), (7, 'en-gb'),
                          (8, 'fr'), (9, 'en-gb'), (10, 'en-ca')])
        
    def testIndexableWrapper(self):
        dummy = Dummy('abc', 'en')
        wrapper = DummyIndexableObjectWrapper(dummy)
        
        self.assertEqual(self.index.index_object(0, wrapper), 1)
        
        del wrapper._IndexableObjectWrapper__ob
        self.assertEqual(self.index.index_object(0, wrapper), 1)
        
        del wrapper._obj
        self.assertEqual(self.index.index_object(0, wrapper), 0)
        
    def testNoLanguageMethod(self):
        class NoLanguageDummy(Dummy):
            def Language(self):
                raise AttributeError('Language')
                
        dummy = NoLanguageDummy('abc', None)
        self.assertEqual(self.index.index_object(0, dummy), 0)
        
    def testNoCallableLanguage(self):
        class NoCallableDummy(Dummy):
            Language = None
            
        dummy = NoCallableDummy('abc', None)
        self.assertEqual(self.index.index_object(0, dummy), 1)