From b7d98ef37be7ac087c9811c7b38d26df519437bc Mon Sep 17 00:00:00 2001 From: Johan Castiblanco Date: Wed, 19 Jun 2024 13:57:08 -0500 Subject: [PATCH] fix: pipeline starts with wrong pipeline_index this removes the keys ["pipeline_index", "launch_validation_error_pipeline"] to dont finish the next pipeline error_validation_task. --- eox_nelp/pearson_vue/rti_backend.py | 9 +++- .../pearson_vue/tests/test_rti_backend.py | 13 +++-- eox_nelp/tests/test_utils.py | 49 ++++++++++++++++++- eox_nelp/utils.py | 17 +++++++ 4 files changed, 82 insertions(+), 6 deletions(-) diff --git a/eox_nelp/pearson_vue/rti_backend.py b/eox_nelp/pearson_vue/rti_backend.py index b6ddbe9b..1434c5d0 100644 --- a/eox_nelp/pearson_vue/rti_backend.py +++ b/eox_nelp/pearson_vue/rti_backend.py @@ -20,6 +20,7 @@ validate_cdd_request, validate_ead_request, ) +from eox_nelp.utils import remove_keys_from_dict class RealTimeImport: @@ -60,8 +61,14 @@ def run_pipeline(self): break if result.get("launch_validation_error_pipeline"): self.backend_data["pipeline_index"] = len(pipeline) - 1 + # clean kwargs to dont finish next pipeline. + error_validation_kwargs = remove_keys_from_dict( + self.backend_data, + ["pipeline_index", "launch_validation_error_pipeline"] + ) + tasks = importlib.import_module("eox_nelp.pearson_vue.tasks") - tasks.error_validation_task.delay(**self.backend_data) + tasks.error_validation_task.delay(**error_validation_kwargs) break def get_pipeline(self): diff --git a/eox_nelp/pearson_vue/tests/test_rti_backend.py b/eox_nelp/pearson_vue/tests/test_rti_backend.py index 9da4582d..bbbe0992 100644 --- a/eox_nelp/pearson_vue/tests/test_rti_backend.py +++ b/eox_nelp/pearson_vue/tests/test_rti_backend.py @@ -10,6 +10,7 @@ ExamAuthorizationDataImport, RealTimeImport, ) +from eox_nelp.utils import remove_keys_from_dict class TestRealTimeImport(unittest.TestCase): @@ -153,7 +154,7 @@ def test_launch_validation_error_pipeline(self, error_validation_task_mock): - Pipeline method 4 is not called. - backend_data attribute is the expected value. Without func3,func4 data and pipeline index in the last. - - error_validation_task is called with updated backend_data kwargs. + - error_validation_task is called with error_validation_kwargs. """ # Mock pipeline functions func1 = MagicMock(return_value={"updated_key": "value1"}) @@ -166,7 +167,6 @@ def test_launch_validation_error_pipeline(self, error_validation_task_mock): func4 = MagicMock(return_value={"additional_key": "value4"}) self.rti.get_pipeline = MagicMock(return_value=[func1, func2, func2]) - self.rti.run_pipeline() func1.assert_called_once_with(**self.backend_data) @@ -178,10 +178,15 @@ def test_launch_validation_error_pipeline(self, error_validation_task_mock): { "pipeline_index": len(self.rti.get_pipeline()) - 1, # includes total of pipeline methods **func1(), # Include data from func1 () - **func2(), # Include data from func2 (with safely_pipeline_termination) + **func2(), # Include data from func2 (with launch_validation_error_pipeline) }, ) - error_validation_task_mock.delay.assert_called_with(**self.rti.backend_data) + + error_validation_kwargs = remove_keys_from_dict( + self.rti.backend_data, + ["pipeline_index", "launch_validation_error_pipeline"] + ) + error_validation_task_mock.delay.assert_called_with(**error_validation_kwargs) def test_get_pipeline(self): """ diff --git a/eox_nelp/tests/test_utils.py b/eox_nelp/tests/test_utils.py index cc257513..4ff276a0 100644 --- a/eox_nelp/tests/test_utils.py +++ b/eox_nelp/tests/test_utils.py @@ -9,7 +9,13 @@ from mock import Mock, patch from opaque_keys.edx.keys import CourseKey -from eox_nelp.utils import camel_to_snake, extract_course_id_from_string, get_course_from_id, get_item_label +from eox_nelp.utils import ( + camel_to_snake, + extract_course_id_from_string, + get_course_from_id, + get_item_label, + remove_keys_from_dict, +) @ddt @@ -222,3 +228,44 @@ def test_invalid_input(self, input_value): - TypeError is raised """ self.assertRaises(TypeError, camel_to_snake, input_value) + + +@ddt +class RemoveKeysFromDict(TestCase): + """Test class for the remove_keys_from_dict method.""" + + def setUp(self): + """ + Set up test environment. + """ + self.student_info = { + "name": "Alice Smith", + "id": 12345, + "grade": 10, + "math_grade": 85, + "science_grade": 92, + "history_grade": 78, + "english_grade": 90, + "has_library_fines": False, + "favorite_subject": "science", + "number_of_siblings": 2, + "email": "alice.smith@school.com" + } + + @data( + ["name", "id"], + ["science_grade", "english_grade"], + ["favorite_subject", "email"], + ["favorite_subject", "math_grade"], + ["history_grade"], + ) + def test_remove_keys_from_dict(self, removed_keys): + """ Test right functionality. + + Expected behavior: + - Returned value is the expected value. + """ + expected_result = remove_keys_from_dict(self.student_info, removed_keys) + + for key in removed_keys: + self.assertNotIn(key, expected_result) diff --git a/eox_nelp/utils.py b/eox_nelp/utils.py index 35d498f8..5e58230d 100644 --- a/eox_nelp/utils.py +++ b/eox_nelp/utils.py @@ -154,3 +154,20 @@ def camel_to_snake(string): String in snake case. """ return re.sub(r'(?