Skip to content

Commit fc72fd3

Browse files
chg ! tests
1 parent 75aa560 commit fc72fd3

File tree

2 files changed

+74
-17
lines changed

2 files changed

+74
-17
lines changed

tests/conftest.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
import pytest
88
import responses
99

10+
from django.core.files.storage.base import Storage
11+
from django.core.files.base import ContentFile
12+
1013
if TYPE_CHECKING:
1114
from country_workspace.models import User
1215

@@ -34,12 +37,44 @@ def pytest_addoption(parser):
3437
)
3538

3639

40+
class MockStorage(Storage):
41+
def __init__(self):
42+
self._file_content = None
43+
44+
def save(self, name, content, max_length=None):
45+
self._file_content = content.read() if hasattr(content, "read") else content
46+
return "mocked/path/to/file"
47+
48+
def get_available_name(self, name, max_length=None):
49+
return "mocked/path/to/file"
50+
51+
def open(self, name, mode="rb"):
52+
if self._file_content is not None:
53+
return ContentFile(self._file_content)
54+
return ContentFile(b"id,name\n1,Test")
55+
56+
57+
@pytest.fixture
58+
def mock_storage():
59+
return MockStorage()
60+
61+
62+
@pytest.fixture(autouse=True)
63+
def patch_asyncjob(mock_storage):
64+
from django.db import models
65+
from country_workspace.models.jobs import AsyncJob
66+
67+
AsyncJob._meta.get_field("file").storage = mock_storage
68+
AsyncJob._meta.get_field("file").__class__ = models.FileField
69+
70+
3771
def pytest_configure(config):
3872
if not config.option.enable_selenium and ("selenium" not in getattr(config.option, "markexpr", None)):
3973
if config.option.markexpr:
4074
config.option.markexpr += " and not selenium"
4175
else:
4276
config.option.markexpr = "not selenium"
77+
4378
os.environ["DJANGO_SETTINGS_MODULE"] = "country_workspace.config.settings"
4479
os.environ.setdefault("STATIC_URL", "/static/")
4580
os.environ.setdefault("MEDIA_ROOT", "/tmp/static/")

tests/workspace/actions/test_ws_bulk.py

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from testutils.factories import FlexFieldFactory
1010
from testutils.utils import select_office
1111
from unittest import mock
12+
from webtest import Upload
13+
1214

1315
from country_workspace.state import state
1416
from country_workspace.workspaces.admin.cleaners.bulk_update import TYPES, create_xls_importer
@@ -39,18 +41,6 @@ def app(django_app_factory: "MixinWithInstanceVariables") -> "DjangoTestApp":
3941
return django_app
4042

4143

42-
@pytest.fixture
43-
def mock_media_storage():
44-
return mock.MagicMock(
45-
**{
46-
"save.return_value": "mocked/path/to/file",
47-
"exists.return_value": False,
48-
"get_available_name.return_value": "mocked/path/to/file",
49-
"open.return_value": io.BytesIO(b"mocked file content"),
50-
}
51-
)
52-
53-
5444
@pytest.fixture(scope="session")
5545
def celery_config():
5646
return {"broker_url": os.environ["CELERY_BROKER_URL"], "result_backend": os.environ["CELERY_BROKER_URL"]}
@@ -159,12 +149,12 @@ def test_bulk_update_export(
159149
force_migrated_records,
160150
settings: "SettingsWrapper",
161151
household: "CountryHousehold",
162-
mock_media_storage,
152+
mock_storage,
163153
) -> None:
164-
with mock.patch("country_workspace.workspaces.admin.cleaners.bulk_update.MEDIA_STORAGE", mock_media_storage):
165-
url = reverse("workspace:workspaces_countryindividual_changelist")
166-
settings.CELERY_TASK_ALWAYS_EAGER = True
167-
selected_fields = stub.header_add["ind"]
154+
url = reverse("workspace:workspaces_countryindividual_changelist")
155+
settings.CELERY_TASK_ALWAYS_EAGER = True
156+
selected_fields = stub.header_add["ind"]
157+
with mock.patch("country_workspace.workspaces.admin.cleaners.bulk_update.MEDIA_STORAGE", mock_storage):
168158
with select_office(app, household.country_office, household.program):
169159
res = app.get(url)
170160
form = res.forms["changelist-form"]
@@ -182,3 +172,35 @@ def test_bulk_update_export(
182172
assert res.status_code == 302
183173
job: AsyncJob = household.program.jobs.first()
184174
job.queue()
175+
176+
177+
def test_bulk_update_import(
178+
app: "DjangoTestApp",
179+
force_migrated_records,
180+
settings: "SettingsWrapper",
181+
household: "CountryHousehold",
182+
data: tuple[io.BytesIO, "CountryHousehold", str],
183+
) -> None:
184+
buff, household, target = data
185+
url = reverse("workspace:workspaces_countryprogram_change", args=[household.program.pk])
186+
settings.CELERY_TASK_ALWAYS_EAGER = True
187+
188+
with select_office(app, household.country_office, household.program):
189+
res = app.get(url)
190+
res = res.click("Update Records")
191+
res.forms["bulk-update-form"]["description"] = f"Bulk update from {target}"
192+
res.forms["bulk-update-form"]["target"] = target
193+
res.forms["bulk-update-form"]["file"] = Upload(f"{target}.xlsx", buff.read())
194+
res = res.forms["bulk-update-form"].submit("_import")
195+
household.refresh_from_db()
196+
job: AsyncJob = household.program.jobs.first()
197+
198+
assert res.status_code == 302
199+
assert job
200+
201+
if target == "hh":
202+
admin1_v = f"admin1_{stub.header_add['hh'].index('admin1') + 2}"
203+
assert household.flex_fields.get("admin1") == admin1_v
204+
elif target == "ind":
205+
given_name = f"given_name_{stub.header_add['ind'].index('given_name') + 2}"
206+
assert household.members.filter(flex_fields__given_name=given_name).exists()

0 commit comments

Comments
 (0)