@@ -2,13 +2,16 @@ package cli
22
33import (
44 "context"
5+ "net/http"
6+ "net/http/httptest"
57 "strings"
68 "testing"
79
810 appsv1 "k8s.io/api/apps/v1"
911 corev1 "k8s.io/api/core/v1"
1012 "k8s.io/apimachinery/pkg/api/resource"
1113 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+ "k8s.io/client-go/kubernetes"
1215 kfake "k8s.io/client-go/kubernetes/fake"
1316 mfake "k8s.io/metrics/pkg/client/clientset/versioned/fake"
1417
@@ -191,3 +194,67 @@ func TestRunPRInjectedEmpty(t *testing.T) {
191194 t .Errorf ("unexpected pr output:\n %s" , out )
192195 }
193196}
197+
198+ // --- price provider selection (Tier 1 derived vs Tier 2 OpenCost) ----------------------------
199+
200+ func TestSelectPriceProviderDefaultDerived (t * testing.T ) {
201+ var warnings []string
202+ p := selectPriceProvider (context .Background (), orchFakeClients (t ), & scanFlags {window : "14d" }, & warnings )
203+ if p .Name () != "node pricing" {
204+ t .Errorf ("provider = %q, want node pricing (Tier 1 default)" , p .Name ())
205+ }
206+ }
207+
208+ func TestSelectPriceProviderExplicitOpenCost (t * testing.T ) {
209+ srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
210+ _ , _ = w .Write ([]byte (`{"code":200,"data":[{"shop/api":{"name":"shop/api",` +
211+ `"properties":{"namespace":"shop","controller":"api"},` +
212+ `"cpuCoreHours":10,"cpuCost":0.5,"ramByteHours":1073741824000,"ramCost":0.2}}]}` ))
213+ }))
214+ defer srv .Close ()
215+
216+ var warnings []string
217+ p := selectPriceProvider (context .Background (), orchFakeClients (t ),
218+ & scanFlags {opencostURL : srv .URL , window : "7d" }, & warnings )
219+ if p .Name () != "OpenCost" {
220+ t .Errorf ("provider = %q, want OpenCost" , p .Name ())
221+ }
222+ if ! strings .Contains (strings .Join (warnings , " " ), "OpenCost" ) {
223+ t .Errorf ("warnings = %v, want an OpenCost note" , warnings )
224+ }
225+ }
226+
227+ func TestSelectPriceProviderBadOpenCostFallsBack (t * testing.T ) {
228+ var warnings []string
229+ p := selectPriceProvider (context .Background (), orchFakeClients (t ),
230+ & scanFlags {opencostURL : "http://opencost.invalid:9003" , window : "7d" }, & warnings )
231+ if p .Name () != "node pricing" {
232+ t .Errorf ("provider = %q, want node pricing fallback" , p .Name ())
233+ }
234+ if ! strings .Contains (strings .Join (warnings , " " ), "unavailable" ) {
235+ t .Errorf ("warnings = %v, want an unavailable note" , warnings )
236+ }
237+ }
238+
239+ func TestSelectPriceProviderAutoDetect (t * testing.T ) {
240+ srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
241+ _ , _ = w .Write ([]byte (`{"code":200,"data":[{"shop/api":{"name":"shop/api",` +
242+ `"properties":{"namespace":"shop","controller":"api"},` +
243+ `"cpuCoreHours":10,"cpuCost":0.5,"ramByteHours":1073741824000,"ramCost":0.2}}]}` ))
244+ }))
245+ defer srv .Close ()
246+
247+ // Override the detection seam so auto-detect resolves to the reachable test server.
248+ origDetect := detectOpenCost
249+ defer func () { detectOpenCost = origDetect }()
250+ detectOpenCost = func (kubernetes.Interface ) string { return srv .URL }
251+
252+ var warnings []string
253+ p := selectPriceProvider (context .Background (), orchFakeClients (t ), & scanFlags {window : "7d" }, & warnings )
254+ if p .Name () != "OpenCost" {
255+ t .Errorf ("provider = %q, want auto-detected OpenCost" , p .Name ())
256+ }
257+ if ! strings .Contains (strings .Join (warnings , " " ), "auto-detected OpenCost" ) {
258+ t .Errorf ("warnings = %v, want auto-detected OpenCost note" , warnings )
259+ }
260+ }
0 commit comments