Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

test_widget.py 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. from django import forms
  4. from django.test import TestCase
  5. from django.urls import reverse_lazy
  6. from oscar.apps.catalogue.models import Product
  7. from oscar.forms import widgets
  8. from oscar.test.factories import create_product
  9. class ImageInputTestCase(TestCase):
  10. def test_unbound_context(self):
  11. i = widgets.ImageInput()
  12. ctx = i.get_context('test_input', None, {'id': 'test-image-id'})
  13. self.assertEqual(ctx['image_id'], 'test-image-id-image')
  14. self.assertEqual(ctx['image_url'], '')
  15. self.assertEqual(
  16. ctx['widget']['attrs'],
  17. {'accept': 'image/*', 'id': 'test-image-id'}
  18. )
  19. def test_bound_context(self):
  20. i = widgets.ImageInput()
  21. ctx = i.get_context('test_input', '/dummy-image-value', {'id': 'test-image-id'})
  22. self.assertEqual(ctx['image_url'], '/dummy-image-value')
  23. class TimePickerInputTestCase(TestCase):
  24. def test_div_attrs_context(self):
  25. i = widgets.TimePickerInput(format='%H:%M')
  26. ctx = i.get_context('test_input', None, {})
  27. self.assertEqual(ctx['div_attrs'], {
  28. 'data-oscarWidget': 'time',
  29. 'data-timeFormat': 'hh:ii',
  30. })
  31. def test_icon_classes_context(self):
  32. i = widgets.TimePickerInput(format='%H:%M')
  33. ctx = i.get_context('test_input', None, {})
  34. self.assertEqual(ctx['icon_classes'], 'icon-time glyphicon-time')
  35. def test_input_format_unicode(self):
  36. # Check that the widget can handle unicode formats
  37. i = widgets.TimePickerInput(format='τ-%H:%M')
  38. time = datetime.time(10, 47)
  39. html = i.render('time', time)
  40. self.assertIn('value="τ-10:47"', html)
  41. class DatePickerInputTestCase(TestCase):
  42. def test_div_attrs_context(self):
  43. i = widgets.DatePickerInput(format='%d/%m/%Y')
  44. ctx = i.get_context('test_input', None, {})
  45. self.assertEqual(ctx['div_attrs'], {
  46. 'data-oscarWidget': 'date',
  47. 'data-dateFormat': 'dd/mm/yyyy',
  48. })
  49. def test_icon_classes_context(self):
  50. i = widgets.DatePickerInput(format='%H:%M')
  51. ctx = i.get_context('test_input', None, {})
  52. self.assertEqual(ctx['icon_classes'], 'icon-calendar glyphicon-calendar')
  53. def test_datepickerinput_format_unicode(self):
  54. # Check that the widget can handle unicode formats
  55. i = widgets.DatePickerInput(format='δ-%d/%m/%Y')
  56. date = datetime.date(2017, 5, 1)
  57. html = i.render('date', date)
  58. self.assertIn('value="δ-01/05/2017"', html)
  59. class DateTimePickerInputTestCase(TestCase):
  60. def test_div_attrs_context(self):
  61. i = widgets.DateTimePickerInput(format='%d/%m/%Y %H:%M')
  62. ctx = i.get_context('test_input', None, {})
  63. self.assertEqual(ctx['div_attrs'], {
  64. 'data-oscarWidget': 'datetime',
  65. 'data-datetimeFormat': 'dd/mm/yyyy hh:ii',
  66. })
  67. def test_icon_classes_context(self):
  68. i = widgets.DateTimePickerInput(format='%d/%m/%Y %H:%M')
  69. ctx = i.get_context('test_input', None, {})
  70. self.assertEqual(ctx['icon_classes'], 'icon-calendar glyphicon-calendar')
  71. def test_datetimepickerinput_format_unicode(self):
  72. # Check that the widget can handle unicode formats
  73. i = widgets.DateTimePickerInput(format='δ-%d/%m/%Y %H:%M')
  74. date = datetime.datetime(2017, 5, 1, 10, 57)
  75. html = i.render('datetime', date)
  76. self.assertIn('value="δ-01/05/2017 10:57"', html)
  77. class TestWidgetsDatetimeFormat(TestCase):
  78. def test_datetime_to_date_format_conversion(self):
  79. format_testcases = (
  80. ('%Y-%m-%d', 'yyyy-mm-dd'),
  81. ('%Y-%m-%d %H:%M', 'yyyy-mm-dd'),
  82. )
  83. for format_, expected in format_testcases:
  84. self.assertEqual(widgets.datetime_format_to_js_date_format(format_), expected)
  85. def test_datetime_to_time_format_conversion(self):
  86. format_testcases = (
  87. ('%Y-%m-%d %H:%M', 'hh:ii'),
  88. ('%H:%M', 'hh:ii'),
  89. )
  90. for format_, expected in format_testcases:
  91. self.assertEqual(widgets.datetime_format_to_js_time_format(format_), expected)
  92. class AdvancedSelectWidgetTestCase(TestCase):
  93. def test_widget_disabled_options(self):
  94. choices = (
  95. ('red', 'Red'),
  96. ('blue', 'Blue'),
  97. ('green', 'Green'),
  98. )
  99. disabled_values = ('red', 'green')
  100. i = widgets.AdvancedSelect(choices=choices, disabled_values=disabled_values)
  101. html = i.render('advselect', [])
  102. self.assertInHTML('<option value="blue">Blue</option>', html, count=1)
  103. self.assertInHTML('<option value="red" disabled>Red</option>', html, count=1)
  104. self.assertInHTML('<option value="green" disabled>Green</option>', html, count=1)
  105. class RemoteSelectTestCase(TestCase):
  106. def setUp(self):
  107. self.url = reverse_lazy('dashboard:catalogue-product-lookup')
  108. def _get_form_field(self, **kwargs):
  109. return forms.ModelChoiceField(
  110. queryset=Product.objects.all(),
  111. widget=widgets.RemoteSelect(lookup_url=self.url),
  112. **kwargs
  113. )
  114. def _get_multiselect_form_field(self, **kwargs):
  115. return forms.ModelChoiceField(
  116. queryset=Product.objects.all(),
  117. widget=widgets.MultipleRemoteSelect(lookup_url=self.url),
  118. **kwargs
  119. )
  120. def test_remote_url_required(self):
  121. with self.assertRaises(ValueError):
  122. widgets.RemoteSelect()
  123. def test_select_widget_renders_only_selected_choices(self):
  124. create_product()
  125. p2 = create_product()
  126. field = self._get_form_field()
  127. form_choices = list(field.widget.options(name='name', value=[p2.pk]))
  128. # We should only have one choice, not two
  129. self.assertEqual(len(form_choices), 1)
  130. self.assertEqual(form_choices[0]['value'], p2.pk)
  131. def test_widget_attrs(self):
  132. field = self._get_form_field()
  133. attrs = field.widget.get_context(name='my_field', value=None, attrs={})['widget']['attrs']
  134. self.assertEqual(attrs['data-multiple'], '')
  135. self.assertEqual(attrs['data-required'], 'required')
  136. self.assertEqual(attrs['data-ajax-url'], self.url)
  137. def test_not_required_widget_attrs(self):
  138. field = self._get_multiselect_form_field(required=False)
  139. attrs = field.widget.get_context(name='my_field', value=None, attrs={})['widget']['attrs']
  140. self.assertEqual(attrs['data-required'], '')
  141. def test_multiselect_widget_renders_only_selected_choices(self):
  142. create_product()
  143. p2 = create_product()
  144. p3 = create_product()
  145. field = self._get_multiselect_form_field()
  146. form_choices = list(field.widget.options(name='name', value=[p2.pk, p3.pk]))
  147. # We should only have two choices, not three
  148. self.assertEqual(len(form_choices), 2)
  149. def test_multiselect_widget_attrs(self):
  150. field = self._get_multiselect_form_field()
  151. attrs = field.widget.get_context(name='my_field', value=None, attrs={})['widget']['attrs']
  152. self.assertEqual(attrs['data-multiple'], 'multiple')