//// Anthropic's authenticated endpoint cannot use the E2E loopback provider.
//// These fixtures catch forgiving upstream parsing and cache compatibility bugs.
import albedo/harness/extensions/claude/catalog
import gleam/dynamic
import gleam/dynamic/decode
import gleam/json
import gleam/option.{None, Some}
import gleeunit/should
fn upstream() -> List(dynamic.Dynamic) {
let assert Ok(rows) =
json.parse(
"[
{\"id\":\"claude-fixture\",\"max_input_tokens\":200000,\"max_tokens\":64000,
\"capabilities\":{\"image_input\":{\"supported\":true},\"effort\":{
\"supported\":true,\"zeta\":{\"supported\":true},\"high\":{\"supported\":true},
\"minimal\":{\"supported\":true},\"alpha\":{\"supported\":true},
\"xhigh\":{\"supported\":true},\"medium\":{\"supported\":true},
\"max\":{\"supported\":true},\"low\":{\"supported\":true},
\"disabled\":{\"supported\":false},\"malformed\":{\"supported\":\"true\"}}}},
{\"id\":\"\"},{\"id\":7},null,
{\"id\":\"claude-fixture\",\"max_input_tokens\":-1,\"max_tokens\":\"100\",
\"capabilities\":{\"image_input\":true,\"effort\":{\"supported\":false,\"high\":{\"supported\":true}}}},
{\"id\":\"claude-last\",\"max_input_tokens\":1.5,\"capabilities\":[]}
]",
decode.list(decode.dynamic),
)
rows
}
pub fn upstream_normalization_keeps_valid_order_duplicates_and_typed_facts_test() -> Nil {
catalog.normalize(upstream())
|> should.equal([
catalog.Model("claude-fixture", Some(200_000), Some(64_000), True, [
"minimal", "low", "medium", "high", "xhigh", "max", "alpha", "zeta",
]),
catalog.Model("claude-fixture", None, None, False, []),
catalog.Model("claude-last", None, None, False, []),
])
}
pub fn normalized_upstream_saves_a_readable_private_cache_test() -> Nil {
let home = temporary_home()
let models = catalog.normalize(upstream())
catalog.save(home, models) |> should.equal(Ok(Nil))
catalog.models(home) |> should.equal(models)
cache_permissions(home) |> should.equal(0o600)
catalog.save(home, []) |> should.equal(Ok(Nil))
catalog.models(home) |> should.equal([])
cleanup(home)
}
pub fn cache_write_failure_keeps_the_existing_error_test() -> Nil {
let home = temporary_home()
block_cache(home)
catalog.save(home, catalog.normalize(upstream()))
|> should.equal(Error("could not save the Claude model list"))
cleanup(home)
}
@external(erlang, "albedo_claude_catalog_test_support", "temporary_home")
fn temporary_home() -> String
@external(erlang, "albedo_claude_catalog_test_support", "cache_permissions")
fn cache_permissions(home: String) -> Int
@external(erlang, "albedo_claude_catalog_test_support", "block_cache")
fn block_cache(home: String) -> Nil
@external(erlang, "albedo_claude_catalog_test_support", "cleanup")
fn cleanup(home: String) -> Nil