class TestSelect2Mixin(object): url = reverse('select2_widget') form = forms.AlbumSelect2WidgetForm() widget_cls = Select2Widget def test_initial_form_class(self): widget = self.widget_cls(attrs={'class': 'my-class'}) assert 'my-class' in widget.render('name', None) assert 'django-select2' in widget.render('name', None) def test_allow_clear(self, db): required_field = self.form.fields['artist'] assert required_field.required is True assert 'data-allow-clear="true"' not in required_field.widget.render( 'artist', None) assert 'data-allow-clear="false"' in required_field.widget.render( 'artist', None) assert '<option></option>' not in required_field.widget.render( 'artist', None) not_required_field = self.form.fields['primary_genre'] assert not_required_field.required is False assert 'data-allow-clear="true"' in not_required_field.widget.render( 'primary_genre', None) assert 'data-allow-clear="false"' not in not_required_field.widget.render( 'primary_genre', None) assert 'data-placeholder' in not_required_field.widget.render( 'primary_genre', None) assert '<option></option>' in not_required_field.widget.render( 'primary_genre', None) def test_no_js_error(self, db, live_server, driver): driver.get(live_server + self.url) with pytest.raises(NoSuchElementException): error = driver.find_element_by_xpath('//body[@JSError]') pytest.fail(error.get_attribute('JSError')) def test_selecting(self, db, live_server, driver): driver.get(live_server + self.url) with pytest.raises(NoSuchElementException): driver.find_element_by_css_selector('.select2-results') elem = driver.find_element_by_css_selector('.select2-selection') elem.click() results = driver.find_element_by_css_selector('.select2-results') assert results.is_displayed() is True elem = results.find_element_by_css_selector('.select2-results__option') elem.click() with pytest.raises(NoSuchElementException): error = driver.find_element_by_xpath('//body[@JSError]') pytest.fail(error.get_attribute('JSError')) def test_data_url(self): with pytest.raises(ValueError): HeavySelect2Widget() widget = HeavySelect2Widget(data_url='/foo/bar') assert widget.get_url() == '/foo/bar'
class TestSelect2Mixin(object): url = reverse('select2_widget') form = forms.AlbumSelect2WidgetForm() multiple_form = forms.AlbumSelect2MultipleWidgetForm() widget_cls = Select2Widget def test_initial_data(self, genres): genre = genres[0] form = self.form.__class__(initial={'primary_genre': genre.pk}) assert text_type(genre) in form.as_p() def test_initial_form_class(self): widget = self.widget_cls(attrs={'class': 'my-class'}) assert 'my-class' in widget.render('name', None) assert 'django-select2' in widget.render('name', None) def test_allow_clear(self, db): required_field = self.form.fields['artist'] assert required_field.required is True assert 'data-allow-clear="true"' not in required_field.widget.render( 'artist', None) assert 'data-allow-clear="false"' in required_field.widget.render( 'artist', None) assert '<option value=""></option>' not in required_field.widget.render( 'artist', None) not_required_field = self.form.fields['primary_genre'] assert not_required_field.required is False assert 'data-allow-clear="true"' in not_required_field.widget.render( 'primary_genre', None) assert 'data-allow-clear="false"' not in not_required_field.widget.render( 'primary_genre', None) assert 'data-placeholder' in not_required_field.widget.render( 'primary_genre', None) assert '<option value=""></option>' in not_required_field.widget.render( 'primary_genre', None) def test_no_js_error(self, db, live_server, driver): driver.get(live_server + self.url) with pytest.raises(NoSuchElementException): error = driver.find_element_by_xpath('//body[@JSError]') pytest.fail(error.get_attribute('JSError')) def test_selecting(self, db, live_server, driver): driver.get(live_server + self.url) with pytest.raises(NoSuchElementException): driver.find_element_by_css_selector('.select2-results') elem = driver.find_element_by_css_selector('.select2-selection') elem.click() results = driver.find_element_by_css_selector('.select2-results') assert results.is_displayed() is True elem = results.find_element_by_css_selector('.select2-results__option') elem.click() with pytest.raises(NoSuchElementException): error = driver.find_element_by_xpath('//body[@JSError]') pytest.fail(error.get_attribute('JSError')) def test_data_url(self): with pytest.raises(ValueError): HeavySelect2Widget() widget = HeavySelect2Widget(data_url='/foo/bar') assert widget.get_url() == '/foo/bar' def test_empty_option(self, db): # Empty options is only required for single selects # https://select2.github.io/options.html#allowClear single_select = self.form.fields['primary_genre'] assert single_select.required is False assert '<option value=""></option>' in single_select.widget.render( 'primary_genre', None) multiple_select = self.multiple_form.fields['featured_artists'] assert multiple_select.required is False assert multiple_select.widget.allow_multiple_selected assert '<option value=""></option>' not in multiple_select.widget.render( 'featured_artists', None) def test_i18n(self): translation.activate('de') assert tuple(Select2Widget().media._js) == ( '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js', '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/i18n/de.js', 'django_select2/django_select2.js') translation.activate('en') assert tuple(Select2Widget().media._js) == ( '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js', '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/i18n/en.js', 'django_select2/django_select2.js') translation.activate('00') assert tuple(Select2Widget().media._js) == ( '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js', 'django_select2/django_select2.js') translation.activate('sr-cyrl') assert tuple(Select2Widget().media._js) == ( '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js', '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/i18n/sr-Cyrl.js', 'django_select2/django_select2.js') translation.activate('zh-cn') assert tuple(Select2Widget().media._js) == ( '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js', '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/i18n/zh-CN.js', 'django_select2/django_select2.js')
class TestSelect2Mixin: url = reverse("select2_widget") form = forms.AlbumSelect2WidgetForm() multiple_form = forms.AlbumSelect2MultipleWidgetForm() widget_cls = Select2Widget def test_initial_data(self, genres): genre = genres[0] form = self.form.__class__(initial={"primary_genre": genre.pk}) assert str(genre) in form.as_p() def test_initial_form_class(self): widget = self.widget_cls(attrs={"class": "my-class"}) assert "my-class" in widget.render("name", None) assert "django-select2" in widget.render("name", None) def test_allow_clear(self, db): required_field = self.form.fields["artist"] assert required_field.required is True assert 'data-allow-clear="true"' not in required_field.widget.render( "artist", None) assert 'data-allow-clear="false"' in required_field.widget.render( "artist", None) assert '<option value=""></option>' not in required_field.widget.render( "artist", None) not_required_field = self.form.fields["primary_genre"] assert not_required_field.required is False assert 'data-allow-clear="true"' in not_required_field.widget.render( "primary_genre", None) assert 'data-allow-clear="false"' not in not_required_field.widget.render( "primary_genre", None) assert "data-placeholder" in not_required_field.widget.render( "primary_genre", None) assert '<option value=""></option>' in not_required_field.widget.render( "primary_genre", None) def test_no_js_error(self, db, live_server, driver): driver.get(live_server + self.url) with pytest.raises(NoSuchElementException): error = driver.find_element_by_xpath("//body[@JSError]") pytest.fail(error.get_attribute("JSError")) def test_selecting(self, db, live_server, driver): driver.get(live_server + self.url) with pytest.raises(NoSuchElementException): driver.find_element_by_css_selector(".select2-results") elem = driver.find_element_by_css_selector(".select2-selection") elem.click() results = driver.find_element_by_css_selector(".select2-results") assert results.is_displayed() is True elem = results.find_element_by_css_selector(".select2-results__option") elem.click() with pytest.raises(NoSuchElementException): error = driver.find_element_by_xpath("//body[@JSError]") pytest.fail(error.get_attribute("JSError")) def test_data_url(self): with pytest.raises(ValueError): HeavySelect2Widget() widget = HeavySelect2Widget(data_url="/foo/bar") assert widget.get_url() == "/foo/bar" def test_empty_option(self, db): # Empty options is only required for single selects # https://select2.github.io/options.html#allowClear single_select = self.form.fields["primary_genre"] assert single_select.required is False assert '<option value=""></option>' in single_select.widget.render( "primary_genre", None) multiple_select = self.multiple_form.fields["featured_artists"] assert multiple_select.required is False assert multiple_select.widget.allow_multiple_selected output = multiple_select.widget.render("featured_artists", None) assert '<option value=""></option>' not in output assert 'data-placeholder=""' in output def test_i18n(self): translation.activate("de") assert tuple(Select2Widget().media._js) == ( f"https://cdnjs.cloudflare.com/ajax/libs/select2/{settings.SELECT2_LIB_VERSION}/js/select2.min.js", f"https://cdnjs.cloudflare.com/ajax/libs/select2/{settings.SELECT2_LIB_VERSION}/js/i18n/de.js", "django_select2/django_select2.js", ) translation.activate("en") assert tuple(Select2Widget().media._js) == ( f"https://cdnjs.cloudflare.com/ajax/libs/select2/{settings.SELECT2_LIB_VERSION}/js/select2.min.js", f"https://cdnjs.cloudflare.com/ajax/libs/select2/{settings.SELECT2_LIB_VERSION}/js/i18n/en.js", "django_select2/django_select2.js", ) translation.activate("00") assert tuple(Select2Widget().media._js) == ( f"https://cdnjs.cloudflare.com/ajax/libs/select2/{settings.SELECT2_LIB_VERSION}/js/select2.min.js", "django_select2/django_select2.js", ) translation.activate("sr-cyrl") assert tuple(Select2Widget().media._js) == ( f"https://cdnjs.cloudflare.com/ajax/libs/select2/{settings.SELECT2_LIB_VERSION}/js/select2.min.js", f"https://cdnjs.cloudflare.com/ajax/libs/select2/{settings.SELECT2_LIB_VERSION}/js/i18n/sr-Cyrl.js", "django_select2/django_select2.js", ) pytest.importorskip("django", minversion="2.0.4") translation.activate("zh-hans") assert tuple(Select2Widget().media._js) == ( f"https://cdnjs.cloudflare.com/ajax/libs/select2/{settings.SELECT2_LIB_VERSION}/js/select2.min.js", f"https://cdnjs.cloudflare.com/ajax/libs/select2/{settings.SELECT2_LIB_VERSION}/js/i18n/zh-CN.js", "django_select2/django_select2.js", ) translation.activate("zh-hant") assert tuple(Select2Widget().media._js) == ( f"https://cdnjs.cloudflare.com/ajax/libs/select2/{settings.SELECT2_LIB_VERSION}/js/select2.min.js", f"https://cdnjs.cloudflare.com/ajax/libs/select2/{settings.SELECT2_LIB_VERSION}/js/i18n/zh-TW.js", "django_select2/django_select2.js", )