88from django .urls import reverse
99from testutils .factories import FlexFieldFactory
1010from testutils .utils import select_office
11- from webtest import Checkbox , Upload
11+ from unittest import mock
1212
1313from country_workspace .state import state
1414from country_workspace .workspaces .admin .cleaners .bulk_update import TYPES , create_xls_importer
2020 from django_webtest import DjangoTestApp
2121 from django_webtest .pytest_plugin import MixinWithInstanceVariables
2222 from pytest_django .fixtures import SettingsWrapper
23+ from webtest import Checkbox
2324
2425 from country_workspace .models import AsyncJob
2526 from country_workspace .workspaces .models import CountryHousehold
@@ -38,6 +39,18 @@ def app(django_app_factory: "MixinWithInstanceVariables") -> "DjangoTestApp":
3839 return django_app
3940
4041
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+
4154@pytest .fixture (scope = "session" )
4255def celery_config ():
4356 return {"broker_url" : os .environ ["CELERY_BROKER_URL" ], "result_backend" : os .environ ["CELERY_BROKER_URL" ]}
@@ -142,56 +155,30 @@ def test_create_xls_importer(household: "CountryHousehold", force_migrated_recor
142155
143156
144157def test_bulk_update_export (
145- app : "DjangoTestApp" , force_migrated_records , settings : "SettingsWrapper" , household : "CountryHousehold"
146- ) -> None :
147- url = reverse ("workspace:workspaces_countryindividual_changelist" )
148- settings .CELERY_TASK_ALWAYS_EAGER = True
149- selected_fields = stub .header_add ["ind" ]
150- with select_office (app , household .country_office , household .program ):
151- res = app .get (url )
152- form = res .forms ["changelist-form" ]
153- form ["action" ] = "bulk_update_export"
154- form .set ("_selected_action" , True , index = 0 )
155- res = form .submit ()
156-
157- form = res .forms ["bulk-update-form" ]
158- for i in range (len (form .fields .get ("fields" ))):
159- target : Checkbox = form .fields .get ("fields" )[i ]
160- if target ._value in selected_fields :
161- target .checked = True
162- res = form .submit ("_export" )
163-
164- assert res .status_code == 302
165- job : AsyncJob = household .program .jobs .first ()
166- job .queue ()
167-
168-
169- def test_bulk_update_import (
170158 app : "DjangoTestApp" ,
171159 force_migrated_records ,
172160 settings : "SettingsWrapper" ,
173- data : tuple [io .BytesIO , "CountryHousehold" , str ],
161+ household : "CountryHousehold" ,
162+ mock_media_storage ,
174163) -> None :
175- buff , household , target = data
176- url = reverse ("workspace:workspaces_countryprogram_change" , args = [household .program .pk ])
177- settings .CELERY_TASK_ALWAYS_EAGER = True
178-
179- with select_office (app , household .country_office , household .program ):
180- res = app .get (url )
181- res = res .click ("Update Records" )
182- res .forms ["bulk-update-form" ]["description" ] = f"Bulk update from { target } "
183- res .forms ["bulk-update-form" ]["target" ] = target
184- res .forms ["bulk-update-form" ]["file" ] = Upload (f"{ target } .xlsx" , buff .read ())
185- res = res .forms ["bulk-update-form" ].submit ("_import" )
186- household .refresh_from_db ()
187- job : AsyncJob = household .program .jobs .first ()
188-
189- assert res .status_code == 302
190- assert job
191-
192- if target == "hh" :
193- admin1_v = f"admin1_{ stub .header_add ['hh' ].index ('admin1' ) + 2 } "
194- assert household .flex_fields .get ("admin1" ) == admin1_v
195- elif target == "ind" :
196- given_name = f"given_name_{ stub .header_add ['ind' ].index ('given_name' ) + 2 } "
197- assert household .members .filter (flex_fields__given_name = given_name ).exists ()
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" ]
168+ with select_office (app , household .country_office , household .program ):
169+ res = app .get (url )
170+ form = res .forms ["changelist-form" ]
171+ form ["action" ] = "bulk_update_export"
172+ form .set ("_selected_action" , True , index = 0 )
173+ res = form .submit ()
174+
175+ form = res .forms ["bulk-update-form" ]
176+ for i in range (len (form .fields .get ("fields" ))):
177+ target : Checkbox = form .fields .get ("fields" )[i ]
178+ if target ._value in selected_fields :
179+ target .checked = True
180+ res = form .submit ("_export" )
181+
182+ assert res .status_code == 302
183+ job : AsyncJob = household .program .jobs .first ()
184+ job .queue ()
0 commit comments