def test_run_lifecycle(self):
        # this is needed to ensure logging output appears in test context - see https://stackoverflow.com/questions/7472863/pydev-unittesting-how-to-capture-text-logged-to-a-logging-logger-in-captured-o
        stream_handler.stream = sys.stdout

        request_id = uuid.uuid4().hex
        handler = AnsibleRequestHandler(self.mock_messaging_service,
                                        self.mock_ansible_client)

        self.mock_ansible_client.run_lifecycle_playbook.return_value = LifecycleExecution(
            request_id, STATUS_COMPLETE, None, {'prop1': 'output__value1'})

        handler.handle_request({
            'lifecycle_name':
            'Install',
            'driver_files':
            DirectoryTree(self.tmp_workspace),
            'system_properties':
            PropValueMap({}),
            'resource_properties':
            PropValueMap({}),
            'deployment_location': {
                'properties': {
                    'testPropA': 'A'
                }
            },
            'request_id':
            request_id
        })

        self.check_response_only(
            LifecycleExecution(request_id, STATUS_COMPLETE, None,
                               {'prop1': 'output__value1'}))
    def test_run_lifecycle_missing_lifecycle_name(self):
        # this is needed to ensure logging output appears in test context - see https://stackoverflow.com/questions/7472863/pydev-unittesting-how-to-capture-text-logged-to-a-logging-logger-in-captured-o
        stream_handler.stream = sys.stdout

        request_id = uuid.uuid4().hex

        handler = AnsibleRequestHandler(self.mock_messaging_service,
                                        self.mock_ansible_client)
        handler.handle_request({
            'request_id':
            request_id,
            'driver_files':
            DirectoryTree(self.tmp_workspace),
            'system_properties':
            PropValueMap({}),
            'resource_properties':
            PropValueMap({}),
            'deployment_location':
            PropValueMap({})
        })
        self.check_response_only(
            LifecycleExecution(
                request_id, STATUS_FAILED,
                FailureDetails(FAILURE_CODE_INTERNAL_ERROR,
                               "Request must have a lifecycle_name"), {}))
    def test_handles_empty_request(self):
        # this is needed to ensure logging output appears in test context - see https://stackoverflow.com/questions/7472863/pydev-unittesting-how-to-capture-text-logged-to-a-logging-logger-in-captured-o
        stream_handler.stream = sys.stdout

        messaging_service = MagicMock()
        ansible_client = MagicMock()
        handler = AnsibleRequestHandler(messaging_service, ansible_client)

        handler.handle_request(None)