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)
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)
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( )