corso/src/cli/utils/groups_test.go
Keepers 7e25fe30f4
fix up cli tabular display and locationRef (#4594)
#### Does this PR need a docs update or release note?

- [x]  No

#### Type of change

- [x] 🌻 Feature

#### Issue(s)

* #4536

#### Test Plan

- [x] 💪 Manual
- [x]  Unit test
- [x] 💚 E2E
2023-12-20 03:23:13 +00:00

460 lines
10 KiB
Go

package utils_test
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
"github.com/alcionai/corso/src/cli/flags"
"github.com/alcionai/corso/src/cli/utils"
"github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/pkg/dttm"
"github.com/alcionai/corso/src/pkg/path"
"github.com/alcionai/corso/src/pkg/selectors"
)
type GroupsUtilsSuite struct {
tester.Suite
}
func TestGroupsUtilsSuite(t *testing.T) {
suite.Run(t, &GroupsUtilsSuite{Suite: tester.NewUnitSuite(t)})
}
func (suite *GroupsUtilsSuite) TestIncludeGroupsRestoreDataSelectors() {
var (
empty = []string{}
single = []string{"single"}
multi = []string{"more", "than", "one"}
containsOnly = []string{"contains"}
prefixOnly = []string{"/prefix"}
containsAndPrefix = []string{"contains", "/prefix"}
onlySlash = []string{string(path.PathSeparator)}
)
table := []struct {
name string
opts utils.GroupsOpts
expectIncludeLen int
}{
// resource
{
name: "no inputs",
opts: utils.GroupsOpts{},
expectIncludeLen: 3,
},
{
name: "empty",
opts: utils.GroupsOpts{
Groups: empty,
},
expectIncludeLen: 3,
},
{
name: "single inputs",
opts: utils.GroupsOpts{
Groups: single,
},
expectIncludeLen: 3,
},
{
name: "multi inputs",
opts: utils.GroupsOpts{
Groups: multi,
},
expectIncludeLen: 3,
},
// sharepoint
{
name: "library folder contains",
opts: utils.GroupsOpts{
FileName: empty,
FolderPath: containsOnly,
},
expectIncludeLen: 1,
},
{
name: "library folder prefixes",
opts: utils.GroupsOpts{
FileName: empty,
FolderPath: prefixOnly,
},
expectIncludeLen: 1,
},
{
name: "library folder prefixes and contains",
opts: utils.GroupsOpts{
FileName: empty,
FolderPath: containsAndPrefix,
},
expectIncludeLen: 2,
},
{
name: "list contains",
opts: utils.GroupsOpts{
FileName: empty,
FolderPath: empty,
ListItem: empty,
ListFolder: containsOnly,
},
expectIncludeLen: 1,
},
{
name: "list prefixes",
opts: utils.GroupsOpts{
ListFolder: prefixOnly,
},
expectIncludeLen: 1,
},
{
name: "list prefixes and contains",
opts: utils.GroupsOpts{
ListFolder: containsAndPrefix,
},
expectIncludeLen: 2,
},
{
name: "Page Folder",
opts: utils.GroupsOpts{
PageFolder: single,
},
expectIncludeLen: 1,
},
{
name: "Site Page ",
opts: utils.GroupsOpts{
Page: single,
},
expectIncludeLen: 1,
},
{
name: "Page & library Files",
opts: utils.GroupsOpts{
PageFolder: single,
FileName: multi,
},
expectIncludeLen: 2,
},
{
name: "folder with just /",
opts: utils.GroupsOpts{
FolderPath: onlySlash,
},
expectIncludeLen: 1,
},
// channels
{
name: "multiple channel multiple message",
opts: utils.GroupsOpts{
Groups: single,
Channels: multi,
Messages: multi,
},
expectIncludeLen: 1,
},
{
name: "single channel multiple message",
opts: utils.GroupsOpts{
Groups: single,
Channels: single,
Messages: multi,
},
expectIncludeLen: 1,
},
{
name: "single channel and message",
opts: utils.GroupsOpts{
Groups: single,
Channels: single,
Messages: single,
},
expectIncludeLen: 1,
},
{
name: "multiple channel only",
opts: utils.GroupsOpts{
Groups: single,
Channels: multi,
},
expectIncludeLen: 1,
},
{
name: "single channel only",
opts: utils.GroupsOpts{
Groups: single,
Channels: single,
},
expectIncludeLen: 1,
},
// conversations
{
name: "multiple conversations multiple posts",
opts: utils.GroupsOpts{
Groups: single,
Conversations: multi,
Posts: multi,
},
expectIncludeLen: 1,
},
{
name: "single conversations multiple post",
opts: utils.GroupsOpts{
Groups: single,
Conversations: single,
Posts: multi,
},
expectIncludeLen: 1,
},
{
name: "single conversations and post",
opts: utils.GroupsOpts{
Groups: single,
Conversations: single,
Posts: single,
},
expectIncludeLen: 1,
},
{
name: "multiple conversations only",
opts: utils.GroupsOpts{
Groups: single,
Conversations: multi,
},
expectIncludeLen: 1,
},
{
name: "single conversations only",
opts: utils.GroupsOpts{
Groups: single,
Conversations: single,
},
expectIncludeLen: 1,
},
}
for _, test := range table {
suite.Run(test.name, func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
sel := utils.IncludeGroupsRestoreDataSelectors(ctx, test.opts)
assert.Len(t, sel.Includes, test.expectIncludeLen)
})
}
}
func (suite *GroupsUtilsSuite) TestValidateGroupsRestoreFlags() {
table := []struct {
name string
backupID string
opts utils.GroupsOpts
expect assert.ErrorAssertionFunc
}{
{
name: "just site",
backupID: "id",
opts: utils.GroupsOpts{WebURL: []string{"site"}}, // site is mandatory
expect: assert.NoError,
},
{
name: "just siteid",
backupID: "id",
opts: utils.GroupsOpts{SiteID: []string{"site-id"}},
expect: assert.NoError,
},
{
name: "multiple sites",
backupID: "id",
opts: utils.GroupsOpts{SiteID: []string{"site-id1", "site-id2"}},
expect: assert.Error,
},
{
name: "site and siteid",
backupID: "id",
opts: utils.GroupsOpts{SiteID: []string{"site-id"}, WebURL: []string{"site"}},
expect: assert.Error,
},
{
name: "no backupID",
backupID: "",
opts: utils.GroupsOpts{},
expect: assert.Error,
},
{
name: "all valid",
backupID: "id",
opts: utils.GroupsOpts{
WebURL: []string{"site"},
FileCreatedAfter: dttm.Now(),
FileCreatedBefore: dttm.Now(),
FileModifiedAfter: dttm.Now(),
FileModifiedBefore: dttm.Now(),
MessageCreatedAfter: dttm.Now(),
MessageCreatedBefore: dttm.Now(),
MessageLastReplyAfter: dttm.Now(),
MessageLastReplyBefore: dttm.Now(),
Populated: flags.PopulatedFlags{
flags.SiteFN: struct{}{},
flags.FileCreatedAfterFN: struct{}{},
flags.FileCreatedBeforeFN: struct{}{},
flags.FileModifiedAfterFN: struct{}{},
flags.FileModifiedBeforeFN: struct{}{},
flags.MessageCreatedAfterFN: struct{}{},
flags.MessageCreatedBeforeFN: struct{}{},
flags.MessageLastReplyAfterFN: struct{}{},
flags.MessageLastReplyBeforeFN: struct{}{},
},
},
expect: assert.NoError,
},
// sharepoint
{
name: "invalid file created after",
backupID: "id",
opts: utils.GroupsOpts{
FileCreatedAfter: "1235",
Populated: flags.PopulatedFlags{
flags.FileCreatedAfterFN: struct{}{},
},
},
expect: assert.Error,
},
{
name: "invalid file created before",
backupID: "id",
opts: utils.GroupsOpts{
FileCreatedBefore: "1235",
Populated: flags.PopulatedFlags{
flags.FileCreatedBeforeFN: struct{}{},
},
},
expect: assert.Error,
},
{
name: "invalid file modified before",
backupID: "id",
opts: utils.GroupsOpts{
FileModifiedBefore: "1235",
Populated: flags.PopulatedFlags{
flags.FileModifiedBeforeFN: struct{}{},
},
},
expect: assert.Error,
},
{
name: "invalid file modified after",
backupID: "id",
opts: utils.GroupsOpts{
FileModifiedAfter: "1235",
Populated: flags.PopulatedFlags{
flags.FileModifiedAfterFN: struct{}{},
},
},
expect: assert.Error,
},
// channels
{
name: "invalid message last reply before",
backupID: "id",
opts: utils.GroupsOpts{
MessageLastReplyBefore: "1235",
Populated: flags.PopulatedFlags{
flags.MessageLastReplyBeforeFN: struct{}{},
},
},
expect: assert.Error,
},
{
name: "invalid message last reply after",
backupID: "id",
opts: utils.GroupsOpts{
MessageLastReplyAfter: "1235",
Populated: flags.PopulatedFlags{
flags.MessageLastReplyAfterFN: struct{}{},
},
},
expect: assert.Error,
},
{
name: "invalid message created before",
backupID: "id",
opts: utils.GroupsOpts{
MessageCreatedBefore: "1235",
Populated: flags.PopulatedFlags{
flags.MessageCreatedBeforeFN: struct{}{},
},
},
expect: assert.Error,
},
{
name: "invalid message created after",
backupID: "id",
opts: utils.GroupsOpts{
MessageCreatedAfter: "1235",
Populated: flags.PopulatedFlags{
flags.MessageCreatedAfterFN: struct{}{},
},
},
expect: assert.Error,
},
}
for _, test := range table {
suite.Run(test.name, func() {
t := suite.T()
test.expect(t, utils.ValidateGroupsRestoreFlags(test.backupID, test.opts, true))
})
}
}
func (suite *GroupsUtilsSuite) TestAddGroupsCategories() {
table := []struct {
name string
cats []string
expectScopeLen int
}{
{
name: "none",
cats: []string{},
expectScopeLen: 3,
},
{
name: "libraries",
cats: []string{flags.DataLibraries},
expectScopeLen: 1,
},
{
name: "messages",
cats: []string{flags.DataMessages},
expectScopeLen: 1,
},
{
name: "conversations",
cats: []string{flags.DataConversations},
expectScopeLen: 1,
},
{
name: "all allowed",
cats: []string{
flags.DataLibraries,
flags.DataMessages,
flags.DataConversations,
},
expectScopeLen: 3,
},
{
name: "bad inputs",
cats: []string{"foo"},
expectScopeLen: 0,
},
}
for _, test := range table {
suite.Run(test.name, func() {
sel := utils.AddGroupsCategories(selectors.NewGroupsBackup(selectors.Any()), test.cats)
scopes := sel.Scopes()
assert.Len(suite.T(), scopes, test.expectScopeLen)
})
}
}