github.com/scaleway/scaleway-cli@v1.11.1/pkg/pricing/basket_test.go (about)

     1  package pricing
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  	"time"
     7  
     8  	. "github.com/smartystreets/goconvey/convey"
     9  )
    10  
    11  func TestNewBasket(t *testing.T) {
    12  	Convey("Testing NewBasket()", t, func() {
    13  		basket := NewBasket()
    14  		So(basket, ShouldNotBeNil)
    15  		So(basket.Length(), ShouldEqual, 0)
    16  	})
    17  }
    18  
    19  func TestBasket_Add(t *testing.T) {
    20  	Convey("Testing Basket.Add", t, FailureContinues, func() {
    21  		basket := NewBasket()
    22  		So(basket, ShouldNotBeNil)
    23  		So(basket.Length(), ShouldEqual, 0)
    24  
    25  		err := basket.Add(NewUsageByPathWithQuantity("/compute/c1/run", big.NewRat(1, 1)))
    26  		So(err, ShouldBeNil)
    27  		So(basket.Length(), ShouldEqual, 1)
    28  
    29  		err = basket.Add(NewUsageByPathWithQuantity("/compute/c1/run", big.NewRat(42, 1)))
    30  		So(err, ShouldBeNil)
    31  		So(basket.Length(), ShouldEqual, 2)
    32  
    33  		err = basket.Add(NewUsageByPathWithQuantity("/compute/c1/run", big.NewRat(600, 1)))
    34  		So(err, ShouldBeNil)
    35  		So(basket.Length(), ShouldEqual, 3)
    36  	})
    37  }
    38  
    39  func TestBasket_Total(t *testing.T) {
    40  	Convey("Testing Basket.Total", t, FailureContinues, func() {
    41  		Convey("3 compute instances", func() {
    42  			basket := NewBasket()
    43  			So(basket, ShouldNotBeNil)
    44  			So(basket.Total(), ShouldEqualBigRat, ratZero)
    45  
    46  			err := basket.Add(NewUsageByPathWithQuantity("/compute/c1/run", big.NewRat(1, 1)))
    47  			So(err, ShouldBeNil)
    48  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(2, 1000)) // 0.002
    49  
    50  			err = basket.Add(NewUsageByPathWithQuantity("/compute/c1/run", big.NewRat(42, 1)))
    51  			So(err, ShouldBeNil)
    52  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(4, 1000)) // 0.004
    53  
    54  			err = basket.Add(NewUsageByPathWithQuantity("/compute/c1/run", big.NewRat(600, 1)))
    55  			So(err, ShouldBeNil)
    56  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(24, 1000)) // 0.024
    57  		})
    58  		Convey("1 server of each type", func() {
    59  			basket := NewBasket()
    60  			So(basket, ShouldNotBeNil)
    61  			So(basket.Total(), ShouldEqualBigRat, ratZero)
    62  
    63  			basket.Add(NewUsageByPath("/compute/c1/run"))
    64  			basket.Add(NewUsageByPath("/compute/c2s/run"))
    65  			basket.Add(NewUsageByPath("/compute/c2m/run"))
    66  			basket.Add(NewUsageByPath("/compute/c2l/run"))
    67  			basket.Add(NewUsageByPath("/compute/vc1s/run"))
    68  			basket.Add(NewUsageByPath("/compute/vc1m/run"))
    69  			basket.Add(NewUsageByPath("/compute/vc1l/run"))
    70  
    71  			basket.SetDuration(1 * time.Minute)
    72  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(116, 1000)) // 0.116
    73  
    74  			basket.SetDuration(1 * time.Hour)
    75  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(116, 1000)) // 0.116
    76  
    77  			basket.SetDuration(2 * time.Hour)
    78  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(232, 1000)) // 0.232
    79  
    80  			basket.SetDuration(24 * time.Hour)
    81  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(2784, 1000)) // 2.784
    82  
    83  			basket.SetDuration(30 * 24 * time.Hour)
    84  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(58000, 1000)) // 58
    85  
    86  			// FIXME: this test if false, the capacity is per month
    87  			basket.SetDuration(365 * 24 * time.Hour)
    88  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(58000, 1000)) // 58
    89  		})
    90  		Convey("1 compute instance with 2 volumes and 1 ip", func() {
    91  			basket := NewBasket()
    92  
    93  			basket.Add(NewUsageByPath("/compute/c1/run"))
    94  			basket.Add(NewUsageByPath("/ip/dynamic"))
    95  			basket.Add(NewUsageByPath("/storage/local/ssd/storage"))
    96  			basket.Add(NewUsageByPath("/storage/local/ssd/storage"))
    97  			So(basket.Length(), ShouldEqual, 4)
    98  
    99  			basket.SetDuration(1 * time.Minute)
   100  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(8, 1000)) // 0.008
   101  
   102  			basket.SetDuration(1 * time.Hour)
   103  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(8, 1000)) // 0.008
   104  
   105  			basket.SetDuration(2 * time.Hour)
   106  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(12, 1000)) // 0.012
   107  
   108  			basket.SetDuration(2 * 24 * time.Hour)
   109  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(196, 1000)) // 0.196
   110  
   111  			basket.SetDuration(30 * 24 * time.Hour)
   112  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(2050, 1000)) // 2.05
   113  
   114  			// FIXME: this test is false, the capacity is per month
   115  			basket.SetDuration(365 * 24 * time.Hour)
   116  			So(basket.Total(), ShouldEqualBigRat, big.NewRat(2694, 1000)) // 2.694
   117  		})
   118  	})
   119  }