# -*- coding: utf-8 -*- """配置映射属性测试 — 使用 hypothesis 验证配置键兼容映射的通用正确性属性。""" import os import warnings import pytest from hypothesis import given, settings from hypothesis import strategies as st from config.settings import AppConfig, _FLOW_TO_DATA_SOURCE # ── 确保测试不读取 .env 文件 ────────────────────────────────── @pytest.fixture(autouse=True) def skip_dotenv(monkeypatch): monkeypatch.setenv("ETL_SKIP_DOTENV", "1") # ── 生成策略 ────────────────────────────────────────────────── flow_st = st.sampled_from(["FULL", "FETCH_ONLY", "INGEST_ONLY"]) # ── Property 11: pipeline_flow → data_source 映射一致性 ────── # Feature: scheduler-refactor, Property 11: pipeline_flow → data_source 映射一致性 # **Validates: Requirements 8.1, 8.2, 8.3, 5.2, 8.4** # # 对于任意旧 pipeline_flow 值(FULL/FETCH_ONLY/INGEST_ONLY), # 映射到 data_source 的结果应与预定义映射表一致: # FULL→hybrid、FETCH_ONLY→online、INGEST_ONLY→offline。 # 同样,配置键 pipeline.flow 应自动映射到 run.data_source。 class TestProperty11FlowToDataSourceMapping: """Property 11: pipeline_flow → data_source 映射一致性。""" @given(flow=flow_st) @settings(max_examples=100) def test_pipeline_flow_maps_to_data_source(self, flow): """通过 pipeline.flow 设置旧值后,run.data_source 应与映射表一致。""" expected = _FLOW_TO_DATA_SOURCE[flow] with warnings.catch_warnings(): warnings.simplefilter("ignore", DeprecationWarning) config = AppConfig.load({ "app": {"store_id": 1}, "pipeline": {"flow": flow}, }) actual = config.get("run.data_source") assert actual == expected, ( f"pipeline.flow={flow!r} 应映射为 run.data_source={expected!r}," f"实际为 {actual!r}" )