Skip to content

Commit

Permalink
chore: update action parameters generation
Browse files Browse the repository at this point in the history
  • Loading branch information
Ang-m4 committed Feb 17, 2025
1 parent 1f8a2f8 commit 242f44d
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 94 deletions.
4 changes: 2 additions & 2 deletions eox_nelp/pearson_vue/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
ExamAuthorizationDataImport,
RealTimeImport,
)
from eox_nelp.pearson_vue.utils import filter_action_parameters, update_user_engines
from eox_nelp.pearson_vue.utils import generate_action_parameters, update_user_engines

User = get_user_model()

Expand Down Expand Up @@ -133,7 +133,7 @@ def audit_pearson_engine_action(user_id, exam_id, action_key, **kwargs):
user = User.objects.get(id=user_id)
update_user_engines(user, action_name, exam_id)
action = getattr(PearsonEngineApiClient(), action_key)
parameters = filter_action_parameters(action_name, user, exam_id)
parameters = generate_action_parameters(user, exam_id)
response = action(**parameters, **kwargs)

if response.get("error"):
Expand Down
62 changes: 28 additions & 34 deletions eox_nelp/pearson_vue/tests/test_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,14 +117,19 @@ def setUp(self):
self.user, _ = User.objects.get_or_create(username="vader")
self.exam_id = "exam123"
self.kwargs = {"extra_info": "test"}
self.action_parameters = {
"user_data": "test",
"platform_data": "test",
"exam_data": "test",
}

@patch("eox_nelp.pearson_vue.tasks.update_user_engines")
@patch("eox_nelp.pearson_vue.tasks.filter_action_parameters")
@patch("eox_nelp.pearson_vue.tasks.generate_action_parameters")
@patch("eox_nelp.pearson_vue.tasks.PearsonEngineApiClient")
def test_real_time_import_rti(
self,
mock_api_client,
filter_action_parameters_mock,
generate_action_parameters_mock,
update_user_engines_mock
):
"""Test real-time import action using the Pearson Engine API.
Expand All @@ -133,29 +138,25 @@ def test_real_time_import_rti(
- update_user_engines is called with correct parameters.
- The real_time_import method is called with the correct parameters.
"""
rti_parameters = {
"user_data": "test",
"platform_data": "test",
"exam_data": "test",
}

mock_action = MagicMock()
mock_action.return_value = {"error": False}
mock_api_client.return_value = MagicMock(**{"real_time_import": mock_action})
filter_action_parameters_mock.return_value = rti_parameters
generate_action_parameters_mock.return_value = self.action_parameters
action_name = "rti"

real_time_import_task_v2(self.user.id, action_name=action_name, **self.kwargs)

update_user_engines_mock.assert_called_once_with(self.user, action_name, None)
mock_action.assert_called_once_with(**rti_parameters, **self.kwargs)
mock_action.assert_called_once_with(**self.action_parameters, **self.kwargs)

@patch("eox_nelp.pearson_vue.tasks.update_user_engines")
@patch("eox_nelp.pearson_vue.tasks.filter_action_parameters")
@patch("eox_nelp.pearson_vue.tasks.generate_action_parameters")
@patch("eox_nelp.pearson_vue.tasks.PearsonEngineApiClient")
def test_real_time_import_cdd(
self,
mock_api_client,
filter_action_parameters_mock,
generate_action_parameters_mock,
update_user_engines_mock
):
"""Test candidate demographics import action using the Pearson Engine API.
Expand All @@ -164,25 +165,24 @@ def test_real_time_import_cdd(
- update_user_engines is called with correct parameters.
- The import_candidate_demographics method is called with the correct parameters.
"""
cdd_parameters = {"user_data": "test", "platform_data": "test"}
mock_action = MagicMock()
mock_action.return_value = {"error": False}
mock_api_client.return_value = MagicMock(**{"import_candidate_demographics": mock_action})
filter_action_parameters_mock.return_value = cdd_parameters
generate_action_parameters_mock.return_value = self.action_parameters
action_name = "cdd"

real_time_import_task_v2(self.user.id, action_name=action_name, **self.kwargs)

update_user_engines_mock.assert_called_once_with(self.user, action_name, None)
mock_action.assert_called_once_with(**cdd_parameters, **self.kwargs)
mock_action.assert_called_once_with(**self.action_parameters, **self.kwargs)

