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 }