corso/src/cli/backup/exchange_test.go
2022-08-05 12:05:45 -07:00

557 lines
13 KiB
Go

package backup
import (
"testing"
"github.com/spf13/cobra"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
"github.com/alcionai/corso/cli/utils"
"github.com/alcionai/corso/internal/tester"
"github.com/alcionai/corso/pkg/selectors"
)
type ExchangeSuite struct {
suite.Suite
}
func TestExchangeSuite(t *testing.T) {
suite.Run(t, new(ExchangeSuite))
}
func (suite *ExchangeSuite) TestAddExchangeCommands() {
expectUse := exchangeServiceCommand
table := []struct {
name string
use string
expectUse string
expectShort string
expectRunE func(*cobra.Command, []string) error
}{
{"create exchange", createCommand, expectUse, exchangeCreateCmd().Short, createExchangeCmd},
{"list exchange", listCommand, expectUse, exchangeListCmd().Short, listExchangeCmd},
{"details exchange", detailsCommand, expectUse, exchangeDetailsCmd().Short, detailsExchangeCmd},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
cmd := &cobra.Command{Use: test.use}
c := addExchangeCommands(cmd)
require.NotNil(t, c)
cmds := cmd.Commands()
require.Len(t, cmds, 1)
child := cmds[0]
assert.Equal(t, test.expectUse, child.Use)
assert.Equal(t, test.expectShort, child.Short)
tester.AreSameFunc(t, test.expectRunE, child.RunE)
})
}
}
func (suite *ExchangeSuite) TestValidateBackupCreateFlags() {
table := []struct {
name string
any bool
user, data []string
expect assert.ErrorAssertionFunc
}{
{
name: "no users, not any",
expect: assert.Error,
},
{
name: "any and data",
any: true,
data: []string{dataEmail},
expect: assert.Error,
},
{
name: "unrecognized data",
user: []string{"fnord"},
data: []string{"smurfs"},
expect: assert.Error,
},
{
name: "users, not any",
user: []string{"fnord"},
expect: assert.NoError,
},
{
name: "no users, any",
any: true,
expect: assert.NoError,
},
{
name: "users, any",
any: true,
user: []string{"fnord"},
expect: assert.NoError,
},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
test.expect(t, validateExchangeBackupCreateFlags(test.any, test.user, test.data))
})
}
}
func (suite *ExchangeSuite) TestExchangeBackupCreateSelectors() {
table := []struct {
name string
any bool
user, data []string
expectIncludeLen int
}{
{
name: "any",
any: true,
expectIncludeLen: 3,
},
{
name: "any users, no data",
user: []string{utils.Wildcard},
expectIncludeLen: 3,
},
{
name: "single user, no data",
user: []string{"u1"},
expectIncludeLen: 3,
},
{
name: "any users, contacts",
user: []string{utils.Wildcard},
data: []string{dataContacts},
expectIncludeLen: 1,
},
{
name: "single user, contacts",
user: []string{"u1"},
data: []string{dataContacts},
expectIncludeLen: 1,
},
{
name: "any users, email",
user: []string{utils.Wildcard},
data: []string{dataEmail},
expectIncludeLen: 1,
},
{
name: "single user, email",
user: []string{"u1"},
data: []string{dataEmail},
expectIncludeLen: 1,
},
{
name: "any users, events",
user: []string{utils.Wildcard},
data: []string{dataEvents},
expectIncludeLen: 1,
},
{
name: "single user, events",
user: []string{"u1"},
data: []string{dataEvents},
expectIncludeLen: 1,
},
{
name: "any users, contacts + email",
user: []string{utils.Wildcard},
data: []string{dataContacts, dataEmail},
expectIncludeLen: 2,
},
{
name: "single user, contacts + email",
user: []string{"u1"},
data: []string{dataContacts, dataEmail},
expectIncludeLen: 2,
},
{
name: "any users, email + events",
user: []string{utils.Wildcard},
data: []string{dataEmail, dataEvents},
expectIncludeLen: 2,
},
{
name: "single user, email + events",
user: []string{"u1"},
data: []string{dataEmail, dataEvents},
expectIncludeLen: 2,
},
{
name: "any users, events + contacts",
user: []string{utils.Wildcard},
data: []string{dataEvents, dataContacts},
expectIncludeLen: 2,
},
{
name: "single user, events + contacts",
user: []string{"u1"},
data: []string{dataEvents, dataContacts},
expectIncludeLen: 2,
},
{
name: "many users, events",
user: []string{"fnord", "smarf"},
data: []string{dataEvents},
expectIncludeLen: 2,
},
{
name: "many users, events + contacts",
user: []string{"fnord", "smarf"},
data: []string{dataEvents, dataContacts},
expectIncludeLen: 4,
},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
sel := exchangeBackupCreateSelectors(test.any, test.user, test.data)
assert.Equal(t, test.expectIncludeLen, len(sel.Includes))
})
}
}
func (suite *ExchangeSuite) TestValidateBackupDetailFlags() {
stub := []string{"id-stub"}
table := []struct {
name string
contacts, contactFolders, emails, emailFolders, events, users []string
backupID string
expect assert.ErrorAssertionFunc
}{
{
name: "only backupid",
backupID: "bid",
expect: assert.NoError,
},
{
name: "any values populated",
backupID: "bid",
contacts: stub,
contactFolders: stub,
emails: stub,
emailFolders: stub,
events: stub,
users: stub,
expect: assert.NoError,
},
{
name: "nothing populated",
expect: assert.Error,
},
{
name: "no backup id",
contacts: stub,
contactFolders: stub,
emails: stub,
emailFolders: stub,
events: stub,
users: stub,
expect: assert.Error,
},
{
name: "no users",
backupID: "bid",
contacts: stub,
contactFolders: stub,
emails: stub,
emailFolders: stub,
events: stub,
expect: assert.Error,
},
{
name: "no contact folders",
backupID: "bid",
contacts: stub,
emails: stub,
emailFolders: stub,
events: stub,
users: stub,
expect: assert.Error,
},
{
name: "no email folders",
backupID: "bid",
contacts: stub,
contactFolders: stub,
emails: stub,
events: stub,
users: stub,
expect: assert.Error,
},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
test.expect(t, validateExchangeBackupDetailFlags(
test.contacts,
test.contactFolders,
test.emails,
test.emailFolders,
test.events,
test.users,
test.backupID,
))
})
}
}
func (suite *ExchangeSuite) TestIncludeExchangeBackupDetailDataSelectors() {
stub := []string{"id-stub"}
any := []string{utils.Wildcard}
table := []struct {
name string
contacts, contactFolders, emails, emailFolders, events, users []string
expectIncludeLen int
}{
{
name: "no selectors",
expectIncludeLen: 0,
},
{
name: "any users",
users: any,
expectIncludeLen: 3,
},
{
name: "single user",
users: stub,
expectIncludeLen: 3,
},
{
name: "multiple users",
users: []string{"fnord", "smarf"},
expectIncludeLen: 6,
},
{
name: "any users, any data",
contacts: any,
contactFolders: any,
emails: any,
emailFolders: any,
events: any,
users: any,
expectIncludeLen: 3,
},
{
name: "any users, any folders",
contactFolders: any,
emailFolders: any,
users: any,
expectIncludeLen: 2,
},
{
name: "single user, single of each data",
contacts: stub,
contactFolders: stub,
emails: stub,
emailFolders: stub,
events: stub,
users: stub,
expectIncludeLen: 3,
},
{
name: "single user, single of each folder",
contactFolders: stub,
emailFolders: stub,
users: stub,
expectIncludeLen: 2,
},
{
name: "any users, contacts",
contacts: any,
contactFolders: stub,
users: any,
expectIncludeLen: 1,
},
{
name: "single user, contacts",
contacts: stub,
contactFolders: stub,
users: stub,
expectIncludeLen: 1,
},
{
name: "any users, emails",
emails: any,
emailFolders: stub,
users: any,
expectIncludeLen: 1,
},
{
name: "single user, emails",
emails: stub,
emailFolders: stub,
users: stub,
expectIncludeLen: 1,
},
{
name: "any users, events",
events: any,
users: any,
expectIncludeLen: 1,
},
{
name: "single user, events",
events: stub,
users: stub,
expectIncludeLen: 1,
},
{
name: "any users, contacts + email",
contacts: any,
contactFolders: any,
emails: any,
emailFolders: any,
users: any,
expectIncludeLen: 2,
},
{
name: "single users, contacts + email",
contacts: stub,
contactFolders: stub,
emails: stub,
emailFolders: stub,
users: stub,
expectIncludeLen: 2,
},
{
name: "any users, email + event",
emails: any,
emailFolders: any,
events: any,
users: any,
expectIncludeLen: 2,
},
{
name: "single users, email + event",
emails: stub,
emailFolders: stub,
events: stub,
users: stub,
expectIncludeLen: 2,
},
{
name: "any users, event + contact",
contacts: any,
contactFolders: any,
events: any,
users: any,
expectIncludeLen: 2,
},
{
name: "single users, event + contact",
contacts: stub,
contactFolders: stub,
events: stub,
users: stub,
expectIncludeLen: 2,
},
{
name: "many users, events",
events: []string{"foo", "bar"},
users: []string{"fnord", "smarf"},
expectIncludeLen: 2,
},
{
name: "many users, events + contacts",
contacts: []string{"foo", "bar"},
contactFolders: []string{"foo", "bar"},
events: []string{"foo", "bar"},
users: []string{"fnord", "smarf"},
expectIncludeLen: 6,
},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
sel := selectors.NewExchangeRestore()
includeExchangeBackupDetailDataSelectors(
sel,
test.contacts,
test.contactFolders,
test.emails,
test.emailFolders,
test.events,
test.users)
assert.Equal(t, test.expectIncludeLen, len(sel.Includes))
})
}
}
func (suite *ExchangeSuite) TestFilterExchangeBackupDetailInfoSelectors() {
stub := "id-stub"
any := utils.Wildcard
table := []struct {
name string
after, before, sender, subject string
expectFilterLen int
}{
{
name: "no selectors",
expectFilterLen: 0,
},
{
name: "any receivedAfter",
after: any,
expectFilterLen: 1,
},
{
name: "single receivedAfter",
after: stub,
expectFilterLen: 1,
},
{
name: "any receivedBefore",
before: any,
expectFilterLen: 1,
},
{
name: "single receivedBefore",
before: stub,
expectFilterLen: 1,
},
{
name: "any sender",
sender: any,
expectFilterLen: 1,
},
{
name: "single sender",
sender: stub,
expectFilterLen: 1,
},
{
name: "any subject",
subject: any,
expectFilterLen: 1,
},
{
name: "single subject",
subject: stub,
expectFilterLen: 1,
},
{
name: "one of each",
after: stub,
before: stub,
sender: stub,
subject: stub,
expectFilterLen: 4,
},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
sel := selectors.NewExchangeRestore()
filterExchangeBackupDetailInfoSelectors(
sel,
test.after,
test.before,
test.sender,
test.subject)
assert.Equal(t, test.expectFilterLen, len(sel.Filters))
})
}
}