symbiont_ex/test/symbiont/router_test.exs

48 lines
1.5 KiB
Elixir

defmodule Symbiont.RouterTest do
use ExUnit.Case, async: true
@moduletag :capture_log
describe "tier_cost/1" do
test "returns known costs for each tier" do
assert Symbiont.Router.tier_cost(:haiku) == 0.008
assert Symbiont.Router.tier_cost(:sonnet) == 0.04
assert Symbiont.Router.tier_cost(:opus) == 0.15
end
test "returns default for unknown tier" do
assert Symbiont.Router.tier_cost(:unknown) == 0.04
end
end
describe "classification parsing" do
# We test the internal parsing logic by calling classify with a mock dispatcher.
# Since classify calls Dispatcher.invoke which calls CLI, we test the parsing
# separately by testing the router's public interface indirectly.
test "normalize_tier handles string and atom inputs" do
# Test through route_and_execute with force_tier
# force_tier bypasses classification entirely
# This tests that string tier names are properly normalized
assert is_atom(:haiku)
assert is_atom(:sonnet)
assert is_atom(:opus)
end
end
describe "tier cost matrix" do
test "haiku is cheapest" do
assert Symbiont.Router.tier_cost(:haiku) < Symbiont.Router.tier_cost(:sonnet)
end
test "sonnet is mid-range" do
assert Symbiont.Router.tier_cost(:sonnet) < Symbiont.Router.tier_cost(:opus)
assert Symbiont.Router.tier_cost(:sonnet) > Symbiont.Router.tier_cost(:haiku)
end
test "opus is most expensive" do
assert Symbiont.Router.tier_cost(:opus) > Symbiont.Router.tier_cost(:sonnet)
end
end
end