Skip to content

Commit d9ab8d7

Browse files
Add tests
1 parent 04a7789 commit d9ab8d7

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

src/country_workspace/utils/flex_fields.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from base64 import b64encode
22
import hashlib
33
import json
4-
from typing import TYPE_CHECKING, Generator
4+
from typing import TYPE_CHECKING, Generator, Literal
55

66
from django import forms
77
from django.core.files.uploadedfile import UploadedFile
@@ -40,7 +40,7 @@ def is_initial(self, value: str | None) -> bool:
4040
class Base64ImageField(forms.ImageField):
4141
widget = Base64ImageInput
4242

43-
def clean(self, data: UploadedFile, initial: str | None = None) -> str | None:
43+
def clean(self, data: UploadedFile | Literal[False], initial: str | None = None) -> str | None:
4444
if cleaned_data := super().clean(data, initial):
4545
content = b64encode(cleaned_data.read()).decode()
4646
return VALUE_FORMAT.format(mimetype=data.content_type, content=content)

tests/utils/test_utils_fields.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
1+
from unittest.mock import Mock
2+
13
import pytest
2-
from pytest_mock import MockFixture
4+
from django.core.files.uploadedfile import SimpleUploadedFile
5+
from pytest_mock import MockerFixture
36

7+
from country_workspace.contrib.kobo.api.data.helpers import VALUE_FORMAT
48
from country_workspace.utils.fields import (
59
clean_field_name,
610
TO_REMOVE_VALUES,
711
clean_field_names,
812
map_fields,
913
)
14+
from country_workspace.utils.flex_fields import Base64ImageInput, Base64ImageField
1015

1116

1217
@pytest.mark.parametrize(
@@ -21,7 +26,7 @@ def test_clean_field_name(input_value, expected_output):
2126
assert clean_field_name(input_value) == expected_output
2227

2328

24-
def test_clean_field_names(mocker: MockFixture) -> None:
29+
def test_clean_field_names(mocker: MockerFixture) -> None:
2530
clean_field_name_mock = mocker.patch("country_workspace.utils.fields.clean_field_name")
2631

2732
cleaned = clean_field_names({(key := "foo"): "bar"})
@@ -42,3 +47,28 @@ def test_clean_field_names(mocker: MockFixture) -> None:
4247
def test_map_fields(input_fields, expected_output):
4348
result = map_fields(input_fields)
4449
assert result == expected_output
50+
51+
52+
@pytest.mark.parametrize("value", [None, "", "test"])
53+
def test_base64_image_input(value: str | None) -> None:
54+
input_ = Base64ImageInput()
55+
assert input_.is_initial(value) == bool(value)
56+
57+
58+
def test_base64_image_field_file_was_cleared(mocker: MockerFixture) -> None:
59+
super_clean_mock = mocker.patch("country_workspace.utils.flex_fields.forms.ImageField.clean")
60+
super_clean_mock.return_value = False
61+
instance = Mock(spec=Base64ImageField)
62+
63+
assert Base64ImageField.clean(instance, False) is None
64+
65+
66+
def test_base64_image_field_content_is_encoded(mocker: MockerFixture) -> None:
67+
super_clean_mock = mocker.patch("country_workspace.utils.flex_fields.forms.ImageField.clean")
68+
b64encode_mock = mocker.patch("country_workspace.utils.flex_fields.b64encode")
69+
b64encode_mock.return_value.decode.return_value = (data := "decoded")
70+
file = SimpleUploadedFile("test.txt", b"test", content_type=(content_type := "text/plain"))
71+
super_clean_mock.return_value = file
72+
instance = Mock(spec=Base64ImageField)
73+
74+
assert Base64ImageField.clean(instance, file) == VALUE_FORMAT.format(mimetype=content_type, content=data)

0 commit comments

Comments
 (0)