@patch("eox_nelp.pearson_vue.tasks.update_user_engines")
@patch("eox_nelp.pearson_vue.tasks.filter_action_parameters")
@patch("eox_nelp.pearson_vue.tasks.generate_action_parameters")
@patch("eox_nelp.pearson_vue.tasks.PearsonEngineApiClient")
def test_real_time_import_ead(
self,
mock_api_client,
filter_action_parameters_mock,
generate_action_parameters_mock,
update_user_engines_mock
):
"""Test exam authorization import action using the Pearson Engine API.
Expand All @@ -191,23 +191,22 @@ def test_real_time_import_ead(
- update_user_engines is called with correct parameters.
- The import_exam_authorization method is called with the correct parameters.
"""
ead_parameters = {"user_data": "test", "exam_data": "test"}
mock_action = MagicMock()
mock_action.return_value = {"error": False}
mock_api_client.return_value = MagicMock(**{"import_exam_authorization": mock_action})
filter_action_parameters_mock.return_value = ead_parameters
generate_action_parameters_mock.return_value = self.action_parameters
action_name = "ead"

real_time_import_task_v2(self.user.id, exam_id=self.exam_id, action_name=action_name, **self.kwargs)

update_user_engines_mock.assert_called_once_with(self.user, action_name, self.exam_id,)
mock_action.assert_called_once_with(**ead_parameters, **self.kwargs)
mock_action.assert_called_once_with(**self.action_parameters, **self.kwargs)

