test_partition.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. # -*- coding:utf-8 -*-
  2. import textwrap
  3. from pathlib import Path
  4. from unittest.mock import patch
  5. from dw_base.datax.partition import execute_ddls, parse_ini_partition
  6. def _write_ini(tmp_path: Path, content: str) -> str:
  7. p = tmp_path / 'x.ini'
  8. p.write_text(textwrap.dedent(content))
  9. return str(p)
  10. def test_parse_partitioned_writer(tmp_path):
  11. ini = _write_ini(tmp_path, '''\
  12. [writer]
  13. dataSource = hdfs/prd-ha
  14. path = /user/hive/warehouse/test.db/raw_usr_app_user_cert_info_inc_d/dt=${dt}/
  15. ''')
  16. ddl = parse_ini_partition(ini, start_date='20260422')
  17. assert ddl == ('ALTER TABLE test.raw_usr_app_user_cert_info_inc_d '
  18. 'ADD IF NOT EXISTS PARTITION(dt=20260422);')
  19. def test_parse_non_partitioned(tmp_path):
  20. ini = _write_ini(tmp_path, '''\
  21. [writer]
  22. dataSource = hdfs/xx
  23. path = /user/hive/warehouse/test.db/non_partitioned/
  24. ''')
  25. assert parse_ini_partition(ini, start_date='20260422') is None
  26. def test_parse_no_writer_path(tmp_path):
  27. ini = _write_ini(tmp_path, '''\
  28. [writer]
  29. dataSource = mongo/xx
  30. ''')
  31. assert parse_ini_partition(ini, start_date='20260422') is None
  32. def test_parse_dt_aligns_with_start_date_for_multiday(tmp_path):
  33. # 多日范围 start=20260401 stop=20260410:dt 应 = start_date = 20260401(业务日)
  34. # 与 HDFS writer 对齐,分区内允许含 [start, stop) 范围内所有数据
  35. ini = _write_ini(tmp_path, '''\
  36. [writer]
  37. path = /user/hive/warehouse/db1.db/t1/dt=${dt}/
  38. ''')
  39. ddl = parse_ini_partition(ini, start_date='20260401')
  40. assert 'PARTITION(dt=20260401)' in ddl
  41. @patch('dw_base.datax.partition.subprocess.run')
  42. def test_execute_ddls_empty_is_noop(mock_run):
  43. execute_ddls([])
  44. mock_run.assert_not_called()