diff --git a/.importanizerc b/.importanizerc index 05c3647..f02a403 100644 --- a/.importanizerc +++ b/.importanizerc @@ -1,13 +1,11 @@ { - "add_imports": [ - "from __future__ import absolute_import, print_function, unicode_literals" - ], - "length": 120, - "groups": [ - {"type": "stdlib"}, - {"type": "remainder"}, - {"type": "packages", "packages": ["django"]}, - {"type": "packages", "packages": ["rest_framework"]}, - {"type": "local"} - ] + "length": 120, + "groups": [ + { "type": "stdlib" }, + { "type": "remainder" }, + { "type": "packages", "packages": ["django"] }, + { "type": "packages", "packages": ["rest_framework"] }, + { "type": "packages", "packages": ["rest_dataclasses"] }, + { "type": "local" } + ] } diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c7812a6 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,20 @@ +--- +language: python +dist: xenial +cache: + directories: + - $HOME/.cache/pip + - $HOME/.cache/pre-commit + +python: + - "3.7" + +install: + - pip install -U -r requirements.txt + +script: + - make lint + - make coverage + +after_success: + coveralls diff --git a/setup.py b/setup.py index 9a5f513..cf19316 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,7 @@ def read(fname): author=about["__author__"], author_email=about["__author_email__"], description=about["__description__"], - install_requires=["djangorestframework"], + install_requires=["django", "djangorestframework"], license="MIT", long_description=read("README.rst"), name="django-rest-dataclasses", diff --git a/tests/test_serializers.py b/tests/test_serializers.py index a21067b..7e13794 100644 --- a/tests/test_serializers.py +++ b/tests/test_serializers.py @@ -2,13 +2,14 @@ from __future__ import absolute_import, print_function, unicode_literals import dataclasses as da -from rest_dataclasses.serializers import DataclassSerializer - +from django.core.exceptions import ValidationError as DjangoValidationError from django.test import SimpleTestCase from rest_framework import fields from rest_framework.exceptions import ValidationError +from rest_dataclasses.serializers import DataclassSerializer + @da.dataclass class User: @@ -232,3 +233,56 @@ class Meta: with self.assertRaises(ValidationError): serializer.save() + + def test_create_star_source(self): + class Serializer(DataclassSerializer): + class Meta: + model = User + fields = ["name"] + + class StarSerializer(DataclassSerializer): + user = Serializer(source="*") + + class Meta: + model = User + fields = ["id", "user"] + + serializer = StarSerializer(data={"user": {"name": "shosca"}, "id": 1}) + serializer.is_valid(raise_exception=True) + user = serializer.save() + + self.assertDictEqual(da.asdict(user), {"id": 1, "name": "shosca", "email": None}) + + def test_create_source_not_in_validated_data(self): + class Serializer(DataclassSerializer): + class Meta: + model = Line + fields = "__all__" + + serializer = Serializer(data={}) + serializer.is_valid(raise_exception=True) + line = serializer.save() + + self.assertDictEqual(da.asdict(line), {"a": None, "b": None}) + + def test_validation_error_on_save(self): + class Serializer(DataclassSerializer): + class Meta: + model = User + fields = ["name"] + + def perform_update(self, instance, validated_data, errors): + raise DjangoValidationError("test") + + class StarSerializer(DataclassSerializer): + user = Serializer(source="*") + + class Meta: + model = User + fields = ["id", "user"] + + serializer = StarSerializer(data={"user": {"name": "shosca"}, "id": 1}) + serializer.is_valid(raise_exception=True) + + with self.assertRaises(ValidationError): + serializer.save() diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 0000000..f3805b9 --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import, print_function, unicode_literals +import unittest + +from django.core.exceptions import ValidationError + +from rest_dataclasses.utils import _django_to_drf + + +class TestUtils(unittest.TestCase): + def test_django_to_drf(self): + self.assertEqual(_django_to_drf("hello"), "hello") + self.assertEqual(_django_to_drf(["hello"]), ["hello"]) + self.assertEqual(_django_to_drf({"hello": "world"}), {"hello": "world"}) + self.assertEqual(_django_to_drf(ValidationError("hello")), ["hello"]) + self.assertEqual(_django_to_drf(ValidationError({"hello": "world"})), {"hello": ["world"]})