407 lines
9.1 KiB
Go
407 lines
9.1 KiB
Go
package selectors
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/alcionai/clues"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/stretchr/testify/suite"
|
|
|
|
"github.com/alcionai/corso/src/internal/tester"
|
|
"github.com/alcionai/corso/src/pkg/path"
|
|
)
|
|
|
|
type ReasonsUnitSuite struct {
|
|
tester.Suite
|
|
}
|
|
|
|
func TestReasonsUnitSuite(t *testing.T) {
|
|
suite.Run(t, &ReasonsUnitSuite{Suite: tester.NewUnitSuite(t)})
|
|
}
|
|
|
|
func (suite *ReasonsUnitSuite) TestReasonsFor_thorough() {
|
|
var (
|
|
tenantID = "tid"
|
|
exchange = path.ExchangeService.String()
|
|
email = path.EmailCategory.String()
|
|
contacts = path.ContactsCategory.String()
|
|
)
|
|
|
|
type expect struct {
|
|
tenant string
|
|
resource string
|
|
category string
|
|
service string
|
|
subtreePath string
|
|
subtreePathHadErr bool
|
|
}
|
|
|
|
stpFor := func(resource, category, service string) string {
|
|
return path.Builder{}.Append(tenantID, service, resource, category).String()
|
|
}
|
|
|
|
table := []struct {
|
|
name string
|
|
sel func() ExchangeRestore
|
|
useName bool
|
|
expect []expect
|
|
}{
|
|
{
|
|
name: "no scopes",
|
|
sel: func() ExchangeRestore {
|
|
return *NewExchangeRestore([]string{"timbo"})
|
|
},
|
|
expect: []expect{},
|
|
},
|
|
{
|
|
name: "use name",
|
|
sel: func() ExchangeRestore {
|
|
sel := NewExchangeRestore([]string{"timbo"})
|
|
sel.Include(sel.MailFolders(Any()))
|
|
plainSel := sel.SetDiscreteOwnerIDName("timbo", "timbubba")
|
|
|
|
sel, err := plainSel.ToExchangeRestore()
|
|
require.NoError(suite.T(), err, clues.ToCore(err))
|
|
|
|
return *sel
|
|
},
|
|
useName: true,
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "timbubba",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("timbubba", email, exchange),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "only includes",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"bubba"})
|
|
sel.Include(sel.MailFolders(Any()))
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "bubba",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("bubba", email, exchange),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "only filters",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"tachoma dhaume"})
|
|
sel.Filter(sel.MailFolders(Any()))
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "tachoma dhaume",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("tachoma dhaume", email, exchange),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "duplicate includes and filters",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"vyng vang zoombah"})
|
|
sel.Include(sel.MailFolders(Any()))
|
|
sel.Filter(sel.MailFolders(Any()))
|
|
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "vyng vang zoombah",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("vyng vang zoombah", email, exchange),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "duplicate includes",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"fat billie"})
|
|
sel.Include(sel.MailFolders(Any()), sel.MailFolders(Any()))
|
|
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "fat billie",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("fat billie", email, exchange),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "duplicate filters",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"seathane"})
|
|
sel.Filter(sel.MailFolders(Any()), sel.MailFolders(Any()))
|
|
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "seathane",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("seathane", email, exchange),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "no duplicates",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"perell"})
|
|
sel.Include(sel.MailFolders(Any()), sel.ContactFolders(Any()))
|
|
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "perell",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("perell", email, exchange),
|
|
},
|
|
{
|
|
tenant: tenantID,
|
|
resource: "perell",
|
|
category: contacts,
|
|
service: exchange,
|
|
subtreePath: stpFor("perell", contacts, exchange),
|
|
},
|
|
},
|
|
},
|
|
}
|
|
for _, test := range table {
|
|
suite.Run(test.name, func() {
|
|
t := suite.T()
|
|
|
|
results := []expect{}
|
|
rs := reasonsFor(test.sel(), tenantID, test.useName)
|
|
|
|
for _, r := range rs {
|
|
stp, err := r.SubtreePath()
|
|
|
|
t.Log("stp err", err)
|
|
|
|
stpStr := ""
|
|
if stp != nil {
|
|
stpStr = stp.String()
|
|
}
|
|
|
|
results = append(results, expect{
|
|
tenant: r.Tenant(),
|
|
resource: r.ProtectedResource(),
|
|
service: r.Service().String(),
|
|
category: r.Category().String(),
|
|
subtreePath: stpStr,
|
|
subtreePathHadErr: err != nil,
|
|
})
|
|
}
|
|
|
|
assert.ElementsMatch(t, test.expect, results)
|
|
})
|
|
}
|
|
}
|
|
|
|
func (suite *ReasonsUnitSuite) TestReasonsFor_serviceChecks() {
|
|
var (
|
|
tenantID = "tid"
|
|
exchange = path.ExchangeService.String()
|
|
email = path.EmailCategory.String()
|
|
contacts = path.ContactsCategory.String()
|
|
)
|
|
|
|
type expect struct {
|
|
tenant string
|
|
resource string
|
|
category string
|
|
service string
|
|
subtreePath string
|
|
subtreePathHadErr bool
|
|
}
|
|
|
|
stpFor := func(resource, category, service string) string {
|
|
return path.Builder{}.Append(tenantID, service, resource, category).String()
|
|
}
|
|
|
|
table := []struct {
|
|
name string
|
|
sel func() ExchangeRestore
|
|
useName bool
|
|
expect []expect
|
|
}{
|
|
{
|
|
name: "no scopes",
|
|
sel: func() ExchangeRestore {
|
|
return *NewExchangeRestore([]string{"timbo"})
|
|
},
|
|
expect: []expect{},
|
|
},
|
|
{
|
|
name: "only includes",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"bubba"})
|
|
sel.Include(sel.MailFolders(Any()))
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "bubba",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("bubba", email, exchange),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "only filters",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"tachoma dhaume"})
|
|
sel.Filter(sel.MailFolders(Any()))
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "tachoma dhaume",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("tachoma dhaume", email, exchange),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "duplicate includes and filters",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"vyng vang zoombah"})
|
|
sel.Include(sel.MailFolders(Any()))
|
|
sel.Filter(sel.MailFolders(Any()))
|
|
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "vyng vang zoombah",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("vyng vang zoombah", email, exchange),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "duplicate includes",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"fat billie"})
|
|
sel.Include(sel.MailFolders(Any()), sel.MailFolders(Any()))
|
|
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "fat billie",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("fat billie", email, exchange),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "duplicate filters",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"seathane"})
|
|
sel.Filter(sel.MailFolders(Any()), sel.MailFolders(Any()))
|
|
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "seathane",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("seathane", email, exchange),
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "no duplicates",
|
|
sel: func() ExchangeRestore {
|
|
sel := *NewExchangeRestore([]string{"perell"})
|
|
sel.Include(sel.MailFolders(Any()), sel.ContactFolders(Any()))
|
|
|
|
return sel
|
|
},
|
|
expect: []expect{
|
|
{
|
|
tenant: tenantID,
|
|
resource: "perell",
|
|
category: email,
|
|
service: exchange,
|
|
subtreePath: stpFor("perell", email, exchange),
|
|
},
|
|
{
|
|
tenant: tenantID,
|
|
resource: "perell",
|
|
category: contacts,
|
|
service: exchange,
|
|
subtreePath: stpFor("perell", contacts, exchange),
|
|
},
|
|
},
|
|
},
|
|
}
|
|
for _, test := range table {
|
|
suite.Run(test.name, func() {
|
|
t := suite.T()
|
|
|
|
results := []expect{}
|
|
rs := reasonsFor(test.sel(), tenantID, test.useName)
|
|
|
|
for _, r := range rs {
|
|
stp, err := r.SubtreePath()
|
|
|
|
t.Log("stp err", err)
|
|
|
|
stpStr := ""
|
|
if stp != nil {
|
|
stpStr = stp.String()
|
|
}
|
|
|
|
results = append(results, expect{
|
|
tenant: r.Tenant(),
|
|
resource: r.ProtectedResource(),
|
|
service: r.Service().String(),
|
|
category: r.Category().String(),
|
|
subtreePath: stpStr,
|
|
subtreePathHadErr: err != nil,
|
|
})
|
|
}
|
|
|
|
assert.ElementsMatch(t, test.expect, results)
|
|
})
|
|
}
|
|
}
|