225 lines
7.6 KiB
Go
225 lines
7.6 KiB
Go
package time
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/traggo/server/model"
|
|
"github.com/traggo/server/test"
|
|
)
|
|
|
|
func TestParseRange(t *testing.T) {
|
|
|
|
entries := []testEntry{
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-1d", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-12T15:55:23Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-1d", "2019-05-13T18:52:23Z").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-12T15:55:23Z", "2019-05-13T18:52:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-1w", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-06T15:55:23Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-10d", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-03T15:55:23Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-1M", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-04-13T15:55:23Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-1y", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2018-05-13T15:55:23Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-5s-3m-5h-2d-2w-3M-1y", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2018-01-27T10:52:18Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now/s", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-13T15:55:23Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now/m", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-13T15:55:00Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now/h", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-13T15:00:00Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now/d", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-13T00:00:00Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-15T15:55:23Z").
|
|
Range("now/w", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-13T00:00:00Z", "2019-05-15T15:55:23Z")),
|
|
now("2019-05-15T15:55:23Z").
|
|
Range("now/M", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-01T00:00:00Z", "2019-05-15T15:55:23Z")),
|
|
now("2019-05-15T15:55:23Z").
|
|
Range("now/y", "now").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-01-01T00:00:00Z", "2019-05-15T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now", "now/s").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-13T15:55:23Z", "2019-05-13T15:55:23.999999999Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now", "now/m").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-13T15:55:23Z", "2019-05-13T15:55:59.999999999Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now", "now/h").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-13T15:55:23Z", "2019-05-13T15:59:59.999999999Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now", "now/d").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-13T15:55:23Z", "2019-05-13T23:59:59.999999999Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now", "now/d").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-13T15:55:23Z", "2019-05-13T23:59:59.999999999Z")),
|
|
now("2019-05-15T15:55:23Z").
|
|
Range("now", "now/w").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-15T15:55:23Z", "2019-05-19T23:59:59.999999999Z")),
|
|
now("2019-05-15T15:55:23Z").
|
|
Range("now", "now/M").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-15T15:55:23Z", "2019-05-31T23:59:59.999999999Z")),
|
|
now("2019-05-15T15:55:23Z").
|
|
Range("now", "now/y").
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-15T15:55:23Z", "2019-12-31T23:59:59.999999999Z")),
|
|
now("2019-05-15T15:55:23Z").
|
|
Range("now-1y/y", "now-1y/y"). // last year
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2018-01-01T00:00:00Z", "2018-12-31T23:59:59.999999999Z")),
|
|
now("2019-05-15T15:55:23Z").
|
|
Range("now-1w/w", "now-1w/w"). // last week
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-06T00:00:00Z", "2019-05-12T23:59:59.999999999Z")),
|
|
now("2019-05-15T15:55:23Z").
|
|
Range("now-1w/w", "now-1w/w-2d"). // last work monday to friday
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-06T00:00:00Z", "2019-05-10T23:59:59.999999999Z")),
|
|
now("2019-05-15T15:55:23Z").
|
|
Range("now-1w/w+5d", "now-1w/w"). // last weekend
|
|
Interval(model.IntervalSingle).
|
|
Expect(r("2019-05-11T00:00:00Z", "2019-05-12T23:59:59.999999999Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-1d", "now").
|
|
Interval(model.IntervalYearly).
|
|
Expect(r("2019-05-12T15:55:23Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-1d", "now").
|
|
Interval(model.IntervalMonthly).
|
|
Expect(r("2019-05-12T15:55:23Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-1d", "now").
|
|
Interval(model.IntervalWeekly).
|
|
Expect(r("2019-05-12T15:55:23Z", "2019-05-13T15:55:23Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-5h/h", "now/h").
|
|
Interval(model.IntervalHourly).
|
|
Expect(
|
|
r("2019-05-13T10:00:00Z", "2019-05-13T10:59:59Z"),
|
|
r("2019-05-13T11:00:00Z", "2019-05-13T11:59:59Z"),
|
|
r("2019-05-13T12:00:00Z", "2019-05-13T12:59:59Z"),
|
|
r("2019-05-13T13:00:00Z", "2019-05-13T13:59:59Z"),
|
|
r("2019-05-13T14:00:00Z", "2019-05-13T14:59:59Z"),
|
|
r("2019-05-13T15:00:00Z", "2019-05-13T15:59:59Z")),
|
|
now("2019-05-13T15:55:23Z").
|
|
Range("now-5d/d", "now/d").
|
|
Interval(model.IntervalDaily).
|
|
Expect(
|
|
r("2019-05-08T00:00:00Z", "2019-05-08T23:59:59Z"),
|
|
r("2019-05-09T00:00:00Z", "2019-05-09T23:59:59Z"),
|
|
r("2019-05-10T00:00:00Z", "2019-05-10T23:59:59Z"),
|
|
r("2019-05-11T00:00:00Z", "2019-05-11T23:59:59Z"),
|
|
r("2019-05-12T00:00:00Z", "2019-05-12T23:59:59Z"),
|
|
r("2019-05-13T00:00:00Z", "2019-05-13T23:59:59Z")),
|
|
now("2019-02-13T15:55:23Z").
|
|
Range("now-5M/M", "now/M").
|
|
Interval(model.IntervalMonthly).
|
|
Expect(
|
|
r("2018-09-01T00:00:00Z", "2018-09-30T23:59:59Z"),
|
|
r("2018-10-01T00:00:00Z", "2018-10-31T23:59:59Z"),
|
|
r("2018-11-01T00:00:00Z", "2018-11-30T23:59:59Z"),
|
|
r("2018-12-01T00:00:00Z", "2018-12-31T23:59:59Z"),
|
|
r("2019-01-01T00:00:00Z", "2019-01-31T23:59:59Z"),
|
|
r("2019-02-01T00:00:00Z", "2019-02-28T23:59:59Z")),
|
|
}
|
|
|
|
for _, entry := range entries {
|
|
t.Run(fmt.Sprintf("now=%s;%s_to_%s;%s", entry.now, entry.from, entry.to, entry.interval), func(t *testing.T) {
|
|
result, err := ParseRange(entry.now, RelativeRange{From: entry.from, To: entry.to}, entry.interval, time.Monday, time.Sunday)
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, entry.expectRanges, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestStuff(t *testing.T) {
|
|
assert.Panics(t, func() {
|
|
ranges(time.Time{}, time.Time{}, "meh")
|
|
})
|
|
assert.NotNil(t, Validate("invalid"))
|
|
assert.Nil(t, Validate("now-1d"))
|
|
_, err := ParseRange(time.Now(), RelativeRange{
|
|
From: "invalid",
|
|
To: "invalid",
|
|
}, model.IntervalDaily, time.Monday, time.Sunday)
|
|
assert.NotNil(t, err)
|
|
_, err = ParseRange(time.Now(), RelativeRange{
|
|
From: "now-1d",
|
|
To: "invalid",
|
|
}, model.IntervalDaily, time.Monday, time.Sunday)
|
|
assert.NotNil(t, err)
|
|
}
|
|
|
|
func now(now string) testEntry {
|
|
return testEntry{now: test.Time(now)}
|
|
}
|
|
|
|
type testEntry struct {
|
|
now time.Time
|
|
from string
|
|
to string
|
|
interval model.Interval
|
|
expectRanges []StaticRange
|
|
}
|
|
|
|
func r(from string, to string) StaticRange {
|
|
return StaticRange{
|
|
From: test.Time(from),
|
|
To: test.Time(to),
|
|
}
|
|
}
|
|
|
|
func (t testEntry) Expect(ranges ...StaticRange) testEntry {
|
|
t.expectRanges = ranges
|
|
return t
|
|
}
|
|
|
|
func (t testEntry) Range(from string, to string) testEntry {
|
|
t.from = from
|
|
t.to = to
|
|
return t
|
|
}
|
|
|
|
func (t testEntry) Interval(interval model.Interval) testEntry {
|
|
t.interval = interval
|
|
return t
|
|
}
|