You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_munger.py 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. from collections import OrderedDict
  2. from django.test import TestCase
  3. from django.test.utils import override_settings
  4. from django.utils.translation import gettext_lazy as _
  5. from oscar.apps.search import facets
  6. FACET_COUNTS = {
  7. 'dates': {},
  8. 'fields': {
  9. 'category': [('Fiction', 12), ('Horror', 6), ('Comedy', 3)],
  10. 'product_class': [('Book', 18), ('DVD', 3)],
  11. 'rating': [],
  12. },
  13. 'queries': {
  14. 'price_exact:[0 TO 20]': 15,
  15. 'price_exact:[20 TO 40]': 5,
  16. 'price_exact:[40 TO 60]': 1,
  17. 'price_exact:[60 TO *]': 0,
  18. }
  19. }
  20. FACET_COUNTS_WITH_PRICE_RANGE_SELECTED = {
  21. 'dates': {},
  22. 'fields': {
  23. 'category': [('Fiction', 12), ('Horror', 6), ('Comedy', 3)],
  24. 'product_class': [('Book', 18), ('DVD', 3)],
  25. 'rating': [],
  26. },
  27. 'queries': {
  28. 'price_exact:[0 TO 20]': 0,
  29. 'price_exact:[20 TO 40]': 21,
  30. 'price_exact:[40 TO 60]': 0,
  31. 'price_exact:[60 TO *]': 0,
  32. }
  33. }
  34. SEARCH_FACETS = {
  35. 'fields': OrderedDict([
  36. ('product_class', {'name': _('Type'), 'field': 'product_class'}),
  37. ('rating', {'name': _('Rating'), 'field': 'rating'}),
  38. ('category', {'name': _('Category'), 'field': 'category'}),
  39. ]),
  40. 'queries': OrderedDict([
  41. ('price_range',
  42. {
  43. 'name': _('Price range'),
  44. 'field': 'price',
  45. 'queries': [
  46. (_('0 to 20'), '[0 TO 20]'),
  47. (_('20 to 40'), '[20 TO 40]'),
  48. (_('40 to 60'), '[40 TO 60]'),
  49. (_('60+'), '[60 TO *]'),
  50. ]
  51. }),
  52. ]),
  53. }
  54. @override_settings(OSCAR_SEARCH_FACETS=SEARCH_FACETS)
  55. class TestFacetMunger(TestCase):
  56. def test_with_no_facets_selected(self):
  57. munger = facets.FacetMunger(
  58. path='/search?q=test',
  59. selected_multi_facets={},
  60. facet_counts=FACET_COUNTS)
  61. data = munger.facet_data()
  62. self.assertTrue('category' in data)
  63. self.assertEqual(3, len(data['category']['results']))
  64. # Check a sample facet dict has the right keys
  65. datum = data['category']['results'][0]
  66. for key in ('count', 'disabled', 'name', 'select_url',
  67. 'selected', 'show_count'):
  68. self.assertTrue(key in datum)
  69. self.assertEqual(datum['count'], 12)
  70. self.assertEqual(datum['name'], 'Fiction')
  71. self.assertFalse(datum['selected'])
  72. def test_pagination_params_are_reset(self):
  73. munger = facets.FacetMunger(
  74. path='/search?q=test&page=2',
  75. selected_multi_facets={},
  76. facet_counts=FACET_COUNTS)
  77. data = munger.facet_data()
  78. # Check a sample facet dict has the right keys
  79. for facet_data in data.values():
  80. for result in facet_data['results']:
  81. self.assertTrue('page' not in result['select_url'])
  82. def test_with_price_facets_selected(self):
  83. munger = facets.FacetMunger(
  84. path='/search?q=test&selected_facets=price_exact%3A%5B20+TO+40%5D',
  85. selected_multi_facets={'price_exact': ['[20 TO 40]']},
  86. facet_counts=FACET_COUNTS_WITH_PRICE_RANGE_SELECTED)
  87. data = munger.facet_data()
  88. self.assertTrue('price_range' in data)
  89. self.assertEqual(4, len(data['price_range']['results']))
  90. # Check a sample facet dict has the right keys
  91. datum = data['price_range']['results'][1]
  92. for key in ('count', 'disabled', 'name', 'deselect_url',
  93. 'selected', 'show_count'):
  94. self.assertTrue(key in datum)
  95. self.assertEqual(datum['count'], 21)
  96. self.assertTrue(datum['selected'])