github.com/scaleway/scaleway-cli@v1.11.1/pkg/pricing/usage_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 TestNewUsageByPathWithQuantity(t *testing.T) {
    12  	Convey("Testing NewUsageByPathWithQuantity()", t, func() {
    13  		usage := NewUsageByPathWithQuantity("/compute/c1/run", big.NewRat(1, 1))
    14  		So(usage.Object.Path, ShouldEqual, "/compute/c1/run")
    15  		So(usage.Quantity, ShouldEqualBigRat, big.NewRat(1, 1))
    16  	})
    17  }
    18  
    19  func TestNewUsageByPath(t *testing.T) {
    20  	Convey("Testing NewUsageByPath()", t, func() {
    21  		usage := NewUsageByPath("/compute/c1/run")
    22  		So(usage.Object.Path, ShouldEqual, "/compute/c1/run")
    23  		So(usage.Quantity, ShouldEqualBigRat, ratZero)
    24  	})
    25  }
    26  
    27  func TestNewUsageWithQuantity(t *testing.T) {
    28  	Convey("Testing NewUsageWithQuantity()", t, func() {
    29  		object := CurrentPricing.GetByPath("/compute/c1/run")
    30  		usage := NewUsageWithQuantity(object, big.NewRat(1, 1))
    31  		So(usage.Object.Path, ShouldEqual, "/compute/c1/run")
    32  		So(usage.Quantity, ShouldEqualBigRat, big.NewRat(1, 1))
    33  	})
    34  }
    35  
    36  func TestUsage_SetStartEnd(t *testing.T) {
    37  	Convey("Testing Usage.SetStartEnd()", t, func() {
    38  		object := Object{
    39  			UsageGranularity: time.Minute,
    40  		}
    41  		usage := NewUsage(&object)
    42  		layout := "2006-Jan-02 15:04:05"
    43  		start, err := time.Parse(layout, "2015-Jan-25 13:15:42")
    44  		So(err, ShouldBeNil)
    45  		end, err := time.Parse(layout, "2015-Jan-25 13:16:10")
    46  		So(err, ShouldBeNil)
    47  		err = usage.SetStartEnd(start, end)
    48  		So(err, ShouldBeNil)
    49  		So(usage.Quantity, ShouldEqualBigRat, big.NewRat(2, 1))
    50  	})
    51  }
    52  
    53  func TestUsage_SetDuration(t *testing.T) {
    54  	Convey("Testing Usage.SetDuration()", t, FailureContinues, func() {
    55  		Convey("UsageGranularity=time.Minute", func() {
    56  			object := Object{
    57  				UsageGranularity: time.Minute,
    58  			}
    59  			usage := NewUsage(&object)
    60  
    61  			err := usage.SetDuration(time.Minute * 10)
    62  			So(err, ShouldBeNil)
    63  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(10, 1))
    64  
    65  			err = usage.SetDuration(time.Minute + time.Second)
    66  			So(err, ShouldBeNil)
    67  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(2, 1))
    68  
    69  			err = usage.SetDuration(0 * time.Minute)
    70  			So(err, ShouldBeNil)
    71  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(0, 1))
    72  
    73  			err = usage.SetDuration(-1 * time.Minute)
    74  			So(err, ShouldBeNil)
    75  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(0, 1))
    76  
    77  			err = usage.SetDuration(10*time.Hour + 5*time.Minute + 10*time.Second)
    78  			So(err, ShouldBeNil)
    79  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(60*10+5+1, 1))
    80  
    81  			err = usage.SetDuration(10 * time.Nanosecond)
    82  			So(err, ShouldBeNil)
    83  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(1, 1))
    84  		})
    85  
    86  		Convey("UsageGranularity=time.Hour", func() {
    87  			object := Object{
    88  				UsageGranularity: time.Hour,
    89  			}
    90  			usage := NewUsage(&object)
    91  
    92  			err := usage.SetDuration(time.Minute * 10)
    93  			So(err, ShouldBeNil)
    94  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(1, 1))
    95  
    96  			err = usage.SetDuration(time.Minute + time.Second)
    97  			So(err, ShouldBeNil)
    98  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(1, 1))
    99  
   100  			err = usage.SetDuration(0 * time.Minute)
   101  			So(err, ShouldBeNil)
   102  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(0, 1))
   103  
   104  			err = usage.SetDuration(-1 * time.Minute)
   105  			So(err, ShouldBeNil)
   106  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(0, 1))
   107  
   108  			err = usage.SetDuration(10*time.Hour + 5*time.Minute + 10*time.Second)
   109  			So(err, ShouldBeNil)
   110  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(11, 1))
   111  
   112  			err = usage.SetDuration(10 * time.Nanosecond)
   113  			So(err, ShouldBeNil)
   114  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(1, 1))
   115  		})
   116  
   117  		Convey("UsageGranularity=time.Hour*24", func() {
   118  			object := Object{
   119  				UsageGranularity: time.Hour * 24,
   120  			}
   121  			usage := NewUsage(&object)
   122  
   123  			err := usage.SetDuration(time.Minute * 10)
   124  			So(err, ShouldBeNil)
   125  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(1, 1))
   126  
   127  			err = usage.SetDuration(time.Minute + time.Second)
   128  			So(err, ShouldBeNil)
   129  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(1, 1))
   130  
   131  			err = usage.SetDuration(0 * time.Minute)
   132  			So(err, ShouldBeNil)
   133  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(0, 1))
   134  
   135  			err = usage.SetDuration(-1 * time.Minute)
   136  			So(err, ShouldBeNil)
   137  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(0, 1))
   138  
   139  			err = usage.SetDuration(10*time.Hour + 5*time.Minute + 10*time.Second)
   140  			So(err, ShouldBeNil)
   141  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(1, 1))
   142  
   143  			err = usage.SetDuration(3*24*time.Hour + 1*time.Minute)
   144  			So(err, ShouldBeNil)
   145  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(4, 1))
   146  
   147  			err = usage.SetDuration(10 * time.Nanosecond)
   148  			So(err, ShouldBeNil)
   149  			So(usage.Quantity, ShouldEqualBigRat, big.NewRat(1, 1))
   150  		})
   151  	})
   152  }
   153  
   154  func TestUsage_BillableQuantity(t *testing.T) {
   155  	Convey("Testing Usage.BillableQuantity()", t, FailureContinues, func() {
   156  		object := &Object{
   157  			UnitQuantity: big.NewRat(60, 1),
   158  		}
   159  		usage := NewUsageWithQuantity(object, big.NewRat(-1, 1))
   160  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(0, 1))
   161  
   162  		usage = NewUsageWithQuantity(object, big.NewRat(-1000, 1))
   163  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(0, 1))
   164  
   165  		usage = NewUsageWithQuantity(object, big.NewRat(0, 1))
   166  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(0, 1))
   167  
   168  		usage = NewUsageWithQuantity(object, big.NewRat(1, 1))
   169  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(60, 1))
   170  
   171  		usage = NewUsageWithQuantity(object, big.NewRat(59, 1))
   172  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(60, 1))
   173  
   174  		usage = NewUsageWithQuantity(object, big.NewRat(599999, 10000)) // 59.9999
   175  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(60, 1))
   176  
   177  		usage = NewUsageWithQuantity(object, big.NewRat(60, 1))
   178  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(60, 1))
   179  
   180  		usage = NewUsageWithQuantity(object, big.NewRat(6000001, 100000)) // 60.00001
   181  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(60*2, 1))
   182  
   183  		usage = NewUsageWithQuantity(object, big.NewRat(61, 1))
   184  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(60*2, 1))
   185  
   186  		usage = NewUsageWithQuantity(object, big.NewRat(119, 1))
   187  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(60*2, 1))
   188  
   189  		usage = NewUsageWithQuantity(object, big.NewRat(121, 1))
   190  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(60*3, 1))
   191  
   192  		usage = NewUsageWithQuantity(object, big.NewRat(1000, 1))
   193  		So(usage.BillableQuantity(), ShouldEqualBigRat, big.NewRat(60*17, 1))
   194  	})
   195  }
   196  
   197  func TestUsage_LostQuantity(t *testing.T) {
   198  	Convey("Testing Usage.LostQuantity()", t, FailureContinues, func() {
   199  		object := &Object{
   200  			UnitQuantity: big.NewRat(60, 1),
   201  		}
   202  		usage := NewUsageWithQuantity(object, big.NewRat(-1, 1))
   203  		So(usage.LostQuantity(), ShouldEqualBigRat, big.NewRat(0, 1))
   204  
   205  		usage = NewUsageWithQuantity(object, big.NewRat(-1000, 1))
   206  		So(usage.LostQuantity(), ShouldEqualBigRat, big.NewRat(0, 1))
   207  
   208  		usage = NewUsageWithQuantity(object, big.NewRat(0, 1))
   209  		So(usage.LostQuantity(), ShouldEqualBigRat, big.NewRat(0, 1))
   210  
   211  		usage = NewUsageWithQuantity(object, big.NewRat(1, 1))
   212  		So(usage.LostQuantity(), ShouldEqualBigRat, big.NewRat(60-1, 1))
   213  
   214  		usage = NewUsageWithQuantity(object, big.NewRat(59, 1))
   215  		So(usage.LostQuantity(), ShouldEqualBigRat, big.NewRat(60-59, 1))
   216  
   217  		usage = NewUsageWithQuantity(object, big.NewRat(599999, 10000)) // 59.9999
   218  		So(usage.LostQuantity(), ShouldEqualBigRat, new(big.Rat).Sub(big.NewRat(60, 1), big.NewRat(599999, 10000)))
   219  
   220  		usage = NewUsageWithQuantity(object, big.NewRat(60, 1))
   221  		So(usage.LostQuantity(), ShouldEqualBigRat, big.NewRat(0, 1))
   222  
   223  		usage = NewUsageWithQuantity(object, big.NewRat(6000001, 100000)) // 60.00001
   224  		So(usage.LostQuantity(), ShouldEqualBigRat, big.NewRat(6000000*2-6000001, 100000))
   225  
   226  		usage = NewUsageWithQuantity(object, big.NewRat(61, 1))
   227  		So(usage.LostQuantity(), ShouldEqualBigRat, big.NewRat(60*2-61, 1))
   228  
   229  		usage = NewUsageWithQuantity(object, big.NewRat(119, 1))
   230  		So(usage.LostQuantity(), ShouldEqualBigRat, big.NewRat(60*2-119, 1))
   231  
   232  		usage = NewUsageWithQuantity(object, big.NewRat(121, 1))
   233  		So(usage.LostQuantity(), ShouldEqualBigRat, big.NewRat(60*3-121, 1))
   234  
   235  		usage = NewUsageWithQuantity(object, big.NewRat(1000, 1))
   236  		So(usage.LostQuantity(), ShouldEqualBigRat, big.NewRat(60*17-1000, 1))
   237  	})
   238  }
   239  
   240  func TestUsage_Total(t *testing.T) {
   241  	Convey("Testing Usage.Total()", t, FailureContinues, func() {
   242  		object := Object{
   243  			UnitQuantity: big.NewRat(60, 1),
   244  			UnitPrice:    big.NewRat(12, 1000), // 0.012
   245  			UnitPriceCap: big.NewRat(6, 1),
   246  		}
   247  
   248  		usage := NewUsageWithQuantity(&object, big.NewRat(-1, 1))
   249  		So(usage.Total(), ShouldEqualBigRat, big.NewRat(0, 1))
   250  
   251  		usage = NewUsageWithQuantity(&object, big.NewRat(0, 1))
   252  		So(usage.Total(), ShouldEqualBigRat, big.NewRat(0, 1))
   253  
   254  		usage = NewUsageWithQuantity(&object, big.NewRat(1, 1))
   255  		So(usage.Total(), ShouldEqualBigRat, big.NewRat(12, 1000)) // 0.012
   256  
   257  		usage = NewUsageWithQuantity(&object, big.NewRat(61, 1))
   258  		So(usage.Total(), ShouldEqualBigRat, big.NewRat(24, 1000)) // 0.024
   259  
   260  		usage = NewUsageWithQuantity(&object, big.NewRat(1000, 1))
   261  		So(usage.Total(), ShouldEqualBigRat, big.NewRat(204, 1000)) // 0.204
   262  	})
   263  }