require resource owner set on selector create (#1887)
## Description selector creation now includes a parameter for a slice of resource owners (users or sites). This is step one in migrating resource owner lists out of scopes and into the selector. next step is to have the selector utilize the primary list instead of the per-scope list. ## Does this PR need a docs update or release note? - [x] ⛔ No ## Type of change - [x] 🌻 Feature ## Issue(s) * #1617 ## Test Plan - [x] ⚡ Unit test - [x] 💚 E2E
This commit is contained in:
parent
a13f1cc3a6
commit
752ff20c6b
@ -284,7 +284,7 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
for _, scope := range sel.DiscreteScopes(users) {
|
for _, scope := range sel.DiscreteScopes(users) {
|
||||||
for _, selUser := range scope.Get(selectors.ExchangeUser) {
|
for _, selUser := range scope.Get(selectors.ExchangeUser) {
|
||||||
opSel := selectors.NewExchangeBackup()
|
opSel := selectors.NewExchangeBackup([]string{selUser})
|
||||||
opSel.Include([]selectors.ExchangeScope{scope.DiscreteCopy(selUser)})
|
opSel.Include([]selectors.ExchangeScope{scope.DiscreteCopy(selUser)})
|
||||||
|
|
||||||
bo, err := r.NewBackup(ctx, opSel.Selector)
|
bo, err := r.NewBackup(ctx, opSel.Selector)
|
||||||
@ -328,7 +328,7 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func exchangeBackupCreateSelectors(userIDs, data []string) *selectors.ExchangeBackup {
|
func exchangeBackupCreateSelectors(userIDs, data []string) *selectors.ExchangeBackup {
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup(userIDs)
|
||||||
|
|
||||||
if len(data) == 0 {
|
if len(data) == 0 {
|
||||||
sel.Include(sel.ContactFolders(userIDs, selectors.Any()))
|
sel.Include(sel.ContactFolders(userIDs, selectors.Any()))
|
||||||
@ -510,7 +510,7 @@ func runDetailsExchangeCmd(
|
|||||||
return nil, errors.Wrap(err, "Failed to get backup details in the repository")
|
return nil, errors.Wrap(err, "Failed to get backup details in the repository")
|
||||||
}
|
}
|
||||||
|
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(nil) // TODO: generate selector in IncludeExchangeRestoreDataSelectors
|
||||||
utils.IncludeExchangeRestoreDataSelectors(sel, opts)
|
utils.IncludeExchangeRestoreDataSelectors(sel, opts)
|
||||||
utils.FilterExchangeRestoreInfoSelectors(sel, opts)
|
utils.FilterExchangeRestoreInfoSelectors(sel, opts)
|
||||||
|
|
||||||
|
|||||||
@ -283,24 +283,26 @@ func (suite *PreparedBackupExchangeIntegrationSuite) SetupSuite() {
|
|||||||
|
|
||||||
suite.backupOps = make(map[path.CategoryType]string)
|
suite.backupOps = make(map[path.CategoryType]string)
|
||||||
|
|
||||||
|
users := []string{suite.m365UserID}
|
||||||
|
|
||||||
for _, set := range backupDataSets {
|
for _, set := range backupDataSets {
|
||||||
var (
|
var (
|
||||||
sel = selectors.NewExchangeBackup()
|
sel = selectors.NewExchangeBackup(users)
|
||||||
scopes []selectors.ExchangeScope
|
scopes []selectors.ExchangeScope
|
||||||
)
|
)
|
||||||
|
|
||||||
switch set {
|
switch set {
|
||||||
case email:
|
case email:
|
||||||
scopes = sel.MailFolders([]string{suite.m365UserID}, []string{exchange.DefaultMailFolder}, selectors.PrefixMatch())
|
scopes = sel.MailFolders(users, []string{exchange.DefaultMailFolder}, selectors.PrefixMatch())
|
||||||
|
|
||||||
case contacts:
|
case contacts:
|
||||||
scopes = sel.ContactFolders(
|
scopes = sel.ContactFolders(
|
||||||
[]string{suite.m365UserID},
|
users,
|
||||||
[]string{exchange.DefaultContactFolder},
|
[]string{exchange.DefaultContactFolder},
|
||||||
selectors.PrefixMatch())
|
selectors.PrefixMatch())
|
||||||
|
|
||||||
case events:
|
case events:
|
||||||
scopes = sel.EventCalendars([]string{suite.m365UserID}, []string{exchange.DefaultCalendar}, selectors.PrefixMatch())
|
scopes = sel.EventCalendars(users, []string{exchange.DefaultCalendar}, selectors.PrefixMatch())
|
||||||
}
|
}
|
||||||
|
|
||||||
sel.Include(scopes)
|
sel.Include(scopes)
|
||||||
@ -515,10 +517,11 @@ func (suite *BackupDeleteExchangeIntegrationSuite) SetupSuite() {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
m365UserID := tester.M365UserID(t)
|
m365UserID := tester.M365UserID(t)
|
||||||
|
users := []string{m365UserID}
|
||||||
|
|
||||||
// some tests require an existing backup
|
// some tests require an existing backup
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup(users)
|
||||||
sel.Include(sel.MailFolders([]string{m365UserID}, []string{exchange.DefaultMailFolder}, selectors.PrefixMatch()))
|
sel.Include(sel.MailFolders(users, []string{exchange.DefaultMailFolder}, selectors.PrefixMatch()))
|
||||||
|
|
||||||
suite.backupOp, err = suite.repo.NewBackup(ctx, sel.Selector)
|
suite.backupOp, err = suite.repo.NewBackup(ctx, sel.Selector)
|
||||||
require.NoError(t, suite.backupOp.Run(ctx))
|
require.NoError(t, suite.backupOp.Run(ctx))
|
||||||
|
|||||||
@ -206,7 +206,7 @@ func createOneDriveCmd(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
for _, scope := range sel.DiscreteScopes(users) {
|
for _, scope := range sel.DiscreteScopes(users) {
|
||||||
for _, selUser := range scope.Get(selectors.OneDriveUser) {
|
for _, selUser := range scope.Get(selectors.OneDriveUser) {
|
||||||
opSel := selectors.NewOneDriveBackup()
|
opSel := selectors.NewOneDriveBackup([]string{selUser})
|
||||||
opSel.Include([]selectors.OneDriveScope{scope.DiscreteCopy(selUser)})
|
opSel.Include([]selectors.OneDriveScope{scope.DiscreteCopy(selUser)})
|
||||||
|
|
||||||
bo, err := r.NewBackup(ctx, opSel.Selector)
|
bo, err := r.NewBackup(ctx, opSel.Selector)
|
||||||
@ -258,7 +258,7 @@ func validateOneDriveBackupCreateFlags(users []string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func oneDriveBackupCreateSelectors(users []string) *selectors.OneDriveBackup {
|
func oneDriveBackupCreateSelectors(users []string) *selectors.OneDriveBackup {
|
||||||
sel := selectors.NewOneDriveBackup()
|
sel := selectors.NewOneDriveBackup(users)
|
||||||
sel.Include(sel.Users(users))
|
sel.Include(sel.Users(users))
|
||||||
|
|
||||||
return sel
|
return sel
|
||||||
@ -401,7 +401,7 @@ func runDetailsOneDriveCmd(
|
|||||||
return nil, errors.Wrap(err, "Failed to get backup details in the repository")
|
return nil, errors.Wrap(err, "Failed to get backup details in the repository")
|
||||||
}
|
}
|
||||||
|
|
||||||
sel := selectors.NewOneDriveRestore()
|
sel := selectors.NewOneDriveRestore(nil) // TODO: generate selector in IncludeExchangeRestoreDataSelectors
|
||||||
utils.IncludeOneDriveRestoreDataSelectors(sel, opts)
|
utils.IncludeOneDriveRestoreDataSelectors(sel, opts)
|
||||||
utils.FilterOneDriveRestoreInfoSelectors(sel, opts)
|
utils.FilterOneDriveRestoreInfoSelectors(sel, opts)
|
||||||
|
|
||||||
|
|||||||
@ -172,10 +172,11 @@ func (suite *BackupDeleteOneDriveIntegrationSuite) SetupSuite() {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
m365UserID := tester.M365UserID(t)
|
m365UserID := tester.M365UserID(t)
|
||||||
|
users := []string{m365UserID}
|
||||||
|
|
||||||
// some tests require an existing backup
|
// some tests require an existing backup
|
||||||
sel := selectors.NewOneDriveBackup()
|
sel := selectors.NewOneDriveBackup(users)
|
||||||
sel.Include(sel.Folders([]string{m365UserID}, selectors.Any()))
|
sel.Include(sel.Folders(users, selectors.Any()))
|
||||||
|
|
||||||
suite.backupOp, err = suite.repo.NewBackup(ctx, sel.Selector)
|
suite.backupOp, err = suite.repo.NewBackup(ctx, sel.Selector)
|
||||||
require.NoError(t, suite.backupOp.Run(ctx))
|
require.NoError(t, suite.backupOp.Run(ctx))
|
||||||
|
|||||||
@ -212,7 +212,7 @@ func createSharePointCmd(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
for _, scope := range sel.DiscreteScopes(gc.GetSiteIDs()) {
|
for _, scope := range sel.DiscreteScopes(gc.GetSiteIDs()) {
|
||||||
for _, selSite := range scope.Get(selectors.SharePointSite) {
|
for _, selSite := range scope.Get(selectors.SharePointSite) {
|
||||||
opSel := selectors.NewSharePointBackup()
|
opSel := selectors.NewSharePointBackup([]string{selSite})
|
||||||
opSel.Include([]selectors.SharePointScope{scope.DiscreteCopy(selSite)})
|
opSel.Include([]selectors.SharePointScope{scope.DiscreteCopy(selSite)})
|
||||||
|
|
||||||
bo, err := r.NewBackup(ctx, opSel.Selector)
|
bo, err := r.NewBackup(ctx, opSel.Selector)
|
||||||
@ -273,19 +273,16 @@ func sharePointBackupCreateSelectors(
|
|||||||
sites, weburls []string,
|
sites, weburls []string,
|
||||||
gc *connector.GraphConnector,
|
gc *connector.GraphConnector,
|
||||||
) (*selectors.SharePointBackup, error) {
|
) (*selectors.SharePointBackup, error) {
|
||||||
sel := selectors.NewSharePointBackup()
|
|
||||||
|
|
||||||
for _, site := range sites {
|
for _, site := range sites {
|
||||||
if site == utils.Wildcard {
|
if site == utils.Wildcard {
|
||||||
sel.Include(sel.Sites(sites))
|
sel := selectors.NewSharePointBackup(selectors.Any())
|
||||||
return sel, nil
|
return sel, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, wURL := range weburls {
|
for _, wURL := range weburls {
|
||||||
if wURL == utils.Wildcard {
|
if wURL == utils.Wildcard {
|
||||||
// due to the wildcard, selectors will drop any url values.
|
sel := selectors.NewSharePointBackup(selectors.Any())
|
||||||
sel.Include(sel.Sites(weburls))
|
|
||||||
return sel, nil
|
return sel, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -295,9 +292,7 @@ func sharePointBackupCreateSelectors(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
sel.Include(sel.Sites(union))
|
return selectors.NewSharePointBackup(union), nil
|
||||||
|
|
||||||
return sel, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
@ -478,7 +473,7 @@ func runDetailsSharePointCmd(
|
|||||||
return nil, errors.Wrap(err, "Failed to get backup details in the repository")
|
return nil, errors.Wrap(err, "Failed to get backup details in the repository")
|
||||||
}
|
}
|
||||||
|
|
||||||
sel := selectors.NewSharePointRestore()
|
sel := selectors.NewSharePointRestore(nil) // TODO: generate selector in IncludeSharePointRestoreDataSelectors
|
||||||
utils.IncludeSharePointRestoreDataSelectors(sel, opts)
|
utils.IncludeSharePointRestoreDataSelectors(sel, opts)
|
||||||
utils.FilterSharePointRestoreInfoSelectors(sel, opts)
|
utils.FilterSharePointRestoreInfoSelectors(sel, opts)
|
||||||
|
|
||||||
|
|||||||
@ -172,10 +172,11 @@ func (suite *BackupDeleteSharePointIntegrationSuite) SetupSuite() {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
m365SiteID := tester.M365SiteID(t)
|
m365SiteID := tester.M365SiteID(t)
|
||||||
|
sites := []string{m365SiteID}
|
||||||
|
|
||||||
// some tests require an existing backup
|
// some tests require an existing backup
|
||||||
sel := selectors.NewSharePointBackup()
|
sel := selectors.NewSharePointBackup(sites)
|
||||||
sel.Include(sel.Libraries([]string{m365SiteID}, selectors.Any()))
|
sel.Include(sel.Libraries(sites, selectors.Any()))
|
||||||
|
|
||||||
suite.backupOp, err = suite.repo.NewBackup(ctx, sel.Selector)
|
suite.backupOp, err = suite.repo.NewBackup(ctx, sel.Selector)
|
||||||
require.NoError(t, suite.backupOp.Run(ctx))
|
require.NoError(t, suite.backupOp.Run(ctx))
|
||||||
|
|||||||
@ -180,6 +180,10 @@ func (suite *SharePointSuite) TestSharePointBackupCreateSelectors() {
|
|||||||
sel, err := sharePointBackupCreateSelectors(ctx, test.site, test.weburl, gc)
|
sel, err := sharePointBackupCreateSelectors(ctx, test.site, test.weburl, gc)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
if len(sel.Scopes()) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
scope := sel.Scopes()[0]
|
scope := sel.Scopes()[0]
|
||||||
targetSites := scope.Get(selectors.SharePointSite)
|
targetSites := scope.Get(selectors.SharePointSite)
|
||||||
|
|
||||||
|
|||||||
@ -216,7 +216,7 @@ func restoreExchangeCmd(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
defer utils.CloseRepo(ctx, r)
|
defer utils.CloseRepo(ctx, r)
|
||||||
|
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(nil) // TODO: generate selector in IncludeExchangeRestoreDataSelectors
|
||||||
utils.IncludeExchangeRestoreDataSelectors(sel, opts)
|
utils.IncludeExchangeRestoreDataSelectors(sel, opts)
|
||||||
utils.FilterExchangeRestoreInfoSelectors(sel, opts)
|
utils.FilterExchangeRestoreInfoSelectors(sel, opts)
|
||||||
|
|
||||||
|
|||||||
@ -81,6 +81,7 @@ func (suite *RestoreExchangeIntegrationSuite) SetupSuite() {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
suite.m365UserID = tester.M365UserID(t)
|
suite.m365UserID = tester.M365UserID(t)
|
||||||
|
users := []string{suite.m365UserID}
|
||||||
|
|
||||||
// init the repo first
|
// init the repo first
|
||||||
suite.repo, err = repository.Initialize(ctx, suite.acct, suite.st, control.Options{})
|
suite.repo, err = repository.Initialize(ctx, suite.acct, suite.st, control.Options{})
|
||||||
@ -90,22 +91,22 @@ func (suite *RestoreExchangeIntegrationSuite) SetupSuite() {
|
|||||||
|
|
||||||
for _, set := range backupDataSets {
|
for _, set := range backupDataSets {
|
||||||
var (
|
var (
|
||||||
sel = selectors.NewExchangeBackup()
|
sel = selectors.NewExchangeBackup(users)
|
||||||
scopes []selectors.ExchangeScope
|
scopes []selectors.ExchangeScope
|
||||||
)
|
)
|
||||||
|
|
||||||
switch set {
|
switch set {
|
||||||
case email:
|
case email:
|
||||||
scopes = sel.MailFolders([]string{suite.m365UserID}, []string{exchange.DefaultMailFolder}, selectors.PrefixMatch())
|
scopes = sel.MailFolders(users, []string{exchange.DefaultMailFolder}, selectors.PrefixMatch())
|
||||||
|
|
||||||
case contacts:
|
case contacts:
|
||||||
scopes = sel.ContactFolders(
|
scopes = sel.ContactFolders(
|
||||||
[]string{suite.m365UserID},
|
users,
|
||||||
[]string{exchange.DefaultContactFolder},
|
[]string{exchange.DefaultContactFolder},
|
||||||
selectors.PrefixMatch())
|
selectors.PrefixMatch())
|
||||||
|
|
||||||
case events:
|
case events:
|
||||||
scopes = sel.EventCalendars([]string{suite.m365UserID}, []string{exchange.DefaultCalendar}, selectors.PrefixMatch())
|
scopes = sel.EventCalendars(users, []string{exchange.DefaultCalendar}, selectors.PrefixMatch())
|
||||||
}
|
}
|
||||||
|
|
||||||
sel.Include(scopes)
|
sel.Include(scopes)
|
||||||
|
|||||||
@ -153,7 +153,7 @@ func restoreOneDriveCmd(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
defer utils.CloseRepo(ctx, r)
|
defer utils.CloseRepo(ctx, r)
|
||||||
|
|
||||||
sel := selectors.NewOneDriveRestore()
|
sel := selectors.NewOneDriveRestore(nil) // TODO: generate selector in IncludeOneDriveRestoreDataSelectors
|
||||||
utils.IncludeOneDriveRestoreDataSelectors(sel, opts)
|
utils.IncludeOneDriveRestoreDataSelectors(sel, opts)
|
||||||
utils.FilterOneDriveRestoreInfoSelectors(sel, opts)
|
utils.FilterOneDriveRestoreInfoSelectors(sel, opts)
|
||||||
|
|
||||||
|
|||||||
@ -140,7 +140,7 @@ func restoreSharePointCmd(cmd *cobra.Command, args []string) error {
|
|||||||
|
|
||||||
defer utils.CloseRepo(ctx, r)
|
defer utils.CloseRepo(ctx, r)
|
||||||
|
|
||||||
sel := selectors.NewSharePointRestore()
|
sel := selectors.NewSharePointRestore(nil) // TODO: generate selector in IncludeSharePointRestoreDataSelectors
|
||||||
utils.IncludeSharePointRestoreDataSelectors(sel, opts)
|
utils.IncludeSharePointRestoreDataSelectors(sel, opts)
|
||||||
utils.FilterSharePointRestoreInfoSelectors(sel, opts)
|
utils.FilterSharePointRestoreInfoSelectors(sel, opts)
|
||||||
|
|
||||||
|
|||||||
@ -301,7 +301,7 @@ func (suite *ExchangeUtilsSuite) TestIncludeExchangeRestoreDataSelectors() {
|
|||||||
}
|
}
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.name, func(t *testing.T) {
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(nil)
|
||||||
utils.IncludeExchangeRestoreDataSelectors(sel, test.opts)
|
utils.IncludeExchangeRestoreDataSelectors(sel, test.opts)
|
||||||
assert.Len(t, sel.Includes, test.expectIncludeLen)
|
assert.Len(t, sel.Includes, test.expectIncludeLen)
|
||||||
})
|
})
|
||||||
@ -316,7 +316,7 @@ func (suite *ExchangeUtilsSuite) TestAddExchangeInclude() {
|
|||||||
containsOnly = []string{"contains"}
|
containsOnly = []string{"contains"}
|
||||||
prefixOnly = []string{"/prefix"}
|
prefixOnly = []string{"/prefix"}
|
||||||
containsAndPrefix = []string{"contains", "/prefix"}
|
containsAndPrefix = []string{"contains", "/prefix"}
|
||||||
eisc = selectors.NewExchangeRestore().Contacts // type independent, just need the func
|
eisc = selectors.NewExchangeRestore(nil).Contacts // type independent, just need the func
|
||||||
)
|
)
|
||||||
|
|
||||||
table := []struct {
|
table := []struct {
|
||||||
@ -369,7 +369,7 @@ func (suite *ExchangeUtilsSuite) TestAddExchangeInclude() {
|
|||||||
}
|
}
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.name, func(t *testing.T) {
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(nil)
|
||||||
// no return, mutates sel as a side effect
|
// no return, mutates sel as a side effect
|
||||||
utils.AddExchangeInclude(sel, test.resources, test.folders, test.items, eisc)
|
utils.AddExchangeInclude(sel, test.resources, test.folders, test.items, eisc)
|
||||||
assert.Len(t, sel.Includes, test.expectIncludeLen)
|
assert.Len(t, sel.Includes, test.expectIncludeLen)
|
||||||
@ -485,7 +485,7 @@ func (suite *ExchangeUtilsSuite) TestFilterExchangeRestoreInfoSelectors() {
|
|||||||
}
|
}
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.name, func(t *testing.T) {
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(nil)
|
||||||
utils.FilterExchangeRestoreInfoSelectors(sel, test.opts)
|
utils.FilterExchangeRestoreInfoSelectors(sel, test.opts)
|
||||||
assert.Len(t, sel.Filters, test.expectFilterLen)
|
assert.Len(t, sel.Filters, test.expectFilterLen)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -90,7 +90,7 @@ func (suite *OneDriveUtilsSuite) TestIncludeOneDriveRestoreDataSelectors() {
|
|||||||
}
|
}
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.name, func(t *testing.T) {
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
sel := selectors.NewOneDriveRestore()
|
sel := selectors.NewOneDriveRestore(nil)
|
||||||
// no return, mutates sel as a side effect
|
// no return, mutates sel as a side effect
|
||||||
utils.IncludeOneDriveRestoreDataSelectors(sel, test.opts)
|
utils.IncludeOneDriveRestoreDataSelectors(sel, test.opts)
|
||||||
assert.Len(t, sel.Includes, test.expectIncludeLen)
|
assert.Len(t, sel.Includes, test.expectIncludeLen)
|
||||||
|
|||||||
@ -126,7 +126,7 @@ func (suite *SharePointUtilsSuite) TestIncludeSharePointRestoreDataSelectors() {
|
|||||||
}
|
}
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.name, func(t *testing.T) {
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
sel := selectors.NewSharePointRestore()
|
sel := selectors.NewSharePointRestore(nil)
|
||||||
// no return, mutates sel as a side effect
|
// no return, mutates sel as a side effect
|
||||||
t.Logf("Options sent: %v\n", test.opts)
|
t.Logf("Options sent: %v\n", test.opts)
|
||||||
utils.IncludeSharePointRestoreDataSelectors(sel, test.opts)
|
utils.IncludeSharePointRestoreDataSelectors(sel, test.opts)
|
||||||
|
|||||||
@ -57,7 +57,7 @@ func handleExchangeEmailFactory(cmd *cobra.Command, args []string) error {
|
|||||||
gc,
|
gc,
|
||||||
service,
|
service,
|
||||||
category,
|
category,
|
||||||
selectors.NewExchangeRestore().Selector,
|
selectors.NewExchangeRestore([]string{user}).Selector,
|
||||||
tenantID, user, destination,
|
tenantID, user, destination,
|
||||||
count,
|
count,
|
||||||
func(id, now, subject, body string) []byte {
|
func(id, now, subject, body string) []byte {
|
||||||
@ -97,7 +97,7 @@ func handleExchangeCalendarEventFactory(cmd *cobra.Command, args []string) error
|
|||||||
gc,
|
gc,
|
||||||
service,
|
service,
|
||||||
category,
|
category,
|
||||||
selectors.NewExchangeRestore().Selector,
|
selectors.NewExchangeRestore([]string{user}).Selector,
|
||||||
tenantID, user, destination,
|
tenantID, user, destination,
|
||||||
count,
|
count,
|
||||||
func(id, now, subject, body string) []byte {
|
func(id, now, subject, body string) []byte {
|
||||||
@ -136,7 +136,7 @@ func handleExchangeContactFactory(cmd *cobra.Command, args []string) error {
|
|||||||
gc,
|
gc,
|
||||||
service,
|
service,
|
||||||
category,
|
category,
|
||||||
selectors.NewExchangeRestore().Selector,
|
selectors.NewExchangeRestore([]string{user}).Selector,
|
||||||
tenantID, user, destination,
|
tenantID, user, destination,
|
||||||
count,
|
count,
|
||||||
func(id, now, subject, body string) []byte {
|
func(id, now, subject, body string) []byte {
|
||||||
|
|||||||
@ -92,10 +92,7 @@ func (gc *GraphConnector) DataCollections(
|
|||||||
func verifyBackupInputs(sels selectors.Selector, userPNs, siteIDs []string) error {
|
func verifyBackupInputs(sels selectors.Selector, userPNs, siteIDs []string) error {
|
||||||
var ids []string
|
var ids []string
|
||||||
|
|
||||||
resourceOwners, err := sels.ResourceOwners()
|
resourceOwners := sels.DiscreteResourceOwners()
|
||||||
if err != nil {
|
|
||||||
return errors.Wrap(err, "invalid backup inputs")
|
|
||||||
}
|
|
||||||
|
|
||||||
switch sels.Service {
|
switch sels.Service {
|
||||||
case selectors.ServiceExchange, selectors.ServiceOneDrive:
|
case selectors.ServiceExchange, selectors.ServiceOneDrive:
|
||||||
@ -112,24 +109,12 @@ func verifyBackupInputs(sels selectors.Selector, userPNs, siteIDs []string) erro
|
|||||||
normROs[strings.ToLower(id)] = struct{}{}
|
normROs[strings.ToLower(id)] = struct{}{}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, ro := range resourceOwners.Includes {
|
for _, ro := range resourceOwners {
|
||||||
if _, ok := normROs[strings.ToLower(ro)]; !ok {
|
if _, ok := normROs[strings.ToLower(ro)]; !ok {
|
||||||
return fmt.Errorf("included resource owner %s not found within tenant", ro)
|
return fmt.Errorf("included resource owner %s not found within tenant", ro)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, ro := range resourceOwners.Excludes {
|
|
||||||
if _, ok := normROs[strings.ToLower(ro)]; !ok {
|
|
||||||
return fmt.Errorf("excluded resource owner %s not found within tenant", ro)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, ro := range resourceOwners.Filters {
|
|
||||||
if _, ok := normROs[strings.ToLower(ro)]; !ok {
|
|
||||||
return fmt.Errorf("filtered resource owner %s not found within tenant", ro)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -59,6 +59,8 @@ func (suite *ConnectorDataCollectionIntegrationSuite) TestExchangeDataCollection
|
|||||||
ctx, flush := tester.NewContext()
|
ctx, flush := tester.NewContext()
|
||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
|
selUsers := []string{suite.user}
|
||||||
|
|
||||||
connector := loadConnector(ctx, suite.T(), Users)
|
connector := loadConnector(ctx, suite.T(), Users)
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
@ -67,8 +69,8 @@ func (suite *ConnectorDataCollectionIntegrationSuite) TestExchangeDataCollection
|
|||||||
{
|
{
|
||||||
name: suite.user + " Email",
|
name: suite.user + " Email",
|
||||||
getSelector: func(t *testing.T) selectors.Selector {
|
getSelector: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup(selUsers)
|
||||||
sel.Include(sel.MailFolders([]string{suite.user}, []string{exchange.DefaultMailFolder}, selectors.PrefixMatch()))
|
sel.Include(sel.MailFolders(selUsers, []string{exchange.DefaultMailFolder}, selectors.PrefixMatch()))
|
||||||
|
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
@ -76,9 +78,9 @@ func (suite *ConnectorDataCollectionIntegrationSuite) TestExchangeDataCollection
|
|||||||
{
|
{
|
||||||
name: suite.user + " Contacts",
|
name: suite.user + " Contacts",
|
||||||
getSelector: func(t *testing.T) selectors.Selector {
|
getSelector: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup(selUsers)
|
||||||
sel.Include(sel.ContactFolders(
|
sel.Include(sel.ContactFolders(
|
||||||
[]string{suite.user},
|
selUsers,
|
||||||
[]string{exchange.DefaultContactFolder},
|
[]string{exchange.DefaultContactFolder},
|
||||||
selectors.PrefixMatch()))
|
selectors.PrefixMatch()))
|
||||||
|
|
||||||
@ -88,9 +90,9 @@ func (suite *ConnectorDataCollectionIntegrationSuite) TestExchangeDataCollection
|
|||||||
// {
|
// {
|
||||||
// name: suite.user + " Events",
|
// name: suite.user + " Events",
|
||||||
// getSelector: func(t *testing.T) selectors.Selector {
|
// getSelector: func(t *testing.T) selectors.Selector {
|
||||||
// sel := selectors.NewExchangeBackup()
|
// sel := selectors.NewExchangeBackup(selUsers)
|
||||||
// sel.Include(sel.EventCalendars(
|
// sel.Include(sel.EventCalendars(
|
||||||
// []string{suite.user},
|
// selUsers,
|
||||||
// []string{exchange.DefaultCalendar},
|
// []string{exchange.DefaultCalendar},
|
||||||
// selectors.PrefixMatch(),
|
// selectors.PrefixMatch(),
|
||||||
// ))
|
// ))
|
||||||
@ -142,6 +144,8 @@ func (suite *ConnectorDataCollectionIntegrationSuite) TestInvalidUserForDataColl
|
|||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
invalidUser := "foo@example.com"
|
invalidUser := "foo@example.com"
|
||||||
|
selUsers := []string{invalidUser}
|
||||||
|
|
||||||
connector := loadConnector(ctx, suite.T(), Users)
|
connector := loadConnector(ctx, suite.T(), Users)
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
@ -150,16 +154,16 @@ func (suite *ConnectorDataCollectionIntegrationSuite) TestInvalidUserForDataColl
|
|||||||
{
|
{
|
||||||
name: "invalid exchange backup user",
|
name: "invalid exchange backup user",
|
||||||
getSelector: func(t *testing.T) selectors.Selector {
|
getSelector: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup(selUsers)
|
||||||
sel.Include(sel.MailFolders([]string{invalidUser}, selectors.Any()))
|
sel.Include(sel.MailFolders(selUsers, selectors.Any()))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Invalid onedrive backup user",
|
name: "Invalid onedrive backup user",
|
||||||
getSelector: func(t *testing.T) selectors.Selector {
|
getSelector: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewOneDriveBackup()
|
sel := selectors.NewOneDriveBackup(selUsers)
|
||||||
sel.Include(sel.Folders([]string{invalidUser}, selectors.Any()))
|
sel.Include(sel.Folders(selUsers, selectors.Any()))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -181,6 +185,8 @@ func (suite *ConnectorDataCollectionIntegrationSuite) TestSharePointDataCollecti
|
|||||||
ctx, flush := tester.NewContext()
|
ctx, flush := tester.NewContext()
|
||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
|
selSites := []string{suite.site}
|
||||||
|
|
||||||
connector := loadConnector(ctx, suite.T(), Sites)
|
connector := loadConnector(ctx, suite.T(), Sites)
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
@ -188,11 +194,10 @@ func (suite *ConnectorDataCollectionIntegrationSuite) TestSharePointDataCollecti
|
|||||||
getSelector func() selectors.Selector
|
getSelector func() selectors.Selector
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Libraries",
|
name: "Libraries",
|
||||||
expected: 1,
|
|
||||||
getSelector: func() selectors.Selector {
|
getSelector: func() selectors.Selector {
|
||||||
sel := selectors.NewSharePointBackup()
|
sel := selectors.NewSharePointBackup(selSites)
|
||||||
sel.Include(sel.Libraries([]string{suite.site}, selectors.Any()))
|
sel.Include(sel.Libraries(selSites, selectors.Any()))
|
||||||
|
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
@ -201,8 +206,8 @@ func (suite *ConnectorDataCollectionIntegrationSuite) TestSharePointDataCollecti
|
|||||||
name: "Lists",
|
name: "Lists",
|
||||||
expected: 0,
|
expected: 0,
|
||||||
getSelector: func() selectors.Selector {
|
getSelector: func() selectors.Selector {
|
||||||
sel := selectors.NewSharePointBackup()
|
sel := selectors.NewSharePointBackup(selSites)
|
||||||
sel.Include(sel.Lists([]string{suite.site}, selectors.Any()))
|
sel.Include(sel.Lists(selSites, selectors.Any()))
|
||||||
|
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
@ -214,7 +219,7 @@ func (suite *ConnectorDataCollectionIntegrationSuite) TestSharePointDataCollecti
|
|||||||
collections, err := sharepoint.DataCollections(
|
collections, err := sharepoint.DataCollections(
|
||||||
ctx,
|
ctx,
|
||||||
test.getSelector(),
|
test.getSelector(),
|
||||||
[]string{suite.site},
|
selSites,
|
||||||
connector.credentials.AzureTenantID,
|
connector.credentials.AzureTenantID,
|
||||||
connector.Service,
|
connector.Service,
|
||||||
connector,
|
connector,
|
||||||
@ -283,9 +288,10 @@ func (suite *ConnectorCreateSharePointCollectionIntegrationSuite) TestCreateShar
|
|||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
var (
|
var (
|
||||||
t = suite.T()
|
t = suite.T()
|
||||||
siteID = tester.M365SiteID(t)
|
siteID = tester.M365SiteID(t)
|
||||||
gc = loadConnector(ctx, t, Sites)
|
gc = loadConnector(ctx, t, Sites)
|
||||||
|
siteIDs = []string{siteID}
|
||||||
)
|
)
|
||||||
|
|
||||||
tables := []struct {
|
tables := []struct {
|
||||||
@ -297,9 +303,9 @@ func (suite *ConnectorCreateSharePointCollectionIntegrationSuite) TestCreateShar
|
|||||||
name: "SharePoint.Libraries",
|
name: "SharePoint.Libraries",
|
||||||
comparator: assert.Equal,
|
comparator: assert.Equal,
|
||||||
sel: func() selectors.Selector {
|
sel: func() selectors.Selector {
|
||||||
sel := selectors.NewSharePointBackup()
|
sel := selectors.NewSharePointBackup(siteIDs)
|
||||||
sel.Include(sel.Libraries(
|
sel.Include(sel.Libraries(
|
||||||
[]string{siteID},
|
siteIDs,
|
||||||
[]string{"foo"},
|
[]string{"foo"},
|
||||||
selectors.PrefixMatch(),
|
selectors.PrefixMatch(),
|
||||||
))
|
))
|
||||||
@ -311,9 +317,9 @@ func (suite *ConnectorCreateSharePointCollectionIntegrationSuite) TestCreateShar
|
|||||||
name: "SharePoint.Lists",
|
name: "SharePoint.Lists",
|
||||||
comparator: assert.Less,
|
comparator: assert.Less,
|
||||||
sel: func() selectors.Selector {
|
sel: func() selectors.Selector {
|
||||||
sel := selectors.NewSharePointBackup()
|
sel := selectors.NewSharePointBackup(siteIDs)
|
||||||
sel.Include(sel.Lists(
|
sel.Include(sel.Lists(
|
||||||
[]string{siteID},
|
siteIDs,
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
selectors.PrefixMatch(), // without this option a SEG Fault occurs
|
selectors.PrefixMatch(), // without this option a SEG Fault occurs
|
||||||
))
|
))
|
||||||
|
|||||||
@ -235,6 +235,7 @@ func (suite *DataCollectionsIntegrationSuite) TestMailFetch() {
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
userID = tester.M365UserID(suite.T())
|
userID = tester.M365UserID(suite.T())
|
||||||
|
users = []string{userID}
|
||||||
acct, err = tester.NewM365Account(suite.T()).M365Config()
|
acct, err = tester.NewM365Account(suite.T()).M365Config()
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -247,8 +248,8 @@ func (suite *DataCollectionsIntegrationSuite) TestMailFetch() {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Folder Iterative Check Mail",
|
name: "Folder Iterative Check Mail",
|
||||||
scope: selectors.NewExchangeBackup().MailFolders(
|
scope: selectors.NewExchangeBackup(users).MailFolders(
|
||||||
[]string{userID},
|
users,
|
||||||
[]string{DefaultMailFolder},
|
[]string{DefaultMailFolder},
|
||||||
selectors.PrefixMatch(),
|
selectors.PrefixMatch(),
|
||||||
)[0],
|
)[0],
|
||||||
@ -293,6 +294,7 @@ func (suite *DataCollectionsIntegrationSuite) TestDelta() {
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
userID = tester.M365UserID(suite.T())
|
userID = tester.M365UserID(suite.T())
|
||||||
|
users = []string{userID}
|
||||||
acct, err = tester.NewM365Account(suite.T()).M365Config()
|
acct, err = tester.NewM365Account(suite.T()).M365Config()
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -304,7 +306,7 @@ func (suite *DataCollectionsIntegrationSuite) TestDelta() {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Mail",
|
name: "Mail",
|
||||||
scope: selectors.NewExchangeBackup().MailFolders(
|
scope: selectors.NewExchangeBackup(users).MailFolders(
|
||||||
[]string{userID},
|
[]string{userID},
|
||||||
[]string{DefaultMailFolder},
|
[]string{DefaultMailFolder},
|
||||||
selectors.PrefixMatch(),
|
selectors.PrefixMatch(),
|
||||||
@ -312,7 +314,7 @@ func (suite *DataCollectionsIntegrationSuite) TestDelta() {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Contacts",
|
name: "Contacts",
|
||||||
scope: selectors.NewExchangeBackup().ContactFolders(
|
scope: selectors.NewExchangeBackup(users).ContactFolders(
|
||||||
[]string{userID},
|
[]string{userID},
|
||||||
[]string{DefaultContactFolder},
|
[]string{DefaultContactFolder},
|
||||||
selectors.PrefixMatch(),
|
selectors.PrefixMatch(),
|
||||||
@ -382,15 +384,16 @@ func (suite *DataCollectionsIntegrationSuite) TestMailSerializationRegression()
|
|||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
var (
|
var (
|
||||||
t = suite.T()
|
t = suite.T()
|
||||||
wg sync.WaitGroup
|
wg sync.WaitGroup
|
||||||
|
users = []string{suite.user}
|
||||||
)
|
)
|
||||||
|
|
||||||
acct, err := tester.NewM365Account(t).M365Config()
|
acct, err := tester.NewM365Account(t).M365Config()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup(users)
|
||||||
sel.Include(sel.MailFolders([]string{suite.user}, []string{DefaultMailFolder}, selectors.PrefixMatch()))
|
sel.Include(sel.MailFolders(users, []string{DefaultMailFolder}, selectors.PrefixMatch()))
|
||||||
|
|
||||||
collections, err := createCollections(
|
collections, err := createCollections(
|
||||||
ctx,
|
ctx,
|
||||||
@ -440,14 +443,16 @@ func (suite *DataCollectionsIntegrationSuite) TestContactSerializationRegression
|
|||||||
acct, err := tester.NewM365Account(suite.T()).M365Config()
|
acct, err := tester.NewM365Account(suite.T()).M365Config()
|
||||||
require.NoError(suite.T(), err)
|
require.NoError(suite.T(), err)
|
||||||
|
|
||||||
|
users := []string{suite.user}
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
scope selectors.ExchangeScope
|
scope selectors.ExchangeScope
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Default Contact Folder",
|
name: "Default Contact Folder",
|
||||||
scope: selectors.NewExchangeBackup().ContactFolders(
|
scope: selectors.NewExchangeBackup(users).ContactFolders(
|
||||||
[]string{suite.user},
|
users,
|
||||||
[]string{DefaultContactFolder},
|
[]string{DefaultContactFolder},
|
||||||
selectors.PrefixMatch())[0],
|
selectors.PrefixMatch())[0],
|
||||||
},
|
},
|
||||||
@ -513,6 +518,8 @@ func (suite *DataCollectionsIntegrationSuite) TestEventsSerializationRegression(
|
|||||||
acct, err := tester.NewM365Account(suite.T()).M365Config()
|
acct, err := tester.NewM365Account(suite.T()).M365Config()
|
||||||
require.NoError(suite.T(), err)
|
require.NoError(suite.T(), err)
|
||||||
|
|
||||||
|
users := []string{suite.user}
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name, expected string
|
name, expected string
|
||||||
scope selectors.ExchangeScope
|
scope selectors.ExchangeScope
|
||||||
@ -520,16 +527,16 @@ func (suite *DataCollectionsIntegrationSuite) TestEventsSerializationRegression(
|
|||||||
{
|
{
|
||||||
name: "Default Event Calendar",
|
name: "Default Event Calendar",
|
||||||
expected: DefaultCalendar,
|
expected: DefaultCalendar,
|
||||||
scope: selectors.NewExchangeBackup().EventCalendars(
|
scope: selectors.NewExchangeBackup(users).EventCalendars(
|
||||||
[]string{suite.user},
|
users,
|
||||||
[]string{DefaultCalendar},
|
[]string{DefaultCalendar},
|
||||||
selectors.PrefixMatch())[0],
|
selectors.PrefixMatch())[0],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Birthday Calendar",
|
name: "Birthday Calendar",
|
||||||
expected: "Birthdays",
|
expected: "Birthdays",
|
||||||
scope: selectors.NewExchangeBackup().EventCalendars(
|
scope: selectors.NewExchangeBackup(users).EventCalendars(
|
||||||
[]string{suite.user},
|
users,
|
||||||
[]string{"Birthdays"},
|
[]string{"Birthdays"},
|
||||||
selectors.PrefixMatch())[0],
|
selectors.PrefixMatch())[0],
|
||||||
},
|
},
|
||||||
|
|||||||
@ -81,15 +81,16 @@ func (suite *ExchangeIteratorSuite) TestCollectionFunctions() {
|
|||||||
t = suite.T()
|
t = suite.T()
|
||||||
mailScope, contactScope, eventScope []selectors.ExchangeScope
|
mailScope, contactScope, eventScope []selectors.ExchangeScope
|
||||||
userID = tester.M365UserID(t)
|
userID = tester.M365UserID(t)
|
||||||
sel = selectors.NewExchangeBackup()
|
users = []string{userID}
|
||||||
|
sel = selectors.NewExchangeBackup(users)
|
||||||
)
|
)
|
||||||
|
|
||||||
eb, err := sel.ToExchangeBackup()
|
eb, err := sel.ToExchangeBackup()
|
||||||
require.NoError(suite.T(), err)
|
require.NoError(suite.T(), err)
|
||||||
|
|
||||||
contactScope = sel.ContactFolders([]string{userID}, []string{DefaultContactFolder}, selectors.PrefixMatch())
|
contactScope = sel.ContactFolders(users, []string{DefaultContactFolder}, selectors.PrefixMatch())
|
||||||
eventScope = sel.EventCalendars([]string{userID}, []string{DefaultCalendar}, selectors.PrefixMatch())
|
eventScope = sel.EventCalendars(users, []string{DefaultCalendar}, selectors.PrefixMatch())
|
||||||
mailScope = sel.MailFolders([]string{userID}, []string{DefaultMailFolder}, selectors.PrefixMatch())
|
mailScope = sel.MailFolders(users, []string{DefaultMailFolder}, selectors.PrefixMatch())
|
||||||
|
|
||||||
eb.Include(contactScope, eventScope, mailScope)
|
eb.Include(contactScope, eventScope, mailScope)
|
||||||
|
|
||||||
|
|||||||
@ -205,16 +205,16 @@ func (suite *DisconnectedGraphConnectorSuite) TestVerifyBackupInputs() {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "No scopes",
|
name: "No scopes",
|
||||||
checkError: assert.NoError,
|
checkError: assert.Error,
|
||||||
getSelector: func(t *testing.T) selectors.Selector {
|
getSelector: func(t *testing.T) selectors.Selector {
|
||||||
return selectors.NewExchangeBackup().Selector
|
return selectors.NewExchangeBackup(nil).Selector
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Valid Single User",
|
name: "Valid Single User",
|
||||||
checkError: assert.NoError,
|
checkError: assert.NoError,
|
||||||
getSelector: func(t *testing.T) selectors.Selector {
|
getSelector: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup([]string{"bobkelso@someHospital.org"})
|
||||||
sel.Include(sel.MailFolders([]string{"bobkelso@someHospital.org"}, selectors.Any()))
|
sel.Include(sel.MailFolders([]string{"bobkelso@someHospital.org"}, selectors.Any()))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
@ -223,7 +223,7 @@ func (suite *DisconnectedGraphConnectorSuite) TestVerifyBackupInputs() {
|
|||||||
name: "Partial invalid user",
|
name: "Partial invalid user",
|
||||||
checkError: assert.Error,
|
checkError: assert.Error,
|
||||||
getSelector: func(t *testing.T) selectors.Selector {
|
getSelector: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup([]string{"bobkelso@someHospital.org", "janitor@someHospital.org"})
|
||||||
sel.Include(sel.MailFolders([]string{"bobkelso@someHospital.org", "janitor@someHospital.org"}, selectors.Any()))
|
sel.Include(sel.MailFolders([]string{"bobkelso@someHospital.org", "janitor@someHospital.org"}, selectors.Any()))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
@ -232,7 +232,9 @@ func (suite *DisconnectedGraphConnectorSuite) TestVerifyBackupInputs() {
|
|||||||
name: "Multiple Valid Users",
|
name: "Multiple Valid Users",
|
||||||
checkError: assert.NoError,
|
checkError: assert.NoError,
|
||||||
getSelector: func(t *testing.T) selectors.Selector {
|
getSelector: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewOneDriveBackup()
|
sel := selectors.NewOneDriveBackup(
|
||||||
|
[]string{"elliotReid@someHospital.org", "johnDorian@someHospital.org", "christurk@somehospital.org"},
|
||||||
|
)
|
||||||
sel.Include(
|
sel.Include(
|
||||||
sel.Users([]string{"elliotReid@someHospital.org", "johnDorian@someHospital.org", "christurk@somehospital.org"}))
|
sel.Users([]string{"elliotReid@someHospital.org", "johnDorian@someHospital.org", "christurk@somehospital.org"}))
|
||||||
|
|
||||||
@ -264,17 +266,17 @@ func (suite *DisconnectedGraphConnectorSuite) TestVerifyBackupInputs_allServices
|
|||||||
name: "Valid User",
|
name: "Valid User",
|
||||||
checkError: assert.NoError,
|
checkError: assert.NoError,
|
||||||
excludes: func(t *testing.T) selectors.Selector {
|
excludes: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewOneDriveBackup()
|
sel := selectors.NewOneDriveBackup([]string{"elliotReid@someHospital.org"})
|
||||||
sel.Exclude(sel.Folders([]string{"elliotReid@someHospital.org"}, selectors.Any()))
|
sel.Exclude(sel.Folders([]string{"elliotReid@someHospital.org"}, selectors.Any()))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
filters: func(t *testing.T) selectors.Selector {
|
filters: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewOneDriveBackup()
|
sel := selectors.NewOneDriveBackup([]string{"elliotReid@someHospital.org"})
|
||||||
sel.Filter(sel.Folders([]string{"elliotReid@someHospital.org"}, selectors.Any()))
|
sel.Filter(sel.Folders([]string{"elliotReid@someHospital.org"}, selectors.Any()))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
includes: func(t *testing.T) selectors.Selector {
|
includes: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewOneDriveBackup()
|
sel := selectors.NewOneDriveBackup([]string{"elliotReid@someHospital.org"})
|
||||||
sel.Include(sel.Folders([]string{"elliotReid@someHospital.org"}, selectors.Any()))
|
sel.Include(sel.Folders([]string{"elliotReid@someHospital.org"}, selectors.Any()))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
@ -283,17 +285,17 @@ func (suite *DisconnectedGraphConnectorSuite) TestVerifyBackupInputs_allServices
|
|||||||
name: "Invalid User",
|
name: "Invalid User",
|
||||||
checkError: assert.Error,
|
checkError: assert.Error,
|
||||||
excludes: func(t *testing.T) selectors.Selector {
|
excludes: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewOneDriveBackup()
|
sel := selectors.NewOneDriveBackup([]string{"foo@SomeCompany.org"})
|
||||||
sel.Exclude(sel.Folders([]string{"foo@SomeCompany.org"}, selectors.Any()))
|
sel.Exclude(sel.Folders([]string{"foo@SomeCompany.org"}, selectors.Any()))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
filters: func(t *testing.T) selectors.Selector {
|
filters: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewOneDriveBackup()
|
sel := selectors.NewOneDriveBackup([]string{"foo@SomeCompany.org"})
|
||||||
sel.Filter(sel.Folders([]string{"foo@SomeCompany.org"}, selectors.Any()))
|
sel.Filter(sel.Folders([]string{"foo@SomeCompany.org"}, selectors.Any()))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
includes: func(t *testing.T) selectors.Selector {
|
includes: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewOneDriveBackup()
|
sel := selectors.NewOneDriveBackup([]string{"foo@SomeCompany.org"})
|
||||||
sel.Include(sel.Folders([]string{"foo@SomeCompany.org"}, selectors.Any()))
|
sel.Include(sel.Folders([]string{"foo@SomeCompany.org"}, selectors.Any()))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
@ -302,17 +304,17 @@ func (suite *DisconnectedGraphConnectorSuite) TestVerifyBackupInputs_allServices
|
|||||||
name: "valid sites",
|
name: "valid sites",
|
||||||
checkError: assert.NoError,
|
checkError: assert.NoError,
|
||||||
excludes: func(t *testing.T) selectors.Selector {
|
excludes: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewSharePointBackup()
|
sel := selectors.NewSharePointBackup([]string{"abc.site.foo", "bar.site.baz"})
|
||||||
sel.Exclude(sel.Sites([]string{"abc.site.foo", "bar.site.baz"}))
|
sel.Exclude(sel.Sites([]string{"abc.site.foo", "bar.site.baz"}))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
filters: func(t *testing.T) selectors.Selector {
|
filters: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewSharePointBackup()
|
sel := selectors.NewSharePointBackup([]string{"abc.site.foo", "bar.site.baz"})
|
||||||
sel.Filter(sel.Sites([]string{"abc.site.foo", "bar.site.baz"}))
|
sel.Filter(sel.Sites([]string{"abc.site.foo", "bar.site.baz"}))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
includes: func(t *testing.T) selectors.Selector {
|
includes: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewSharePointBackup()
|
sel := selectors.NewSharePointBackup([]string{"abc.site.foo", "bar.site.baz"})
|
||||||
sel.Include(sel.Sites([]string{"abc.site.foo", "bar.site.baz"}))
|
sel.Include(sel.Sites([]string{"abc.site.foo", "bar.site.baz"}))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
@ -321,17 +323,17 @@ func (suite *DisconnectedGraphConnectorSuite) TestVerifyBackupInputs_allServices
|
|||||||
name: "invalid sites",
|
name: "invalid sites",
|
||||||
checkError: assert.Error,
|
checkError: assert.Error,
|
||||||
excludes: func(t *testing.T) selectors.Selector {
|
excludes: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewSharePointBackup()
|
sel := selectors.NewSharePointBackup([]string{"fnords.smarfs.brawnhilda"})
|
||||||
sel.Exclude(sel.Sites([]string{"fnords.smarfs.brawnhilda"}))
|
sel.Exclude(sel.Sites([]string{"fnords.smarfs.brawnhilda"}))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
filters: func(t *testing.T) selectors.Selector {
|
filters: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewSharePointBackup()
|
sel := selectors.NewSharePointBackup([]string{"fnords.smarfs.brawnhilda"})
|
||||||
sel.Filter(sel.Sites([]string{"fnords.smarfs.brawnhilda"}))
|
sel.Filter(sel.Sites([]string{"fnords.smarfs.brawnhilda"}))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
includes: func(t *testing.T) selectors.Selector {
|
includes: func(t *testing.T) selectors.Selector {
|
||||||
sel := selectors.NewSharePointBackup()
|
sel := selectors.NewSharePointBackup([]string{"fnords.smarfs.brawnhilda"})
|
||||||
sel.Include(sel.Sites([]string{"fnords.smarfs.brawnhilda"}))
|
sel.Include(sel.Sites([]string{"fnords.smarfs.brawnhilda"}))
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
},
|
},
|
||||||
|
|||||||
@ -776,13 +776,16 @@ func makeExchangeBackupSel(
|
|||||||
t *testing.T,
|
t *testing.T,
|
||||||
dests []destAndCats,
|
dests []destAndCats,
|
||||||
) selectors.Selector {
|
) selectors.Selector {
|
||||||
sel := selectors.NewExchangeBackup()
|
|
||||||
toInclude := [][]selectors.ExchangeScope{}
|
toInclude := [][]selectors.ExchangeScope{}
|
||||||
|
resourceOwners := []string{}
|
||||||
|
|
||||||
for _, d := range dests {
|
for _, d := range dests {
|
||||||
for c := range d.cats {
|
for c := range d.cats {
|
||||||
|
sel := selectors.NewExchangeBackup(nil)
|
||||||
builder := sel.MailFolders
|
builder := sel.MailFolders
|
||||||
|
|
||||||
|
resourceOwners = append(resourceOwners, d.resourceOwner)
|
||||||
|
|
||||||
switch c {
|
switch c {
|
||||||
case path.ContactsCategory:
|
case path.ContactsCategory:
|
||||||
builder = sel.ContactFolders
|
builder = sel.ContactFolders
|
||||||
@ -799,6 +802,7 @@ func makeExchangeBackupSel(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sel := selectors.NewExchangeBackup(resourceOwners)
|
||||||
sel.Include(toInclude...)
|
sel.Include(toInclude...)
|
||||||
|
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
@ -808,10 +812,13 @@ func makeOneDriveBackupSel(
|
|||||||
t *testing.T,
|
t *testing.T,
|
||||||
dests []destAndCats,
|
dests []destAndCats,
|
||||||
) selectors.Selector {
|
) selectors.Selector {
|
||||||
sel := selectors.NewOneDriveBackup()
|
|
||||||
toInclude := [][]selectors.OneDriveScope{}
|
toInclude := [][]selectors.OneDriveScope{}
|
||||||
|
resourceOwners := []string{}
|
||||||
|
|
||||||
for _, d := range dests {
|
for _, d := range dests {
|
||||||
|
sel := selectors.NewOneDriveBackup(nil)
|
||||||
|
|
||||||
|
resourceOwners = append(resourceOwners, d.resourceOwner)
|
||||||
toInclude = append(toInclude, sel.Folders(
|
toInclude = append(toInclude, sel.Folders(
|
||||||
[]string{d.resourceOwner},
|
[]string{d.resourceOwner},
|
||||||
[]string{d.dest},
|
[]string{d.dest},
|
||||||
@ -819,6 +826,7 @@ func makeOneDriveBackupSel(
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sel := selectors.NewOneDriveBackup(resourceOwners)
|
||||||
sel.Include(toInclude...)
|
sel.Include(toInclude...)
|
||||||
|
|
||||||
return sel.Selector
|
return sel.Selector
|
||||||
|
|||||||
@ -145,7 +145,7 @@ func (suite *OneDriveSuite) TestOneDriveNewCollections() {
|
|||||||
suite.T().Run(test.name, func(t *testing.T) {
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
service := loadTestService(t)
|
service := loadTestService(t)
|
||||||
scope := selectors.
|
scope := selectors.
|
||||||
NewOneDriveBackup().
|
NewOneDriveBackup([]string{test.user}).
|
||||||
Users([]string{test.user})[0]
|
Users([]string{test.user})[0]
|
||||||
odcs, err := NewCollections(
|
odcs, err := NewCollections(
|
||||||
creds.AzureTenantID,
|
creds.AzureTenantID,
|
||||||
|
|||||||
@ -283,15 +283,8 @@ func selectorToOwnersCats(sel selectors.Selector) *kopia.OwnersCats {
|
|||||||
ServiceCats: map[string]kopia.ServiceCat{},
|
ServiceCats: map[string]kopia.ServiceCat{},
|
||||||
}
|
}
|
||||||
|
|
||||||
ros, err := sel.ResourceOwners()
|
for _, ro := range sel.DiscreteResourceOwners() {
|
||||||
if err != nil {
|
oc.ResourceOwners[ro] = struct{}{}
|
||||||
return &kopia.OwnersCats{}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, sl := range [][]string{ros.Includes, ros.Filters} {
|
|
||||||
for _, ro := range sl {
|
|
||||||
oc.ResourceOwners[ro] = struct{}{}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pcs, err := sel.PathCategories()
|
pcs, err := sel.PathCategories()
|
||||||
|
|||||||
@ -340,7 +340,7 @@ func (suite *BackupOpSuite) TestBackupOperation_ConsumeBackupDataCollections_Pat
|
|||||||
ID: "id2",
|
ID: "id2",
|
||||||
}
|
}
|
||||||
|
|
||||||
sel = selectors.NewExchangeBackup().Selector
|
sel = selectors.NewExchangeBackup([]string{resourceOwner}).Selector
|
||||||
)
|
)
|
||||||
|
|
||||||
table := []struct {
|
table := []struct {
|
||||||
@ -660,6 +660,7 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchange() {
|
|||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
m365UserID := tester.M365UserID(suite.T())
|
m365UserID := tester.M365UserID(suite.T())
|
||||||
|
users := []string{m365UserID}
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
@ -671,12 +672,8 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchange() {
|
|||||||
{
|
{
|
||||||
name: "Mail",
|
name: "Mail",
|
||||||
selectFunc: func() *selectors.ExchangeBackup {
|
selectFunc: func() *selectors.ExchangeBackup {
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup(users)
|
||||||
sel.Include(sel.MailFolders(
|
sel.Include(sel.MailFolders(users, []string{exchange.DefaultMailFolder}, selectors.PrefixMatch()))
|
||||||
[]string{m365UserID},
|
|
||||||
[]string{exchange.DefaultMailFolder},
|
|
||||||
selectors.PrefixMatch()))
|
|
||||||
|
|
||||||
return sel
|
return sel
|
||||||
},
|
},
|
||||||
resourceOwner: m365UserID,
|
resourceOwner: m365UserID,
|
||||||
@ -686,9 +683,9 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchange() {
|
|||||||
{
|
{
|
||||||
name: "Contacts",
|
name: "Contacts",
|
||||||
selectFunc: func() *selectors.ExchangeBackup {
|
selectFunc: func() *selectors.ExchangeBackup {
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup(users)
|
||||||
sel.Include(sel.ContactFolders(
|
sel.Include(sel.ContactFolders(
|
||||||
[]string{m365UserID},
|
users,
|
||||||
[]string{exchange.DefaultContactFolder},
|
[]string{exchange.DefaultContactFolder},
|
||||||
selectors.PrefixMatch()))
|
selectors.PrefixMatch()))
|
||||||
|
|
||||||
@ -701,12 +698,8 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchange() {
|
|||||||
{
|
{
|
||||||
name: "Calendar Events",
|
name: "Calendar Events",
|
||||||
selectFunc: func() *selectors.ExchangeBackup {
|
selectFunc: func() *selectors.ExchangeBackup {
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup(users)
|
||||||
sel.Include(sel.EventCalendars(
|
sel.Include(sel.EventCalendars(users, []string{exchange.DefaultCalendar}, selectors.PrefixMatch()))
|
||||||
[]string{m365UserID},
|
|
||||||
[]string{exchange.DefaultCalendar},
|
|
||||||
selectors.PrefixMatch()))
|
|
||||||
|
|
||||||
return sel
|
return sel
|
||||||
},
|
},
|
||||||
resourceOwner: m365UserID,
|
resourceOwner: m365UserID,
|
||||||
@ -808,7 +801,7 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_oneDrive() {
|
|||||||
t = suite.T()
|
t = suite.T()
|
||||||
mb = evmock.NewBus()
|
mb = evmock.NewBus()
|
||||||
m365UserID = tester.SecondaryM365UserID(t)
|
m365UserID = tester.SecondaryM365UserID(t)
|
||||||
sel = selectors.NewOneDriveBackup()
|
sel = selectors.NewOneDriveBackup([]string{m365UserID})
|
||||||
)
|
)
|
||||||
|
|
||||||
sel.Include(sel.Users([]string{m365UserID}))
|
sel.Include(sel.Users([]string{m365UserID}))
|
||||||
@ -841,7 +834,7 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_sharePoint() {
|
|||||||
t = suite.T()
|
t = suite.T()
|
||||||
mb = evmock.NewBus()
|
mb = evmock.NewBus()
|
||||||
siteID = tester.M365SiteID(t)
|
siteID = tester.M365SiteID(t)
|
||||||
sel = selectors.NewSharePointBackup()
|
sel = selectors.NewSharePointBackup([]string{siteID})
|
||||||
)
|
)
|
||||||
|
|
||||||
sel.Include(sel.Sites([]string{siteID}))
|
sel.Include(sel.Sites([]string{siteID}))
|
||||||
|
|||||||
@ -178,11 +178,13 @@ func (suite *RestoreOpIntegrationSuite) SetupSuite() {
|
|||||||
sw := store.NewKopiaStore(ms)
|
sw := store.NewKopiaStore(ms)
|
||||||
suite.sw = sw
|
suite.sw = sw
|
||||||
|
|
||||||
bsel := selectors.NewExchangeBackup()
|
users := []string{m365UserID}
|
||||||
|
|
||||||
|
bsel := selectors.NewExchangeBackup(users)
|
||||||
bsel.Include(
|
bsel.Include(
|
||||||
bsel.MailFolders([]string{m365UserID}, []string{exchange.DefaultMailFolder}, selectors.PrefixMatch()),
|
bsel.MailFolders(users, []string{exchange.DefaultMailFolder}, selectors.PrefixMatch()),
|
||||||
bsel.ContactFolders([]string{m365UserID}, []string{exchange.DefaultContactFolder}, selectors.PrefixMatch()),
|
bsel.ContactFolders(users, []string{exchange.DefaultContactFolder}, selectors.PrefixMatch()),
|
||||||
bsel.EventCalendars([]string{m365UserID}, []string{exchange.DefaultCalendar}, selectors.PrefixMatch()),
|
bsel.EventCalendars(users, []string{exchange.DefaultCalendar}, selectors.PrefixMatch()),
|
||||||
)
|
)
|
||||||
|
|
||||||
bo, err := NewBackupOperation(
|
bo, err := NewBackupOperation(
|
||||||
@ -264,9 +266,10 @@ func (suite *RestoreOpIntegrationSuite) TestRestore_Run() {
|
|||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
|
users := []string{tester.M365UserID(t)}
|
||||||
|
|
||||||
rsel := selectors.NewExchangeRestore()
|
rsel := selectors.NewExchangeRestore(users)
|
||||||
rsel.Include(rsel.Users([]string{tester.M365UserID(t)}))
|
rsel.Include(rsel.Users(users))
|
||||||
|
|
||||||
dest := tester.DefaultTestRestoreDestination()
|
dest := tester.DefaultTestRestoreDestination()
|
||||||
mb := evmock.NewBus()
|
mb := evmock.NewBus()
|
||||||
@ -307,7 +310,7 @@ func (suite *RestoreOpIntegrationSuite) TestRestore_Run_ErrorNoResults() {
|
|||||||
|
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
|
|
||||||
rsel := selectors.NewExchangeRestore()
|
rsel := selectors.NewExchangeRestore(selectors.None())
|
||||||
rsel.Include(rsel.Users(selectors.None()))
|
rsel.Include(rsel.Users(selectors.None()))
|
||||||
|
|
||||||
dest := tester.DefaultTestRestoreDestination()
|
dest := tester.DefaultTestRestoreDestination()
|
||||||
|
|||||||
@ -25,7 +25,7 @@ func TestBackupSuite(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func stubBackup(t time.Time) backup.Backup {
|
func stubBackup(t time.Time) backup.Backup {
|
||||||
sel := selectors.NewExchangeBackup()
|
sel := selectors.NewExchangeBackup(selectors.Any())
|
||||||
sel.Include(sel.Users(selectors.Any()))
|
sel.Include(sel.Users(selectors.Any()))
|
||||||
|
|
||||||
return backup.Backup{
|
return backup.Backup{
|
||||||
|
|||||||
@ -400,7 +400,7 @@ func (suite *RepositoryLoadTestExchangeSuite) TestExchange() {
|
|||||||
ctx, flush := tester.WithContext(suite.ctx)
|
ctx, flush := tester.WithContext(suite.ctx)
|
||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
bsel := selectors.NewExchangeBackup()
|
bsel := selectors.NewExchangeBackup(suite.usersUnderTest)
|
||||||
bsel.Include(bsel.MailFolders(suite.usersUnderTest, selectors.Any()))
|
bsel.Include(bsel.MailFolders(suite.usersUnderTest, selectors.Any()))
|
||||||
bsel.Include(bsel.ContactFolders(suite.usersUnderTest, selectors.Any()))
|
bsel.Include(bsel.ContactFolders(suite.usersUnderTest, selectors.Any()))
|
||||||
bsel.Include(bsel.EventCalendars(suite.usersUnderTest, selectors.Any()))
|
bsel.Include(bsel.EventCalendars(suite.usersUnderTest, selectors.Any()))
|
||||||
@ -451,7 +451,7 @@ func (suite *RepositoryIndividualLoadTestExchangeSuite) TestExchange() {
|
|||||||
ctx, flush := tester.WithContext(suite.ctx)
|
ctx, flush := tester.WithContext(suite.ctx)
|
||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
bsel := selectors.NewExchangeBackup()
|
bsel := selectors.NewExchangeBackup(suite.usersUnderTest)
|
||||||
bsel.Include(bsel.MailFolders(suite.usersUnderTest, selectors.Any()))
|
bsel.Include(bsel.MailFolders(suite.usersUnderTest, selectors.Any()))
|
||||||
bsel.Include(bsel.ContactFolders(suite.usersUnderTest, selectors.Any()))
|
bsel.Include(bsel.ContactFolders(suite.usersUnderTest, selectors.Any()))
|
||||||
bsel.Include(bsel.EventCalendars(suite.usersUnderTest, selectors.Any()))
|
bsel.Include(bsel.EventCalendars(suite.usersUnderTest, selectors.Any()))
|
||||||
@ -504,7 +504,7 @@ func (suite *RepositoryLoadTestOneDriveSuite) TestOneDrive() {
|
|||||||
ctx, flush := tester.WithContext(suite.ctx)
|
ctx, flush := tester.WithContext(suite.ctx)
|
||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
bsel := selectors.NewOneDriveBackup()
|
bsel := selectors.NewOneDriveBackup(suite.usersUnderTest)
|
||||||
bsel.Include(bsel.Users(suite.usersUnderTest))
|
bsel.Include(bsel.Users(suite.usersUnderTest))
|
||||||
sel := bsel.Selector
|
sel := bsel.Selector
|
||||||
|
|
||||||
@ -551,7 +551,7 @@ func (suite *RepositoryIndividualLoadTestOneDriveSuite) TestOneDrive() {
|
|||||||
ctx, flush := tester.WithContext(suite.ctx)
|
ctx, flush := tester.WithContext(suite.ctx)
|
||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
bsel := selectors.NewOneDriveBackup()
|
bsel := selectors.NewOneDriveBackup(suite.usersUnderTest)
|
||||||
bsel.Include(bsel.Users(suite.usersUnderTest))
|
bsel.Include(bsel.Users(suite.usersUnderTest))
|
||||||
sel := bsel.Selector
|
sel := bsel.Selector
|
||||||
|
|
||||||
@ -602,7 +602,7 @@ func (suite *RepositoryLoadTestSharePointSuite) TestSharePoint() {
|
|||||||
ctx, flush := tester.WithContext(suite.ctx)
|
ctx, flush := tester.WithContext(suite.ctx)
|
||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
bsel := selectors.NewSharePointBackup()
|
bsel := selectors.NewSharePointBackup(suite.sitesUnderTest)
|
||||||
bsel.Include(bsel.Sites(suite.sitesUnderTest))
|
bsel.Include(bsel.Sites(suite.sitesUnderTest))
|
||||||
sel := bsel.Selector
|
sel := bsel.Selector
|
||||||
|
|
||||||
@ -649,7 +649,7 @@ func (suite *RepositoryIndividualLoadTestSharePointSuite) TestSharePoint() {
|
|||||||
ctx, flush := tester.WithContext(suite.ctx)
|
ctx, flush := tester.WithContext(suite.ctx)
|
||||||
defer flush()
|
defer flush()
|
||||||
|
|
||||||
bsel := selectors.NewSharePointBackup()
|
bsel := selectors.NewSharePointBackup(suite.sitesUnderTest)
|
||||||
bsel.Include(bsel.Sites(suite.sitesUnderTest))
|
bsel.Include(bsel.Sites(suite.sitesUnderTest))
|
||||||
sel := bsel.Selector
|
sel := bsel.Selector
|
||||||
|
|
||||||
|
|||||||
@ -12,10 +12,19 @@ import (
|
|||||||
func Example_newSelector() {
|
func Example_newSelector() {
|
||||||
// Selectors should use application-specific constructors.
|
// Selectors should use application-specific constructors.
|
||||||
// Generate a selector for backup operations.
|
// Generate a selector for backup operations.
|
||||||
seb := selectors.NewExchangeBackup()
|
seb := selectors.NewExchangeBackup(nil)
|
||||||
|
|
||||||
// Generate a selector for restore and 'backup details' operations.
|
// Generate a selector for restore and 'backup details' operations.
|
||||||
ser := selectors.NewExchangeRestore()
|
ser := selectors.NewExchangeRestore(nil)
|
||||||
|
|
||||||
|
// Selectors specify the data that should be handled
|
||||||
|
// in an operation by specifying the Scope of data.
|
||||||
|
// Initially, the selector will ask for the resource
|
||||||
|
// owners (users, in this example). Only these users
|
||||||
|
// will be involved in the backup.
|
||||||
|
seb = selectors.NewExchangeBackup(
|
||||||
|
[]string{"your-user-id", "foo-user-id", "bar-user-id"},
|
||||||
|
)
|
||||||
|
|
||||||
// The core selector can be passed around without slicing any
|
// The core selector can be passed around without slicing any
|
||||||
// application-specific data.
|
// application-specific data.
|
||||||
@ -46,42 +55,11 @@ func Example_newSelector() {
|
|||||||
// Output: OneDrive service is not Exchange: wrong selector service type
|
// Output: OneDrive service is not Exchange: wrong selector service type
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExampleIncludeUsers demonstrates how to specify users in a selector.
|
|
||||||
func Example_includeUsers() {
|
|
||||||
seb := selectors.NewExchangeBackup()
|
|
||||||
|
|
||||||
// Selectors specify the data that should be handled
|
|
||||||
// in an operation by specifying the Scope of data.
|
|
||||||
seb.Include(
|
|
||||||
// Selector application instances own the API which describes
|
|
||||||
// the scopes of data that callers may specify.
|
|
||||||
seb.Users([]string{"my-user-id"}),
|
|
||||||
)
|
|
||||||
|
|
||||||
// Selection scopes can be passed around independently.
|
|
||||||
yourUser := seb.Users([]string{"your-user-id"})
|
|
||||||
|
|
||||||
// Most scopes accept multiple values, unioning them into the final selection.
|
|
||||||
otherUsers := seb.Users([]string{"foo-user-id", "bar-user-id"})
|
|
||||||
|
|
||||||
// Multiple scopes can be added at a time.
|
|
||||||
// All calls to Include append those scopes to the current set,
|
|
||||||
// so this addition will also include "my-user-id" from before.
|
|
||||||
seb.Include(
|
|
||||||
yourUser,
|
|
||||||
otherUsers,
|
|
||||||
)
|
|
||||||
|
|
||||||
// Two predefined sets of values exist: any and none.
|
|
||||||
// Any is a wildcard that accepts all values.
|
|
||||||
seb.Users(selectors.Any())
|
|
||||||
// None is the opposite of Any: rejecting all values.
|
|
||||||
seb.Users(selectors.None())
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExampleIncludeFoldersAndItems demonstrates how to select for granular data.
|
// ExampleIncludeFoldersAndItems demonstrates how to select for granular data.
|
||||||
func Example_includeFoldersAndItems() {
|
func Example_includeFoldersAndItems() {
|
||||||
seb := selectors.NewExchangeBackup()
|
seb := selectors.NewExchangeBackup(
|
||||||
|
[]string{"your-user-id", "foo-user-id", "bar-user-id"},
|
||||||
|
)
|
||||||
|
|
||||||
// Much of the data handled by Corso exists within an established hierarchy.
|
// Much of the data handled by Corso exists within an established hierarchy.
|
||||||
// Resource Owner-level data (such as users) sits at the top, with Folder
|
// Resource Owner-level data (such as users) sits at the top, with Folder
|
||||||
@ -116,7 +94,9 @@ func Example_includeFoldersAndItems() {
|
|||||||
|
|
||||||
// ExampleFilters demonstrates selector filters.
|
// ExampleFilters demonstrates selector filters.
|
||||||
func Example_filters() {
|
func Example_filters() {
|
||||||
ser := selectors.NewExchangeRestore()
|
ser := selectors.NewExchangeRestore(
|
||||||
|
[]string{"your-user-id", "foo-user-id", "bar-user-id"},
|
||||||
|
)
|
||||||
|
|
||||||
// In addition to data ownership details (user, folder, itemID), certain operations
|
// In addition to data ownership details (user, folder, itemID), certain operations
|
||||||
// like `backup details` and restores allow items to be selected by filtering on
|
// like `backup details` and restores allow items to be selected by filtering on
|
||||||
@ -164,7 +144,9 @@ var (
|
|||||||
|
|
||||||
// ExampleReduceDetails demonstrates how selectors are used to filter backup details.
|
// ExampleReduceDetails demonstrates how selectors are used to filter backup details.
|
||||||
func Example_reduceDetails() {
|
func Example_reduceDetails() {
|
||||||
ser := selectors.NewExchangeRestore()
|
ser := selectors.NewExchangeRestore(
|
||||||
|
[]string{"your-user-id", "foo-user-id", "bar-user-id"},
|
||||||
|
)
|
||||||
|
|
||||||
// The Reduce() call is where our constructed selectors are applied to the data
|
// The Reduce() call is where our constructed selectors are applied to the data
|
||||||
// from a previous backup record.
|
// from a previous backup record.
|
||||||
@ -189,7 +171,9 @@ func Example_scopeMatching() {
|
|||||||
// Just like sets of backup data can be filtered down using Reduce(), we can check
|
// Just like sets of backup data can be filtered down using Reduce(), we can check
|
||||||
// if an individual bit of data matches our scopes, too.
|
// if an individual bit of data matches our scopes, too.
|
||||||
scope := selectors.
|
scope := selectors.
|
||||||
NewExchangeBackup().
|
NewExchangeBackup(
|
||||||
|
[]string{"your-user-id", "foo-user-id", "bar-user-id"},
|
||||||
|
).
|
||||||
Mails(
|
Mails(
|
||||||
[]string{"id-1"},
|
[]string{"id-1"},
|
||||||
[]string{"Inbox"},
|
[]string{"Inbox"},
|
||||||
|
|||||||
@ -37,17 +37,16 @@ type (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ Reducer = &ExchangeRestore{}
|
_ Reducer = &ExchangeRestore{}
|
||||||
_ printabler = &ExchangeRestore{}
|
_ printabler = &ExchangeRestore{}
|
||||||
_ resourceOwnerer = &ExchangeRestore{}
|
_ pathCategorier = &ExchangeRestore{}
|
||||||
_ pathCategorier = &ExchangeRestore{}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewExchange produces a new Selector with the service set to ServiceExchange.
|
// NewExchange produces a new Selector with the service set to ServiceExchange.
|
||||||
func NewExchangeBackup() *ExchangeBackup {
|
func NewExchangeBackup(users []string) *ExchangeBackup {
|
||||||
src := ExchangeBackup{
|
src := ExchangeBackup{
|
||||||
exchange{
|
exchange{
|
||||||
newSelector(ServiceExchange),
|
newSelector(ServiceExchange, users),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,10 +66,10 @@ func (s Selector) ToExchangeBackup() (*ExchangeBackup, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewExchangeRestore produces a new Selector with the service set to ServiceExchange.
|
// NewExchangeRestore produces a new Selector with the service set to ServiceExchange.
|
||||||
func NewExchangeRestore() *ExchangeRestore {
|
func NewExchangeRestore(users []string) *ExchangeRestore {
|
||||||
src := ExchangeRestore{
|
src := ExchangeRestore{
|
||||||
exchange{
|
exchange{
|
||||||
newSelector(ServiceExchange),
|
newSelector(ServiceExchange, users),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,16 +93,6 @@ func (s exchange) Printable() Printable {
|
|||||||
return toPrintable[ExchangeScope](s.Selector)
|
return toPrintable[ExchangeScope](s.Selector)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResourceOwners produces the aggregation of discrete users described by each type of scope.
|
|
||||||
// Any and None values are omitted.
|
|
||||||
func (s exchange) ResourceOwners() selectorResourceOwners {
|
|
||||||
return selectorResourceOwners{
|
|
||||||
Excludes: resourceOwnersIn(s.Excludes, ExchangeUser.String()),
|
|
||||||
Filters: resourceOwnersIn(s.Filters, ExchangeUser.String()),
|
|
||||||
Includes: resourceOwnersIn(s.Includes, ExchangeUser.String()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PathCategories produces the aggregation of discrete users described by each type of scope.
|
// PathCategories produces the aggregation of discrete users described by each type of scope.
|
||||||
func (s exchange) PathCategories() selectorPathCategories {
|
func (s exchange) PathCategories() selectorPathCategories {
|
||||||
return selectorPathCategories{
|
return selectorPathCategories{
|
||||||
|
|||||||
@ -25,14 +25,14 @@ func TestExchangeSelectorSuite(t *testing.T) {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestNewExchangeBackup() {
|
func (suite *ExchangeSelectorSuite) TestNewExchangeBackup() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
eb := NewExchangeBackup()
|
eb := NewExchangeBackup(nil)
|
||||||
assert.Equal(t, eb.Service, ServiceExchange)
|
assert.Equal(t, eb.Service, ServiceExchange)
|
||||||
assert.NotZero(t, eb.Scopes())
|
assert.NotZero(t, eb.Scopes())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestToExchangeBackup() {
|
func (suite *ExchangeSelectorSuite) TestToExchangeBackup() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
eb := NewExchangeBackup()
|
eb := NewExchangeBackup(nil)
|
||||||
s := eb.Selector
|
s := eb.Selector
|
||||||
eb, err := s.ToExchangeBackup()
|
eb, err := s.ToExchangeBackup()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@ -42,14 +42,14 @@ func (suite *ExchangeSelectorSuite) TestToExchangeBackup() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestNewExchangeRestore() {
|
func (suite *ExchangeSelectorSuite) TestNewExchangeRestore() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore(nil)
|
||||||
assert.Equal(t, er.Service, ServiceExchange)
|
assert.Equal(t, er.Service, ServiceExchange)
|
||||||
assert.NotZero(t, er.Scopes())
|
assert.NotZero(t, er.Scopes())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestToExchangeRestore() {
|
func (suite *ExchangeSelectorSuite) TestToExchangeRestore() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
eb := NewExchangeRestore()
|
eb := NewExchangeRestore(nil)
|
||||||
s := eb.Selector
|
s := eb.Selector
|
||||||
eb, err := s.ToExchangeRestore()
|
eb, err := s.ToExchangeRestore()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@ -59,7 +59,6 @@ func (suite *ExchangeSelectorSuite) TestToExchangeRestore() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Contacts() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Contacts() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -68,6 +67,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Contacts() {
|
|||||||
c2 = "c2"
|
c2 = "c2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Exclude(sel.Contacts([]string{user}, []string{folder}, []string{c1, c2}))
|
sel.Exclude(sel.Contacts([]string{user}, []string{folder}, []string{c1, c2}))
|
||||||
scopes := sel.Excludes
|
scopes := sel.Excludes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -85,7 +85,6 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Contacts() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Contacts() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Contacts() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -94,6 +93,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Contacts() {
|
|||||||
c2 = "c2"
|
c2 = "c2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Include(sel.Contacts([]string{user}, []string{folder}, []string{c1, c2}))
|
sel.Include(sel.Contacts([]string{user}, []string{folder}, []string{c1, c2}))
|
||||||
scopes := sel.Includes
|
scopes := sel.Includes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -113,7 +113,6 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Contacts() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_ContactFolders() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_ContactFolders() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -121,6 +120,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_ContactFolders(
|
|||||||
f2 = "f2"
|
f2 = "f2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Exclude(sel.ContactFolders([]string{user}, []string{f1, f2}))
|
sel.Exclude(sel.ContactFolders([]string{user}, []string{f1, f2}))
|
||||||
scopes := sel.Excludes
|
scopes := sel.Excludes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -138,7 +138,6 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_ContactFolders(
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_ContactFolders() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_ContactFolders() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -146,6 +145,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_ContactFolders(
|
|||||||
f2 = "f2"
|
f2 = "f2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Include(sel.ContactFolders([]string{user}, []string{f1, f2}))
|
sel.Include(sel.ContactFolders([]string{user}, []string{f1, f2}))
|
||||||
scopes := sel.Includes
|
scopes := sel.Includes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -165,7 +165,6 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_ContactFolders(
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Events() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Events() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -174,6 +173,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Events() {
|
|||||||
c1 = "c1"
|
c1 = "c1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Exclude(sel.Events([]string{user}, []string{c1}, []string{e1, e2}))
|
sel.Exclude(sel.Events([]string{user}, []string{c1}, []string{e1, e2}))
|
||||||
scopes := sel.Excludes
|
scopes := sel.Excludes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -191,7 +191,6 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Events() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_EventCalendars() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_EventCalendars() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -199,6 +198,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_EventCalendars(
|
|||||||
c2 = "c2"
|
c2 = "c2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Exclude(sel.EventCalendars([]string{user}, []string{c1, c2}))
|
sel.Exclude(sel.EventCalendars([]string{user}, []string{c1, c2}))
|
||||||
scopes := sel.Excludes
|
scopes := sel.Excludes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -216,7 +216,6 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_EventCalendars(
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Events() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Events() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -225,6 +224,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Events() {
|
|||||||
c1 = "c1"
|
c1 = "c1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Include(sel.Events([]string{user}, []string{c1}, []string{e1, e2}))
|
sel.Include(sel.Events([]string{user}, []string{c1}, []string{e1, e2}))
|
||||||
scopes := sel.Includes
|
scopes := sel.Includes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -242,7 +242,6 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Events() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_EventCalendars() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_EventCalendars() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -250,6 +249,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_EventCalendars(
|
|||||||
c2 = "c2"
|
c2 = "c2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Include(sel.EventCalendars([]string{user}, []string{c1, c2}))
|
sel.Include(sel.EventCalendars([]string{user}, []string{c1, c2}))
|
||||||
scopes := sel.Includes
|
scopes := sel.Includes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -267,7 +267,6 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_EventCalendars(
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Mails() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Mails() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -276,6 +275,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Mails() {
|
|||||||
m2 = "m2"
|
m2 = "m2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Exclude(sel.Mails([]string{user}, []string{folder}, []string{m1, m2}))
|
sel.Exclude(sel.Mails([]string{user}, []string{folder}, []string{m1, m2}))
|
||||||
scopes := sel.Excludes
|
scopes := sel.Excludes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -293,7 +293,6 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Mails() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Mails() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Mails() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -302,6 +301,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Mails() {
|
|||||||
m2 = "m2"
|
m2 = "m2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Include(sel.Mails([]string{user}, []string{folder}, []string{m1, m2}))
|
sel.Include(sel.Mails([]string{user}, []string{folder}, []string{m1, m2}))
|
||||||
scopes := sel.Includes
|
scopes := sel.Includes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -321,7 +321,6 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Mails() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_MailFolders() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_MailFolders() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -329,6 +328,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_MailFolders() {
|
|||||||
f2 = "f2"
|
f2 = "f2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Exclude(sel.MailFolders([]string{user}, []string{f1, f2}))
|
sel.Exclude(sel.MailFolders([]string{user}, []string{f1, f2}))
|
||||||
scopes := sel.Excludes
|
scopes := sel.Excludes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -346,7 +346,6 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_MailFolders() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_MailFolders() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_MailFolders() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
user = "user"
|
user = "user"
|
||||||
@ -354,6 +353,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_MailFolders() {
|
|||||||
f2 = "f2"
|
f2 = "f2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{user})
|
||||||
sel.Include(sel.MailFolders([]string{user}, []string{f1, f2}))
|
sel.Include(sel.MailFolders([]string{user}, []string{f1, f2}))
|
||||||
scopes := sel.Includes
|
scopes := sel.Includes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
@ -373,13 +373,13 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_MailFolders() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Users() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Users() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
u1 = "u1"
|
u1 = "u1"
|
||||||
u2 = "u2"
|
u2 = "u2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{u1, u2})
|
||||||
sel.Exclude(sel.Users([]string{u1, u2}))
|
sel.Exclude(sel.Users([]string{u1, u2}))
|
||||||
scopes := sel.Excludes
|
scopes := sel.Excludes
|
||||||
require.Len(t, scopes, 3)
|
require.Len(t, scopes, 3)
|
||||||
@ -427,13 +427,13 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Exclude_Users() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Users() {
|
func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Users() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewExchangeBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
u1 = "u1"
|
u1 = "u1"
|
||||||
u2 = "u2"
|
u2 = "u2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewExchangeBackup([]string{u1, u2})
|
||||||
sel.Include(sel.Users([]string{u1, u2}))
|
sel.Include(sel.Users([]string{u1, u2}))
|
||||||
scopes := sel.Includes
|
scopes := sel.Includes
|
||||||
require.Len(t, scopes, 3)
|
require.Len(t, scopes, 3)
|
||||||
@ -480,7 +480,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeSelector_Include_Users() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeBackup_Scopes() {
|
func (suite *ExchangeSelectorSuite) TestExchangeBackup_Scopes() {
|
||||||
eb := NewExchangeBackup()
|
eb := NewExchangeBackup(Any())
|
||||||
eb.Include(eb.Users(Any()))
|
eb.Include(eb.Users(Any()))
|
||||||
|
|
||||||
scopes := eb.Scopes()
|
scopes := eb.Scopes()
|
||||||
@ -534,7 +534,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeBackup_DiscreteScopes() {
|
|||||||
|
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.name, func(t *testing.T) {
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
eb := NewExchangeBackup()
|
eb := NewExchangeBackup(test.include)
|
||||||
eb.Include(eb.Users(test.include))
|
eb.Include(eb.Users(test.include))
|
||||||
|
|
||||||
scopes := eb.DiscreteScopes(test.discrete)
|
scopes := eb.DiscreteScopes(test.discrete)
|
||||||
@ -571,7 +571,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeScope_Category() {
|
|||||||
}
|
}
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.is.String()+test.expect.String(), func(t *testing.T) {
|
suite.T().Run(test.is.String()+test.expect.String(), func(t *testing.T) {
|
||||||
eb := NewExchangeBackup()
|
eb := NewExchangeBackup(Any())
|
||||||
eb.Includes = []scope{
|
eb.Includes = []scope{
|
||||||
{scopeKeyCategory: filters.Identity(test.is.String())},
|
{scopeKeyCategory: filters.Identity(test.is.String())},
|
||||||
}
|
}
|
||||||
@ -614,7 +614,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeScope_IncludesCategory() {
|
|||||||
}
|
}
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.is.String()+test.expect.String(), func(t *testing.T) {
|
suite.T().Run(test.is.String()+test.expect.String(), func(t *testing.T) {
|
||||||
eb := NewExchangeBackup()
|
eb := NewExchangeBackup(Any())
|
||||||
eb.Includes = []scope{
|
eb.Includes = []scope{
|
||||||
{scopeKeyCategory: filters.Identity(test.is.String())},
|
{scopeKeyCategory: filters.Identity(test.is.String())},
|
||||||
}
|
}
|
||||||
@ -625,7 +625,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeScope_IncludesCategory() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeScope_Get() {
|
func (suite *ExchangeSelectorSuite) TestExchangeScope_Get() {
|
||||||
eb := NewExchangeBackup()
|
eb := NewExchangeBackup(Any())
|
||||||
eb.Include(eb.Users(Any()))
|
eb.Include(eb.Users(Any()))
|
||||||
|
|
||||||
scopes := eb.Scopes()
|
scopes := eb.Scopes()
|
||||||
@ -659,7 +659,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeScope_Get() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestExchangeScope_MatchesInfo() {
|
func (suite *ExchangeSelectorSuite) TestExchangeScope_MatchesInfo() {
|
||||||
es := NewExchangeRestore()
|
es := NewExchangeRestore(Any())
|
||||||
|
|
||||||
const (
|
const (
|
||||||
name = "smarf mcfnords"
|
name = "smarf mcfnords"
|
||||||
@ -781,7 +781,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeScope_MatchesPath() {
|
|||||||
var (
|
var (
|
||||||
pth = stubPath(suite.T(), usr, []string{fld1, fld2, mail}, path.EmailCategory)
|
pth = stubPath(suite.T(), usr, []string{fld1, fld2, mail}, path.EmailCategory)
|
||||||
short = "thisisahashofsomekind"
|
short = "thisisahashofsomekind"
|
||||||
es = NewExchangeRestore()
|
es = NewExchangeRestore(Any()) // TODO: move into test so that test user set is embedded in the selector
|
||||||
)
|
)
|
||||||
|
|
||||||
table := []struct {
|
table := []struct {
|
||||||
@ -922,7 +922,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"no refs",
|
"no refs",
|
||||||
makeDeets(),
|
makeDeets(),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore(Any())
|
||||||
er.Include(er.Users(Any()))
|
er.Include(er.Users(Any()))
|
||||||
return er
|
return er
|
||||||
},
|
},
|
||||||
@ -932,7 +932,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"contact only",
|
"contact only",
|
||||||
makeDeets(contact),
|
makeDeets(contact),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore(Any())
|
||||||
er.Include(er.Users(Any()))
|
er.Include(er.Users(Any()))
|
||||||
return er
|
return er
|
||||||
},
|
},
|
||||||
@ -942,7 +942,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"event only",
|
"event only",
|
||||||
makeDeets(event),
|
makeDeets(event),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore(Any())
|
||||||
er.Include(er.Users(Any()))
|
er.Include(er.Users(Any()))
|
||||||
return er
|
return er
|
||||||
},
|
},
|
||||||
@ -952,7 +952,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"mail only",
|
"mail only",
|
||||||
makeDeets(mail),
|
makeDeets(mail),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore(Any())
|
||||||
er.Include(er.Users(Any()))
|
er.Include(er.Users(Any()))
|
||||||
return er
|
return er
|
||||||
},
|
},
|
||||||
@ -962,7 +962,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"all",
|
"all",
|
||||||
makeDeets(contact, event, mail),
|
makeDeets(contact, event, mail),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore(Any())
|
||||||
er.Include(er.Users(Any()))
|
er.Include(er.Users(Any()))
|
||||||
return er
|
return er
|
||||||
},
|
},
|
||||||
@ -972,7 +972,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"only match contact",
|
"only match contact",
|
||||||
makeDeets(contact, event, mail),
|
makeDeets(contact, event, mail),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore([]string{"uid"})
|
||||||
er.Include(er.Contacts([]string{"uid"}, []string{"cfld"}, []string{"cid"}))
|
er.Include(er.Contacts([]string{"uid"}, []string{"cfld"}, []string{"cid"}))
|
||||||
return er
|
return er
|
||||||
},
|
},
|
||||||
@ -982,7 +982,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"only match contactInSubFolder",
|
"only match contactInSubFolder",
|
||||||
makeDeets(contactInSubFolder, contact, event, mail),
|
makeDeets(contactInSubFolder, contact, event, mail),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore([]string{"uid"})
|
||||||
er.Include(er.ContactFolders([]string{"uid"}, []string{"cfld1/cfld2"}))
|
er.Include(er.ContactFolders([]string{"uid"}, []string{"cfld1/cfld2"}))
|
||||||
return er
|
return er
|
||||||
},
|
},
|
||||||
@ -992,7 +992,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"only match contactInSubFolder by prefix",
|
"only match contactInSubFolder by prefix",
|
||||||
makeDeets(contactInSubFolder, contact, event, mail),
|
makeDeets(contactInSubFolder, contact, event, mail),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore([]string{"uid"})
|
||||||
er.Include(er.ContactFolders([]string{"uid"}, []string{"cfld1/cfld2"}, PrefixMatch()))
|
er.Include(er.ContactFolders([]string{"uid"}, []string{"cfld1/cfld2"}, PrefixMatch()))
|
||||||
return er
|
return er
|
||||||
},
|
},
|
||||||
@ -1002,7 +1002,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"only match contactInSubFolder by leaf folder",
|
"only match contactInSubFolder by leaf folder",
|
||||||
makeDeets(contactInSubFolder, contact, event, mail),
|
makeDeets(contactInSubFolder, contact, event, mail),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore([]string{"uid"})
|
||||||
er.Include(er.ContactFolders([]string{"uid"}, []string{"cfld2"}))
|
er.Include(er.ContactFolders([]string{"uid"}, []string{"cfld2"}))
|
||||||
return er
|
return er
|
||||||
},
|
},
|
||||||
@ -1012,7 +1012,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"only match event",
|
"only match event",
|
||||||
makeDeets(contact, event, mail),
|
makeDeets(contact, event, mail),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore([]string{"uid"})
|
||||||
er.Include(er.Events([]string{"uid"}, []string{"ecld"}, []string{"eid"}))
|
er.Include(er.Events([]string{"uid"}, []string{"ecld"}, []string{"eid"}))
|
||||||
return er
|
return er
|
||||||
},
|
},
|
||||||
@ -1022,7 +1022,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"only match mail",
|
"only match mail",
|
||||||
makeDeets(contact, event, mail),
|
makeDeets(contact, event, mail),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore([]string{"uid"})
|
||||||
er.Include(er.Mails([]string{"uid"}, []string{"mfld"}, []string{"mid"}))
|
er.Include(er.Mails([]string{"uid"}, []string{"mfld"}, []string{"mid"}))
|
||||||
return er
|
return er
|
||||||
},
|
},
|
||||||
@ -1032,7 +1032,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"exclude contact",
|
"exclude contact",
|
||||||
makeDeets(contact, event, mail),
|
makeDeets(contact, event, mail),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore(Any())
|
||||||
er.Include(er.Users(Any()))
|
er.Include(er.Users(Any()))
|
||||||
er.Exclude(er.Contacts([]string{"uid"}, []string{"cfld"}, []string{"cid"}))
|
er.Exclude(er.Contacts([]string{"uid"}, []string{"cfld"}, []string{"cid"}))
|
||||||
return er
|
return er
|
||||||
@ -1043,7 +1043,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"exclude event",
|
"exclude event",
|
||||||
makeDeets(contact, event, mail),
|
makeDeets(contact, event, mail),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore(Any())
|
||||||
er.Include(er.Users(Any()))
|
er.Include(er.Users(Any()))
|
||||||
er.Exclude(er.Events([]string{"uid"}, []string{"ecld"}, []string{"eid"}))
|
er.Exclude(er.Events([]string{"uid"}, []string{"ecld"}, []string{"eid"}))
|
||||||
return er
|
return er
|
||||||
@ -1054,7 +1054,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
"exclude mail",
|
"exclude mail",
|
||||||
makeDeets(contact, event, mail),
|
makeDeets(contact, event, mail),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore(Any())
|
||||||
er.Include(er.Users(Any()))
|
er.Include(er.Users(Any()))
|
||||||
er.Exclude(er.Mails([]string{"uid"}, []string{"mfld"}, []string{"mid"}))
|
er.Exclude(er.Mails([]string{"uid"}, []string{"mfld"}, []string{"mid"}))
|
||||||
return er
|
return er
|
||||||
@ -1071,7 +1071,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
return ds
|
return ds
|
||||||
}(),
|
}(),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore(Any())
|
||||||
er.Include(er.Users(Any()))
|
er.Include(er.Users(Any()))
|
||||||
er.Filter(er.MailSubject("subj"))
|
er.Filter(er.MailSubject("subj"))
|
||||||
return er
|
return er
|
||||||
@ -1092,7 +1092,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
return ds
|
return ds
|
||||||
}(),
|
}(),
|
||||||
func() *ExchangeRestore {
|
func() *ExchangeRestore {
|
||||||
er := NewExchangeRestore()
|
er := NewExchangeRestore(Any())
|
||||||
er.Include(er.Users(Any()))
|
er.Include(er.Users(Any()))
|
||||||
er.Filter(er.MailSubject("subj"))
|
er.Filter(er.MailSubject("subj"))
|
||||||
return er
|
return er
|
||||||
@ -1115,7 +1115,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestScopesByCategory() {
|
func (suite *ExchangeSelectorSuite) TestScopesByCategory() {
|
||||||
var (
|
var (
|
||||||
es = NewExchangeRestore()
|
es = NewExchangeRestore(Any())
|
||||||
users = es.Users(Any())
|
users = es.Users(Any())
|
||||||
contacts = es.ContactFolders(Any(), Any())
|
contacts = es.ContactFolders(Any(), Any())
|
||||||
events = es.Events(Any(), Any(), Any())
|
events = es.Events(Any(), Any(), Any())
|
||||||
@ -1178,7 +1178,7 @@ func (suite *ExchangeSelectorSuite) TestPasses() {
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
es = NewExchangeRestore()
|
es = NewExchangeRestore(Any()) // TODO: move into test and compose with each test value
|
||||||
anyUser = setScopesToDefault(es.Users(Any()))
|
anyUser = setScopesToDefault(es.Users(Any()))
|
||||||
noUser = setScopesToDefault(es.Users(None()))
|
noUser = setScopesToDefault(es.Users(None()))
|
||||||
mail = setScopesToDefault(es.Mails(Any(), Any(), []string{mid}))
|
mail = setScopesToDefault(es.Mails(Any(), Any(), []string{mid}))
|
||||||
@ -1229,7 +1229,7 @@ func (suite *ExchangeSelectorSuite) TestContains() {
|
|||||||
target := "fnords"
|
target := "fnords"
|
||||||
|
|
||||||
var (
|
var (
|
||||||
es = NewExchangeRestore()
|
es = NewExchangeRestore(Any()) // TODO: move into test and compose with each test value
|
||||||
anyUser = setScopesToDefault(es.Users(Any()))
|
anyUser = setScopesToDefault(es.Users(Any()))
|
||||||
noMail = setScopesToDefault(es.Mails(None(), None(), None()))
|
noMail = setScopesToDefault(es.Mails(None(), None(), None()))
|
||||||
does = setScopesToDefault(es.Mails(Any(), Any(), []string{target}))
|
does = setScopesToDefault(es.Mails(Any(), Any(), []string{target}))
|
||||||
@ -1266,7 +1266,7 @@ func (suite *ExchangeSelectorSuite) TestContains() {
|
|||||||
|
|
||||||
func (suite *ExchangeSelectorSuite) TestIsAny() {
|
func (suite *ExchangeSelectorSuite) TestIsAny() {
|
||||||
var (
|
var (
|
||||||
es = NewExchangeRestore()
|
es = NewExchangeRestore(Any()) // TODO: move into test and compose with each test value
|
||||||
anyUser = setScopesToDefault(es.Users(Any()))
|
anyUser = setScopesToDefault(es.Users(Any()))
|
||||||
noUser = setScopesToDefault(es.Users(None()))
|
noUser = setScopesToDefault(es.Users(None()))
|
||||||
specificMail = setScopesToDefault(es.Mails(Any(), Any(), []string{"email"}))
|
specificMail = setScopesToDefault(es.Mails(Any(), Any(), []string{"email"}))
|
||||||
|
|||||||
@ -36,17 +36,16 @@ type (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ Reducer = &OneDriveRestore{}
|
_ Reducer = &OneDriveRestore{}
|
||||||
_ printabler = &OneDriveRestore{}
|
_ printabler = &OneDriveRestore{}
|
||||||
_ resourceOwnerer = &OneDriveRestore{}
|
_ pathCategorier = &OneDriveRestore{}
|
||||||
_ pathCategorier = &OneDriveRestore{}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewOneDriveBackup produces a new Selector with the service set to ServiceOneDrive.
|
// NewOneDriveBackup produces a new Selector with the service set to ServiceOneDrive.
|
||||||
func NewOneDriveBackup() *OneDriveBackup {
|
func NewOneDriveBackup(users []string) *OneDriveBackup {
|
||||||
src := OneDriveBackup{
|
src := OneDriveBackup{
|
||||||
oneDrive{
|
oneDrive{
|
||||||
newSelector(ServiceOneDrive),
|
newSelector(ServiceOneDrive, users),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -66,10 +65,10 @@ func (s Selector) ToOneDriveBackup() (*OneDriveBackup, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewOneDriveRestore produces a new Selector with the service set to ServiceOneDrive.
|
// NewOneDriveRestore produces a new Selector with the service set to ServiceOneDrive.
|
||||||
func NewOneDriveRestore() *OneDriveRestore {
|
func NewOneDriveRestore(users []string) *OneDriveRestore {
|
||||||
src := OneDriveRestore{
|
src := OneDriveRestore{
|
||||||
oneDrive{
|
oneDrive{
|
||||||
newSelector(ServiceOneDrive),
|
newSelector(ServiceOneDrive, users),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,16 +92,6 @@ func (s oneDrive) Printable() Printable {
|
|||||||
return toPrintable[OneDriveScope](s.Selector)
|
return toPrintable[OneDriveScope](s.Selector)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResourceOwners produces the aggregation of discrete users described by each type of scope.
|
|
||||||
// Any and None values are omitted.
|
|
||||||
func (s oneDrive) ResourceOwners() selectorResourceOwners {
|
|
||||||
return selectorResourceOwners{
|
|
||||||
Excludes: resourceOwnersIn(s.Excludes, OneDriveUser.String()),
|
|
||||||
Filters: resourceOwnersIn(s.Filters, OneDriveUser.String()),
|
|
||||||
Includes: resourceOwnersIn(s.Includes, OneDriveUser.String()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PathCategories produces the aggregation of discrete users described by each type of scope.
|
// PathCategories produces the aggregation of discrete users described by each type of scope.
|
||||||
func (s oneDrive) PathCategories() selectorPathCategories {
|
func (s oneDrive) PathCategories() selectorPathCategories {
|
||||||
return selectorPathCategories{
|
return selectorPathCategories{
|
||||||
|
|||||||
@ -24,14 +24,14 @@ func TestOneDriveSelectorSuite(t *testing.T) {
|
|||||||
|
|
||||||
func (suite *OneDriveSelectorSuite) TestNewOneDriveBackup() {
|
func (suite *OneDriveSelectorSuite) TestNewOneDriveBackup() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
ob := NewOneDriveBackup()
|
ob := NewOneDriveBackup(Any())
|
||||||
assert.Equal(t, ob.Service, ServiceOneDrive)
|
assert.Equal(t, ob.Service, ServiceOneDrive)
|
||||||
assert.NotZero(t, ob.Scopes())
|
assert.NotZero(t, ob.Scopes())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *OneDriveSelectorSuite) TestToOneDriveBackup() {
|
func (suite *OneDriveSelectorSuite) TestToOneDriveBackup() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
ob := NewOneDriveBackup()
|
ob := NewOneDriveBackup(Any())
|
||||||
s := ob.Selector
|
s := ob.Selector
|
||||||
ob, err := s.ToOneDriveBackup()
|
ob, err := s.ToOneDriveBackup()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@ -69,7 +69,7 @@ func (suite *OneDriveSelectorSuite) TestOneDriveBackup_DiscreteScopes() {
|
|||||||
|
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.name, func(t *testing.T) {
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
eb := NewOneDriveBackup()
|
eb := NewOneDriveBackup(test.include)
|
||||||
eb.Include(eb.Users(test.include))
|
eb.Include(eb.Users(test.include))
|
||||||
|
|
||||||
scopes := eb.DiscreteScopes(test.discrete)
|
scopes := eb.DiscreteScopes(test.discrete)
|
||||||
@ -83,14 +83,18 @@ func (suite *OneDriveSelectorSuite) TestOneDriveBackup_DiscreteScopes() {
|
|||||||
|
|
||||||
func (suite *OneDriveSelectorSuite) TestOneDriveSelector_Users() {
|
func (suite *OneDriveSelectorSuite) TestOneDriveSelector_Users() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewOneDriveBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
u1 = "u1"
|
u1 = "u1"
|
||||||
u2 = "u2"
|
u2 = "u2"
|
||||||
)
|
)
|
||||||
|
|
||||||
userScopes := sel.Users([]string{u1, u2})
|
var (
|
||||||
|
users = []string{u1, u2}
|
||||||
|
sel = NewOneDriveBackup(users)
|
||||||
|
userScopes = sel.Users(users)
|
||||||
|
)
|
||||||
|
|
||||||
for _, scope := range userScopes {
|
for _, scope := range userScopes {
|
||||||
// Scope value is either u1 or u2
|
// Scope value is either u1 or u2
|
||||||
assert.Contains(t, join(u1, u2), scope[OneDriveUser.String()].Target)
|
assert.Contains(t, join(u1, u2), scope[OneDriveUser.String()].Target)
|
||||||
@ -122,14 +126,19 @@ func (suite *OneDriveSelectorSuite) TestOneDriveSelector_Users() {
|
|||||||
|
|
||||||
func (suite *OneDriveSelectorSuite) TestOneDriveSelector_Include_Users() {
|
func (suite *OneDriveSelectorSuite) TestOneDriveSelector_Include_Users() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewOneDriveBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
u1 = "u1"
|
u1 = "u1"
|
||||||
u2 = "u2"
|
u2 = "u2"
|
||||||
)
|
)
|
||||||
|
|
||||||
sel.Include(sel.Users([]string{u1, u2}))
|
var (
|
||||||
|
users = []string{u1, u2}
|
||||||
|
sel = NewOneDriveBackup(users)
|
||||||
|
userScopes = sel.Users(users)
|
||||||
|
)
|
||||||
|
|
||||||
|
sel.Include(userScopes)
|
||||||
scopes := sel.Includes
|
scopes := sel.Includes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
|
|
||||||
@ -144,14 +153,19 @@ func (suite *OneDriveSelectorSuite) TestOneDriveSelector_Include_Users() {
|
|||||||
|
|
||||||
func (suite *OneDriveSelectorSuite) TestOneDriveSelector_Exclude_Users() {
|
func (suite *OneDriveSelectorSuite) TestOneDriveSelector_Exclude_Users() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewOneDriveBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
u1 = "u1"
|
u1 = "u1"
|
||||||
u2 = "u2"
|
u2 = "u2"
|
||||||
)
|
)
|
||||||
|
|
||||||
sel.Exclude(sel.Users([]string{u1, u2}))
|
var (
|
||||||
|
users = []string{u1, u2}
|
||||||
|
sel = NewOneDriveBackup(users)
|
||||||
|
userScopes = sel.Users(users)
|
||||||
|
)
|
||||||
|
|
||||||
|
sel.Exclude(userScopes)
|
||||||
scopes := sel.Excludes
|
scopes := sel.Excludes
|
||||||
require.Len(t, scopes, 1)
|
require.Len(t, scopes, 1)
|
||||||
|
|
||||||
@ -166,14 +180,14 @@ func (suite *OneDriveSelectorSuite) TestOneDriveSelector_Exclude_Users() {
|
|||||||
|
|
||||||
func (suite *OneDriveSelectorSuite) TestNewOneDriveRestore() {
|
func (suite *OneDriveSelectorSuite) TestNewOneDriveRestore() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
or := NewOneDriveRestore()
|
or := NewOneDriveRestore(Any())
|
||||||
assert.Equal(t, or.Service, ServiceOneDrive)
|
assert.Equal(t, or.Service, ServiceOneDrive)
|
||||||
assert.NotZero(t, or.Scopes())
|
assert.NotZero(t, or.Scopes())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *OneDriveSelectorSuite) TestToOneDriveRestore() {
|
func (suite *OneDriveSelectorSuite) TestToOneDriveRestore() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
eb := NewOneDriveRestore()
|
eb := NewOneDriveRestore(Any())
|
||||||
s := eb.Selector
|
s := eb.Selector
|
||||||
or, err := s.ToOneDriveRestore()
|
or, err := s.ToOneDriveRestore()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@ -233,7 +247,7 @@ func (suite *OneDriveSelectorSuite) TestOneDriveRestore_Reduce() {
|
|||||||
"all",
|
"all",
|
||||||
deets,
|
deets,
|
||||||
func() *OneDriveRestore {
|
func() *OneDriveRestore {
|
||||||
odr := NewOneDriveRestore()
|
odr := NewOneDriveRestore(Any())
|
||||||
odr.Include(odr.Users(Any()))
|
odr.Include(odr.Users(Any()))
|
||||||
return odr
|
return odr
|
||||||
},
|
},
|
||||||
@ -243,7 +257,7 @@ func (suite *OneDriveSelectorSuite) TestOneDriveRestore_Reduce() {
|
|||||||
"only match file",
|
"only match file",
|
||||||
deets,
|
deets,
|
||||||
func() *OneDriveRestore {
|
func() *OneDriveRestore {
|
||||||
odr := NewOneDriveRestore()
|
odr := NewOneDriveRestore(Any())
|
||||||
odr.Include(odr.Items(Any(), Any(), []string{"file2"}))
|
odr.Include(odr.Items(Any(), Any(), []string{"file2"}))
|
||||||
return odr
|
return odr
|
||||||
},
|
},
|
||||||
@ -253,7 +267,7 @@ func (suite *OneDriveSelectorSuite) TestOneDriveRestore_Reduce() {
|
|||||||
"only match folder",
|
"only match folder",
|
||||||
deets,
|
deets,
|
||||||
func() *OneDriveRestore {
|
func() *OneDriveRestore {
|
||||||
odr := NewOneDriveRestore()
|
odr := NewOneDriveRestore([]string{"uid"})
|
||||||
odr.Include(odr.Folders([]string{"uid"}, []string{"folderA/folderB", "folderA/folderC"}))
|
odr.Include(odr.Folders([]string{"uid"}, []string{"folderA/folderB", "folderA/folderC"}))
|
||||||
return odr
|
return odr
|
||||||
},
|
},
|
||||||
@ -290,7 +304,7 @@ func (suite *OneDriveSelectorSuite) TestOneDriveCategory_PathValues() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (suite *OneDriveSelectorSuite) TestOneDriveScope_MatchesInfo() {
|
func (suite *OneDriveSelectorSuite) TestOneDriveScope_MatchesInfo() {
|
||||||
ods := NewOneDriveRestore()
|
ods := NewOneDriveRestore(Any())
|
||||||
|
|
||||||
var (
|
var (
|
||||||
epoch = time.Time{}
|
epoch = time.Time{}
|
||||||
|
|||||||
@ -72,19 +72,6 @@ type Reducer interface {
|
|||||||
Reduce(context.Context, *details.Details) *details.Details
|
Reduce(context.Context, *details.Details) *details.Details
|
||||||
}
|
}
|
||||||
|
|
||||||
// selectorResourceOwners aggregates all discrete resource owner ids described
|
|
||||||
// in the selector. Any and None values are ignored. ResourceOwner sets are
|
|
||||||
// grouped by their scope type (includes, excludes, filters).
|
|
||||||
type selectorResourceOwners struct {
|
|
||||||
Includes []string
|
|
||||||
Excludes []string
|
|
||||||
Filters []string
|
|
||||||
}
|
|
||||||
|
|
||||||
type resourceOwnerer interface {
|
|
||||||
ResourceOwners() selectorResourceOwners
|
|
||||||
}
|
|
||||||
|
|
||||||
// selectorResourceOwners aggregates all discrete path category types described
|
// selectorResourceOwners aggregates all discrete path category types described
|
||||||
// in the selector. Category sets are grouped by their scope type (includes,
|
// in the selector. Category sets are grouped by their scope type (includes,
|
||||||
// excludes, filters).
|
// excludes, filters).
|
||||||
@ -107,6 +94,10 @@ type pathCategorier interface {
|
|||||||
type Selector struct {
|
type Selector struct {
|
||||||
// The service scope of the data. Exchange, Teams, SharePoint, etc.
|
// The service scope of the data. Exchange, Teams, SharePoint, etc.
|
||||||
Service service `json:"service,omitempty"`
|
Service service `json:"service,omitempty"`
|
||||||
|
|
||||||
|
// A record of the resource owners matched by this selector.
|
||||||
|
ResourceOwners filters.Filter `json:"resourceOwners,omitempty"`
|
||||||
|
|
||||||
// A slice of exclusion scopes. Exclusions apply globally to all
|
// A slice of exclusion scopes. Exclusions apply globally to all
|
||||||
// inclusions/filters, with any-match behavior.
|
// inclusions/filters, with any-match behavior.
|
||||||
Excludes []scope `json:"exclusions,omitempty"`
|
Excludes []scope `json:"exclusions,omitempty"`
|
||||||
@ -118,14 +109,21 @@ type Selector struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// helper for specific selector instance constructors.
|
// helper for specific selector instance constructors.
|
||||||
func newSelector(s service) Selector {
|
func newSelector(s service, resourceOwners []string) Selector {
|
||||||
return Selector{
|
return Selector{
|
||||||
Service: s,
|
Service: s,
|
||||||
Excludes: []scope{},
|
ResourceOwners: filterize(scopeConfig{}, resourceOwners...),
|
||||||
Includes: []scope{},
|
Excludes: []scope{},
|
||||||
|
Includes: []scope{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DiscreteResourceOwners returns the list of individual resourceOwners used
|
||||||
|
// in the selector.
|
||||||
|
func (s Selector) DiscreteResourceOwners() []string {
|
||||||
|
return split(s.ResourceOwners.Target)
|
||||||
|
}
|
||||||
|
|
||||||
func (s Selector) String() string {
|
func (s Selector) String() string {
|
||||||
bs, err := json.Marshal(s)
|
bs, err := json.Marshal(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -215,16 +213,6 @@ func (s Selector) Reduce(ctx context.Context, deets *details.Details) (*details.
|
|||||||
return r.Reduce(ctx, deets), nil
|
return r.Reduce(ctx, deets), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns the sets of resource owners identified in each scope set.
|
|
||||||
func (s Selector) ResourceOwners() (selectorResourceOwners, error) {
|
|
||||||
ro, err := selectorAsIface[resourceOwnerer](s)
|
|
||||||
if err != nil {
|
|
||||||
return selectorResourceOwners{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return ro.ResourceOwners(), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns the sets of path categories identified in each scope set.
|
// returns the sets of path categories identified in each scope set.
|
||||||
func (s Selector) PathCategories() (selectorPathCategories, error) {
|
func (s Selector) PathCategories() (selectorPathCategories, error) {
|
||||||
ro, err := selectorAsIface[pathCategorier](s)
|
ro, err := selectorAsIface[pathCategorier](s)
|
||||||
|
|||||||
@ -35,7 +35,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeAllMail",
|
name: "ExchangeAllMail",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.Mails(
|
sel.Include(sel.Mails(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
@ -49,7 +49,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeMailFolderPrefixMatch",
|
name: "ExchangeMailFolderPrefixMatch",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.MailFolders(
|
sel.Include(sel.MailFolders(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
[]string{testdata.ExchangeEmailInboxPath.Folder()},
|
[]string{testdata.ExchangeEmailInboxPath.Folder()},
|
||||||
@ -62,7 +62,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeMailSubject",
|
name: "ExchangeMailSubject",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Filter(sel.MailSubject("foo"))
|
sel.Filter(sel.MailSubject("foo"))
|
||||||
|
|
||||||
return sel
|
return sel
|
||||||
@ -72,7 +72,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeMailSubjectExcludeItem",
|
name: "ExchangeMailSubjectExcludeItem",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Filter(sel.MailSender("a-person"))
|
sel.Filter(sel.MailSender("a-person"))
|
||||||
sel.Exclude(sel.Mails(
|
sel.Exclude(sel.Mails(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
@ -87,7 +87,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeMailSender",
|
name: "ExchangeMailSender",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Filter(sel.MailSender("a-person"))
|
sel.Filter(sel.MailSender("a-person"))
|
||||||
|
|
||||||
return sel
|
return sel
|
||||||
@ -100,7 +100,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeMailReceivedTime",
|
name: "ExchangeMailReceivedTime",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Filter(sel.MailReceivedBefore(
|
sel.Filter(sel.MailReceivedBefore(
|
||||||
common.FormatTime(testdata.Time1.Add(time.Second)),
|
common.FormatTime(testdata.Time1.Add(time.Second)),
|
||||||
))
|
))
|
||||||
@ -112,7 +112,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeMailID",
|
name: "ExchangeMailID",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.Mails(
|
sel.Include(sel.Mails(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
@ -126,7 +126,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeMailShortRef",
|
name: "ExchangeMailShortRef",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.Mails(
|
sel.Include(sel.Mails(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
@ -140,7 +140,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeAllEventsAndMailWithSubject",
|
name: "ExchangeAllEventsAndMailWithSubject",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.Events(
|
sel.Include(sel.Events(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
@ -155,7 +155,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeEventsAndMailWithSubject",
|
name: "ExchangeEventsAndMailWithSubject",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Filter(sel.EventSubject("foo"))
|
sel.Filter(sel.EventSubject("foo"))
|
||||||
sel.Filter(sel.MailSubject("foo"))
|
sel.Filter(sel.MailSubject("foo"))
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeAll",
|
name: "ExchangeAll",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.Users(
|
sel.Include(sel.Users(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
))
|
))
|
||||||
@ -185,7 +185,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeMailByFolder",
|
name: "ExchangeMailByFolder",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.MailFolders(
|
sel.Include(sel.MailFolders(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
[]string{testdata.ExchangeEmailBasePath.Folder()},
|
[]string{testdata.ExchangeEmailBasePath.Folder()},
|
||||||
@ -201,7 +201,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeMailByFolderPrefix",
|
name: "ExchangeMailByFolderPrefix",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.MailFolders(
|
sel.Include(sel.MailFolders(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
[]string{testdata.ExchangeEmailBasePath.Folder()},
|
[]string{testdata.ExchangeEmailBasePath.Folder()},
|
||||||
@ -215,7 +215,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeMailByFolderRoot",
|
name: "ExchangeMailByFolderRoot",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.MailFolders(
|
sel.Include(sel.MailFolders(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
[]string{testdata.ExchangeEmailInboxPath.Folder()},
|
[]string{testdata.ExchangeEmailInboxPath.Folder()},
|
||||||
@ -228,7 +228,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeContactByFolder",
|
name: "ExchangeContactByFolder",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.ContactFolders(
|
sel.Include(sel.ContactFolders(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
[]string{testdata.ExchangeContactsBasePath.Folder()},
|
[]string{testdata.ExchangeContactsBasePath.Folder()},
|
||||||
@ -241,7 +241,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeContactByFolderRoot",
|
name: "ExchangeContactByFolderRoot",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.ContactFolders(
|
sel.Include(sel.ContactFolders(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
[]string{testdata.ExchangeContactsRootPath.Folder()},
|
[]string{testdata.ExchangeContactsRootPath.Folder()},
|
||||||
@ -255,7 +255,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeEventsByFolder",
|
name: "ExchangeEventsByFolder",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.EventCalendars(
|
sel.Include(sel.EventCalendars(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
[]string{testdata.ExchangeEventsBasePath.Folder()},
|
[]string{testdata.ExchangeEventsBasePath.Folder()},
|
||||||
@ -268,7 +268,7 @@ func (suite *SelectorReduceSuite) TestReduce() {
|
|||||||
{
|
{
|
||||||
name: "ExchangeEventsByFolderRoot",
|
name: "ExchangeEventsByFolderRoot",
|
||||||
selFunc: func() selectors.Reducer {
|
selFunc: func() selectors.Reducer {
|
||||||
sel := selectors.NewExchangeRestore()
|
sel := selectors.NewExchangeRestore(selectors.Any())
|
||||||
sel.Include(sel.EventCalendars(
|
sel.Include(sel.EventCalendars(
|
||||||
selectors.Any(),
|
selectors.Any(),
|
||||||
[]string{testdata.ExchangeEventsRootPath.Folder()},
|
[]string{testdata.ExchangeEventsRootPath.Folder()},
|
||||||
|
|||||||
@ -21,7 +21,7 @@ func TestSelectorSuite(t *testing.T) {
|
|||||||
|
|
||||||
func (suite *SelectorSuite) TestNewSelector() {
|
func (suite *SelectorSuite) TestNewSelector() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
s := newSelector(ServiceUnknown)
|
s := newSelector(ServiceUnknown, Any())
|
||||||
assert.NotNil(t, s)
|
assert.NotNil(t, s)
|
||||||
assert.Equal(t, s.Service, ServiceUnknown)
|
assert.Equal(t, s.Service, ServiceUnknown)
|
||||||
assert.NotNil(t, s.Includes)
|
assert.NotNil(t, s.Includes)
|
||||||
|
|||||||
@ -34,17 +34,16 @@ type (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_ Reducer = &SharePointRestore{}
|
_ Reducer = &SharePointRestore{}
|
||||||
_ printabler = &SharePointRestore{}
|
_ printabler = &SharePointRestore{}
|
||||||
_ resourceOwnerer = &SharePointRestore{}
|
_ pathCategorier = &SharePointRestore{}
|
||||||
_ pathCategorier = &SharePointRestore{}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewSharePointBackup produces a new Selector with the service set to ServiceSharePoint.
|
// NewSharePointBackup produces a new Selector with the service set to ServiceSharePoint.
|
||||||
func NewSharePointBackup() *SharePointBackup {
|
func NewSharePointBackup(sites []string) *SharePointBackup {
|
||||||
src := SharePointBackup{
|
src := SharePointBackup{
|
||||||
sharePoint{
|
sharePoint{
|
||||||
newSelector(ServiceSharePoint),
|
newSelector(ServiceSharePoint, sites),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,10 +63,10 @@ func (s Selector) ToSharePointBackup() (*SharePointBackup, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewSharePointRestore produces a new Selector with the service set to ServiceSharePoint.
|
// NewSharePointRestore produces a new Selector with the service set to ServiceSharePoint.
|
||||||
func NewSharePointRestore() *SharePointRestore {
|
func NewSharePointRestore(sites []string) *SharePointRestore {
|
||||||
src := SharePointRestore{
|
src := SharePointRestore{
|
||||||
sharePoint{
|
sharePoint{
|
||||||
newSelector(ServiceSharePoint),
|
newSelector(ServiceSharePoint, sites),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,16 +90,6 @@ func (s sharePoint) Printable() Printable {
|
|||||||
return toPrintable[SharePointScope](s.Selector)
|
return toPrintable[SharePointScope](s.Selector)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResourceOwners produces the aggregation of discrete sitets described by each type of scope.
|
|
||||||
// Any and None values are omitted.
|
|
||||||
func (s sharePoint) ResourceOwners() selectorResourceOwners {
|
|
||||||
return selectorResourceOwners{
|
|
||||||
Excludes: resourceOwnersIn(s.Excludes, SharePointSite.String()),
|
|
||||||
Filters: resourceOwnersIn(s.Filters, SharePointSite.String()),
|
|
||||||
Includes: resourceOwnersIn(s.Includes, SharePointSite.String()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PathCategories produces the aggregation of discrete users described by each type of scope.
|
// PathCategories produces the aggregation of discrete users described by each type of scope.
|
||||||
func (s sharePoint) PathCategories() selectorPathCategories {
|
func (s sharePoint) PathCategories() selectorPathCategories {
|
||||||
return selectorPathCategories{
|
return selectorPathCategories{
|
||||||
|
|||||||
@ -22,14 +22,14 @@ func TestSharePointSelectorSuite(t *testing.T) {
|
|||||||
|
|
||||||
func (suite *SharePointSelectorSuite) TestNewSharePointBackup() {
|
func (suite *SharePointSelectorSuite) TestNewSharePointBackup() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
ob := NewSharePointBackup()
|
ob := NewSharePointBackup(nil)
|
||||||
assert.Equal(t, ob.Service, ServiceSharePoint)
|
assert.Equal(t, ob.Service, ServiceSharePoint)
|
||||||
assert.NotZero(t, ob.Scopes())
|
assert.NotZero(t, ob.Scopes())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *SharePointSelectorSuite) TestToSharePointBackup() {
|
func (suite *SharePointSelectorSuite) TestToSharePointBackup() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
ob := NewSharePointBackup()
|
ob := NewSharePointBackup(nil)
|
||||||
s := ob.Selector
|
s := ob.Selector
|
||||||
ob, err := s.ToSharePointBackup()
|
ob, err := s.ToSharePointBackup()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@ -67,7 +67,7 @@ func (suite *SharePointSelectorSuite) TestSharePointBackup_DiscreteScopes() {
|
|||||||
|
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.name, func(t *testing.T) {
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
eb := NewSharePointBackup()
|
eb := NewSharePointBackup(test.include)
|
||||||
eb.Include(eb.Sites(test.include))
|
eb.Include(eb.Sites(test.include))
|
||||||
|
|
||||||
scopes := eb.DiscreteScopes(test.discrete)
|
scopes := eb.DiscreteScopes(test.discrete)
|
||||||
@ -81,14 +81,15 @@ func (suite *SharePointSelectorSuite) TestSharePointBackup_DiscreteScopes() {
|
|||||||
|
|
||||||
func (suite *SharePointSelectorSuite) TestSharePointSelector_Sites() {
|
func (suite *SharePointSelectorSuite) TestSharePointSelector_Sites() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewSharePointBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
s1 = "s1"
|
s1 = "s1"
|
||||||
s2 = "s2"
|
s2 = "s2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewSharePointBackup([]string{s1, s2})
|
||||||
siteScopes := sel.Sites([]string{s1, s2})
|
siteScopes := sel.Sites([]string{s1, s2})
|
||||||
|
|
||||||
for _, scope := range siteScopes {
|
for _, scope := range siteScopes {
|
||||||
// Scope value is either s1 or s2
|
// Scope value is either s1 or s2
|
||||||
assert.Contains(t, join(s1, s2), scope[SharePointSite.String()].Target)
|
assert.Contains(t, join(s1, s2), scope[SharePointSite.String()].Target)
|
||||||
@ -120,13 +121,13 @@ func (suite *SharePointSelectorSuite) TestSharePointSelector_Sites() {
|
|||||||
|
|
||||||
func (suite *SharePointSelectorSuite) TestSharePointSelector_Include_WebURLs() {
|
func (suite *SharePointSelectorSuite) TestSharePointSelector_Include_WebURLs() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewSharePointRestore()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
s1 = "s1"
|
s1 = "s1"
|
||||||
s2 = "s2"
|
s2 = "s2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewSharePointRestore([]string{s1, s2})
|
||||||
sel.Include(sel.WebURL([]string{s1, s2}))
|
sel.Include(sel.WebURL([]string{s1, s2}))
|
||||||
scopes := sel.Includes
|
scopes := sel.Includes
|
||||||
require.Len(t, scopes, 2)
|
require.Len(t, scopes, 2)
|
||||||
@ -159,7 +160,7 @@ func (suite *SharePointSelectorSuite) TestSharePointSelector_Include_WebURLs_any
|
|||||||
}
|
}
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.name, func(t *testing.T) {
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
sel := NewSharePointRestore()
|
sel := NewSharePointRestore(Any())
|
||||||
sel.Include(sel.WebURL(test.in))
|
sel.Include(sel.WebURL(test.in))
|
||||||
scopes := sel.Includes
|
scopes := sel.Includes
|
||||||
require.Len(t, scopes, 2)
|
require.Len(t, scopes, 2)
|
||||||
@ -177,13 +178,13 @@ func (suite *SharePointSelectorSuite) TestSharePointSelector_Include_WebURLs_any
|
|||||||
|
|
||||||
func (suite *SharePointSelectorSuite) TestSharePointSelector_Exclude_WebURLs() {
|
func (suite *SharePointSelectorSuite) TestSharePointSelector_Exclude_WebURLs() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewSharePointRestore()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
s1 = "s1"
|
s1 = "s1"
|
||||||
s2 = "s2"
|
s2 = "s2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewSharePointRestore([]string{s1, s2})
|
||||||
sel.Exclude(sel.WebURL([]string{s1, s2}))
|
sel.Exclude(sel.WebURL([]string{s1, s2}))
|
||||||
scopes := sel.Excludes
|
scopes := sel.Excludes
|
||||||
require.Len(t, scopes, 2)
|
require.Len(t, scopes, 2)
|
||||||
@ -201,13 +202,13 @@ func (suite *SharePointSelectorSuite) TestSharePointSelector_Exclude_WebURLs() {
|
|||||||
// SharePoint Libraries & SharePoint Lists are created.
|
// SharePoint Libraries & SharePoint Lists are created.
|
||||||
func (suite *SharePointSelectorSuite) TestSharePointSelector_Include_Sites() {
|
func (suite *SharePointSelectorSuite) TestSharePointSelector_Include_Sites() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewSharePointBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
s1 = "s1"
|
s1 = "s1"
|
||||||
s2 = "s2"
|
s2 = "s2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewSharePointBackup([]string{s1, s2})
|
||||||
sel.Include(sel.Sites([]string{s1, s2}))
|
sel.Include(sel.Sites([]string{s1, s2}))
|
||||||
scopes := sel.Includes
|
scopes := sel.Includes
|
||||||
require.Len(t, scopes, 2)
|
require.Len(t, scopes, 2)
|
||||||
@ -223,13 +224,13 @@ func (suite *SharePointSelectorSuite) TestSharePointSelector_Include_Sites() {
|
|||||||
|
|
||||||
func (suite *SharePointSelectorSuite) TestSharePointSelector_Exclude_Sites() {
|
func (suite *SharePointSelectorSuite) TestSharePointSelector_Exclude_Sites() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
sel := NewSharePointBackup()
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
s1 = "s1"
|
s1 = "s1"
|
||||||
s2 = "s2"
|
s2 = "s2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
sel := NewSharePointBackup([]string{s1, s2})
|
||||||
sel.Exclude(sel.Sites([]string{s1, s2}))
|
sel.Exclude(sel.Sites([]string{s1, s2}))
|
||||||
scopes := sel.Excludes
|
scopes := sel.Excludes
|
||||||
require.Len(t, scopes, 2)
|
require.Len(t, scopes, 2)
|
||||||
@ -245,14 +246,14 @@ func (suite *SharePointSelectorSuite) TestSharePointSelector_Exclude_Sites() {
|
|||||||
|
|
||||||
func (suite *SharePointSelectorSuite) TestNewSharePointRestore() {
|
func (suite *SharePointSelectorSuite) TestNewSharePointRestore() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
or := NewSharePointRestore()
|
or := NewSharePointRestore(nil)
|
||||||
assert.Equal(t, or.Service, ServiceSharePoint)
|
assert.Equal(t, or.Service, ServiceSharePoint)
|
||||||
assert.NotZero(t, or.Scopes())
|
assert.NotZero(t, or.Scopes())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *SharePointSelectorSuite) TestToSharePointRestore() {
|
func (suite *SharePointSelectorSuite) TestToSharePointRestore() {
|
||||||
t := suite.T()
|
t := suite.T()
|
||||||
eb := NewSharePointRestore()
|
eb := NewSharePointRestore(nil)
|
||||||
s := eb.Selector
|
s := eb.Selector
|
||||||
or, err := s.ToSharePointRestore()
|
or, err := s.ToSharePointRestore()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@ -262,9 +263,9 @@ func (suite *SharePointSelectorSuite) TestToSharePointRestore() {
|
|||||||
|
|
||||||
func (suite *SharePointSelectorSuite) TestSharePointRestore_Reduce() {
|
func (suite *SharePointSelectorSuite) TestSharePointRestore_Reduce() {
|
||||||
var (
|
var (
|
||||||
item = stubRepoRef(path.SharePointService, path.LibrariesCategory, "uid", "/folderA/folderB", "item")
|
item = stubRepoRef(path.SharePointService, path.LibrariesCategory, "sid", "folderA/folderB", "item")
|
||||||
item2 = stubRepoRef(path.SharePointService, path.LibrariesCategory, "uid", "/folderA/folderC", "item2")
|
item2 = stubRepoRef(path.SharePointService, path.LibrariesCategory, "sid", "folderA/folderC", "item2")
|
||||||
item3 = stubRepoRef(path.SharePointService, path.LibrariesCategory, "uid", "/folderD/folderE", "item3")
|
item3 = stubRepoRef(path.SharePointService, path.LibrariesCategory, "sid", "folderD/folderE", "item3")
|
||||||
)
|
)
|
||||||
|
|
||||||
deets := &details.Details{
|
deets := &details.Details{
|
||||||
@ -309,34 +310,34 @@ func (suite *SharePointSelectorSuite) TestSharePointRestore_Reduce() {
|
|||||||
expect []string
|
expect []string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
"all",
|
name: "all",
|
||||||
deets,
|
deets: deets,
|
||||||
func() *SharePointRestore {
|
makeSelector: func() *SharePointRestore {
|
||||||
odr := NewSharePointRestore()
|
odr := NewSharePointRestore(Any())
|
||||||
odr.Include(odr.Sites(Any()))
|
odr.Include(odr.Sites(Any()))
|
||||||
return odr
|
return odr
|
||||||
},
|
},
|
||||||
arr(item, item2, item3),
|
expect: arr(item, item2, item3),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"only match item",
|
name: "only match item",
|
||||||
deets,
|
deets: deets,
|
||||||
func() *SharePointRestore {
|
makeSelector: func() *SharePointRestore {
|
||||||
odr := NewSharePointRestore()
|
odr := NewSharePointRestore(Any())
|
||||||
odr.Include(odr.LibraryItems(Any(), Any(), []string{"item2"}))
|
odr.Include(odr.LibraryItems(Any(), Any(), []string{"item2"}))
|
||||||
return odr
|
return odr
|
||||||
},
|
},
|
||||||
arr(item2),
|
expect: arr(item2),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"only match folder",
|
name: "only match folder",
|
||||||
deets,
|
deets: deets,
|
||||||
func() *SharePointRestore {
|
makeSelector: func() *SharePointRestore {
|
||||||
odr := NewSharePointRestore()
|
odr := NewSharePointRestore([]string{"sid"})
|
||||||
odr.Include(odr.Libraries([]string{"uid"}, []string{"folderA/folderB", "folderA/folderC"}))
|
odr.Include(odr.Libraries([]string{"sid"}, []string{"folderA/folderB", "folderA/folderC"}))
|
||||||
return odr
|
return odr
|
||||||
},
|
},
|
||||||
arr(item, item2),
|
expect: arr(item, item2),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
@ -398,7 +399,7 @@ func (suite *SharePointSelectorSuite) TestSharePointCategory_PathValues() {
|
|||||||
|
|
||||||
func (suite *SharePointSelectorSuite) TestSharePointScope_MatchesInfo() {
|
func (suite *SharePointSelectorSuite) TestSharePointScope_MatchesInfo() {
|
||||||
var (
|
var (
|
||||||
ods = NewSharePointRestore()
|
ods = NewSharePointRestore(nil) // TODO: move into test
|
||||||
host = "www.website.com"
|
host = "www.website.com"
|
||||||
pth = "/foo"
|
pth = "/foo"
|
||||||
url = host + pth
|
url = host + pth
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user