예제 #1
0
class TestModelSelect2Mixin(TestHeavySelect2Mixin):
    form = forms.AlbumModelSelect2WidgetForm(initial={"primary_genre": 1})
    multiple_form = forms.ArtistModelSelect2MultipleWidgetForm()

    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_label_from_instance_initial(self, genres):
        genre = genres[0]
        genre.title = genre.title.lower()
        genre.save()

        form = self.form.__class__(initial={"primary_genre": genre.pk})
        assert genre.title not in form.as_p(), form.as_p()
        assert genre.title.upper() in form.as_p()

    @pytest.fixture(autouse=True)
    def genres(self, genres):
        return genres

    def test_selected_option(self, db, genres):
        genre = genres[0]
        genre2 = genres[1]
        not_required_field = self.form.fields["primary_genre"]
        assert not_required_field.required is False
        widget_output = not_required_field.widget.render(
            "primary_genre", genre.pk)
        selected_option = (
            '<option value="{pk}" selected="selected">{value}</option>'.format(
                pk=genre.pk, value=force_str(genre)))
        selected_option_a = '<option value="{pk}" selected>{value}</option>'.format(
            pk=genre.pk, value=force_str(genre))
        unselected_option = '<option value="{pk}">{value}</option>'.format(
            pk=genre2.pk, value=force_str(genre2))

        assert (selected_option in widget_output
                or selected_option_a in widget_output), widget_output
        assert unselected_option not in widget_output

    def test_selected_option_label_from_instance(self, db, genres):
        genre = genres[0]
        genre.title = genre.title.lower()
        genre.save()

        field = self.form.fields["primary_genre"]
        widget_output = field.widget.render("primary_genre", genre.pk)

        def get_selected_options(genre):
            return (
                '<option value="{pk}" selected="selected">{value}</option>'.
                format(pk=genre.pk, value=force_str(genre)),
                '<option value="{pk}" selected>{value}</option>'.format(
                    pk=genre.pk, value=force_str(genre)),
            )

        assert all(o not in widget_output for o in get_selected_options(genre))
        genre.title = genre.title.upper()

        assert any(o in widget_output for o in get_selected_options(genre))

    def test_get_queryset(self):
        widget = ModelSelect2Widget()
        with pytest.raises(NotImplementedError):
            widget.get_queryset()
        widget.model = Genre
        assert isinstance(widget.get_queryset(), QuerySet)
        widget.model = None
        widget.queryset = Genre.objects.all()
        assert isinstance(widget.get_queryset(), QuerySet)

    def test_tag_attrs_Select2Widget(self):
        widget = Select2Widget()
        output = widget.render("name", "value")
        assert 'data-minimum-input-length="0"' in output

    def test_custom_tag_attrs_Select2Widget(self):
        widget = Select2Widget(attrs={"data-minimum-input-length": "3"})
        output = widget.render("name", "value")
        assert 'data-minimum-input-length="3"' in output

    def test_tag_attrs_ModelSelect2Widget(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=["title__icontains"])
        output = widget.render("name", "value")
        assert 'data-minimum-input-length="2"' in output

    def test_tag_attrs_ModelSelect2TagWidget(self):
        widget = ModelSelect2TagWidget(queryset=Genre.objects.all(),
                                       search_fields=["title__icontains"])
        output = widget.render("name", "value")
        assert 'data-minimum-input-length="2"' in output

    def test_tag_attrs_HeavySelect2Widget(self):
        widget = HeavySelect2Widget(data_url="/foo/bar/")
        output = widget.render("name", "value")
        assert 'data-minimum-input-length="2"' in output

    def test_custom_tag_attrs_ModelSelect2Widget(self):
        widget = ModelSelect2Widget(
            queryset=Genre.objects.all(),
            search_fields=["title__icontains"],
            attrs={"data-minimum-input-length": "3"},
        )
        output = widget.render("name", "value")
        assert 'data-minimum-input-length="3"' in output

    def test_get_search_fields(self):
        widget = ModelSelect2Widget()
        with pytest.raises(NotImplementedError):
            widget.get_search_fields()

        widget.search_fields = ["title__icontains"]
        assert isinstance(widget.get_search_fields(), Iterable)
        assert all(isinstance(x, str) for x in widget.get_search_fields())

    def test_filter_queryset(self, genres):
        widget = TitleModelSelect2Widget(queryset=Genre.objects.all())
        assert widget.filter_queryset(None, genres[0].title[:3]).exists()

        widget = TitleModelSelect2Widget(search_fields=["title__icontains"],
                                         queryset=Genre.objects.all())
        qs = widget.filter_queryset(
            None, " ".join([genres[0].title[:3], genres[0].title[3:]]))
        assert qs.exists()

    def test_filter_queryset__startswith(self, genres):
        genre = Genre.objects.create(title="Space Genre")
        widget = TitleModelSelect2Widget(queryset=Genre.objects.all())
        assert widget.filter_queryset(None, genre.title).exists()

        widget = TitleModelSelect2Widget(search_fields=["title__istartswith"],
                                         queryset=Genre.objects.all())
        qs = widget.filter_queryset(None, "Space Gen")
        assert qs.exists()

        qs = widget.filter_queryset(None, "Gen")
        assert not qs.exists()

    def test_filter_queryset__contains(self, genres):
        genre = Genre.objects.create(title="Space Genre")
        widget = TitleModelSelect2Widget(queryset=Genre.objects.all())
        assert widget.filter_queryset(None, genre.title).exists()

        widget = TitleModelSelect2Widget(search_fields=["title__contains"],
                                         queryset=Genre.objects.all())
        qs = widget.filter_queryset(None, "Space Gen")
        assert qs.exists()

        qs = widget.filter_queryset(None, "NOT Gen")
        assert qs.exists(), "contains works even if only one part matches"

    def test_filter_queryset__multiple_fields(self, genres):
        genre = Genre.objects.create(title="Space Genre")
        widget = TitleModelSelect2Widget(queryset=Genre.objects.all())
        assert widget.filter_queryset(None, genre.title).exists()

        widget = TitleModelSelect2Widget(
            search_fields=[
                "title__startswith",
                "title__endswith",
            ],
            queryset=Genre.objects.all(),
        )
        qs = widget.filter_queryset(None, "Space")
        assert qs.exists()

        qs = widget.filter_queryset(None, "Genre")
        assert qs.exists()

    def test_model_kwarg(self):
        widget = ModelSelect2Widget(model=Genre,
                                    search_fields=["title__icontains"])
        genre = Genre.objects.last()
        result = widget.filter_queryset(None, genre.title)
        assert result.exists()

    def test_queryset_kwarg(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=["title__icontains"])
        genre = Genre.objects.last()
        result = widget.filter_queryset(None, genre.title)
        assert result.exists()

    def test_ajax_view_registration(self, client):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=["title__icontains"])
        widget.render("name", "value")
        url = reverse("django_select2:auto-json")
        genre = Genre.objects.last()
        response = client.get(url,
                              data=dict(field_id=widget.field_id,
                                        term=genre.title))
        assert response.status_code == 200, response.content
        data = json.loads(response.content.decode("utf-8"))
        assert data["results"]
        assert genre.pk in [result["id"] for result in data["results"]]

    def test_render(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all())
        widget.render("name", "value")
        cached_widget = cache.get(widget._get_cache_key())
        assert cached_widget["max_results"] == widget.max_results
        assert cached_widget["search_fields"] == tuple(widget.search_fields)
        qs = widget.get_queryset()
        assert isinstance(cached_widget["queryset"][0], qs.__class__)
        assert str(cached_widget["queryset"][1]) == str(qs.query)

    def test_get_url(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=["title__icontains"])
        assert isinstance(widget.get_url(), str)

    def test_custom_to_field_name(self):
        the_best_band_in_the_world = Artist.objects.create(title="Take That")
        groupie = Groupie.objects.create(obsession=the_best_band_in_the_world)
        form = forms.GroupieForm(instance=groupie)
        assert '<option value="Take That" selected>TAKE THAT</option>' in form.as_p(
        )

    def test_empty_label(self, db):
        # Empty options is only required for single selects
        # https://select2.github.io/options.html#allowClear
        single_select = self.form.fields["primary_genre"]
        single_select.empty_label = "Hello World"
        assert single_select.required is False
        assert 'data-placeholder="Hello World"' in single_select.widget.render(
            "primary_genre", None)
