def assertNewJobInputHash(self, cmd_snippet, arguments_hash): cmd = "dx-jobutil-new-job entrypointname " + cmd_snippet + " --test" expected_job_input = {"function": "entrypointname", "input": {}} env = override_environment(DX_JOB_ID="job-000000000000000000000001", DX_WORKSPACE_ID=self.project) output = run(cmd, env=env) expected_job_input.update(arguments_hash) self.assertEqual(json.loads(output), expected_job_input)
def test_build_asset_help(self): env = override_environment(DX_SECURITY_CONTEXT=None, DX_APISERVER_HOST=None, DX_APISERVER_PORT=None, DX_APISERVER_PROTOCOL=None) run("dx build_asset -h", env=env)
def assertNewJobError(self, cmd_snippet, exit_code): cmd = "dx-jobutil-new-job entrypointname " + cmd_snippet + " --test" env = override_environment(DX_JOB_ID="job-000000000000000000000001", DX_WORKSPACE_ID=self.project) with self.assertSubprocessFailure(exit_code=exit_code): run(cmd, env=env)
def test_dx_jobutil_new_job(self): first_record = dxpy.new_dxrecord(name="first_record") second_record = dxpy.new_dxrecord(name="second_record") dxpy.new_dxrecord(name="duplicate_name_record") dxpy.new_dxrecord(name="duplicate_name_record") # In a different project... third_record = dxpy.new_dxrecord(name="third_record", project=self.aux_project.get_id()) test_cases = ( # string ("-ifoo=input_string", {"foo": "input_string"}), # string that looks like a {job,analysis} ID ("-ifoo=job-012301230123012301230123", {"foo": "job-012301230123012301230123"}), ("-ifoo=analysis-012301230123012301230123", {"foo": "analysis-012301230123012301230123"}), # int ("-ifoo=24", {"foo": 24}), # float ("-ifoo=24.5", {"foo": 24.5}), # json ('-ifoo=\'{"a": "b"}\'', {"foo": {"a": "b"}}), ('-ifoo=\'["a", "b"]\'', {"foo": ["a", "b"]}), # objectName ("-ifoo=first_record", {"foo": dxpy.dxlink(first_record.get_id(), self.project)}), # objectId ("-ifoo=" + first_record.get_id(), {"foo": dxpy.dxlink(first_record.get_id())}), # project:objectName ("-ifoo=" + self.aux_project.get_id() + ":third_record", {"foo": dxpy.dxlink(third_record.get_id(), self.aux_project.get_id())}), # project:objectId ("-ifoo=" + self.aux_project.get_id() + ":" + third_record.get_id(), {"foo": dxpy.dxlink(third_record.get_id(), self.aux_project.get_id())}), # same, but wrong project is specified ("-ifoo=" + self.project + ":" + third_record.get_id(), {"foo": dxpy.dxlink(third_record.get_id(), self.aux_project.get_id())}), # glob ("-ifoo=first*", {"foo": dxpy.dxlink(first_record.get_id(), self.project)}), # JBOR ("-ifoo=job-012301230123012301230123:outputfield", {"foo": {"$dnanexus_link": {"job": "job-012301230123012301230123", "field": "outputfield"}}}), # order of inputs is preserved from command line to API call ("-ifoo=first* -ifoo=second_record -ifoo=job-012301230123012301230123:outputfield", {"foo": [dxpy.dxlink(first_record.get_id(), self.project), dxpy.dxlink(second_record.get_id(), self.project), {"$dnanexus_link": {"job": "job-012301230123012301230123", "field": "outputfield"}}]}), ("-ifoo=job-012301230123012301230123:outputfield -ifoo=first_record -ifoo=second_*", {"foo": [{"$dnanexus_link": {"job": "job-012301230123012301230123", "field": "outputfield"}}, dxpy.dxlink(first_record.get_id(), self.project), dxpy.dxlink(second_record.get_id(), self.project)]}), # if there is any ambiguity, the name is left unresolved ("-ifoo=duplicate_name_record", {"foo": "duplicate_name_record"}), ("-ifoo=*record", {"foo": "*record"}), # Override class ("-ifoo:int=24", {"foo": 24}), ("-ifoo:string=24", {"foo": "24"}), ("-ifoo:string=first_record", {"foo": "first_record"}), ('-ifoo:hash=\'{"a": "b"}\'', {"foo": {"a": "b"}}), ('-ifoo:hash=\'["a", "b"]\'', {"foo": ["a", "b"]}), ("-ifoo:file=first_record", None), # Error ("-ifoo:int=foo", None), # Error ("-ifoo:int=24.5", None), # Error # Array inputs # implicit array notation ("-ifoo=24 -ifoo=25", {"foo": [24, 25]}), ("-ifoo=25 -ibar=1 -ifoo=24", {"foo": [25, 24], "bar": 1}), ("-ifoo=first_record -ifoo=second_record", {"foo": [dxpy.dxlink(first_record.get_id(), self.project), dxpy.dxlink(second_record.get_id(), self.project)]}), # different types (unusual, but potentially meaningful if # foo is a json input) ("-ifoo=24 -ifoo=bar", {"foo": [24, "bar"]}), # explicit array notation is NOT respected (in contexts with # no inputSpec such as this one) ("-ifoo:array:int=24", {"foo": 24}), ("-ifoo:array:record=first_record", {"foo": dxpy.dxlink(first_record.get_id(), self.project)}), ) env = override_environment(DX_JOB_ID="job-000000000000000000000001", DX_WORKSPACE_ID=self.project) for cmd_snippet, expected_input_hash in test_cases: cmd = "dx-jobutil-new-job " + cmd_snippet + " entrypointname --test" if expected_input_hash is None: with self.assertSubprocessFailure(exit_code=1): run(cmd, env=env) else: output = run(cmd, env=env) self.assertEqual(json.loads(output), {"input": expected_input_hash, "function": "entrypointname"})