split users scope into per-type scopes (#412)

When a caller constructs an Users() exchange scope,
instead of building a single scope that contains all of the
provided users and all of the data beneath, follow the
pattern of the other scopes and generate one scope per
user-category pair.
This commit is contained in:
Keepers 2022-07-25 16:16:16 -06:00 committed by GitHub
parent ea3c9c035e
commit 75e8317bf9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 30 deletions

View File

@ -109,7 +109,7 @@ func (suite *ExchangeSuite) TestExchangeBackupCreateSelectors() {
{ {
name: "any", name: "any",
any: true, any: true,
expectIncludeLen: 1, expectIncludeLen: 3,
}, },
{ {
name: "any users, no data", name: "any users, no data",
@ -313,17 +313,17 @@ func (suite *ExchangeSuite) TestIncludeExchangeBackupDetailDataSelectors() {
{ {
name: "any users", name: "any users",
users: any, users: any,
expectIncludeLen: 1, expectIncludeLen: 3,
}, },
{ {
name: "single user", name: "single user",
users: stub, users: stub,
expectIncludeLen: 1, expectIncludeLen: 3,
}, },
{ {
name: "multiple users", name: "multiple users",
users: []string{"fnord", "smarf"}, users: []string{"fnord", "smarf"},
expectIncludeLen: 1, expectIncludeLen: 6,
}, },
{ {
name: "any users, any data", name: "any users, any data",

View File

@ -149,17 +149,17 @@ func (suite *ExchangeSuite) TestIncludeExchangeRestoreDataSelectors() {
{ {
name: "any users", name: "any users",
users: any, users: any,
expectIncludeLen: 1, expectIncludeLen: 3,
}, },
{ {
name: "single user", name: "single user",
users: stub, users: stub,
expectIncludeLen: 1, expectIncludeLen: 3,
}, },
{ {
name: "multiple users", name: "multiple users",
users: []string{"fnord", "smarf"}, users: []string{"fnord", "smarf"},
expectIncludeLen: 1, expectIncludeLen: 6,
}, },
{ {
name: "any users, any data", name: "any users, any data",

View File

@ -265,10 +265,11 @@ func (s *exchange) MailFolders(users, folders []string) []ExchangeScope {
func (s *exchange) Users(users []string) []ExchangeScope { func (s *exchange) Users(users []string) []ExchangeScope {
users = normalize(users) users = normalize(users)
scopes := []ExchangeScope{} scopes := []ExchangeScope{}
scopes = append( for _, u := range users {
scopes, scopes = append(scopes, makeExchangeUserScope(u, Group, ExchangeContactFolder, Any()))
makeExchangeScope(Group, ExchangeUser, users), scopes = append(scopes, makeExchangeUserScope(u, Item, ExchangeEvent, Any()))
) scopes = append(scopes, makeExchangeUserScope(u, Group, ExchangeMailFolder, Any()))
}
return scopes return scopes
} }

View File

@ -276,15 +276,22 @@ func (suite *ExchangeSourceSuite) TestExchangeSelector_Exclude_Users() {
sel.Exclude(sel.Users([]string{u1, u2})) sel.Exclude(sel.Users([]string{u1, u2}))
scopes := sel.Excludes scopes := sel.Excludes
require.Equal(t, 1, len(scopes)) require.Equal(t, 6, len(scopes))
scope := scopes[0] for _, scope := range scopes {
assert.Equal(t, scope[ExchangeUser.String()], join(u1, u2)) assert.Contains(t, join(u1, u2), scope[ExchangeUser.String()])
assert.Equal(t, scope[ExchangeContact.String()], AnyTgt) if scope[scopeKeyCategory] == ExchangeContactFolder.String() {
assert.Equal(t, scope[ExchangeContactFolder.String()], AnyTgt) assert.Equal(t, scope[ExchangeContact.String()], AnyTgt)
assert.Equal(t, scope[ExchangeEvent.String()], AnyTgt) assert.Equal(t, scope[ExchangeContactFolder.String()], AnyTgt)
assert.Equal(t, scope[ExchangeMail.String()], AnyTgt) }
assert.Equal(t, scope[ExchangeMailFolder.String()], AnyTgt) if scope[scopeKeyCategory] == ExchangeEvent.String() {
assert.Equal(t, scope[ExchangeEvent.String()], AnyTgt)
}
if scope[scopeKeyCategory] == ExchangeMailFolder.String() {
assert.Equal(t, scope[ExchangeMail.String()], AnyTgt)
assert.Equal(t, scope[ExchangeMailFolder.String()], AnyTgt)
}
}
} }
func (suite *ExchangeSourceSuite) TestExchangeSelector_Include_Users() { func (suite *ExchangeSourceSuite) TestExchangeSelector_Include_Users() {
@ -298,17 +305,22 @@ func (suite *ExchangeSourceSuite) TestExchangeSelector_Include_Users() {
sel.Include(sel.Users([]string{u1, u2})) sel.Include(sel.Users([]string{u1, u2}))
scopes := sel.Includes scopes := sel.Includes
require.Equal(t, 1, len(scopes)) require.Equal(t, 6, len(scopes))
scope := scopes[0] for _, scope := range scopes {
assert.Equal(t, scope[ExchangeUser.String()], join(u1, u2)) assert.Contains(t, join(u1, u2), scope[ExchangeUser.String()])
assert.Equal(t, scope[ExchangeContact.String()], AnyTgt) if scope[scopeKeyCategory] == ExchangeContactFolder.String() {
assert.Equal(t, scope[ExchangeContactFolder.String()], AnyTgt) assert.Equal(t, scope[ExchangeContact.String()], AnyTgt)
assert.Equal(t, scope[ExchangeEvent.String()], AnyTgt) assert.Equal(t, scope[ExchangeContactFolder.String()], AnyTgt)
assert.Equal(t, scope[ExchangeMail.String()], AnyTgt) }
assert.Equal(t, scope[ExchangeMailFolder.String()], AnyTgt) if scope[scopeKeyCategory] == ExchangeEvent.String() {
assert.Equal(t, scope[ExchangeEvent.String()], AnyTgt)
assert.Equal(t, sel.Scopes()[0].Category(), ExchangeUser) }
if scope[scopeKeyCategory] == ExchangeMailFolder.String() {
assert.Equal(t, scope[ExchangeMail.String()], AnyTgt)
assert.Equal(t, scope[ExchangeMailFolder.String()], AnyTgt)
}
}
} }
func (suite *ExchangeSourceSuite) TestNewExchangeDestination() { func (suite *ExchangeSourceSuite) TestNewExchangeDestination() {
@ -559,9 +571,14 @@ func (suite *ExchangeSourceSuite) TestExchangeScope_MatchesPath() {
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) {
scopes := extendExchangeScopeValues(test.scope) scopes := extendExchangeScopeValues(test.scope)
var aMatch bool
for _, scope := range scopes { for _, scope := range scopes {
test.expect(t, scope.matchesPath(ExchangeMail, path)) if scope.matchesPath(ExchangeMail, path) {
aMatch = true
break
}
} }
test.expect(t, aMatch)
}) })
} }
} }