|
@@ -0,0 +1,73 @@
|
|
|
|
|
+# -*- coding:utf-8 -*-
|
|
|
|
|
+from unittest.mock import patch
|
|
|
|
|
+
|
|
|
|
|
+import pytest
|
|
|
|
|
+
|
|
|
|
|
+from dw_base.datax.runner import run_job
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+class _RC:
|
|
|
|
|
+ def __init__(self, code): self.returncode = code
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@patch('dw_base.datax.runner.subprocess.run')
|
|
|
|
|
+def test_run_job_local_two_subprocess_calls(mock_run, tmp_path):
|
|
|
|
|
+ mock_run.return_value = _RC(0)
|
|
|
|
|
+ rc = run_job(
|
|
|
|
|
+ ini_path=str(tmp_path / 'x.ini'),
|
|
|
|
|
+ start_date='20260422', stop_date='20260423',
|
|
|
|
|
+ worker_host='cdhmaster02', current_host='cdhmaster02',
|
|
|
|
|
+ base_dir=str(tmp_path), python3_path='/usr/bin/python3',
|
|
|
|
|
+ datax_home='/opt/datax',
|
|
|
|
|
+ )
|
|
|
|
|
+ assert rc == 0
|
|
|
|
|
+ assert mock_run.call_count == 2 # 生成 json + 执行 datax.py
|
|
|
|
|
+ first_argv = mock_run.call_args_list[0][0][0]
|
|
|
|
|
+ assert first_argv[0] == '/usr/bin/python3'
|
|
|
|
|
+ assert 'datax-job-config-generator.py' in first_argv[2]
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@patch('dw_base.datax.runner.subprocess.run')
|
|
|
|
|
+def test_run_job_remote_uses_ssh(mock_run, tmp_path):
|
|
|
|
|
+ mock_run.return_value = _RC(0)
|
|
|
|
|
+ rc = run_job(
|
|
|
|
|
+ ini_path=str(tmp_path / 'x.ini'),
|
|
|
|
|
+ start_date='20260422', stop_date='20260423',
|
|
|
|
|
+ worker_host='cdhnode02', current_host='cdhmaster02',
|
|
|
|
|
+ base_dir=str(tmp_path), python3_path='/usr/bin/python3',
|
|
|
|
|
+ datax_home='/opt/datax',
|
|
|
|
|
+ )
|
|
|
|
|
+ assert rc == 0
|
|
|
|
|
+ first_argv = mock_run.call_args_list[0][0][0]
|
|
|
|
|
+ assert first_argv[0] == 'ssh'
|
|
|
|
|
+ assert first_argv[1] == 'cdhnode02'
|
|
|
|
|
+ # remote_cmd 是单字符串参数
|
|
|
|
|
+ assert 'datax-job-config-generator.py' in first_argv[2]
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@patch('dw_base.datax.runner.subprocess.run')
|
|
|
|
|
+def test_run_job_gen_failure_raises(mock_run, tmp_path):
|
|
|
|
|
+ mock_run.return_value = _RC(1)
|
|
|
|
|
+ with pytest.raises(RuntimeError, match='生成 DataX json 失败'):
|
|
|
|
|
+ run_job(
|
|
|
|
|
+ ini_path=str(tmp_path / 'x.ini'),
|
|
|
|
|
+ start_date='20260422', stop_date='20260423',
|
|
|
|
|
+ worker_host='cdhmaster02', current_host='cdhmaster02',
|
|
|
|
|
+ base_dir=str(tmp_path), python3_path='/usr/bin/python3',
|
|
|
|
|
+ datax_home='/opt/datax',
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@patch('dw_base.datax.runner.subprocess.run')
|
|
|
|
|
+def test_run_job_skip_datax_only_runs_gen(mock_run, tmp_path):
|
|
|
|
|
+ mock_run.return_value = _RC(0)
|
|
|
|
|
+ rc = run_job(
|
|
|
|
|
+ ini_path=str(tmp_path / 'x.ini'),
|
|
|
|
|
+ start_date='20260422', stop_date='20260423',
|
|
|
|
|
+ worker_host='cdhmaster02', current_host='cdhmaster02',
|
|
|
|
|
+ base_dir=str(tmp_path), python3_path='/usr/bin/python3',
|
|
|
|
|
+ datax_home='/opt/datax',
|
|
|
|
|
+ skip_datax=True,
|
|
|
|
|
+ )
|
|
|
|
|
+ assert rc == 0
|
|
|
|
|
+ assert mock_run.call_count == 1
|