"""Picker dedup must fold live bare wire-ids into their curated public slug.

Kimi Coding Plan live-discovers its flagship as the bare id ``k3`` while the
curated catalog carries ``kimi-k3``. The curated-first picker merge must not
render both as separate rows for the same model.
"""

from unittest.mock import patch

from hermes_cli.model_search import model_alias_canonical
from hermes_cli.models import provider_model_ids


class TestModelAliasCanonical:
    def test_bare_k3_folds_to_public_slug(self):
        assert model_alias_canonical("k3") == "kimi-k3"
        assert model_alias_canonical("K3") == "kimi-k3"


class TestPickerMergeAliasDedup:
    def test_live_bare_k3_not_duplicated_against_curated_kimi_k3(self):
        """Coding Plan key: live returns bare ``k3``; curated has ``kimi-k3``.
        Exactly one k3-family row must survive (the curated slug leads)."""
        with (
            patch(
                "hermes_cli.auth.resolve_api_key_provider_credentials",
                return_value={
                    "api_key": "sk-kimi-x",
                    "base_url": "https://api.kimi.com/coding",
                },
            ),
            patch(
                "providers.base.ProviderProfile.fetch_models",
                return_value=["k3", "kimi-for-coding"],
            ),
        ):
            out = provider_model_ids("kimi-coding")

        k3_rows = [m for m in out if model_alias_canonical(m) == "kimi-k3"]
        assert k3_rows == ["kimi-k3"], out
        # Live-only entries with no curated twin still surface.
        assert "kimi-for-coding" in out

