github.com/mailgun/holster/v4@v4.20.0/clock/duration_test.go (about) 1 package clock_test 2 3 import ( 4 "encoding/json" 5 "testing" 6 7 "github.com/mailgun/holster/v4/clock" 8 "github.com/stretchr/testify/suite" 9 ) 10 11 type DurationSuite struct { 12 suite.Suite 13 } 14 15 func TestDurationSuite(t *testing.T) { 16 suite.Run(t, new(DurationSuite)) 17 } 18 19 func (s *DurationSuite) TestNewOk() { 20 for _, v := range []interface{}{ 21 42 * clock.Second, 22 int(42000000000), 23 int64(42000000000), 24 42000000000., 25 "42s", 26 []byte("42s"), 27 } { 28 d, err := clock.NewDurationJSON(v) 29 s.Nil(err) 30 s.Equal(42*clock.Second, d.Duration) 31 } 32 } 33 34 func (s *DurationSuite) TestNewError() { 35 for _, tc := range []struct { 36 v interface{} 37 errMsg string 38 }{{ 39 v: "foo", 40 errMsg: "while parsing string: time: invalid duration \"foo\"", 41 }, { 42 v: []byte("foo"), 43 errMsg: "while parsing []byte: time: invalid duration \"foo\"", 44 }, { 45 v: true, 46 errMsg: "bad type bool", 47 }} { 48 d, err := clock.NewDurationJSON(tc.v) 49 s.Equal(tc.errMsg, err.Error()) 50 s.Equal(clock.DurationJSON{}, d) 51 } 52 } 53 54 func (s *DurationSuite) TestUnmarshal() { 55 for _, v := range []string{ 56 `{"foo": 42000000000}`, 57 `{"foo": 0.42e11}`, 58 `{"foo": "42s"}`, 59 } { 60 var withDuration struct { 61 Foo clock.DurationJSON `json:"foo"` 62 } 63 err := json.Unmarshal([]byte(v), &withDuration) 64 s.Nil(err) 65 s.Equal(42*clock.Second, withDuration.Foo.Duration) 66 } 67 } 68 69 func (s *DurationSuite) TestMarshalling() { 70 d, err := clock.NewDurationJSON(42 * clock.Second) 71 s.Nil(err) 72 encoded, err := d.MarshalJSON() 73 s.Nil(err) 74 var decoded clock.DurationJSON 75 err = decoded.UnmarshalJSON(encoded) 76 s.Nil(err) 77 s.Equal(d, decoded) 78 s.Equal("42s", decoded.String()) 79 }