# -*- coding: utf-8 -*-
"""ODS 任务文档覆盖完整性验证。

**Validates: Requirements 2.1, 2.4**

从 task_registry.py 中提取所有 layer="ODS" 的任务代码，
验证 docs/etl_tasks/ods_tasks.md 中包含每个任务代码的说明章节。
"""
# Feature: etl-task-documentation, Property 1: ODS 任务文档覆盖完整性

from __future__ import annotations

from pathlib import Path

import pytest

from orchestration.task_registry import default_registry

# ── 测试数据准备 ──────────────────────────────────────────────

_PROJECT_ROOT = Path(__file__).resolve().parents[2]
_ODS_DOC_PATH = _PROJECT_ROOT / "docs" / "etl_tasks" / "ods_tasks.md"

# 从注册表动态获取所有 ODS 层任务代码
_ODS_TASK_CODES: list[str] = default_registry.get_tasks_by_layer("ODS")


@pytest.fixture(scope="module")
def ods_doc_content() -> str:
    """读取 ods_tasks.md 全文，供所有测试用例共享。"""
    assert _ODS_DOC_PATH.exists(), f"文档文件不存在: {_ODS_DOC_PATH}"
    return _ODS_DOC_PATH.read_text(encoding="utf-8")


# ── 参数化验证：每个 ODS 任务代码必须出现在文档中 ─────────────

@pytest.mark.parametrize("task_code", _ODS_TASK_CODES, ids=_ODS_TASK_CODES)
def test_ods_task_code_in_doc(task_code: str, ods_doc_content: str):
    """Property 1: 每个注册的 ODS 任务代码在 ods_tasks.md 中有对应说明。

    **Validates: Requirements 2.1, 2.4**
    """
    assert task_code in ods_doc_content, (
        f"ODS 任务 '{task_code}' 已在 task_registry 中注册，"
        f"但未在 ods_tasks.md 中找到对应说明章节"
    )
