def test_channel_full_publish_enforces_manual_taxonomy_policy(monkeypatch):
    from app.jobs import channel_full_publish as mod

    captured = {}

    class _Sess:
        def __enter__(self):
            return self

        def __exit__(self, *args):
            return False

        def commit(self):
            return None

    monkeypatch.setattr(mod, "get_session", lambda: _Sess())
    monkeypatch.setattr(
        mod,
        "_active_native_ids",
        lambda *a, **k: {"magento": 1, "shopify": None},
    )
    monkeypatch.setattr(mod, "_load_target_skus", lambda *a, **k: ["ACH-B12"])

    def _fake_pipeline(**kwargs):
        captured["pipeline"] = dict(kwargs)
        return {"status": "ok"}

    def _fake_landings(*args, **kwargs):
        captured["landings"] = dict(kwargs)
        return {"status": "ok", "errors": []}

    monkeypatch.setattr(
        "app.jobs.sync_master_taxonomy_pipeline.run_master_taxonomy_pipeline",
        _fake_pipeline,
    )
    monkeypatch.setattr(mod, "_provision_attributes", lambda *a, **k: {"status": "ok"})
    monkeypatch.setattr(mod, "_bootstrap_shopping_facets", lambda *a, **k: {"status": "ok"})
    monkeypatch.setattr(mod, "_push_collection_landings", _fake_landings)
    monkeypatch.setattr(mod, "_push_magento_batches", lambda *a, **k: {"status": "ok"})
    monkeypatch.setattr(mod, "compat_connection_id", lambda *a, **k: 1)

    result = mod.run_channel_full_publish(
        dry_run=True,
        channels=["magento"],
        taxonomy_mode="full",
        skus=["ACH-B12"],
    )

    assert result["status"] == "ok"
    assert result["taxonomy_mode"] == "link_only"
    assert result["taxonomy_mode_requested"] == "full"
    assert captured["pipeline"]["taxonomy_mode"] == "link_only"
    assert captured["pipeline"]["create_missing_remotes"] is False
    assert captured["landings"]["provision_missing_remote"] is False


def test_channel_full_publish_fails_on_collection_landing_errors(monkeypatch):
    from app.jobs import channel_full_publish as mod

    class _Sess:
        def __enter__(self):
            return self

        def __exit__(self, *args):
            return False

        def commit(self):
            return None

    monkeypatch.setattr(mod, "get_session", lambda: _Sess())
    monkeypatch.setattr(
        mod,
        "_active_native_ids",
        lambda *a, **k: {"magento": 1, "shopify": None},
    )
    monkeypatch.setattr(mod, "_load_target_skus", lambda *a, **k: ["ACH-B12"])
    monkeypatch.setattr(
        "app.jobs.sync_master_taxonomy_pipeline.run_master_taxonomy_pipeline",
        lambda **kwargs: {"status": "ok"},
    )
    monkeypatch.setattr(mod, "_provision_attributes", lambda *a, **k: {"status": "ok"})
    monkeypatch.setattr(mod, "_bootstrap_shopping_facets", lambda *a, **k: {"status": "ok"})
    monkeypatch.setattr(
        mod,
        "_push_collection_landings",
        lambda *a, **k: {"status": "ok", "errors": [{"path_slug": "kitchen-cabinets/anna", "error": "boom"}]},
    )

    result = mod.run_channel_full_publish(
        dry_run=True,
        channels=["magento"],
        skus=["ACH-B12"],
    )

    assert result["status"] == "failed"
    assert result["error"] == "Magento collection landing push failed"


def test_channel_full_publish_passes_skip_collection_assets(monkeypatch):
    from app.jobs import channel_full_publish as mod

    captured = {}

    class _Sess:
        def __enter__(self):
            return self

        def __exit__(self, *args):
            return False

        def commit(self):
            return None

    monkeypatch.setattr(mod, "get_session", lambda: _Sess())
    monkeypatch.setattr(
        mod,
        "_active_native_ids",
        lambda *a, **k: {"magento": 1, "shopify": None},
    )
    monkeypatch.setattr(mod, "_load_target_skus", lambda *a, **k: ["ACH-B12"])
    monkeypatch.setattr(
        "app.jobs.sync_master_taxonomy_pipeline.run_master_taxonomy_pipeline",
        lambda **kwargs: {"status": "ok"},
    )
    monkeypatch.setattr(mod, "_provision_attributes", lambda *a, **k: {"status": "ok"})
    monkeypatch.setattr(mod, "_bootstrap_shopping_facets", lambda *a, **k: {"status": "ok"})
    monkeypatch.setattr(mod, "_push_magento_batches", lambda *a, **k: {"status": "ok"})

    def _fake_landings(*args, **kwargs):
        captured.update(kwargs)
        return {"status": "ok", "errors": []}

    monkeypatch.setattr(mod, "_push_collection_landings", _fake_landings)

    result = mod.run_channel_full_publish(
        dry_run=True,
        channels=["magento"],
        skus=["ACH-B12"],
        skip_collection_assets=True,
    )

    assert result["status"] == "ok"
    assert result["skip_collection_assets"] is True
    assert captured["skip_collection_assets"] is True
