From 005edc93d7b28d050dbfd2384616eab75a440d8f Mon Sep 17 00:00:00 2001 From: Lincoln Puzey Date: Sun, 28 Feb 2021 14:03:57 +0800 Subject: [PATCH] Add tests to document how dirtyfields works with FileFields --- tests/django_settings.py | 3 +++ tests/files/bar.txt | 1 + tests/files/foo.txt | 1 + tests/models.py | 4 +++ tests/test_core.py | 54 ++++++++++++++++++++++++++++++++++++++-- tests/utils.py | 5 ++++ 6 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 tests/files/bar.txt create mode 100644 tests/files/foo.txt diff --git a/tests/django_settings.py b/tests/django_settings.py index 5aece06..9d214f6 100644 --- a/tests/django_settings.py +++ b/tests/django_settings.py @@ -1,5 +1,6 @@ # Minimum settings that are needed to run django test suite import os +import tempfile SECRET_KEY = 'WE DONT CARE ABOUT IT' @@ -26,3 +27,5 @@ } INSTALLED_APPS = ('tests', ) + +MEDIA_ROOT = tempfile.mkdtemp(prefix="django-dirtyfields-test-media-root-") diff --git a/tests/files/bar.txt b/tests/files/bar.txt new file mode 100644 index 0000000..50b30ad --- /dev/null +++ b/tests/files/bar.txt @@ -0,0 +1 @@ +bar-content diff --git a/tests/files/foo.txt b/tests/files/foo.txt new file mode 100644 index 0000000..d1e7a10 --- /dev/null +++ b/tests/files/foo.txt @@ -0,0 +1 @@ +foo-content diff --git a/tests/models.py b/tests/models.py index 554b13d..3513e74 100644 --- a/tests/models.py +++ b/tests/models.py @@ -155,3 +155,7 @@ class ModelWithM2MAndSpecifiedFieldsTest(DirtyFieldsMixin, models.Model): class BinaryModelTest(DirtyFieldsMixin, models.Model): bytea = models.BinaryField() + + +class FileFieldModel(DirtyFieldsMixin, models.Model): + file1 = models.FileField(upload_to="file1/") diff --git a/tests/test_core.py b/tests/test_core.py index 0e319fc..2aed90a 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -1,8 +1,14 @@ from decimal import Decimal +from os.path import dirname, join + import pytest +from django.core.files.base import ContentFile, File -from .models import (ModelTest, ModelWithForeignKeyTest, ModelWithOneToOneFieldTest, - SubclassModelTest, ModelWithDecimalFieldTest) +from .models import (ModelTest, ModelWithForeignKeyTest, + ModelWithOneToOneFieldTest, + SubclassModelTest, ModelWithDecimalFieldTest, + FileFieldModel) +from .utils import FakeFieldFile @pytest.mark.django_db @@ -199,3 +205,47 @@ def test_refresh_from_db_no_fields(): assert tm.boolean is False assert tm.characters == "new value" assert tm.get_dirty_fields() == {"boolean": True, "characters": "old value"} + + +@pytest.mark.django_db +def test_file_fields_content_file(): + tm = FileFieldModel() + # field is dirty because model is unsaved + assert tm.get_dirty_fields() == {"file1": FakeFieldFile("")} + tm.save() + assert tm.get_dirty_fields() == {} + + # set file makes field dirty + tm.file1.save("test-file-1.txt", ContentFile(b"Test file content 1"), save=False) + assert tm.get_dirty_fields() == {"file1": FakeFieldFile("")} + tm.save() + assert tm.get_dirty_fields() == {} + + # change file makes field dirty + tm.file1.save("test-file-2.txt", ContentFile(b"Test file content 2"), save=False) + assert tm.get_dirty_fields() == {"file1": FakeFieldFile("file1/test-file-1.txt")} + tm.save() + assert tm.get_dirty_fields() == {} + + +@pytest.mark.django_db +def test_file_fields_real_file(): + tm = FileFieldModel() + # field is dirty because model is unsaved + assert tm.get_dirty_fields() == {"file1": FakeFieldFile("")} + tm.save() + assert tm.get_dirty_fields() == {} + + # set file makes field dirty + with open(join(dirname(__file__), "files", "foo.txt"), "rb") as f: + tm.file1.save("test-file-3.txt", File(f), save=False) + assert tm.get_dirty_fields() == {"file1": FakeFieldFile("")} + tm.save() + assert tm.get_dirty_fields() == {} + + # change file makes field dirty + with open(join(dirname(__file__), "files", "bar.txt"), "rb") as f: + tm.file1.save("test-file-4.txt", File(f), save=False) + assert tm.get_dirty_fields() == {"file1": FakeFieldFile("file1/test-file-3.txt")} + tm.save() + assert tm.get_dirty_fields() == {} diff --git a/tests/utils.py b/tests/utils.py index b686fe0..1e05837 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,4 +1,5 @@ import re +from collections import namedtuple from django.conf import settings from django.db import connection @@ -62,3 +63,7 @@ def is_postgresql_env_with_jsonb_field(): PG_VERSION = 0 return PG_VERSION >= 90400 + + +# Will compare equal with a django `FieldFile` instance in tests. +FakeFieldFile = namedtuple("FakeFieldFile", ["name"])