@patch("eox_nelp.pearson_vue.tasks.update_user_engines")
@patch("eox_nelp.pearson_vue.tasks.filter_action_parameters")
@patch("eox_nelp.pearson_vue.tasks.generate_action_parameters")
def test_real_time_import_invalid_action(
self,
filter_action_parameters_mock,
generate_action_parameters_mock,
update_user_engines_mock
):
"""Test that a KeyError is raised for an invalid action name.
Expand All @@ -219,15 +218,15 @@ def test_real_time_import_invalid_action(
with self.assertRaises(KeyError):
real_time_import_task_v2(self.user.id, action_name="invalid_action")
update_user_engines_mock.assert_not_called()
filter_action_parameters_mock.assert_not_called()
generate_action_parameters_mock.assert_not_called()

@patch("eox_nelp.pearson_vue.tasks.update_user_engines")
@patch("eox_nelp.pearson_vue.tasks.filter_action_parameters")
@patch("eox_nelp.pearson_vue.tasks.generate_action_parameters")
@patch('eox_nelp.pearson_vue.tasks.PearsonEngineApiClient')
def test_real_time_import_user_not_found(
self,
mock_api_client,
filter_action_parameters_mock,
generate_action_parameters_mock,
update_user_engines_mock
):
"""Test that a DoesNotExist is raised for an invalid user id.
Expand All @@ -241,15 +240,15 @@ def test_real_time_import_user_not_found(
real_time_import_task_v2(12345678, action_name="rti")
mock_api_client.assert_not_called()
update_user_engines_mock.assert_not_called()
filter_action_parameters_mock.assert_not_called()
generate_action_parameters_mock.assert_not_called()

@patch("eox_nelp.pearson_vue.tasks.update_user_engines")
@patch("eox_nelp.pearson_vue.tasks.filter_action_parameters")
@patch("eox_nelp.pearson_vue.tasks.generate_action_parameters")
@patch("eox_nelp.pearson_vue.tasks.PearsonEngineApiClient")
def test_raise_exception_on_error_response(
self,
mock_api_client,
filter_action_parameters_mock,
generate_action_parameters_mock,
update_user_engines_mock
):
"""Test that an exception is raised when the API response contains an Error.
Expand All @@ -260,11 +259,6 @@ def test_raise_exception_on_error_response(
- The action method is called with the correct parameters.
- Exception contains the expected message.
"""
rti_parameters = {
"user_data": "test",
"platform_data": "test",
"exam_data": "test",
}
mock_action = MagicMock()
expected_message = "Timeout error"
mock_action.return_value = {
Expand All @@ -273,10 +267,10 @@ def test_raise_exception_on_error_response(
}
action_name = "rti"
mock_api_client.return_value = MagicMock(**{"real_time_import": mock_action})
filter_action_parameters_mock.return_value = rti_parameters
generate_action_parameters_mock.return_value = self.action_parameters
with self.assertRaises(Exception) as context:
real_time_import_task_v2(self.user.id, action_name=action_name, **self.kwargs)

update_user_engines_mock.assert_called_once_with(self.user, action_name, None)
mock_action.assert_called_once_with(**rti_parameters, **self.kwargs)
mock_action.assert_called_once_with(**self.action_parameters, **self.kwargs)
self.assertEqual(expected_message, str(context.exception))
110 changes: 61 additions & 49 deletions eox_nelp/pearson_vue/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from eox_nelp.pearson_vue.constants import PAYLOAD_CDD, PAYLOAD_EAD
from eox_nelp.pearson_vue.models import PearsonEngine
from eox_nelp.pearson_vue.utils import (
filter_action_parameters,
generate_action_parameters,
generate_client_authorization_id,
is_cp1252,
update_user_engines,
Expand Down Expand Up @@ -567,57 +567,69 @@ def test_does_not_increment_course_value_for_other_actions(self):
self.assertDictEqual(user.pearsonengine.courses, {})


class TestFilterActionParameters(TestCase):
"""Class to test the filter_action_parameters function."""
class TestGenerateActionParameters(TestCase):
"""Test case for generate_action_parameters."""

def setUp(self):
"""Set up the test environment for the test cases."""
"""
Set up the test environment.
"""
self.mock_get_user_data = self.patch("eox_nelp.pearson_vue.utils.get_user_data")
self.mock_get_platform_data = self.patch("eox_nelp.pearson_vue.utils.get_platform_data")
self.mock_get_exam_data = self.patch("eox_nelp.pearson_vue.utils.get_exam_data")

self.mock_get_user_data.return_value = {"user_data": "mock"}
self.mock_get_platform_data.return_value = {"platform_data": "mock"}
self.mock_get_exam_data.return_value = {"exam_data": "mock"}

def patch(self, target, **kwargs):
"""Patch a target and return the mock"""
patcher = patch(target, **kwargs)
mock = patcher.start()
self.addCleanup(patcher.stop)
return mock

def test_generate_action_parameters_with_exam_id(self):
"""
Test generate_action_parameters function with exam_id.
self.get_user_data_patcher = patch(
"eox_nelp.pearson_vue.utils.get_user_data",
return_value={"user_data": "mock"},
)
self.get_platform_data_patcher = patch(
"eox_nelp.pearson_vue.utils.get_platform_data",
return_value={"platform_data": "mock"},
)
self.get_exam_data_patcher = patch(
"eox_nelp.pearson_vue.utils.get_exam_data",
return_value={"exam_data": "mock"},
)
Expected behavior:
- The result is a dict with user_data, platform_data, and exam_data.
- get_user_data, get_platform_data, and get_exam_data are called once.
- get_exam_data is called with exam_id.
"""
user = MagicMock()
exam_id = "exam123"

self.mock_get_user_data = self.get_user_data_patcher.start()
self.mock_get_platform_data = self.get_platform_data_patcher.start()
self.mock_get_exam_data = self.get_exam_data_patcher.start()
result = generate_action_parameters(user, exam_id)

def tearDown(self):
"""Restore the state of the mocks."""
self.get_user_data_patcher.stop()
self.get_platform_data_patcher.stop()
self.get_exam_data_patcher.stop()

def test_import_candidate_demographics_action_parameters(self):
"""Test if the `filter_action_parameters` function returns the correct
parameters for the "cdd" action.
"""
result = filter_action_parameters("cdd", user=MagicMock())
self.assertNotIn("exam_data", result)
self.assertIn("user_data", result)
self.assertIn("platform_data", result)

def test_import_exam_authorization_action_parameters(self):
"""Test if the `filter_action_parameters` function returns the correct
parameters for the "ead" action.
self.assertEqual(result, {
"user_data": {"user_data": "mock"},
"platform_data": {"platform_data": "mock"},
"exam_data": {"exam_data": "mock"},
})
self.mock_get_user_data.assert_called_once_with(user)
self.mock_get_platform_data.assert_called_once()
self.mock_get_exam_data.assert_called_once_with(exam_id)

def test_generate_action_parameters_without_exam_id(self):
"""
result = filter_action_parameters("ead", user=MagicMock())
self.assertNotIn("platform_data", result)
self.assertIn("user_data", result)
self.assertIn("exam_data", result)

def test_real_time_import_action_parameters(self):
"""Test if the `filter_action_parameters` function returns the correct
parameters for the "rti" action.
Test generate_action_parameters function without exam_id.
Expected behavior:
- The result is a dict with user_data, platform_data, and exam_data.
- get_user_data, get_platform_data, and get_exam_data are called once.
- get_exam_data is called with None.
"""
result = filter_action_parameters("rti", user=MagicMock())
self.assertIn("user_data", result)
self.assertIn("platform_data", result)
self.assertIn("exam_data", result)
user = MagicMock()

result = generate_action_parameters(user)

self.assertEqual(result, {
"user_data": {"user_data": "mock"},
"platform_data": {"platform_data": "mock"},
"exam_data": {"exam_data": "mock"},
})
self.mock_get_user_data.assert_called_once_with(user)
self.mock_get_platform_data.assert_called_once()
self.mock_get_exam_data.assert_called_once_with(None)
10 changes: 1 addition & 9 deletions eox_nelp/pearson_vue/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ def get_exam_data(exam_id):
}


def filter_action_parameters(action_name, user, exam_id=None):
def generate_action_parameters(user, exam_id=None):
"""
Select the appropriate parameters for the action based on the action name.
Expand All @@ -144,12 +144,4 @@ def filter_action_parameters(action_name, user, exam_id=None):
"exam_data": get_exam_data(exam_id),
}

if action_name == "cdd":
del action_parameters["exam_data"]
return action_parameters

if action_name == "ead":
del action_parameters["platform_data"]
return action_parameters

return action_parameters

0 comments on commit 242f44d

Please sign in to comment.