Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions core/wren/src/wren/policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,10 @@ def resolve_model_name(
falls back to a case-insensitive scan. Returns ``None`` if no model
matches.
"""
model_set = (
model_names if isinstance(model_names, (set, frozenset)) else set(model_names)
)
# Drop non-str names so a corrupt models collection cannot crash .lower().
if not isinstance(name, str) or not name:
return None
model_set = {n for n in model_names if isinstance(n, str) and n}
if name in model_set:
return name
if quoted:
Expand Down
25 changes: 25 additions & 0 deletions core/wren/tests/unit/test_resolve_model_name_nonstr.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
"""resolve_model_name must ignore non-str names without AttributeError."""

from __future__ import annotations

import pytest

from wren.policy import resolve_model_name

pytestmark = pytest.mark.unit


def test_resolve_filters_non_str_candidates() -> None:
names = {"Orders", None, 12, "", "customers"} # type: ignore[list-item]
assert resolve_model_name("orders", quoted=False, model_names=names) == "Orders"
assert resolve_model_name("missing", quoted=False, model_names=names) is None


def test_resolve_rejects_non_str_lookup() -> None:
assert resolve_model_name(None, quoted=False, model_names={"a"}) is None # type: ignore[arg-type]
assert resolve_model_name(1, quoted=True, model_names={"1"}) is None # type: ignore[arg-type]


def test_resolve_quoted_exact() -> None:
assert resolve_model_name("Orders", quoted=True, model_names={"Orders"}) == "Orders"
assert resolve_model_name("orders", quoted=True, model_names={"Orders"}) is None
Loading