Ejemplo n.º 1
0
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'
Ejemplo n.º 2
0
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')
Ejemplo n.º 3
0
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",
        )