Skip to content

Commit

Permalink
Add tests to document how dirtyfields works with FileFields
Browse files Browse the repository at this point in the history
  • Loading branch information
LincolnPuzey committed Apr 1, 2021
1 parent 2ef5d81 commit 005edc9
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 2 deletions.
3 changes: 3 additions & 0 deletions 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'

Expand All @@ -26,3 +27,5 @@
}

INSTALLED_APPS = ('tests', )

MEDIA_ROOT = tempfile.mkdtemp(prefix="django-dirtyfields-test-media-root-")
1 change: 1 addition & 0 deletions tests/files/bar.txt
@@ -0,0 +1 @@
bar-content
1 change: 1 addition & 0 deletions tests/files/foo.txt
@@ -0,0 +1 @@
foo-content
4 changes: 4 additions & 0 deletions tests/models.py
Expand Up @@ -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/")
54 changes: 52 additions & 2 deletions 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
Expand Down Expand Up @@ -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() == {}
5 changes: 5 additions & 0 deletions tests/utils.py
@@ -1,4 +1,5 @@
import re
from collections import namedtuple

from django.conf import settings
from django.db import connection
Expand Down Expand Up @@ -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"])

0 comments on commit 005edc9

Please sign in to comment.