corso/src/cli/utils/exchange_test.go
Keepers bf0a01708a
remove selector printable, list discreteOwner (#2034)
## Description

The selectors printable code wasn't being used in any valid way, so that's out.  Backup List printing now refers to the DiscreteOwner in the embedded selector as the ResourceOwner reference.  Renamed the "Selectors"
column in the List print table to "Resource Owner" to better match what should be contained in that field.

## Does this PR need a docs update or release note?

- [x]  Yes, it's included

## Type of change

- [x] 🐛 Bugfix
- [x] 🧹 Tech Debt/Cleanup

## Issue(s)

* #1617

## Test Plan

- [x] 💪 Manual
- [x]  Unit test
2023-01-09 22:42:17 +00:00

487 lines
9.9 KiB
Go

package utils_test
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
"github.com/alcionai/corso/src/cli/utils"
"github.com/alcionai/corso/src/internal/common"
"github.com/alcionai/corso/src/pkg/selectors"
)
type ExchangeUtilsSuite struct {
suite.Suite
}
func TestExchangeUtilsSuite(t *testing.T) {
suite.Run(t, new(ExchangeUtilsSuite))
}
func (suite *ExchangeUtilsSuite) TestValidateRestoreFlags() {
table := []struct {
name string
backupID string
opts utils.ExchangeOpts
expect assert.ErrorAssertionFunc
}{
{
name: "with backupid",
backupID: "bid",
opts: utils.ExchangeOpts{},
expect: assert.NoError,
},
{
name: "no backupid",
opts: utils.ExchangeOpts{},
expect: assert.Error,
},
{
name: "valid time",
backupID: "bid",
opts: utils.ExchangeOpts{EmailReceivedAfter: common.Now()},
expect: assert.NoError,
},
{
name: "invalid time",
opts: utils.ExchangeOpts{EmailReceivedAfter: "fnords"},
expect: assert.Error,
},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
test.expect(t, utils.ValidateExchangeRestoreFlags(test.backupID, test.opts))
})
}
}
func (suite *ExchangeUtilsSuite) TestIncludeExchangeRestoreDataSelectors() {
stub := []string{"id-stub"}
many := []string{"fnord", "smarf"}
a := []string{utils.Wildcard}
table := []struct {
name string
opts utils.ExchangeOpts
expectIncludeLen int
}{
{
name: "no selectors",
expectIncludeLen: 3,
},
{
name: "any users",
opts: utils.ExchangeOpts{
Users: a,
},
expectIncludeLen: 3,
},
{
name: "single user",
opts: utils.ExchangeOpts{
Users: stub,
},
expectIncludeLen: 3,
},
{
name: "multiple users",
opts: utils.ExchangeOpts{
Users: many,
},
expectIncludeLen: 3,
},
{
name: "any users, any data",
opts: utils.ExchangeOpts{
Contact: a,
ContactFolder: a,
Email: a,
EmailFolder: a,
Event: a,
EventCalendar: a,
Users: a,
},
expectIncludeLen: 3,
},
{
name: "any users, any folders",
opts: utils.ExchangeOpts{
ContactFolder: a,
EmailFolder: a,
EventCalendar: a,
Users: a,
},
expectIncludeLen: 3,
},
{
name: "single user, single of each data",
opts: utils.ExchangeOpts{
Contact: stub,
ContactFolder: stub,
Email: stub,
EmailFolder: stub,
Event: stub,
EventCalendar: stub,
Users: stub,
},
expectIncludeLen: 3,
},
{
name: "single user, single of each folder",
opts: utils.ExchangeOpts{
ContactFolder: stub,
EmailFolder: stub,
EventCalendar: stub,
Users: stub,
},
expectIncludeLen: 3,
},
{
name: "any users, contacts",
opts: utils.ExchangeOpts{
Contact: a,
ContactFolder: stub,
Users: a,
},
expectIncludeLen: 1,
},
{
name: "single user, contacts",
opts: utils.ExchangeOpts{
Contact: stub,
ContactFolder: stub,
Users: stub,
},
expectIncludeLen: 1,
},
{
name: "any users, emails",
opts: utils.ExchangeOpts{
Email: a,
EmailFolder: stub,
Users: a,
},
expectIncludeLen: 1,
},
{
name: "single user, emails",
opts: utils.ExchangeOpts{
Email: stub,
EmailFolder: stub,
Users: stub,
},
expectIncludeLen: 1,
},
{
name: "any users, events",
opts: utils.ExchangeOpts{
Event: a,
EventCalendar: a,
Users: a,
},
expectIncludeLen: 1,
},
{
name: "single user, events",
opts: utils.ExchangeOpts{
Event: stub,
EventCalendar: stub,
Users: stub,
},
expectIncludeLen: 1,
},
{
name: "any users, contacts + email",
opts: utils.ExchangeOpts{
Contact: a,
ContactFolder: a,
Email: a,
EmailFolder: a,
Users: a,
},
expectIncludeLen: 2,
},
{
name: "single users, contacts + email",
opts: utils.ExchangeOpts{
Contact: stub,
ContactFolder: stub,
Email: stub,
EmailFolder: stub,
Users: stub,
},
expectIncludeLen: 2,
},
{
name: "any users, email + event",
opts: utils.ExchangeOpts{
Email: a,
EmailFolder: a,
Event: a,
EventCalendar: a,
Users: a,
},
expectIncludeLen: 2,
},
{
name: "single users, email + event",
opts: utils.ExchangeOpts{
Email: stub,
EmailFolder: stub,
Event: stub,
EventCalendar: stub,
Users: stub,
},
expectIncludeLen: 2,
},
{
name: "any users, event + contact",
opts: utils.ExchangeOpts{
Contact: a,
ContactFolder: a,
Event: a,
EventCalendar: a,
Users: a,
},
expectIncludeLen: 2,
},
{
name: "single users, event + contact",
opts: utils.ExchangeOpts{
Contact: stub,
ContactFolder: stub,
Event: stub,
EventCalendar: stub,
Users: stub,
},
expectIncludeLen: 2,
},
{
name: "many users, events",
opts: utils.ExchangeOpts{
Event: many,
EventCalendar: many,
Users: many,
},
expectIncludeLen: 1,
},
{
name: "many users, events + contacts",
opts: utils.ExchangeOpts{
Contact: many,
ContactFolder: many,
Event: many,
EventCalendar: many,
Users: many,
},
expectIncludeLen: 2,
},
{
name: "mail, no folder or user",
opts: utils.ExchangeOpts{
Email: stub,
},
expectIncludeLen: 1,
},
{
name: "contacts, no folder or user",
opts: utils.ExchangeOpts{
Contact: stub,
},
expectIncludeLen: 1,
},
{
name: "event, no folder or user",
opts: utils.ExchangeOpts{
Event: stub,
},
expectIncludeLen: 1,
},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
sel := utils.IncludeExchangeRestoreDataSelectors(test.opts)
assert.Len(t, sel.Includes, test.expectIncludeLen)
})
}
}
func (suite *ExchangeUtilsSuite) TestAddExchangeInclude() {
var (
empty = []string{}
single = []string{"single"}
multi = []string{"more", "than", "one"}
containsOnly = []string{"contains"}
prefixOnly = []string{"/prefix"}
containsAndPrefix = []string{"contains", "/prefix"}
eisc = selectors.NewExchangeRestore(nil).Contacts // type independent, just need the func
)
table := []struct {
name string
resources, folders, items []string
expectIncludeLen int
}{
{
name: "no inputs",
folders: empty,
items: empty,
expectIncludeLen: 0,
},
{
name: "single inputs",
folders: single,
items: single,
expectIncludeLen: 1,
},
{
name: "multi inputs",
folders: multi,
items: multi,
expectIncludeLen: 1,
},
{
name: "folder contains",
folders: containsOnly,
items: empty,
expectIncludeLen: 1,
},
{
name: "folder prefixes",
folders: prefixOnly,
items: empty,
expectIncludeLen: 1,
},
{
name: "folder prefixes and contains",
folders: containsAndPrefix,
items: empty,
expectIncludeLen: 2,
},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
sel := selectors.NewExchangeRestore(nil)
// no return, mutates sel as a side effect
utils.AddExchangeInclude(sel, test.folders, test.items, eisc)
assert.Len(t, sel.Includes, test.expectIncludeLen)
})
}
}
func (suite *ExchangeUtilsSuite) TestFilterExchangeRestoreInfoSelectors() {
stub := "id-stub"
table := []struct {
name string
opts utils.ExchangeOpts
expectFilterLen int
}{
{
name: "no selectors",
expectFilterLen: 0,
},
{
name: "contactName",
opts: utils.ExchangeOpts{
ContactName: stub,
},
expectFilterLen: 1,
},
{
name: "receivedAfter",
opts: utils.ExchangeOpts{
EmailReceivedAfter: stub,
},
expectFilterLen: 1,
},
{
name: "receivedAfter",
opts: utils.ExchangeOpts{
EmailReceivedAfter: stub,
},
expectFilterLen: 1,
},
{
name: "receivedBefore",
opts: utils.ExchangeOpts{
EmailReceivedBefore: stub,
},
expectFilterLen: 1,
},
{
name: "sender",
opts: utils.ExchangeOpts{
EmailSender: stub,
},
expectFilterLen: 1,
},
{
name: "subject",
opts: utils.ExchangeOpts{
EmailSubject: stub,
},
expectFilterLen: 1,
},
{
name: "organizer",
opts: utils.ExchangeOpts{
EventOrganizer: stub,
},
expectFilterLen: 1,
},
{
name: "recurs",
opts: utils.ExchangeOpts{
EventRecurs: stub,
},
expectFilterLen: 1,
},
{
name: "startsAfter",
opts: utils.ExchangeOpts{
EventStartsAfter: stub,
},
expectFilterLen: 1,
},
{
name: "startsBefore",
opts: utils.ExchangeOpts{
EventStartsBefore: stub,
},
expectFilterLen: 1,
},
{
name: "eventSubject",
opts: utils.ExchangeOpts{
EventSubject: stub,
},
expectFilterLen: 1,
},
{
name: "one of each",
opts: utils.ExchangeOpts{
ContactName: stub,
EmailReceivedAfter: stub,
EmailReceivedBefore: stub,
EmailSender: stub,
EmailSubject: stub,
EventOrganizer: stub,
EventRecurs: stub,
EventStartsAfter: stub,
EventStartsBefore: stub,
EventSubject: stub,
},
expectFilterLen: 10,
},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
sel := selectors.NewExchangeRestore(nil)
utils.FilterExchangeRestoreInfoSelectors(sel, test.opts)
assert.Len(t, sel.Filters, test.expectFilterLen)
})
}
}