1 Star 0 Fork 0

吕冰 / influxdb

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
annotation_test.go 12.38 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
package influxdb
import (
"encoding/json"
"strings"
"testing"
"time"
"github.com/influxdata/influxdb/v2/kit/platform"
"github.com/influxdata/influxdb/v2/kit/platform/errors"
"github.com/stretchr/testify/require"
)
var (
testTime time.Time = time.Now()
testTime2 time.Time = testTime.Add(time.Minute)
annID, _ = platform.IDFromString("2345678901234567")
)
func nowFunc() time.Time {
return testTime
}
func TestAnnotationCreate(t *testing.T) {
type tst struct {
name string
input AnnotationCreate
expected AnnotationCreate
err *errors.Error
}
tests := []tst{
{
name: "minimum valid create request",
input: AnnotationCreate{
Summary: "this is a default annotation",
},
expected: AnnotationCreate{
StreamTag: "default",
Summary: "this is a default annotation",
EndTime: &testTime,
StartTime: &testTime,
},
},
{
name: "full valid create request",
input: AnnotationCreate{
StreamTag: "other",
Summary: "this is another annotation",
Message: "This is a much longer description or message to add to the annotation summary",
Stickers: map[string]string{"product": "cloud"},
EndTime: &testTime2,
StartTime: &testTime,
},
expected: AnnotationCreate{
StreamTag: "other",
Summary: "this is another annotation",
Message: "This is a much longer description or message to add to the annotation summary",
Stickers: map[string]string{"product": "cloud"},
EndTime: &testTime2,
StartTime: &testTime,
},
},
{
name: "empty create request",
input: AnnotationCreate{},
err: errEmptySummary,
},
{
name: "end time before start create request",
input: AnnotationCreate{
Summary: "this is a default annotation",
EndTime: &testTime,
StartTime: &testTime2,
},
err: errReversedTimes,
},
{
name: "default end time before start create request",
input: AnnotationCreate{
Summary: "this is a default annotation",
StartTime: &testTime2,
},
err: errReversedTimes,
},
{
name: "summary too long",
input: AnnotationCreate{
Summary: strings.Repeat("a", 256),
},
err: errSummaryTooLong,
},
{
name: "message too long",
input: AnnotationCreate{
Summary: "longTom",
Message: strings.Repeat("a", 4097),
},
err: errMsgTooLong,
},
{
name: "stream tag too long",
input: AnnotationCreate{
Summary: "longTom",
StreamTag: strings.Repeat("a", 256),
},
err: errStreamTagTooLong,
},
{
name: "sticker key too long",
input: AnnotationCreate{
Summary: "longTom",
Stickers: map[string]string{strings.Repeat("1", 256): "val"},
},
err: errStickerTooLong,
},
{
name: "sticker val too long",
input: AnnotationCreate{
Summary: "longTom",
Stickers: map[string]string{"key": strings.Repeat("1", 256)},
},
err: errStickerTooLong,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
err := test.input.Validate(nowFunc)
if test.err != nil {
require.Equal(t, test.err, err)
return
}
require.NoError(t, err)
require.Equal(t, test.expected, test.input)
})
}
}
func TestDeleteFilter(t *testing.T) {
type tst struct {
name string
input AnnotationDeleteFilter
expected AnnotationDeleteFilter
err *errors.Error
}
tests := []tst{
{
name: "minimum valid delete",
input: AnnotationDeleteFilter{
StreamTag: "default",
EndTime: &testTime,
StartTime: &testTime,
},
expected: AnnotationDeleteFilter{
StreamTag: "default",
EndTime: &testTime,
StartTime: &testTime,
},
},
{
name: "full valid delete",
input: AnnotationDeleteFilter{
StreamTag: "default",
Stickers: map[string]string{"product": "oss"},
EndTime: &testTime,
StartTime: &testTime,
},
expected: AnnotationDeleteFilter{
StreamTag: "default",
Stickers: map[string]string{"product": "oss"},
EndTime: &testTime,
StartTime: &testTime,
},
},
{
name: "missing stream tag",
input: AnnotationDeleteFilter{
Stickers: map[string]string{"product": "oss"},
EndTime: &testTime,
StartTime: &testTime,
},
err: errMissingStreamTagOrId,
},
{
name: "missing start time",
input: AnnotationDeleteFilter{
StreamTag: "default",
Stickers: map[string]string{"product": "oss"},
EndTime: &testTime,
},
err: errMissingStartTime,
},
{
name: "missing end time",
input: AnnotationDeleteFilter{
StreamTag: "default",
Stickers: map[string]string{"product": "oss"},
StartTime: &testTime,
},
err: errMissingEndTime,
},
{
name: "end time before start create request",
input: AnnotationDeleteFilter{
StreamTag: "default",
Stickers: map[string]string{"product": "oss"},
EndTime: &testTime,
StartTime: &testTime2,
},
err: errReversedTimes,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
err := test.input.Validate()
if test.err != nil {
require.Equal(t, test.err, err)
return
}
require.NoError(t, err)
require.Equal(t, test.expected, test.input)
})
}
}
func TestAnnotationListFilter(t *testing.T) {
type tst struct {
name string
input AnnotationListFilter
expected AnnotationListFilter
checkValue bool
err *errors.Error
}
tests := []tst{
{
name: "minimum valid",
input: AnnotationListFilter{
BasicFilter: BasicFilter{
EndTime: &testTime,
StartTime: &testTime,
},
},
expected: AnnotationListFilter{
BasicFilter: BasicFilter{
EndTime: &testTime,
StartTime: &testTime,
},
},
},
{
name: "empty valid",
input: AnnotationListFilter{},
expected: AnnotationListFilter{
BasicFilter: BasicFilter{
EndTime: &testTime,
StartTime: &testTime,
},
},
checkValue: true,
},
{
name: "invalid due to reversed times",
input: AnnotationListFilter{
BasicFilter: BasicFilter{
EndTime: &testTime,
StartTime: &testTime2,
},
},
err: errReversedTimes,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
err := test.input.Validate(nowFunc)
if test.err != nil {
require.Equal(t, test.err, err)
return
}
require.NoError(t, err)
if test.checkValue {
require.Equal(t, *test.expected.BasicFilter.StartTime, *test.expected.BasicFilter.EndTime)
} else {
require.Equal(t, test.expected, test.input)
}
})
}
}
func TestStreamListFilter(t *testing.T) {
type tst struct {
name string
input StreamListFilter
expected StreamListFilter
checkValue bool
err *errors.Error
}
tests := []tst{
{
name: "minimum valid",
input: StreamListFilter{
BasicFilter: BasicFilter{
EndTime: &testTime,
StartTime: &testTime,
},
},
expected: StreamListFilter{
BasicFilter: BasicFilter{
EndTime: &testTime,
StartTime: &testTime,
},
},
},
{
name: "empty valid",
input: StreamListFilter{},
expected: StreamListFilter{
BasicFilter: BasicFilter{
EndTime: &testTime,
StartTime: &testTime,
},
},
checkValue: true,
},
{
name: "invalid due to reversed times",
input: StreamListFilter{
BasicFilter: BasicFilter{
EndTime: &testTime,
StartTime: &testTime2,
},
},
err: errReversedTimes,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
err := test.input.Validate(nowFunc)
if test.err != nil {
require.Equal(t, test.err, err)
return
}
require.NoError(t, err)
if test.checkValue {
require.Equal(t, *test.expected.BasicFilter.StartTime, *test.expected.BasicFilter.EndTime)
} else {
require.Equal(t, test.expected, test.input)
}
})
}
}
func TestStreamIsValid(t *testing.T) {
type tst struct {
name string
input Stream
err *errors.Error
}
tests := []tst{
{
name: "minimum valid",
input: Stream{
Name: "default",
},
},
{
name: "empty valid",
input: Stream{},
},
{
name: "invalid name too long",
input: Stream{
Name: strings.Repeat("a", 512),
},
err: errStreamNameTooLong,
},
{
name: "invalid description too long",
input: Stream{
Name: "longTom",
Description: strings.Repeat("a", 2048),
},
err: errStreamDescTooLong,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
if test.err != nil {
require.Equal(t, test.err, test.input.Validate(false))
} else {
require.NoError(t, test.input.Validate(false))
}
})
}
}
func TestBasicStreamIsValid(t *testing.T) {
type tst struct {
name string
input BasicStream
expected bool
}
tests := []tst{
{
name: "minimum valid",
input: BasicStream{
Names: []string{"default"},
},
expected: true,
},
{
name: "invalid",
input: BasicStream{},
expected: false,
},
{
name: "empty name",
input: BasicStream{Names: []string{""}},
expected: false,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
require.Equal(t, test.expected, test.input.IsValid())
})
}
}
func TestMashallReadAnnotations(t *testing.T) {
ra := ReadAnnotations{
"default": []ReadAnnotation{
{
ID: *annID,
Summary: "this is one annotation",
Stickers: map[string]string{"env": "testing"},
StartTime: testTime.Format(time.RFC3339Nano),
EndTime: testTime2.Format(time.RFC3339Nano),
},
{
ID: *annID,
Summary: "this is another annotation",
Stickers: map[string]string{"env": "testing"},
StartTime: testTime.Format(time.RFC3339Nano),
EndTime: testTime.Format(time.RFC3339Nano),
},
},
"testing": []ReadAnnotation{
{
ID: *annID,
Summary: "this is yet another annotation",
Stickers: map[string]string{"env": "testing"},
StartTime: testTime.Format(time.RFC3339Nano),
EndTime: testTime.Format(time.RFC3339Nano),
},
},
}
b, err := json.Marshal(ra)
require.NoError(t, err)
require.Greater(t, len(b), 0)
}
func TestSetStickerIncludes(t *testing.T) {
type tst struct {
name string
input map[string][]string
expected AnnotationStickers
}
tests := []tst{
{
name: "with stickerIncludes",
input: map[string][]string{
"stickerIncludes[product]": {"oss"},
"stickerIncludes[author]": {"russ"},
"streams": {"default", "blogs"},
},
expected: map[string]string{
"product": "oss",
"author": "russ",
},
},
{
name: "no sticker includes",
input: map[string][]string{
"startTime": {"2021-01-13T22%3A17%3A37.953Z"},
"endTime": {"2021-01-13T22%3A17%3A37.953Z"},
"streams": {"default", "blogs"},
},
expected: map[string]string{},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
f := AnnotationListFilter{}
f.SetStickerIncludes(test.input)
require.Equal(t, test.expected, f.StickerIncludes)
})
}
}
func TestSetStickers(t *testing.T) {
type tst struct {
name string
input map[string][]string
expected map[string]string
}
tests := []tst{
{
name: "with stickers",
input: map[string][]string{
"stickers[product]": {"oss"},
"stickers[author]": {"russ"},
"streams": {"default", "blogs"},
},
expected: map[string]string{
"product": "oss",
"author": "russ",
},
},
{
name: "no stickers",
input: map[string][]string{
"startTime": {"2021-01-13T22%3A17%3A37.953Z"},
"endTime": {"2021-01-13T22%3A17%3A37.953Z"},
"streams": {"default", "blogs"},
},
expected: map[string]string{},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
f := AnnotationDeleteFilter{}
f.SetStickers(test.input)
require.Equal(t, test.expected, f.Stickers)
})
}
}
func TestStickerSliceToMap(t *testing.T) {
t.Parallel()
tests := []struct {
name string
stickers []string
want map[string]string
wantErr error
}{
{
"good stickers",
[]string{"good1=val1", "good2=val2"},
map[string]string{"good1": "val1", "good2": "val2"},
nil,
},
{
"bad stickers",
[]string{"this is an invalid sticker", "shouldbe=likethis"},
nil,
invalidStickerError("this is an invalid sticker"),
},
{
"no stickers",
[]string{},
map[string]string{},
nil,
},
}
for _, tt := range tests {
got, err := stickerSliceToMap(tt.stickers)
require.Equal(t, tt.want, got)
require.Equal(t, tt.wantErr, err)
}
}
Go
1
https://gitee.com/lyu_bing/influxdb.git
git@gitee.com:lyu_bing/influxdb.git
lyu_bing
influxdb
influxdb
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891