99from testutils .factories import FlexFieldFactory
1010from testutils .utils import select_office
1111from unittest import mock
12+ from webtest import Upload
13+
1214
1315from country_workspace .state import state
1416from 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" )
5545def 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