from types import SimpleNamespace
from unittest.mock import MagicMock

from db.channel_attribute_options import _shopify_options


def test_shopify_options_use_human_name_not_namespace_key():
    row_a = SimpleNamespace(
        attribute_code="custom_door_style",
        name="Door Style",
        namespace="custom",
        key="door_style",
        data_type="single_line_text_field",
        owner_type="product_metafield",
    )
    row_b = SimpleNamespace(
        attribute_code="vendor",
        name="Vendor",
        namespace=None,
        key=None,
        data_type="string",
        owner_type="product",
    )
    session = MagicMock()
    session.scalar.return_value = None
    session.scalars.return_value.all.return_value = [row_a, row_b]

    options = _shopify_options(session, connection_id=None)

    assert [opt["label"] for opt in options] == ["Door Style", "Vendor"]
    assert [opt["field_group"] for opt in options] == ["custom", "core"]
    assert [opt["display_label"] for opt in options] == ["Door Style (custom)", "Vendor (core)"]
    assert [opt["code"] for opt in options] == ["custom_door_style", "vendor"]


def test_shopify_options_sorted_alphabetically_by_label():
    row_z = SimpleNamespace(
        attribute_code="custom_z_field",
        name="Zulu Field",
        namespace="custom",
        key="z_field",
        data_type="single_line_text_field",
        owner_type="product_metafield",
    )
    row_a = SimpleNamespace(
        attribute_code="custom_alpha",
        name="Alpha Field",
        namespace="custom",
        key="alpha",
        data_type="single_line_text_field",
        owner_type="product_metafield",
    )
    session = MagicMock()
    session.scalar.return_value = None
    session.scalars.return_value.all.return_value = [row_z, row_a]

    options = _shopify_options(session, connection_id=None)

    assert [opt["label"] for opt in options] == ["Alpha Field", "Zulu Field"]
