def test_extra_kwargs_not_altered(self): class TestSerializer(serializers.ModelSerializer): non_model_field = serializers.CharField() class Meta: model = OneFieldModel read_only_fields = ('char_field', 'non_model_field') fields = read_only_fields extra_kwargs = {} class ChildSerializer(TestSerializer): class Meta(TestSerializer.Meta): read_only_fields = () test_expected = dedent(""" TestSerializer(): char_field = CharField(read_only=True) non_model_field = CharField() """) child_expected = dedent(""" ChildSerializer(): char_field = CharField(max_length=100) non_model_field = CharField() """) self.assertEqual(unicode_repr(ChildSerializer()), child_expected) self.assertEqual(unicode_repr(TestSerializer()), test_expected) self.assertEqual(unicode_repr(ChildSerializer()), child_expected)
def test_nonPK_foreignkey_model_serializer(self): class TestParentModel(models.Model): title = models.CharField(max_length=64) class TestChildModel(models.Model): parent = models.ForeignKey(TestParentModel, related_name='children', on_delete=models.CASCADE) value = models.CharField(primary_key=True, max_length=64) class TestChildModelSerializer(serializers.ModelSerializer): class Meta: model = TestChildModel fields = ('value', 'parent') class TestParentModelSerializer(serializers.ModelSerializer): class Meta: model = TestParentModel fields = ('id', 'title', 'children') parent_expected = dedent(""" TestParentModelSerializer(): id = IntegerField(label='ID', read_only=True) title = CharField(max_length=64) children = PrimaryKeyRelatedField(many=True, queryset=TestChildModel.objects.all()) """) self.assertEqual(unicode_repr(TestParentModelSerializer()), parent_expected) child_expected = dedent(""" TestChildModelSerializer(): value = CharField(max_length=64, validators=[<UniqueValidator(queryset=TestChildModel.objects.all())>]) parent = PrimaryKeyRelatedField(queryset=TestParentModel.objects.all()) """) self.assertEqual(unicode_repr(TestChildModelSerializer()), child_expected)
def test_fields(self): """Ensure `fields` is passed to embedded documents.""" class CompoundParentSerializer(DocumentSerializer): class Meta: model = CompoundParentDocument fields = ( 'embedded_list', 'embedded_list.child.name', 'embedded_map', 'embedded_map.child.age', 'list_of_embedded_documents', 'list_of_embedded_documents.child.name') depth = 1 expected = dedent(""" CompoundParentSerializer(): embedded_list = EmbeddedSerializer(many=True, required=False): name = CharField(required=False) embedded_map = DictField(child=EmbeddedSerializer(required=False), required=False): age = IntegerField(required=False) list_of_embedded_documents = EmbeddedSerializer(many=True, required=False): name = CharField(required=False) """) serializer = CompoundParentSerializer() unicode_repr(serializer) assert unicode_repr(CompoundParentSerializer()) == expected
def smart_repr(value): if isinstance(value, QuerySet): return manager_repr(value) if isinstance(value, BaseField): return mongo_field_repr(value) if isinstance(value, BaseDocument): return mongo_field_repr(value) if isinstance(value, Field): return field_repr(value) value = unicode_repr(value) # Representations like u'help text' # should simply be presented as 'help text' value = uni_lit_re.sub("'\\1'", value) # Representations like # <django.core.validators.RegexValidator object at 0x1047af050> # Should be presented as # <django.core.validators.RegexValidator object> value = re.sub(' at 0x[0-9a-f]{4,32}>', '>', value) return value
def test_field_options(self): class TestSerializer(DocumentSerializer): class Meta: model = FieldOptionsModel fields = "__all__" expected = dedent( """ TestSerializer(): id = ObjectIdField(read_only=True) required_field = IntegerField(required=True) int_null_field = IntegerField(allow_null=True, required=False) string_null_field = CharField(allow_blank=True, allow_null=True, required=False) required_list_field = ListField(allow_empty=False, child=IntegerField(required=False), required=True) non_required_list_field = ListField(child=IntegerField(required=False), required=False) required_dict_field = DictField(allow_empty=False, required=True) choices_field = ChoiceField(choices=(('red', 'Red'), ('blue', 'Blue'), ('green', 'Green')), required=False) length_limit_field = CharField(max_length=12, min_length=3, required=False) value_limit_field = IntegerField(max_value=12, min_value=3, required=False) decimal_field = DecimalField(decimal_places=4, max_digits=8, max_value=9999, required=False) """ ) # if six.PY2: # # This particular case is too awkward to resolve fully across # # both py2 and py3. # expected = expected.replace( # "('red', 'Red'), ('blue', 'Blue'), ('green', 'Green')", # "(u'red', u'Red'), (u'blue', u'Blue'), (u'green', u'Green')" # ) assert unicode_repr(TestSerializer()) == expected
def test_meta_exclude(self): """ Serializer should respect Meta.exclude """ class TestSerializer(DocumentSerializer): class Meta: model = RegularModel exclude = ('decimal_field', 'custom_field') # in pythons 2 and 3 regex reprs are different if six.PY2: regex_repr = "<_sre.SRE_Pattern object>" else: regex_repr = "re.compile('^valid_regex')" expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) str_field = CharField(required=False) str_regex_field = RegexField(regex=%s, required=False) url_field = URLField(required=False) email_field = EmailField(required=False) int_field = IntegerField(required=False) long_field = IntegerField(required=False) float_field = FloatField(required=False) boolean_field = BooleanField(required=False) nullboolean_field = NullBooleanField(required=False) date_field = DateTimeField(required=False) complexdate_field = DateTimeField(required=False) uuid_field = UUIDField(required=False) id_field = ObjectIdField(required=False) """ % regex_repr) assert unicode_repr(TestSerializer()) == expected
def test_nested_relations(self): class TestSerializer(serializers.ModelSerializer): class Meta: model = RelationalModel depth = 1 fields = "__all__" expected = dedent( """ TestSerializer(): id = IntegerField(label='ID', read_only=True) foreign_key = NestedSerializer(read_only=True): id = IntegerField(label='ID', read_only=True) name = CharField(max_length=100) one_to_one = NestedSerializer(read_only=True): id = IntegerField(label='ID', read_only=True) name = CharField(max_length=100) many_to_many = NestedSerializer(many=True, read_only=True): id = IntegerField(label='ID', read_only=True) name = CharField(max_length=100) through = NestedSerializer(many=True, read_only=True): id = IntegerField(label='ID', read_only=True) name = CharField(max_length=100) """ ) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_meta_exclude(self): """ Serializer should respect Meta.exclude """ class TestSerializer(DocumentSerializer): class Meta: model = RegularModel exclude = ('decimal_field', 'custom_field') expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) str_field = CharField(required=False) url_field = URLField(required=False) email_field = EmailField(required=False) int_field = IntegerField(required=False) long_field = IntegerField(required=False) float_field = FloatField(required=False) boolean_field = BooleanField(required=False) nullboolean_field = NullBooleanField(required=False) date_field = DateTimeField(required=False) complexdate_field = DateTimeField(required=False) uuid_field = UUIDField(required=False) id_field = ObjectIdField(required=False) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_regular_fields(self): """ Model fields should map to their equivelent serializer fields. """ class TestSerializer(DocumentSerializer): class Meta: model = RegularModel expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) str_field = CharField(required=False) url_field = URLField(required=False) email_field = EmailField(required=False) int_field = IntegerField(required=False) long_field = IntegerField(required=False) float_field = FloatField(required=False) boolean_field = BooleanField(required=False) nullboolean_field = NullBooleanField(required=False) date_field = DateTimeField(required=False) complexdate_field = DateTimeField(required=False) uuid_field = UUIDField(required=False) id_field = ObjectIdField(required=False) decimal_field = DecimalField(decimal_places=2, max_digits=65536, required=False) custom_field = DocumentField(model_field=<tests.test_1basic.CustomField: custom_field>, required=False) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_extra_field_kwargs(self): class CompoundParentSerializer(DocumentSerializer): class Meta: model = CompoundParentDocument fields = ('__all__') depth = 1 extra_kwargs = { 'foo': {'default': 'bar'}, 'embedded_list.child.name': {'default': 'Johnny'}, 'list_of_embedded_documents.child.name': {'default': 'B'}, 'embedded_map.child.name': {'default': 'Good'} } expected = dedent(""" CompoundParentSerializer(): id = ObjectIdField(read_only=True) foo = CharField(default='bar') embedded_list = EmbeddedSerializer(many=True, required=False): name = CharField(default='Johnny') age = IntegerField(required=False) list_of_embedded_documents = EmbeddedSerializer(many=True, required=False): name = CharField(default='B') age = IntegerField(required=False) embedded_map = DictField(child=EmbeddedSerializer(required=False), required=False): name = CharField(default='Good') age = IntegerField(required=False) """) assert unicode_repr(CompoundParentSerializer()) == expected
def test_nested_hyperlinked_relations_starred_source(self): class TestSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = RelationalModel depth = 1 fields = '__all__' extra_kwargs = { 'url': { 'source': '*', }} expected = dedent(""" TestSerializer(): url = HyperlinkedIdentityField(source='*', view_name='relationalmodel-detail') foreign_key = NestedSerializer(read_only=True): url = HyperlinkedIdentityField(view_name='foreignkeytargetmodel-detail') name = CharField(max_length=100) one_to_one = NestedSerializer(read_only=True): url = HyperlinkedIdentityField(view_name='onetoonetargetmodel-detail') name = CharField(max_length=100) many_to_many = NestedSerializer(many=True, read_only=True): url = HyperlinkedIdentityField(view_name='manytomanytargetmodel-detail') name = CharField(max_length=100) through = NestedSerializer(many=True, read_only=True): url = HyperlinkedIdentityField(view_name='throughtargetmodel-detail') name = CharField(max_length=100) """) self.maxDiff = None self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_nested_hyperlinked_relations(self): class TestSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = RelationalModel depth = 1 expected = dedent( """ TestSerializer(): url = HyperlinkedIdentityField(view_name='relationalmodel-detail') foreign_key = NestedSerializer(read_only=True): url = HyperlinkedIdentityField(view_name='foreignkeytargetmodel-detail') name = CharField(max_length=100) one_to_one = NestedSerializer(read_only=True): url = HyperlinkedIdentityField(view_name='onetoonetargetmodel-detail') name = CharField(max_length=100) many_to_many = NestedSerializer(many=True, read_only=True): url = HyperlinkedIdentityField(view_name='manytomanytargetmodel-detail') name = CharField(max_length=100) through = NestedSerializer(many=True, read_only=True): url = HyperlinkedIdentityField(view_name='throughtargetmodel-detail') name = CharField(max_length=100) """ ) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_read_only(self): """Ensure `read_only` are passed to embedded documents.""" class CompoundParentSerializer(DocumentSerializer): class Meta: model = CompoundParentDocument fields = ('__all__') read_only_fields = ( 'foo', 'embedded_list.child.name', 'list_of_embedded_documents.child.name', 'embedded_map.child.name' ) expected = dedent(""" CompoundParentSerializer(): id = ObjectIdField(read_only=True) foo = CharField(read_only=True) embedded_list = EmbeddedSerializer(many=True, required=False): name = CharField(read_only=True) age = IntegerField(required=False) list_of_embedded_documents = EmbeddedSerializer(many=True, required=False): name = CharField(read_only=True) age = IntegerField(required=False) embedded_map = DictField(child=EmbeddedSerializer(required=False), required=False): name = CharField(read_only=True) age = IntegerField(required=False) """) assert unicode_repr(CompoundParentSerializer()) == expected
def test_extra_field_kwargs(self): """Ensure `extra_kwargs` are passed to embedded documents.""" class ParentSerializer(DocumentSerializer): class Meta: model = ParentDocument fields = ('__all__') depth = 1 extra_kwargs = { 'foo': {'default': 'bar'}, 'embedded.name': {'default': 'Johnny B. Good'} } expected = dedent(""" ParentSerializer(): id = ObjectIdField(read_only=True) foo = CharField(default='bar') nested_reference = NestedSerializer(read_only=True): id = ObjectIdField(read_only=True) foo = CharField(required=False) bar = CharField(required=False) embedded = EmbeddedSerializer(required=False): name = CharField(default='Johnny B. Good') age = IntegerField(required=False) """) assert unicode_repr(ParentSerializer()) == expected
def test_regular_fields(self): """ Model fields should map to their equivelent serializer fields. """ class TestSerializer(serializers.ModelSerializer): class Meta: model = RegularFieldsModel fields = '__all__' expected = dedent(""" TestSerializer(): auto_field = IntegerField(read_only=True) big_integer_field = IntegerField() boolean_field = BooleanField(required=False) char_field = CharField(max_length=100) comma_separated_integer_field = CharField(max_length=100, validators=[<django.core.validators.RegexValidator object>]) date_field = DateField() datetime_field = DateTimeField() decimal_field = DecimalField(decimal_places=1, max_digits=3) email_field = EmailField(max_length=100) float_field = FloatField() integer_field = IntegerField() null_boolean_field = NullBooleanField(required=False) positive_integer_field = IntegerField() positive_small_integer_field = IntegerField() slug_field = SlugField(max_length=100) small_integer_field = IntegerField() text_field = CharField(max_length=100, style={'base_template': 'textarea.html'}) time_field = TimeField() url_field = URLField(max_length=100) custom_field = ModelField(model_field=<tests.test_model_serializer.CustomField: custom_field>) file_path_field = FilePathField(path='/tmp/') """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_field_options(self): class TestSerializer(serializers.ModelSerializer): class Meta: model = FieldOptionsModel fields = '__all__' expected = dedent(""" TestSerializer(): id = IntegerField(label='ID', read_only=True) value_limit_field = IntegerField(max_value=10, min_value=1) length_limit_field = CharField(max_length=12, min_length=3) blank_field = CharField(allow_blank=True, max_length=10, required=False) null_field = IntegerField(allow_null=True, required=False) default_field = IntegerField(required=False) descriptive_field = IntegerField(help_text='Some help text', label='A label') choices_field = ChoiceField(choices=(('red', 'Red'), ('blue', 'Blue'), ('green', 'Green'))) """) if six.PY2: # This particular case is too awkward to resolve fully across # both py2 and py3. expected = expected.replace( "('red', 'Red'), ('blue', 'Blue'), ('green', 'Green')", "(u'red', u'Red'), (u'blue', u'Blue'), (u'green', u'Green')" ) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_nested_unique_together_relations(self): class TestSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = UniqueTogetherModel depth = 1 fields = '__all__' expected = dedent(""" TestSerializer(): url = HyperlinkedIdentityField(view_name='uniquetogethermodel-detail') foreign_key = NestedSerializer(read_only=True): url = HyperlinkedIdentityField(view_name='foreignkeytargetmodel-detail') name = CharField(max_length=100) one_to_one = NestedSerializer(read_only=True): url = HyperlinkedIdentityField(view_name='onetoonetargetmodel-detail') name = CharField(max_length=100) """) if six.PY2: # This case is also too awkward to resolve fully across both py2 # and py3. (See above) expected = expected.replace( "('foreign_key', 'one_to_one')", "(u'foreign_key', u'one_to_one')" ) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_mapping(self): expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) fil = FileField(required=False) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_embbedded(self): class EmbeddingSerializer(EmbeddedDocumentSerializer): class Meta: model = DumbEmbedded expected = dedent(""" EmbeddingSerializer(): name = CharField(required=False) foo = IntegerField(required=False) """) assert unicode_repr(EmbeddingSerializer()) == expected
def test_embedded_serializer(self): class TestSerializer(EmbeddedDocumentSerializer): class Meta: model = EmbeddedModel expected = dedent(""" TestSerializer(): foo = CharField(required=False) bar = CharField(required=False) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_embedding_generic(self): class EmbeddingSerializer(DocumentSerializer): class Meta: model = GenericEmbeddingDoc expected = dedent(""" EmbeddingSerializer(): id = ObjectIdField(read_only=True) embedded = GenericEmbeddedDocumentField(model_field=<mongoengine.fields.GenericEmbeddedDocumentField: embedded>, required=False) """) assert unicode_repr(EmbeddingSerializer()) == expected
def test_shallow(self): class TestSerializer(DocumentSerializer): class Meta: model = EmbeddingModel depth = 0 expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) embedded = HiddenField(default=None) """) assert unicode_repr(TestSerializer()) == expected
def test_suboptions(self): class TestSerializer(DocumentSerializer): class Meta: model = OptionsCompoundFieldsModel expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) int_list_field = ListField(child=IntegerField(max_value=7, min_value=3, required=False), required=False) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_embbedded_order(self): class EmbeddingSerializer(EmbeddedDocumentSerializer): class Meta: model = OrderedEmbedded expected = dedent(""" EmbeddingSerializer(): f2 = IntegerField(required=False) f0 = IntegerField(required=False) f1 = IntegerField(required=False) """) assert unicode_repr(EmbeddingSerializer()) == expected
def test_mapping_nodepth(self): class TestSerializer(DocumentSerializer): class Meta: model = EmbeddingModel depth = 0 expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) embedded = DocumentField(depth=0, model_field=<mongoengine.fields.EmbeddedDocumentField: embedded>, read_only=True) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_declared(self): class TestSerializer(DynamicDocumentSerializer): class Meta: model = DynamicModel expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) foo = IntegerField(required=False) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_mapping(self): class TestSerializer(DocumentSerializer): class Meta: model = MockModel expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) foo = CharField(required=False) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_embedding_required(self): class EmbeddingSerializer(DocumentSerializer): class Meta: model = RequiredEmbeddingDoc expected = dedent(""" EmbeddingSerializer(): id = ObjectIdField(read_only=True) embedded = EmbeddedSerializer(required=True): name = CharField(required=False) foo = IntegerField(required=False) """) assert unicode_repr(EmbeddingSerializer()) == expected
def test_shallow(self): class TestSerializer(DocumentSerializer): class Meta: model = ReferencingDoc depth = 0 expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) ref = ReferenceField(queryset=ReferencedDoc.objects, required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_declared(self): class TestSerializer(DynamicDocumentSerializer): class Meta: model = DumbDynamic expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) name = CharField(required=False) foo = IntegerField(required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_nullable_boolean_field(self): class NullableBooleanModel(models.Model): field = models.BooleanField(null=True, default=False) class NullableBooleanSerializer(serializers.ModelSerializer): class Meta: model = NullableBooleanModel fields = ['field'] expected = dedent(""" NullableBooleanSerializer(): field = BooleanField(allow_null=True, required=False) """) self.assertEqual(unicode_repr(NullableBooleanSerializer()), expected)
def test_array_field(self): class ArrayFieldModel(models.Model): array_field = postgres_fields.ArrayField( base_field=models.CharField()) class TestSerializer(serializers.ModelSerializer): class Meta: model = ArrayFieldModel fields = ['array_field'] expected = dedent(""" TestSerializer(): array_field = ListField(child=CharField(label='Array field', validators=[<django.core.validators.MaxLengthValidator object>])) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_hyperlinked_relations(self): class TestSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = RelationalModel fields = '__all__' expected = dedent(""" TestSerializer(): url = HyperlinkedIdentityField(view_name='relationalmodel-detail') foreign_key = HyperlinkedRelatedField(queryset=ForeignKeyTargetModel.objects.all(), view_name='foreignkeytargetmodel-detail') one_to_one = HyperlinkedRelatedField(queryset=OneToOneTargetModel.objects.all(), validators=[<UniqueValidator(queryset=RelationalModel.objects.all())>], view_name='onetoonetargetmodel-detail') many_to_many = HyperlinkedRelatedField(allow_empty=False, many=True, queryset=ManyToManyTargetModel.objects.all(), view_name='manytomanytargetmodel-detail') through = HyperlinkedRelatedField(many=True, read_only=True, view_name='throughtargetmodel-detail') """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_deep(self): class TestSerializer(DocumentSerializer): class Meta: model = ReferencingDoc fields = '__all__' depth = 1 expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) ref = NestedSerializer(read_only=True): id = ObjectIdField(read_only=True) name = CharField(required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_pk_fields(self): """ Both `pk` and the actual primary key name are valid in `Meta.fields`. """ class TestSerializer(DocumentSerializer): class Meta: model = AutoFieldModel fields = ('pk', 'auto_field') expected = dedent(""" TestSerializer(): pk = IntegerField(read_only=True) auto_field = IntegerField(read_only=True) """) assert unicode_repr(TestSerializer()) == expected
def test_pk_relations(self): class TestSerializer(serializers.ModelSerializer): class Meta: model = RelationalModel fields = '__all__' expected = dedent(""" TestSerializer(): id = IntegerField(label='ID', read_only=True) foreign_key = PrimaryKeyRelatedField(queryset=ForeignKeyTargetModel.objects.all()) one_to_one = PrimaryKeyRelatedField(queryset=OneToOneTargetModel.objects.all(), validators=[<UniqueValidator(queryset=RelationalModel.objects.all())>]) many_to_many = PrimaryKeyRelatedField(allow_empty=False, many=True, queryset=ManyToManyTargetModel.objects.all()) through = PrimaryKeyRelatedField(many=True, read_only=True) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_extended(self): class TestSerializer(DynamicDocumentSerializer): bar = drf_fields.CharField(required=False) class Meta: model = DumbDynamic expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) bar = CharField(required=False) name = CharField(required=False) foo = IntegerField(required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_extra_field_kwargs(self): """ Ensure `extra_kwargs` are passed to generated fields. """ class TestSerializer(DocumentSerializer): class Meta: model = RegularModel fields = ('id', 'str_field') extra_kwargs = {'str_field': {'default': 'extra'}} expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) str_field = CharField(default='extra') """) assert unicode_repr(TestSerializer()) == expected
def test_embedding_nested(self): class TestSerializer(DocumentSerializer): class Meta: model = NestedEmbeddingDoc fields = '__all__' expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) embedded = EmbeddedSerializer(required=False): name = CharField(required=False) embedded = EmbeddedSerializer(required=False): name = CharField(required=False) foo = IntegerField(required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_method_field(self): """ Properties and methods on the model should be allowed as `Meta.fields` values, and should map to `ReadOnlyField`. """ class TestSerializer(DocumentSerializer): class Meta: model = RegularModel fields = ('id', 'method') expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) method = ReadOnlyField() """) assert unicode_repr(TestSerializer()) == expected
def test_references(self): class TestSerializer(DocumentSerializer): class Meta: model = RefFieldsDoc # order is broken expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) ref_list = ListField(child=ReferenceField(queryset=ReferencedDoc.objects, required=False), required=False) ref = ReferenceField(queryset=ReferencedDoc.objects, required=False) dbref = ReferenceField(queryset=ReferencedDoc.objects, required=False) cached = ReferenceField(queryset=ReferencedDoc.objects, required=False) generic = GenericReferenceField(required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_embedding_custom_generic(self): class CustomEmbedding(DocumentField): pass class TestSerializer(DocumentSerializer): serializer_embedded_generic = CustomEmbedding class Meta: model = GenericEmbeddingDoc expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) embedded = CustomEmbedding(model_field=<mongoengine.fields.GenericEmbeddedDocumentField: embedded>, required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_embedding_nodepth(self): class EmbeddingSerializer(DocumentSerializer): class Meta: model = NestedEmbeddingDoc depth = 0 expected = dedent(""" EmbeddingSerializer(): id = ObjectIdField(read_only=True) embedded = EmbeddedSerializer(required=False): name = CharField(required=False) embedded = EmbeddedSerializer(required=False): name = CharField(required=False) foo = IntegerField(required=False) """) assert unicode_repr(EmbeddingSerializer()) == expected
def test_basic(self): class TestSerializer(DocumentSerializer): class Meta: model = BasicCompoundDoc fields = '__all__' expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) list_field = ListField(required=False) int_list_field = ListField(child=IntegerField(required=False), required=False) dict_field = DictField(required=False) int_dict_field = DictField(child=IntegerField(required=False), required=False) int_map_field = DictField(child=IntegerField(required=False), required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_meta_fields(self): """ Serializer should respect Meta.fields """ class TestSerializer(DocumentSerializer): class Meta: model = RegularModel fields = ('id', 'str_field') expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) str_field = CharField(required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_embedding_custom_bottom(self): class CustomEmbedding(Field): bla = drf_fields.CharField() class TestSerializer(DocumentSerializer): serializer_embedded_bottom = CustomEmbedding class Meta: model = NestedEmbeddingDoc depth_embedding = 0 expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) embedded = CustomEmbedding(default=None, required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_duration_field(self): class DurationFieldModel(models.Model): """ A model that defines DurationField. """ duration_field = ModelDurationField() class TestSerializer(serializers.ModelSerializer): class Meta: model = DurationFieldModel expected = dedent(""" TestSerializer(): id = IntegerField(label='ID', read_only=True) duration_field = DurationField() """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_mapping(self): class FileDoc(Document): f = fields.FileField(collection_name='files') i = fields.ImageField(collection_name='images') class TestSerializer(DocumentSerializer): class Meta: model = FileDoc expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) f = FileField(required=False) i = ImageField(required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_custom_field(self): class CustomReferencing(ReferenceField): pass class TestSerializer(DocumentSerializer): serializer_reference_field = CustomReferencing class Meta: model = ReferencingDoc depth = 0 expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) ref = CustomReferencing(queryset=ReferencedDoc.objects, required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_embedding_custom_nested(self): class CustomTestSerializer(Serializer): bla = drf_fields.CharField() class TestSerializer(DocumentSerializer): serializer_embedded_nested = CustomTestSerializer class Meta: model = NestedEmbeddingDoc expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) embedded = EmbeddedSerializer(required=False): bla = CharField() """) assert unicode_repr(TestSerializer()) == expected
def test_custom_generic(self): class CustomReferencing(GenericReferenceField): pass class TestSerializer(DocumentSerializer): serializer_reference_generic = CustomReferencing class Meta: model = GenericReferencingDoc depth = 0 expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) ref = CustomReferencing(required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_mapping(self): class TestSerializer(DocumentSerializer): class Meta: model = GeoDoc expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) geo_point_field = GeoPointField(required=False) point_field = GeoJSONField(geo_type='Point', required=False) line_field = GeoJSONField(geo_type='LineString', required=False) poly_field = GeoJSONField(geo_type='Polygon', required=False) multi_point_field = GeoJSONField(geo_type='MultiPoint', required=False) multi_line_field = GeoJSONField(geo_type='MultiLineString', required=False) multi_poly_field = GeoJSONField(geo_type='MultiPolygon', required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_recursive(self): class TestSerializer(DocumentSerializer): class Meta: model = RecursiveReferencingDoc depth = 3 expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) ref = NestedSerializer(read_only=True): id = ObjectIdField(read_only=True) ref = NestedSerializer(read_only=True): id = ObjectIdField(read_only=True) ref = NestedSerializer(read_only=True): id = ObjectIdField(read_only=True) ref = ReferenceField(queryset=RecursiveReferencingDoc.objects, required=False) """) assert unicode_repr(TestSerializer()) == expected
def test_custom_nested(self): class CustomReferencing(Serializer): foo = IntegerField() class TestSerializer(DocumentSerializer): serializer_reference_nested = CustomReferencing class Meta: model = ReferencingDoc depth = 1 expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) ref = NestedSerializer(read_only=True): foo = IntegerField() """) assert unicode_repr(TestSerializer()) == expected
def test_mapping_recursive(self): class TestSerializer(DocumentSerializer): class Meta: model = RecursiveEmbeddingModel depth = 3 expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) embedded = NestedEmbSerializer(): foo = CharField(required=False) embedded = NestedEmbSerializer(): foo = CharField(required=False) embedded = NestedEmbSerializer(): foo = CharField(required=False) embedded = DocumentField(depth=0, model_field=<mongoengine.fields.EmbeddedDocumentField: embedded>, read_only=True) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_embedding_recursive_restricted(self): class TestSerializer(DocumentSerializer): class Meta: model = RecursiveEmbeddingDoc depth_embedding = 2 expected = dedent(""" TestSerializer(): id = ObjectIdField(read_only=True) embedded = EmbeddedSerializer(required=False): name = CharField(required=False) embedded = EmbeddedSerializer(required=False): name = CharField(required=False) embedded = HiddenField(default=None, required=False) """) serializer = TestSerializer() assert unicode_repr(serializer) == expected
def test_named_field_source(self): class TestSerializer(serializers.ModelSerializer): class Meta: model = RegularFieldsModel fields = ('number_field',) extra_kwargs = { 'number_field': { 'source': 'integer_field' } } expected = dedent(""" TestSerializer(): number_field = IntegerField(source='integer_field') """) self.maxDiff = None self.assertEqual(unicode_repr(TestSerializer()), expected)
def test_duration_field_with_validators(self): class ValidatedDurationFieldModel(models.Model): """ A model that defines DurationField with validators. """ duration_field = models.DurationField( validators=[MinValueValidator(datetime.timedelta(days=1)), MaxValueValidator(datetime.timedelta(days=3))] ) class TestSerializer(serializers.ModelSerializer): class Meta: model = ValidatedDurationFieldModel fields = '__all__' expected = dedent(""" TestSerializer(): id = IntegerField(label='ID', read_only=True) duration_field = DurationField(max_value=datetime.timedelta(3), min_value=datetime.timedelta(1)) """) self.assertEqual(unicode_repr(TestSerializer()), expected)
def smart_repr(value): if isinstance(value, models.Manager): return manager_repr(value) if isinstance(value, Promise) and value._delegate_text: value = force_text(value) value = unicode_repr(value) # Representations like u'help text' # should simply be presented as 'help text' if value.startswith("u'") and value.endswith("'"): return value[1:] # Representations like # <django.core.validators.RegexValidator object at 0x1047af050> # Should be presented as # <django.core.validators.RegexValidator object> value = re.sub(' at 0x[0-9A-Fa-f]{4,32}>', '>', value) return value