예제 #1
0
def initialise_workflows(transmission: outbound_transmission.OutboundTransmission, party_key: str,
                         work_description_store: persistence_adaptor.PersistenceAdaptor,
                         sync_async_store: persistence_adaptor.PersistenceAdaptor,
                         max_request_size: int,
                         persistence_store_retries: int,
                         routing: routing_reliability.RoutingAndReliability) \
        -> Dict[str, workflow.CommonWorkflow]:
    """Initialise the workflows
    :param transmission: The transmission object to be used to make requests to the spine endpoints
    :param party_key: The party key to use to identify this MHS.
    :param work_description_store: The persistence adaptor for the state database.
    :param sync_async_store: The persistence adaptor for the sync-async database.
    :param max_request_size: The maximum size of the request body that gets sent to Spine.
    :param persistence_store_retries The number of times to retry storing values in the work description or sync-async
    databases.
    :param routing: The routing and reliability component to use to request routing/reliability details
    from.
    :return: The workflows that can be used to handle messages.
    """

    resynchroniser = resync.SyncAsyncResynchroniser(
        sync_async_store, int(config.get_config('RESYNC_RETRIES', '20')),
        float(config.get_config('RESYNC_INTERVAL', '1.0')),
        float(config.get_config('RESYNC_INITIAL_DELAY', '0')))

    return workflow.get_workflow_map(
        party_key,
        work_description_store=work_description_store,
        transmission=transmission,
        resynchroniser=resynchroniser,
        max_request_size=max_request_size,
        persistence_store_max_retries=persistence_store_retries,
        routing=routing)
    async def test_should_return_correct_result_on_resynchronisation(self):
        # Arrange
        store = MagicMock()
        store.get.return_value = test_utilities.awaitable(True)
        resynchroniser = resync.SyncAsyncResynchroniser(store, 20, 1, 0)

        # Act
        result = await resynchroniser.pause_request('Message')

        # Assert
        self.assertEqual(store.get.call_count, 1)
        self.assertTrue(result)
    async def test_should_initially_wait_before_polling_store(self, sleep_mock):
        # Arrange
        store = MagicMock()
        sleep_mock.return_value = test_utilities.awaitable(1)
        store.get.return_value = test_utilities.awaitable(True)
        resynchroniser = resync.SyncAsyncResynchroniser(store, 20, 1, 5)

        # Act
        await resynchroniser.pause_request('Message')

        # Assert
        self.assertEqual(sleep_mock.call_count, 1)
        self.assertEqual(sleep_mock.call_args[0][0], 5)
    async def test_should_return_correct_result_if_retry_succeeds(self, sleep_mock):
        # Arrange
        store = MagicMock()
        sleep_mock.return_value = test_utilities.awaitable(1)
        store.get.side_effect = [test_utilities.awaitable(None), test_utilities.awaitable(True)]
        resynchroniser = resync.SyncAsyncResynchroniser(store, 20, 1, 0)

        # Act
        response = await resynchroniser.pause_request('Message')

        # Assert
        self.assertTrue(response)
        self.assertEqual(store.get.call_count, 2)
    async def test_should_perform_correct_number_of_sleeps_between_retries(self, sleep_mock):
        # Arrange
        store = MagicMock()
        sleep_mock.return_value = test_utilities.awaitable(1)
        store.get.return_value = test_utilities.awaitable(None)
        max_retries = 20
        resynchroniser = resync.SyncAsyncResynchroniser(store, max_retries, 1, 0)

        # Act
        with self.assertRaises(resync.SyncAsyncResponseException):
            await resynchroniser.pause_request('Message')

        # Assert
        self.assertEqual(1 + max_retries, sleep_mock.call_count)
    async def test_should_respect_max_retries_while_attempting_to_retry(self, sleep_mock):
        # Arrange
        store = MagicMock()
        sleep_mock.return_value = test_utilities.awaitable(1)
        store.get.return_value = test_utilities.awaitable(None)
        max_retries = 20
        resynchroniser = resync.SyncAsyncResynchroniser(store, max_retries, 1, 0)

        # Act
        with self.assertRaises(resync.SyncAsyncResponseException):
            await resynchroniser.pause_request('Message')

        # Assert
        self.assertEqual(1 + max_retries, store.get.call_count,
                         f"Retrieving the message should be tried once and then retried {max_retries} times.")