package pricing_test import ( "testing" "time" "github.com/stretchr/testify/assert" "cloud.o-forge.io/core/oc-lib/models/common/pricing" ) type DummyStrategy int func (d DummyStrategy) GetStrategy() string { return "DUMMY" } func (d DummyStrategy) GetStrategyValue() int { return int(d) } func TestBuyingStrategy_String(t *testing.T) { assert.Equal(t, "UNLIMITED", pricing.UNLIMITED.String()) assert.Equal(t, "SUBSCRIPTION", pricing.SUBSCRIPTION.String()) assert.Equal(t, "PAY PER USE", pricing.PAY_PER_USE.String()) } func TestBuyingStrategyList(t *testing.T) { list := pricing.BuyingStrategyList() assert.Equal(t, 3, len(list)) assert.Contains(t, list, pricing.SUBSCRIPTION) } func TestTimePricingStrategy_String(t *testing.T) { assert.Equal(t, "ONCE", pricing.ONCE.String()) assert.Equal(t, "PER SECOND", pricing.PER_SECOND.String()) assert.Equal(t, "PER MONTH", pricing.PER_MONTH.String()) } func TestTimePricingStrategyList(t *testing.T) { list := pricing.TimePricingStrategyList() assert.Equal(t, 7, len(list)) assert.Contains(t, list, pricing.PER_DAY) } func TestTimePricingStrategy_Methods(t *testing.T) { ts := pricing.PER_MINUTE assert.Equal(t, "PER_MINUTE", ts.GetStrategy()) assert.Equal(t, 2, ts.GetStrategyValue()) } func Test_getAverageTimeInSecond_WithEnd(t *testing.T) { start := time.Now() end := start.Add(30 * time.Minute) _, err := pricing.BookingEstimation(pricing.PER_MINUTE, 2.0, 1200, start, &end) assert.NoError(t, err) } func Test_getAverageTimeInSecond_WithoutEnd(t *testing.T) { start := time.Now() // getAverageTimeInSecond is tested via BookingEstimation price, err := pricing.BookingEstimation(pricing.PER_HOUR, 10.0, 100, start, nil) assert.NoError(t, err) assert.True(t, price > 0) } func TestBookingEstimation(t *testing.T) { start := time.Now() end := start.Add(2 * time.Hour) strategies := map[pricing.TimePricingStrategy]float64{ pricing.ONCE: 50, pricing.PER_HOUR: 10, pricing.PER_MINUTE: 1, pricing.PER_SECOND: 0.1, pricing.PER_DAY: 100, pricing.PER_WEEK: 500, pricing.PER_MONTH: 2000, } for strategy, price := range strategies { t.Run(strategy.String(), func(t *testing.T) { cost, err := pricing.BookingEstimation(strategy, price, 3600, start, &end) assert.NoError(t, err) assert.True(t, cost >= 0) }) } _, err := pricing.BookingEstimation(999, 10, 3600, start, &end) assert.Error(t, err) } func TestPricingStrategy_Getters(t *testing.T) { ps := pricing.PricingStrategy[DummyStrategy]{ Price: 20, Currency: "USD", BuyingStrategy: pricing.SUBSCRIPTION, TimePricingStrategy: pricing.PER_MINUTE, OverrideStrategy: DummyStrategy(1), } assert.Equal(t, pricing.SUBSCRIPTION, ps.GetBuyingStrategy()) assert.Equal(t, pricing.PER_MINUTE, ps.GetTimePricingStrategy()) assert.Equal(t, DummyStrategy(1), ps.GetOverrideStrategy()) } func TestPricingStrategy_GetPrice(t *testing.T) { start := time.Now() end := start.Add(1 * time.Hour) // SUBSCRIPTION case ps := pricing.PricingStrategy[DummyStrategy]{ Price: 5, BuyingStrategy: pricing.SUBSCRIPTION, TimePricingStrategy: pricing.PER_HOUR, } p, err := ps.GetPrice(2, 3600, start, &end) assert.NoError(t, err) assert.True(t, p > 0) // UNLIMITED case ps.BuyingStrategy = pricing.UNLIMITED p, err = ps.GetPrice(10, 0, start, &end) assert.NoError(t, err) assert.Equal(t, 5.0, p) // PAY_PER_USE case ps.BuyingStrategy = pricing.PAY_PER_USE p, err = ps.GetPrice(3, 0, start, &end) assert.NoError(t, err) assert.Equal(t, 15.0, p) }