def test_mini_wf(self):
        """
        Test that a mini workflow is executable with cwltool after converting.
        Workflow receives string input "foo" and outputs "foo foo\n".
        :return:
        """
        v1_file = os.path.join(
            os.path.dirname(__file__),
            'mini_wf_cwl1_{}.cwl'.format(
                ''.join(random.sample(string.ascii_lowercase, 3))
            )
        )
        d2_file = os.path.join(os.path.dirname(__file__),
                               'mini_wf_d2.cwl')
        CWLConverterFacade(d2_file, output=v1_file)

        process = subprocess.Popen(
            [sys.executable, "-m", "cwltool", v1_file, "--input", "foo"],
            stdout=subprocess.PIPE, stderr=subprocess.PIPE)

        stdout, _ = process.communicate()
        os.remove(v1_file)

        self.assertIn("foo foo", str(stdout))
        self.assertEqual(process.returncode, 0)
    def test_mini_tool(self, mock_stdout):
        """
        Test that a mini tool is executable with cwltool after converting.
        Workflow receives integer input 1 and outputs "1 1 1\n".
        :return:
        """

        v1_file = os.path.join(
            os.path.dirname(__file__),
            'mini_tool_cwl1_{}.json'.format(
                ''.join(random.sample(string.ascii_lowercase, 3))
            )
        )
        d2_file = os.path.join(os.path.dirname(__file__),
                               'mini_tool_d2.cwl')
        CWLConverterFacade(d2_file,
                           output=v1_file)

        process = subprocess.Popen(
            [sys.executable, "-m", "cwltool", v1_file, "--in", "1"],
            stdout=subprocess.PIPE, stderr=subprocess.PIPE)

        stdout, _ = process.communicate()
        os.remove(v1_file)

        self.assertIn("1 1 1", str(stdout))
        self.assertIn("Converting done.", mock_stdout.getvalue())
        self.assertEqual(process.returncode, 0)
    def test_local_input_platform_output_update(
            self, mock_api, mock_load, mock_parse
    ):
        """
        Check if install_app is called if app does not exist
        """

        mock_app_wf1 = MagicMock(sevenbridges.App)
        mock_app_wf1.raw = {
            "id": "a/b/c",
            "class": "CommandLineTool",
            "cwlVersion": "sbg:draft-2"
        }
        mock_user = MagicMock(sevenbridges.User)
        mock_user.username = "******"
        mock_api_instance = mock_api.return_value
        mock_api_instance.users.me.return_value = mock_user
        mock_api_instance.apps.get.side_effect = mock_app_get_not_found
        mock_parse.return_value = mock_app_wf1.raw
        mock_load.return_value = mock_app_wf1.raw
        CWLConverterFacade("a.cwl", output='a/b/c', validate=False,
                           decompose=False, update=True)

        mock_parse.assert_called()
        mock_api_instance.apps.create_revision.assert_not_called()
        mock_api_instance.apps.install_app.assert_called_with(
            'a/b/c', ANY, api=mock_api_instance
        )
        mock_api_instance.apps.get.assert_called_with(
            'a/b/c',
            api=mock_api_instance
        )
    def test_platform_input_no_output_update_true_prompt(
            self, mock_api, mock_parse
    ):
        """
        Check if update true via prompt submits create_revision
        """

        mock_app_wf1 = MagicMock(sevenbridges.App)
        mock_app_wf1.raw = {
            "id": "a/b/c",
            "class": "CommandLineTool",
            "cwlVersion": "sbg:draft-2"
        }
        mock_api_instance = mock_api.return_value
        mock_api_instance.apps.get.return_value = mock_app_wf1
        mock_parse.return_value = mock_app_wf1.raw
        CWLConverterFacade("a/b/c", validate=False,
                           decompose=False, update=False)

        mock_parse.assert_called()
        mock_api_instance.apps.create_revision.assert_called_once_with(
            'a/b/c', ANY, ANY, api=mock_api_instance
        )
        mock_api_instance.apps.get.assert_called_with('a/b/c',
                                                      api=mock_api_instance)
    def test_base_command_with_spaces(self, mock_stdout):
        """
        baseCommand with spaces should be split into indiviudal components
        and run corectly on cwltool.
        :return:
        """

        v1_file = os.path.join(
            os.path.dirname(__file__),
            'mini_tool_cwl1_{}.json'.format(
                ''.join(random.sample(string.ascii_lowercase, 3))
            )
        )
        d2_file = os.path.join(os.path.dirname(__file__),
                               'tool_base_command_with_spaces_d2.cwl')
        CWLConverterFacade(d2_file,
                           output=v1_file)

        process = subprocess.Popen(
            [sys.executable, "-m", "cwltool", v1_file],
            stdout=subprocess.PIPE, stderr=subprocess.PIPE)

        stdout, _ = process.communicate()
        os.remove(v1_file)

        self.assertIn("A test string", str(stdout))
        self.assertEqual(process.returncode, 0)
        self.assertIn("Converting done.", mock_stdout.getvalue())
def main(args=sys.argv[1:]):
    """
    Entrypoint and CLI for sbg_cwl_upgrader tool.
    """

    args = vars(create_arg_parser().parse_args(args))

    configure_logging(args)

    CWLConverterFacade(token=args['token'],
                       profile=args['profile'],
                       platform=args['platform'],
                       endpoint=args['endpoint'],
                       app_revision=args['revision'],
                       input_=args['input'],
                       output=args['output'],
                       cwl_version=args['cwl_version'],
                       validate=args['validate'],
                       update=args['update'],
                       decompose=args['decompose'])
 def test_local_input_no_output(self):
     """
     Check exception is raised for local input and no output
     """
     with self.assertRaises(Exception):
         CWLConverterFacade('wf.cwl')