예제 #2
0
class TestModelSelect2Mixin(TestHeavySelect2Mixin):
    form = forms.AlbumModelSelect2WidgetForm(initial={'primary_genre': 1})
    multiple_form = forms.ArtistModelSelect2MultipleWidgetForm()

    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_label_from_instance_initial(self, genres):
        genre = genres[0]
        genre.title = genre.title.lower()
        genre.save()

        form = self.form.__class__(initial={'primary_genre': genre.pk})
        assert genre.title not in form.as_p(), form.as_p()
        assert genre.title.upper() in form.as_p()

    @pytest.fixture(autouse=True)
    def genres(self, genres):
        return genres

    def test_selected_option(self, db, genres):
        genre = genres[0]
        genre2 = genres[1]
        not_required_field = self.form.fields['primary_genre']
        assert not_required_field.required is False
        widget_output = not_required_field.widget.render(
            'primary_genre', genre.pk)
        selected_option = '<option value="{pk}" selected="selected">{value}</option>'.format(
            pk=genre.pk, value=force_text(genre))
        selected_option_a = '<option value="{pk}" selected>{value}</option>'.format(
            pk=genre.pk, value=force_text(genre))
        unselected_option = '<option value="{pk}">{value}</option>'.format(
            pk=genre2.pk, value=force_text(genre2))

        assert selected_option in widget_output or selected_option_a in widget_output, widget_output
        assert unselected_option not in widget_output

    def test_selected_option_label_from_instance(self, db, genres):
        genre = genres[0]
        genre.title = genre.title.lower()
        genre.save()

        field = self.form.fields['primary_genre']
        widget_output = field.widget.render('primary_genre', genre.pk)

        def get_selected_options(genre):
            return '<option value="{pk}" selected="selected">{value}</option>'.format(
                pk=genre.pk, value=force_text(genre)
            ), '<option value="{pk}" selected>{value}</option>'.format(
                pk=genre.pk, value=force_text(genre))

        assert all(o not in widget_output for o in get_selected_options(genre))
        genre.title = genre.title.upper()

        assert any(o in widget_output for o in get_selected_options(genre))

    def test_get_queryset(self):
        widget = ModelSelect2Widget()
        with pytest.raises(NotImplementedError):
            widget.get_queryset()
        widget.model = Genre
        assert isinstance(widget.get_queryset(), QuerySet)
        widget.model = None
        widget.queryset = Genre.objects.all()
        assert isinstance(widget.get_queryset(), QuerySet)

    def test_get_search_fields(self):
        widget = ModelSelect2Widget()
        with pytest.raises(NotImplementedError):
            widget.get_search_fields()

        widget.search_fields = ['title__icontains']
        assert isinstance(widget.get_search_fields(), collections.Iterable)
        assert all(
            isinstance(x, text_type) for x in widget.get_search_fields())

    def test_filter_queryset(self, genres):
        widget = TitleModelSelect2Widget(queryset=Genre.objects.all())
        assert widget.filter_queryset(genres[0].title[:3]).exists()

        widget = TitleModelSelect2Widget(search_fields=['title__icontains'],
                                         queryset=Genre.objects.all())
        qs = widget.filter_queryset(" ".join(
            [genres[0].title[:3], genres[0].title[3:]]))
        assert qs.exists()

    def test_model_kwarg(self):
        widget = ModelSelect2Widget(model=Genre,
                                    search_fields=['title__icontains'])
        genre = Genre.objects.last()
        result = widget.filter_queryset(genre.title)
        assert result.exists()

    def test_queryset_kwarg(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=['title__icontains'])
        genre = Genre.objects.last()
        result = widget.filter_queryset(genre.title)
        assert result.exists()

    def test_ajax_view_registration(self, client):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=['title__icontains'])
        widget.render('name', 'value')
        url = reverse('django_select2-json')
        genre = Genre.objects.last()
        response = client.get(url,
                              data=dict(field_id=signing.dumps(id(widget)),
                                        term=genre.title))
        assert response.status_code == 200, response.content
        data = json.loads(response.content.decode('utf-8'))
        assert data['results']
        assert genre.pk in [result['id'] for result in data['results']]

    def test_render(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all())
        widget.render('name', 'value')
        cached_widget = cache.get(widget._get_cache_key())
        assert cached_widget['max_results'] == widget.max_results
        assert cached_widget['search_fields'] == widget.search_fields
        qs = widget.get_queryset()
        assert isinstance(cached_widget['queryset'][0], qs.__class__)
        assert text_type(cached_widget['queryset'][1]) == text_type(qs.query)

    def test_get_url(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=['title__icontains'])
        assert isinstance(widget.get_url(), text_type)
