f99010fae1
CI / lint (push) Failing after 1s
CI / frontend (push) Failing after 1s
CI / scripts (push) Failing after 1s
CI / Go Test (ubuntu-latest) (push) Failing after 0s
CI / frontend-node-25 (push) Failing after 1s
CI / docs (push) Failing after 0s
CI / coverage (push) Failing after 0s
CI / e2e (push) Failing after 0s
Docker / build-and-push (push) Failing after 1s
CI / integration (push) Failing after 4m43s
CI / Go Test (windows-latest) (push) Has been cancelled
CI / Desktop Unit Tests (Windows) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Linux (arm64)) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Linux) (push) Has been cancelled
Desktop Artifacts / Desktop Build (Windows) (push) Has been cancelled
Desktop Artifacts (macOS) / Desktop Build (macOS (aarch64)) (push) Has been cancelled
Desktop Artifacts (macOS) / Desktop Build (macOS (x86_64)) (push) Has been cancelled
68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
package db
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"go.kenn.io/agentsview/internal/export"
|
|
)
|
|
|
|
func TestLookupModelRates_DotDashFallback(t *testing.T) {
|
|
resolver := export.NewPricingResolver([]export.EffectivePricingRow{
|
|
{
|
|
ModelPattern: "claude-opus-4-7",
|
|
Rates: export.ModelRates{
|
|
InputPerMTok: 5, OutputPerMTok: 25,
|
|
},
|
|
},
|
|
{
|
|
ModelPattern: "claude-opus-4.6",
|
|
Rates: export.ModelRates{
|
|
InputPerMTok: 99, OutputPerMTok: 99,
|
|
},
|
|
},
|
|
})
|
|
|
|
lookup := resolver.Lookup("claude-opus-4.7")
|
|
require.True(t, lookup.OK, "dotted model should resolve via normalized key")
|
|
assert.Equal(t, 5.0, lookup.Rates.InputPerMTok)
|
|
assert.Equal(t, 25.0, lookup.Rates.OutputPerMTok)
|
|
|
|
dashed := resolver.Lookup("claude-opus-4-7")
|
|
require.True(t, dashed.OK, "already-dashed model should resolve exactly")
|
|
assert.Equal(t, 5.0, dashed.Rates.InputPerMTok)
|
|
|
|
exact := resolver.Lookup("claude-opus-4.6")
|
|
require.True(t, exact.OK)
|
|
assert.Equal(t, 99.0, exact.Rates.InputPerMTok,
|
|
"exact match must win over normalized fallback")
|
|
|
|
unknown := resolver.Lookup("gpt-5.5")
|
|
assert.False(t, unknown.OK, "unknown model stays unpriced")
|
|
}
|
|
|
|
func TestModelRateResolverCachesResolvedModels(t *testing.T) {
|
|
resolver := export.NewPricingResolver([]export.EffectivePricingRow{{
|
|
ModelPattern: "gemini-3.5-flash",
|
|
Rates: export.ModelRates{
|
|
InputPerMTok: 1.25, OutputPerMTok: 10,
|
|
},
|
|
}})
|
|
|
|
first := resolver.Lookup("Gemini 3.5 Flash (High)")
|
|
require.True(t, first.OK)
|
|
assert.Equal(t, 1.25, first.Rates.InputPerMTok)
|
|
|
|
second := resolver.Lookup("Gemini 3.5 Flash (High)")
|
|
require.True(t, second.OK)
|
|
assert.Equal(t, first, second)
|
|
|
|
unknown := resolver.Lookup("unknown-model")
|
|
assert.False(t, unknown.OK)
|
|
|
|
unknown = resolver.Lookup("unknown-model")
|
|
assert.False(t, unknown.OK)
|
|
}
|