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:
Keepers 2022-12-21 11:38:41 -07:00 committed by GitHub
parent a13f1cc3a6
commit 752ff20c6b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 348 additions and 391 deletions

View File

@ -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)

View File

@ -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))

View File

@ -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)

View File

@ -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))

View File

@ -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)

View File

@ -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))

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)
}) })

View File

@ -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)

View File

@ -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)

View File

@ -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 {

View File

@ -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
} }

View File

@ -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
)) ))

View File

@ -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],
}, },

View File

@ -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)

View File

@ -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
}, },

View File

@ -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

View File

@ -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,

View File

@ -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()

View File

@ -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}))

View File

@ -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()

View File

@ -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{

View File

@ -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

View File

@ -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"},

View File

@ -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{

View File

@ -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"}))

View File

@ -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{

View File

@ -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{}

View File

@ -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)

View File

@ -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()},

View File

@ -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)

View File

@ -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{

View File

@ -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