예제 #3
0
class TestModelSelect2Mixin(TestHeavySelect2Mixin):
    form = forms.AlbumModelSelect2WidgetForm(initial={'primary_genre': 1})
    multiple_form = forms.ArtistModelSelect2MultipleWidgetForm()

    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_label_from_instance_initial(self, genres):
        genre = genres[0]
        genre.title = genre.title.lower()
        genre.save()

        form = self.form.__class__(initial={'primary_genre': genre.pk})
        assert genre.title not in form.as_p(), form.as_p()
        assert genre.title.upper() in form.as_p()

    @pytest.fixture(autouse=True)
    def genres(self, genres):
        return genres

    def test_selected_option(self, db, genres):
        genre = genres[0]
        genre2 = genres[1]
        not_required_field = self.form.fields['primary_genre']
        assert not_required_field.required is False
        widget_output = not_required_field.widget.render(
            'primary_genre', genre.pk)
        selected_option = '<option value="{pk}" selected="selected">{value}</option>'.format(
            pk=genre.pk, value=force_text(genre))
        selected_option_a = '<option value="{pk}" selected>{value}</option>'.format(
            pk=genre.pk, value=force_text(genre))
        unselected_option = '<option value="{pk}">{value}</option>'.format(
            pk=genre2.pk, value=force_text(genre2))

        assert selected_option in widget_output or selected_option_a in widget_output, widget_output
        assert unselected_option not in widget_output

    def test_selected_option_label_from_instance(self, db, genres):
        genre = genres[0]
        genre.title = genre.title.lower()
        genre.save()

        field = self.form.fields['primary_genre']
        widget_output = field.widget.render('primary_genre', genre.pk)

        def get_selected_options(genre):
            return '<option value="{pk}" selected="selected">{value}</option>'.format(
                pk=genre.pk, value=force_text(genre)
            ), '<option value="{pk}" selected>{value}</option>'.format(
                pk=genre.pk, value=force_text(genre))

        assert all(o not in widget_output for o in get_selected_options(genre))
        genre.title = genre.title.upper()

        assert any(o in widget_output for o in get_selected_options(genre))

    def test_get_queryset(self):
        widget = ModelSelect2Widget()
        with pytest.raises(NotImplementedError):
            widget.get_queryset()
        widget.model = Genre
        assert isinstance(widget.get_queryset(), QuerySet)
        widget.model = None
        widget.queryset = Genre.objects.all()
        assert isinstance(widget.get_queryset(), QuerySet)

    def test_tag_attrs_Select2Widget(self):
        widget = Select2Widget()
        output = widget.render('name', 'value')
        assert 'data-minimum-input-length="0"' in output

    def test_custom_tag_attrs_Select2Widget(self):
        widget = Select2Widget(attrs={'data-minimum-input-length': '3'})
        output = widget.render('name', 'value')
        assert 'data-minimum-input-length="3"' in output

    def test_tag_attrs_ModelSelect2Widget(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=['title__icontains'])
        output = widget.render('name', 'value')
        assert 'data-minimum-input-length="2"' in output

    def test_tag_attrs_ModelSelect2TagWidget(self):
        widget = ModelSelect2TagWidget(queryset=Genre.objects.all(),
                                       search_fields=['title__icontains'])
        output = widget.render('name', 'value')
        assert 'data-minimum-input-length="2"' in output

    def test_tag_attrs_HeavySelect2Widget(self):
        widget = HeavySelect2Widget(data_url='/foo/bar/')
        output = widget.render('name', 'value')
        assert 'data-minimum-input-length="2"' in output

    def test_custom_tag_attrs_ModelSelect2Widget(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=['title__icontains'],
                                    attrs={'data-minimum-input-length': '3'})
        output = widget.render('name', 'value')
        assert 'data-minimum-input-length="3"' in output

    def test_get_search_fields(self):
        widget = ModelSelect2Widget()
        with pytest.raises(NotImplementedError):
            widget.get_search_fields()

        widget.search_fields = ['title__icontains']
        assert isinstance(widget.get_search_fields(), Iterable)
        assert all(isinstance(x, str) for x in widget.get_search_fields())

    def test_filter_queryset(self, genres):
        widget = TitleModelSelect2Widget(queryset=Genre.objects.all())
        assert widget.filter_queryset(None, genres[0].title[:3]).exists()

        widget = TitleModelSelect2Widget(search_fields=['title__icontains'],
                                         queryset=Genre.objects.all())
        qs = widget.filter_queryset(
            None, " ".join([genres[0].title[:3], genres[0].title[3:]]))
        assert qs.exists()

    def test_model_kwarg(self):
        widget = ModelSelect2Widget(model=Genre,
                                    search_fields=['title__icontains'])
        genre = Genre.objects.last()
        result = widget.filter_queryset(None, genre.title)
        assert result.exists()

    def test_queryset_kwarg(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=['title__icontains'])
        genre = Genre.objects.last()
        result = widget.filter_queryset(None, genre.title)
        assert result.exists()

    def test_ajax_view_registration(self, client):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=['title__icontains'])
        widget.render('name', 'value')
        url = reverse('django_select2:auto-json')
        genre = Genre.objects.last()
        response = client.get(url,
                              data=dict(field_id=signing.dumps(id(widget)),
                                        term=genre.title))
        assert response.status_code == 200, response.content
        data = json.loads(response.content.decode('utf-8'))
        assert data['results']
        assert genre.pk in [result['id'] for result in data['results']]

    def test_render(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all())
        widget.render('name', 'value')
        cached_widget = cache.get(widget._get_cache_key())
        assert cached_widget['max_results'] == widget.max_results
        assert cached_widget['search_fields'] == tuple(widget.search_fields)
        qs = widget.get_queryset()
        assert isinstance(cached_widget['queryset'][0], qs.__class__)
        assert str(cached_widget['queryset'][1]) == str(qs.query)

    def test_get_url(self):
        widget = ModelSelect2Widget(queryset=Genre.objects.all(),
                                    search_fields=['title__icontains'])
        assert isinstance(widget.get_url(), str)

    def test_custom_to_field_name(self):
        the_best_band_in_the_world = Artist.objects.create(title='Take That')
        groupie = Groupie.objects.create(obsession=the_best_band_in_the_world)
        form = forms.GroupieForm(instance=groupie)
        assert '<option value="Take That" selected>TAKE THAT</option>' in form.as_p(
        )