def test_malformed_filterset_fields(self): # Malformed filter fields should raise an exception class View(FilterFieldsRootView): filterset_fields = ['non_existent'] backend = DjangoFilterBackend() msg = "'Meta.fields' contains fields that are not defined on this FilterSet: non_existent" with self.assertRaisesMessage(TypeError, msg): backend.get_schema_fields(View())
def test_malformed_filterset_fields(self): # Malformed filter fields should raise an exception class View(FilterFieldsRootView): filterset_fields = ['non_existent'] backend = DjangoFilterBackend() msg = "'Meta.fields' must not contain non-model field names: non_existent" with self.assertRaisesMessage(TypeError, msg): backend.get_schema_fields(View())
def test_fields_with_filter_class(self): backend = DjangoFilterBackend() fields = backend.get_schema_fields(FilterClassRootView()) schemas = [f.schema for f in fields] fields = [f.name for f in fields] self.assertEqual(fields, ['text', 'decimal', 'date']) self.assertIsInstance(schemas[0], compat.coreschema.String) self.assertIsInstance(schemas[1], compat.coreschema.Number) self.assertIsInstance(schemas[2], compat.coreschema.String)
def test_fields_with_filter_fields_dict(self): class DictFilterFieldsRootView(FilterFieldsRootView): filter_fields = { 'decimal': ['exact', 'lt', 'gt'], } backend = DjangoFilterBackend() fields = backend.get_schema_fields(DictFilterFieldsRootView()) fields = [f.name for f in fields] self.assertEqual(fields, ['decimal', 'decimal__lt', 'decimal__gt'])
def test_filter_fields_list_with_bad_get_queryset(self): """ See: * https://github.com/carltongibson/django-filter/issues/551 """ class BadGetQuerySetView(FilterFieldsRootView): def get_queryset(self): raise AttributeError("I don't have that") backend = DjangoFilterBackend() fields = backend.get_schema_fields(BadGetQuerySetView()) self.assertEqual(fields, [], "get_schema_fields should handle AttributeError")
def tests_field_with_request_callable(self): def qs(request): # users expect a valid request object to be provided which cannot # be guaranteed during schema generation. self.fail("callable queryset should not be invoked during schema generation") class F(SeveralFieldsFilter): f = filters.ModelChoiceFilter(queryset=qs) class View(FilterClassRootView): filter_class = F view = View() view.request = factory.get('/') backend = DjangoFilterBackend() fields = backend.get_schema_fields(view) fields = [f.name for f in fields] self.assertEqual(fields, ['text', 'decimal', 'date', 'f'])
def test_filter_fields_list_with_bad_get_queryset(self): """ See: * https://github.com/carltongibson/django-filter/issues/551 """ class BadGetQuerySetView(FilterFieldsRootView): def get_queryset(self): raise AttributeError("I don't have that") backend = DjangoFilterBackend() with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") fields = backend.get_schema_fields(BadGetQuerySetView()) self.assertEqual(fields, [], "get_schema_fields should handle AttributeError") warning = "{} is not compatible with schema generation".format(BadGetQuerySetView) self.assertEqual(len(w), 1) self.assertEqual(str(w[0].message), warning)
def test_field_required(self): class RequiredFieldsFilter(SeveralFieldsFilter): required_text = filters.CharFilter(required=True) class Meta(SeveralFieldsFilter.Meta): fields = SeveralFieldsFilter.Meta.fields + ['required_text'] class FilterClassWithRequiredFieldsView(FilterClassRootView): filterset_class = RequiredFieldsFilter backend = DjangoFilterBackend() fields = backend.get_schema_fields(FilterClassWithRequiredFieldsView()) required = [f.required for f in fields] fields = [f.name for f in fields] self.assertEqual(fields, ['text', 'decimal', 'date', 'required_text']) self.assertFalse(required[0]) self.assertFalse(required[1]) self.assertFalse(required[2]) self.assertTrue(required[3])
def test_fields_with_filter_fields_list(self): backend = DjangoFilterBackend() fields = backend.get_schema_fields(FilterFieldsRootView()) fields = [f.name for f in fields] self.assertEqual(fields, ['decimal', 'date'])