48 lines
1.5 KiB
Elixir
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
|