@@ -44,7 +44,10 @@ class TestRunImport:
4444 @patch ("odoo_data_flow.importer.import_threaded.import_data" )
4545 @patch ("odoo_data_flow.importer._run_preflight_checks" )
4646 def test_run_import_success_path (
47- self , mock_preflight : MagicMock , mock_import_data : MagicMock , tmp_path : Path
47+ self ,
48+ mock_preflight : MagicMock ,
49+ mock_import_data : MagicMock ,
50+ tmp_path : Path ,
4851 ) -> None :
4952 """Test the successful execution path of run_import."""
5053 # Arrange
@@ -81,7 +84,9 @@ def test_run_import_success_path(
8184 @patch ("odoo_data_flow.importer._infer_model_from_filename" )
8285 @patch ("odoo_data_flow.importer._show_error_panel" )
8386 def test_run_import_fails_if_model_not_found (
84- self , mock_show_error : MagicMock , mock_infer_model : MagicMock
87+ self ,
88+ mock_show_error : MagicMock ,
89+ mock_infer_model : MagicMock ,
8590 ) -> None :
8691 """Test that the import aborts if no model can be determined."""
8792 # Arrange
@@ -114,7 +119,9 @@ def test_run_import_fails_if_model_not_found(
114119
115120 @patch ("odoo_data_flow.importer.import_threaded.import_data" )
116121 def test_import_data_simple_success (
117- self , mock_import_data : MagicMock , tmp_path : Path
122+ self ,
123+ mock_import_data : MagicMock ,
124+ tmp_path : Path ,
118125 ) -> None :
119126 """Tests a simple, successful import with no failures."""
120127 source_file = tmp_path / "source.csv"
@@ -144,7 +151,9 @@ def test_import_data_simple_success(
144151
145152 @patch ("odoo_data_flow.importer.import_threaded.import_data" )
146153 def test_import_data_two_pass_success (
147- self , mock_import_data : MagicMock , tmp_path : Path
154+ self ,
155+ mock_import_data : MagicMock ,
156+ tmp_path : Path ,
148157 ) -> None :
149158 """Tests a successful two-pass import with deferred fields."""
150159 source_file = tmp_path / "source.csv"
@@ -176,7 +185,9 @@ def test_import_data_two_pass_success(
176185@patch ("odoo_data_flow.importer.import_threaded.import_data" )
177186@patch ("odoo_data_flow.importer._run_preflight_checks" , return_value = False )
178187def test_run_import_preflight_fails (
179- mock_preflight : MagicMock , mock_import_data : MagicMock , tmp_path : Path
188+ mock_preflight : MagicMock ,
189+ mock_import_data : MagicMock ,
190+ tmp_path : Path ,
180191) -> None :
181192 """Test that the import aborts if preflight checks fail."""
182193 source_file = tmp_path / "source.csv"
@@ -206,7 +217,9 @@ def test_run_import_preflight_fails(
206217@patch ("odoo_data_flow.importer.import_threaded.import_data" )
207218@patch ("odoo_data_flow.importer._run_preflight_checks" , return_value = True )
208219def test_run_import_fail_mode (
209- mock_preflight : MagicMock , mock_import_data : MagicMock , tmp_path : Path
220+ mock_preflight : MagicMock ,
221+ mock_import_data : MagicMock ,
222+ tmp_path : Path ,
210223) -> None :
211224 """Test the fail mode logic."""
212225 source_file = tmp_path / "source.csv"
@@ -320,3 +333,50 @@ def test_run_import_invalid_context(mock_show_error: MagicMock) -> None:
320333 groupby = None ,
321334 )
322335 mock_show_error .assert_called_once ()
336+
337+
338+ @patch ("odoo_data_flow.importer.relational_import.run_direct_relational_import" )
339+ @patch ("odoo_data_flow.importer.import_threaded.import_data" )
340+ @patch ("odoo_data_flow.importer._run_preflight_checks" )
341+ def test_run_import_fail_mode_with_strategies (
342+ mock_preflight : MagicMock ,
343+ mock_import_data : MagicMock ,
344+ mock_relational_import : MagicMock ,
345+ tmp_path : Path ,
346+ ) -> None :
347+ """Test that relational strategies are skipped in fail mode."""
348+ source_file = tmp_path / "source.csv"
349+ source_file .touch ()
350+ fail_file = tmp_path / "res_partner_fail.csv"
351+ fail_file .write_text ("id,name\n 1,test" )
352+
353+ def preflight_side_effect (* _args : Any , ** kwargs : Any ) -> bool :
354+ kwargs ["import_plan" ]["strategies" ] = {
355+ "field" : {"strategy" : "direct_relational_import" }
356+ }
357+ return True
358+
359+ mock_preflight .side_effect = preflight_side_effect
360+ mock_import_data .return_value = (True , {"total_records" : 1 , "id_map" : {"1" : 1 }})
361+
362+ run_import (
363+ config = "dummy.conf" ,
364+ filename = str (source_file ),
365+ model = "res.partner" ,
366+ fail = True ,
367+ deferred_fields = None ,
368+ unique_id_field = None ,
369+ no_preflight_checks = False ,
370+ headless = True ,
371+ worker = 1 ,
372+ batch_size = 100 ,
373+ skip = 0 ,
374+ separator = ";" ,
375+ ignore = None ,
376+ context = {},
377+ encoding = "utf-8" ,
378+ o2m = False ,
379+ groupby = None ,
380+ )
381+ mock_import_data .assert_called_once ()
382+ mock_relational_import .assert_not_called ()
0 commit comments