Esempio n. 1
0
 def test_it_creates_delete_action_for_forced_delete_if_externally_mappable(
         self, DeleteModelAction):
     external_system_mock = MagicMock()
     model_mock = MagicMock()
     sut = ActionFactory(model_mock, external_system_mock)
     result = sut.build(SyncActions(delete=True, force=True), ['field'],
                        'external_key', {'field': 'value'})
     DeleteModelAction.assert_called_with(model_mock, ['field'],
                                          {'field': 'value'})
     self.assertIn(DeleteModelAction.return_value, result)
Esempio n. 2
0
 def test_it_builds_an_update_with_external_action_if_externally_mappable(
         self, builtAction):
     external_system_mock = MagicMock()
     model_mock = MagicMock()
     sut = ActionFactory(model_mock, external_system_mock)
     result = sut.build(SyncActions(update=True), ['field'], 'external_key',
                        {'field': 'value'})
     builtAction.assert_called_with(
         external_system_mock, model_mock,
         'external_key', ['field'], {'field': 'value'}, False)
     self.assertIn(builtAction.return_value, result)
Esempio n. 3
0
 def setUp(self):
     self.model = MagicMock()
     self.sut = ActionFactory(self.model)
Esempio n. 4
0
class TestActionFactory(TestCase):
    def setUp(self):
        self.model = MagicMock()
        self.sut = ActionFactory(self.model)

    @patch('nsync.actions.ModelAction')
    def test_it_creates_a_base_model_action_if_no_action_flags_are_included(
            self, ModelAction):
        result = self.sut.build(SyncActions(), ['field'], None, {'field': ''})
        ModelAction.assert_called_with(self.model, ['field'], {'field': ''})
        self.assertIn(ModelAction.return_value, result)

    @patch('nsync.actions.CreateModelAction')
    def test_it_calls_create_action_with_correct_parameters(self,
                                                            TargetActionClass):
        result = self.sut.build(SyncActions(create=True), ['field'], ANY,
                                {'field': ''})
        TargetActionClass.assert_called_with(self.model, ['field'],
                                             {'field': ''})
        self.assertIn(TargetActionClass.return_value, result)

    @patch('nsync.actions.UpdateModelAction')
    def test_it_calls_update_action_with_correct_parameters(self,
                                                            TargetActionClass):
        for actions in [SyncActions(update=True, force=False),
                        SyncActions(update=True, force=True)]:
            result = self.sut.build(actions, ['field'], ANY, {'field': ''})
            TargetActionClass.assert_called_with(self.model, ['field'],
                                                 {'field': ''}, actions.force)
            self.assertIn(TargetActionClass.return_value, result)

    @patch('nsync.actions.DeleteModelAction')
    def test_it_calls_delete_action_with_correct_parameters(self,
                                                            TargetActionClass):
        result = self.sut.build(SyncActions(delete=True, force=True), ['field'],
                                ANY, {'field': ''})
        TargetActionClass.assert_called_with(self.model, ['field'],
                                             {'field': ''})
        self.assertIn(TargetActionClass.return_value, result)

    def test_delete_action_not_built_if_unforced_and_not_externally_mappable(
            self):
        """
        If there is no external mapping AND the delete is not forced,
        then the usual 'DeleteIfOnlyReferenceModelAction' will not actually
        do anything anyway, so test that no actions are built.
        """
        result = self.sut.build(SyncActions(delete=True), ['field'], ANY,
                                {'field': ''})
        self.assertEqual([], result)

    def test_it_creates_two_actions_if_create_and_update_flags_are_included(
            self):
        result = self.sut.build(SyncActions(create=True, update=True), ['field'],
                                ANY, {'field': ''})
        self.assertEqual(2, len(result))

    def test_it_considers_nothing_externally_mappable_without_external_system(
            self):
        self.assertIs(False, self.sut.is_externally_mappable(''))
        self.assertIs(False, self.sut.is_externally_mappable("a mappable key"))

    def test_it_considers_non_strings_as_not_externally_mappable(self):
        self.assertFalse(ActionFactory(ANY, ANY).is_externally_mappable(None))
        self.assertFalse(ActionFactory(ANY, ANY).is_externally_mappable(0))
        self.assertFalse(ActionFactory(ANY, ANY).is_externally_mappable(1))
        self.assertFalse(ActionFactory(ANY, ANY).is_externally_mappable(ANY))

    def test_it_considers_non_blank_strings_as_externally_mappable(self):
        self.assertTrue(
            ActionFactory(ANY, ANY).is_externally_mappable('a mappable key'))

    @patch('nsync.actions.CreateModelWithReferenceAction')
    def test_it_builds_a_create_with_external_action_if_externally_mappable(
            self, builtAction):
        external_system_mock = MagicMock()
        model_mock = MagicMock()
        sut = ActionFactory(model_mock, external_system_mock)
        result = sut.build(SyncActions(create=True), ['field'], 'external_key',
                           {'field': 'value'})
        builtAction.assert_called_with(
            external_system_mock, model_mock,
            'external_key', ['field'], {'field': 'value'})
        self.assertIn(builtAction.return_value, result)

    @patch('nsync.actions.UpdateModelWithReferenceAction')
    def test_it_builds_an_update_with_external_action_if_externally_mappable(
            self, builtAction):
        external_system_mock = MagicMock()
        model_mock = MagicMock()
        sut = ActionFactory(model_mock, external_system_mock)
        result = sut.build(SyncActions(update=True), ['field'], 'external_key',
                           {'field': 'value'})
        builtAction.assert_called_with(
            external_system_mock, model_mock,
            'external_key', ['field'], {'field': 'value'}, False)
        self.assertIn(builtAction.return_value, result)

    @patch('nsync.actions.DeleteExternalReferenceAction')
    def test_it_creates_delete_external_reference_if_externally_mappable(
            self, DeleteExternalReferenceAction):
        external_system_mock = MagicMock()
        model_mock = MagicMock()
        sut = ActionFactory(model_mock, external_system_mock)
        result = sut.build(SyncActions(delete=True), ['field'], 'external_key',
                           {'field': 'value'})
        DeleteExternalReferenceAction.assert_called_with(
            external_system_mock, 'external_key')
        self.assertIn(DeleteExternalReferenceAction.return_value, result)

    @patch('nsync.actions.DeleteModelAction')
    def test_it_creates_delete_action_for_forced_delete_if_externally_mappable(
            self, DeleteModelAction):
        external_system_mock = MagicMock()
        model_mock = MagicMock()
        sut = ActionFactory(model_mock, external_system_mock)
        result = sut.build(SyncActions(delete=True, force=True), ['field'],
                           'external_key', {'field': 'value'})
        DeleteModelAction.assert_called_with(model_mock, ['field'],
                                             {'field': 'value'})
        self.assertIn(DeleteModelAction.return_value, result)

    @patch('nsync.actions.DeleteIfOnlyReferenceModelAction')
    @patch('nsync.actions.DeleteModelAction')
    def test_it_wraps_delete_action_if_externally_mappable(
            self, DeleteModelAction, DeleteIfOnlyReferenceModelAction):
        external_system_mock = MagicMock()
        model_mock = MagicMock()
        sut = ActionFactory(model_mock, external_system_mock)
        result = sut.build(SyncActions(delete=True), ['field'], 'external_key',
                           {'field': 'value'})
        DeleteModelAction.assert_called_with(model_mock, ['field'],
                                             {'field': 'value'})
        DeleteIfOnlyReferenceModelAction.assert_called_with(
            external_system_mock,
            'external_key',
            DeleteModelAction.return_value)
        self.assertIn(DeleteIfOnlyReferenceModelAction.return_value, result)