diff --git a/tests/xapian_tests/search_indexes.py b/tests/xapian_tests/search_indexes.py index 3e87b27..76c0df4 100644 --- a/tests/xapian_tests/search_indexes.py +++ b/tests/xapian_tests/search_indexes.py @@ -14,5 +14,13 @@ class DocumentIndex(indexes.SearchIndex): name = indexes.CharField(model_attr='name') date = indexes.DateField(model_attr='date') + tags = indexes.MultiValueField() + def get_model(self): return models.Document() + + def prepare_tags(self, obj): + l = [['tag', 'tag-test', 'tag-test-test'], + ['tag', 'tag-test'], + ['tag']] + return l[obj.id % 3] diff --git a/tests/xapian_tests/tests/test_backend.py b/tests/xapian_tests/tests/test_backend.py index 7ed4551..2e91f58 100644 --- a/tests/xapian_tests/tests/test_backend.py +++ b/tests/xapian_tests/tests/test_backend.py @@ -150,7 +150,7 @@ class XapianSimpleMockIndex(indexes.SearchIndex): return '22.34' def prepare_multi_value(self, obj): - return ['multi1', 'multi2'] + return ['tag', 'tag-test', 'tag-test-test'] class HaystackBackendTestCase(object): @@ -288,13 +288,23 @@ class BackendIndexationTestCase(HaystackBackendTestCase, TestCase): self.assertFalse('ZXDECIMAL_NUMBER22.34' in terms) def test_multivalue_field(self): + """ + Regression test for #103 + """ terms = get_terms(self.backend, '-a') - self.assertTrue('multi1' in terms) - self.assertTrue('multi2' in terms) - self.assertTrue('XMULTI_VALUEmulti1' in terms) - self.assertTrue('XMULTI_VALUEmulti2' in terms) - self.assertTrue('ZXMULTI_VALUEmulti2' in terms) - self.assertTrue('Zmulti2' in terms) + self.assertTrue('tag' in terms) + self.assertTrue('tag-test' in terms) + self.assertTrue('tag-test-test' in terms) + + self.assertTrue('XMULTI_VALUEtag' in terms) + self.assertTrue('XMULTI_VALUEtag-test' in terms) + self.assertTrue('XMULTI_VALUEtag-test-test' in terms) + + # these and only these terms + # 3 for the exact term (^{term}$) + self.assertEqual(len([term for term in terms if term.startswith('XMULTI_VALUE')]), 6) + # no stem for exact multivalues. + self.assertEqual(len([term for term in terms if term.startswith('ZXMULTI_VALUE')]), 0) def test_non_ascii_chars(self): terms = get_terms(self.backend, '-a') diff --git a/tests/xapian_tests/tests/test_interface.py b/tests/xapian_tests/tests/test_interface.py index 60fe0fb..3b16a22 100644 --- a/tests/xapian_tests/tests/test_interface.py +++ b/tests/xapian_tests/tests/test_interface.py @@ -193,3 +193,11 @@ class InterfaceTestCase(TestCase): """ self.assertEqual(pks(self.queryset.filter(content='corrup\xe7\xe3o')), pks(Document.objects.filter(summary__contains='corrup\xe7\xe3o'))) + + def test_multi_values_exact_search(self): + """ + Regression test for #103 + """ + self.assertEqual(len(self.queryset.filter(tags__exact='tag')), 12) + self.assertEqual(len(self.queryset.filter(tags__exact='tag-test')), 8) + self.assertEqual(len(self.queryset.filter(tags__exact='tag-test-test')), 4)