influx-cli/clients/bucket/update_test.go

166 lines
6.0 KiB
Go

package bucket_test
import (
"bytes"
"context"
"strings"
"testing"
"github.com/golang/mock/gomock"
"github.com/influxdata/influx-cli/v2/api"
"github.com/influxdata/influx-cli/v2/clients"
"github.com/influxdata/influx-cli/v2/clients/bucket"
"github.com/influxdata/influx-cli/v2/internal/mock"
"github.com/influxdata/influx-cli/v2/internal/testutils"
"github.com/stretchr/testify/assert"
tmock "github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
)
func TestBucketsUpdate(t *testing.T) {
t.Parallel()
var testCases = []struct {
name string
params bucket.BucketsUpdateParams
registerBucketExpectations func(*testing.T, *mock.MockBucketsApi)
expectedStdoutPattern string
}{
{
name: "name",
params: bucket.BucketsUpdateParams{
BucketParams: clients.BucketParams{
BucketID: "123",
BucketName: "cold-storage",
},
},
registerBucketExpectations: func(t *testing.T, bucketsApi *mock.MockBucketsApi) {
bucketsApi.EXPECT().PatchBucketsID(gomock.Any(), gomock.Eq("123")).
Return(api.ApiPatchBucketsIDRequest{ApiService: bucketsApi}.BucketID("123"))
bucketsApi.EXPECT().PatchBucketsIDExecute(tmock.MatchedBy(func(in api.ApiPatchBucketsIDRequest) bool {
body := in.GetPatchBucketRequest()
return assert.Equal(t, "123", in.GetBucketID()) &&
assert.NotNil(t, body) &&
assert.Equal(t, "cold-storage", body.GetName()) &&
assert.Nil(t, body.Description) &&
assert.Empty(t, body.GetRetentionRules())
})).Return(api.Bucket{
Id: api.PtrString("123"),
Name: "cold-storage",
OrgID: api.PtrString("456"),
}, nil)
},
expectedStdoutPattern: `123\s+cold-storage\s+infinite\s+n/a\s+456`,
},
{
name: "description",
params: bucket.BucketsUpdateParams{
BucketParams: clients.BucketParams{BucketID: "123"},
Description: "a very useful description",
},
registerBucketExpectations: func(t *testing.T, bucketsApi *mock.MockBucketsApi) {
bucketsApi.EXPECT().PatchBucketsID(gomock.Any(), gomock.Eq("123")).
Return(api.ApiPatchBucketsIDRequest{ApiService: bucketsApi}.BucketID("123"))
bucketsApi.EXPECT().PatchBucketsIDExecute(tmock.MatchedBy(func(in api.ApiPatchBucketsIDRequest) bool {
body := in.GetPatchBucketRequest()
return assert.Equal(t, "123", in.GetBucketID()) &&
assert.NotNil(t, body) &&
assert.Equal(t, "a very useful description", body.GetDescription()) &&
assert.Nil(t, body.Name) &&
assert.Empty(t, body.GetRetentionRules())
})).Return(api.Bucket{
Id: api.PtrString("123"),
Name: "my-bucket",
Description: api.PtrString("a very useful description"),
OrgID: api.PtrString("456"),
}, nil)
},
expectedStdoutPattern: `123\s+my-bucket\s+infinite\s+n/a\s+456`,
},
{
name: "retention",
params: bucket.BucketsUpdateParams{
BucketParams: clients.BucketParams{BucketID: "123"},
Retention: "3w",
},
registerBucketExpectations: func(t *testing.T, bucketsApi *mock.MockBucketsApi) {
bucketsApi.EXPECT().PatchBucketsID(gomock.Any(), gomock.Eq("123")).
Return(api.ApiPatchBucketsIDRequest{ApiService: bucketsApi}.BucketID("123"))
bucketsApi.EXPECT().PatchBucketsIDExecute(tmock.MatchedBy(func(in api.ApiPatchBucketsIDRequest) bool {
body := in.GetPatchBucketRequest()
return assert.Equal(t, "123", in.GetBucketID()) &&
assert.NotNil(t, body) &&
assert.Nil(t, body.Name) &&
assert.Nil(t, body.Description) &&
assert.Len(t, body.GetRetentionRules(), 1) &&
assert.Nil(t, body.GetRetentionRules()[0].ShardGroupDurationSeconds) &&
assert.Equal(t, int64(3*7*24*3600), body.GetRetentionRules()[0].EverySeconds)
})).Return(api.Bucket{
Id: api.PtrString("123"),
Name: "my-bucket",
OrgID: api.PtrString("456"),
RetentionRules: []api.RetentionRule{
{EverySeconds: int64(3 * 7 * 24 * 3600)},
},
}, nil)
},
expectedStdoutPattern: `123\s+my-bucket\s+504h0m0s\s+n/a\s+456`,
},
{
name: "shard-group duration",
params: bucket.BucketsUpdateParams{
BucketParams: clients.BucketParams{BucketID: "123"},
ShardGroupDuration: "10h30m",
},
registerBucketExpectations: func(t *testing.T, bucketsApi *mock.MockBucketsApi) {
bucketsApi.EXPECT().PatchBucketsID(gomock.Any(), gomock.Eq("123")).
Return(api.ApiPatchBucketsIDRequest{ApiService: bucketsApi}.BucketID("123"))
bucketsApi.EXPECT().PatchBucketsIDExecute(tmock.MatchedBy(func(in api.ApiPatchBucketsIDRequest) bool {
body := in.GetPatchBucketRequest()
return assert.Equal(t, "123", in.GetBucketID()) &&
assert.NotNil(t, body) &&
assert.Nil(t, body.Name) &&
assert.Nil(t, body.Description) &&
assert.Len(t, body.GetRetentionRules(), 1) &&
assert.Equal(t, int64(10*3600+30*60), *body.GetRetentionRules()[0].ShardGroupDurationSeconds)
})).Return(api.Bucket{
Id: api.PtrString("123"),
Name: "my-bucket",
OrgID: api.PtrString("456"),
RetentionRules: []api.RetentionRule{
{ShardGroupDurationSeconds: api.PtrInt64(10*3600 + 30*60)},
},
}, nil)
},
expectedStdoutPattern: `123\s+my-bucket\s+infinite\s+10h30m0s\s+456`,
},
}
for _, tc := range testCases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
ctrl := gomock.NewController(t)
stdio := mock.NewMockStdIO(ctrl)
writtenBytes := bytes.Buffer{}
stdio.EXPECT().Write(gomock.Any()).DoAndReturn(writtenBytes.Write).AnyTimes()
client := mock.NewMockBucketsApi(ctrl)
if tc.registerBucketExpectations != nil {
tc.registerBucketExpectations(t, client)
}
cli := bucket.Client{
CLI: clients.CLI{StdIO: stdio},
BucketsApi: client,
}
err := cli.Update(context.Background(), &tc.params)
require.NoError(t, err)
testutils.MatchLines(t, []string{
`ID\s+Name\s+Retention\s+Shard group duration\s+Organization ID\s+Schema Type`,
tc.expectedStdoutPattern,
}, strings.Split(writtenBytes.String(), "\n"))
})
}
}