correct paths in selectors (#789)

The path package changed the standard format
of fullPath and repoRef design.  This should have
failed tests before being pushed to main, but was
able to slip in falsely while github actions were
configured to pass all tests until failed.
This commit is contained in:
Keepers 2022-09-07 14:14:51 -06:00 committed by GitHub
parent 9602360b5b
commit c73ca6a4e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 106 additions and 51 deletions

View File

@ -259,10 +259,10 @@ func (gc *GraphConnector) RestoreExchangeDataCollection(
for _, dc := range dcs { for _, dc := range dcs {
var ( var (
directory = strings.Join(dc.FullPath(), "") directory = strings.Join(dc.FullPath(), "")
user = dc.FullPath()[1] user = dc.FullPath()[2]
items = dc.Items() items = dc.Items()
// TODO(ashmrtn): Update this when we have path struct support in collections. // TODO(ashmrtn): Update this when we have path struct support in collections.
category = path.ToCategoryType(dc.FullPath()[2]) category = path.ToCategoryType(dc.FullPath()[3])
exit bool exit bool
) )

View File

@ -252,7 +252,7 @@ func (suite *GraphConnectorIntegrationSuite) TestRestoreMessages() {
for i := 0; i < 3; i++ { for i := 0; i < 3; i++ {
mdc := mockconnector.NewMockExchangeCollection( mdc := mockconnector.NewMockExchangeCollection(
[]string{"tenant", suite.user, category.String(), "Inbox"}, []string{"tenant", path.ExchangeService.String(), suite.user, category.String(), "Inbox"},
1) 1)
collection = append(collection, mdc) collection = append(collection, mdc)
} }

View File

@ -43,6 +43,13 @@ func singleton(level logLevel) *zap.SugaredLogger {
return loggerton return loggerton
} }
// when testing, ensure debug logging matches the test.v setting
for _, arg := range os.Args {
if arg == `--test.v=true` {
level = Development
}
}
// set up a logger core to use as a fallback // set up a logger core to use as a fallback
levelFilter := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { levelFilter := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
switch level { switch level {

View File

@ -555,24 +555,24 @@ func (ec exchangeCategory) unknownCat() categorizer {
// => {exchUser: userPN, exchMailFolder: mailFolder, exchMail: mailID} // => {exchUser: userPN, exchMailFolder: mailFolder, exchMail: mailID}
func (ec exchangeCategory) pathValues(path []string) map[categorizer]string { func (ec exchangeCategory) pathValues(path []string) map[categorizer]string {
m := map[categorizer]string{} m := map[categorizer]string{}
if len(path) < 5 { if len(path) < 6 {
return m return m
} }
m[ExchangeUser] = path[1] m[ExchangeUser] = path[2]
switch ec { switch ec {
case ExchangeContact: case ExchangeContact:
m[ExchangeContactFolder] = path[3] m[ExchangeContactFolder] = path[4]
m[ExchangeContact] = path[4] m[ExchangeContact] = path[5]
case ExchangeEvent: case ExchangeEvent:
m[ExchangeEventCalendar] = path[3] m[ExchangeEventCalendar] = path[4]
m[ExchangeEvent] = path[4] m[ExchangeEvent] = path[5]
case ExchangeMail: case ExchangeMail:
m[ExchangeMailFolder] = path[3] m[ExchangeMailFolder] = path[4]
m[ExchangeMail] = path[4] m[ExchangeMail] = path[5]
} }
return m return m

View File

@ -9,6 +9,7 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"github.com/alcionai/corso/internal/common" "github.com/alcionai/corso/internal/common"
"github.com/alcionai/corso/internal/path"
"github.com/alcionai/corso/pkg/backup/details" "github.com/alcionai/corso/pkg/backup/details"
"github.com/alcionai/corso/pkg/filters" "github.com/alcionai/corso/pkg/filters"
) )
@ -777,8 +778,8 @@ func (suite *ExchangeSelectorSuite) TestExchangeScope_MatchesPath() {
) )
var ( var (
path = []string{"tid", usr, "email", fld, mail} pth = stubPath(path.ExchangeService, path.EmailCategory, usr, fld, mail)
es = NewExchangeRestore() es = NewExchangeRestore()
) )
table := []struct { table := []struct {
@ -807,7 +808,7 @@ func (suite *ExchangeSelectorSuite) TestExchangeScope_MatchesPath() {
scopes := setScopesToDefault(test.scope) scopes := setScopesToDefault(test.scope)
var aMatch bool var aMatch bool
for _, scope := range scopes { for _, scope := range scopes {
pv := ExchangeMail.pathValues(path) pv := ExchangeMail.pathValues(pth)
if matchesPathValues(scope, ExchangeMail, pv) { if matchesPathValues(scope, ExchangeMail, pv) {
aMatch = true aMatch = true
break break
@ -821,12 +822,12 @@ func (suite *ExchangeSelectorSuite) TestExchangeScope_MatchesPath() {
func (suite *ExchangeSelectorSuite) TestIdPath() { func (suite *ExchangeSelectorSuite) TestIdPath() {
table := []struct { table := []struct {
cat exchangeCategory cat exchangeCategory
path []string pth []string
expect map[exchangeCategory]string expect map[exchangeCategory]string
}{ }{
{ {
ExchangeContact, ExchangeContact,
[]string{"tid", "uid", "contact", "cFld", "cid"}, stubPath(path.ExchangeService, path.ContactsCategory, "uid", "cFld", "cid"),
map[exchangeCategory]string{ map[exchangeCategory]string{
ExchangeUser: "uid", ExchangeUser: "uid",
ExchangeContactFolder: "cFld", ExchangeContactFolder: "cFld",
@ -835,15 +836,16 @@ func (suite *ExchangeSelectorSuite) TestIdPath() {
}, },
{ {
ExchangeEvent, ExchangeEvent,
[]string{"tid", "uid", "event", "eid"}, stubPath(path.ExchangeService, path.EventsCategory, "uid", "eCld", "eid"),
map[exchangeCategory]string{ map[exchangeCategory]string{
ExchangeUser: "uid", ExchangeUser: "uid",
ExchangeEvent: "eid", ExchangeEventCalendar: "eCld",
ExchangeEvent: "eid",
}, },
}, },
{ {
ExchangeMail, ExchangeMail,
[]string{"tid", "uid", "email", "mFld", "mid"}, stubPath(path.ExchangeService, path.EmailCategory, "uid", "mFld", "mid"),
map[exchangeCategory]string{ map[exchangeCategory]string{
ExchangeUser: "uid", ExchangeUser: "uid",
ExchangeMailFolder: "mFld", ExchangeMailFolder: "mFld",
@ -852,7 +854,7 @@ func (suite *ExchangeSelectorSuite) TestIdPath() {
}, },
{ {
ExchangeCategoryUnknown, ExchangeCategoryUnknown,
[]string{"tid", "uid", "contact", "cFld", "cid"}, stubPath(path.ExchangeService, path.UnknownCategory, "u", "f", "i"),
map[exchangeCategory]string{ map[exchangeCategory]string{
ExchangeUser: "uid", ExchangeUser: "uid",
}, },
@ -880,10 +882,10 @@ func (suite *ExchangeSelectorSuite) TestExchangeRestore_Reduce() {
return deets return deets
} }
const ( var (
contact = "tid/uid/contacts/cfld/cid" contact = stubRepoRef(path.ExchangeService, path.ContactsCategory, "uid", "cfld", "cid")
event = "tid/uid/events/ecld/eid" event = stubRepoRef(path.ExchangeService, path.EventsCategory, "uid", "ecld", "eid")
mail = "tid/uid/email/mfld/mid" mail = stubRepoRef(path.ExchangeService, path.EmailCategory, "uid", "mfld", "mid")
) )
arr := func(s ...string) []string { arr := func(s ...string) []string {
@ -1090,7 +1092,7 @@ func (suite *ExchangeSelectorSuite) TestPasses() {
mail = setScopesToDefault(es.Mails(Any(), Any(), []string{mid})) mail = setScopesToDefault(es.Mails(Any(), Any(), []string{mid}))
otherMail = setScopesToDefault(es.Mails(Any(), Any(), []string{"smarf"})) otherMail = setScopesToDefault(es.Mails(Any(), Any(), []string{"smarf"}))
noMail = setScopesToDefault(es.Mails(Any(), Any(), None())) noMail = setScopesToDefault(es.Mails(Any(), Any(), None()))
path = []string{"tid", "user", "email", "folder", mid} pth = stubPath(path.ExchangeService, path.EmailCategory, "user", "folder", mid)
) )
table := []struct { table := []struct {
@ -1121,7 +1123,7 @@ func (suite *ExchangeSelectorSuite) TestPasses() {
suite.T().Run(test.name, func(t *testing.T) { suite.T().Run(test.name, func(t *testing.T) {
result := passes( result := passes(
cat, cat,
cat.pathValues(path), cat.pathValues(pth),
deets, deets,
test.excludes, test.excludes,
test.filters, test.filters,
@ -1226,23 +1228,23 @@ func (suite *ExchangeSelectorSuite) TestExchangeCategory_leafCat() {
} }
func (suite *ExchangeSelectorSuite) TestExchangeCategory_PathValues() { func (suite *ExchangeSelectorSuite) TestExchangeCategory_PathValues() {
contactPath := []string{"ten", "user", "contact", "cfolder", "contactitem"} contactPath := stubPath(path.ExchangeService, path.ContactsCategory, "user", "cfolder", "contactitem")
contactMap := map[categorizer]string{ contactMap := map[categorizer]string{
ExchangeUser: contactPath[1], ExchangeUser: contactPath[2],
ExchangeContactFolder: contactPath[3], ExchangeContactFolder: contactPath[4],
ExchangeContact: contactPath[4], ExchangeContact: contactPath[5],
} }
eventPath := []string{"ten", "user", "event", "ecalendar", "eventitem"} eventPath := stubPath(path.ExchangeService, path.EventsCategory, "user", "ecalendar", "eventitem")
eventMap := map[categorizer]string{ eventMap := map[categorizer]string{
ExchangeUser: eventPath[1], ExchangeUser: eventPath[2],
ExchangeEventCalendar: eventPath[3], ExchangeEventCalendar: eventPath[4],
ExchangeEvent: eventPath[4], ExchangeEvent: eventPath[5],
} }
mailPath := []string{"ten", "user", "mail", "mfolder", "mailitem"} mailPath := stubPath(path.ExchangeService, path.EmailCategory, "user", "mfolder", "mailitem")
mailMap := map[categorizer]string{ mailMap := map[categorizer]string{
ExchangeUser: contactPath[1], ExchangeUser: contactPath[2],
ExchangeMailFolder: mailPath[3], ExchangeMailFolder: mailPath[4],
ExchangeMail: mailPath[4], ExchangeMail: mailPath[5],
} }
table := []struct { table := []struct {

View File

@ -1,10 +1,12 @@
package selectors package selectors
import ( import (
"strings"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/alcionai/corso/internal/path"
"github.com/alcionai/corso/pkg/backup/details" "github.com/alcionai/corso/pkg/backup/details"
"github.com/alcionai/corso/pkg/filters" "github.com/alcionai/corso/pkg/filters"
) )
@ -40,7 +42,7 @@ func (mc mockCategorizer) unknownCat() categorizer {
return unknownCatStub return unknownCatStub
} }
func (mc mockCategorizer) pathValues(path []string) map[categorizer]string { func (mc mockCategorizer) pathValues(pth []string) map[categorizer]string {
return map[categorizer]string{rootCatStub: "stub"} return map[categorizer]string{rootCatStub: "stub"}
} }
@ -140,3 +142,15 @@ func scopeMustHave[T scopeT](t *testing.T, sc T, m map[categorizer]string) {
}) })
} }
} }
// stubPath ensures test path production matches that of fullPath design,
// stubbing out static values where necessary.
func stubPath(service path.ServiceType, data path.CategoryType, resourceOwner, folders, item string) []string {
return []string{"tid", service.String(), resourceOwner, data.String(), folders, item}
}
// stubRepoRef ensures test path production matches that of repoRef design,
// stubbing out static values where necessary.
func stubRepoRef(service path.ServiceType, data path.CategoryType, resourceOwner, folders, item string) string {
return strings.Join([]string{"tid", service.String(), resourceOwner, data.String(), folders, item}, "/")
}

View File

@ -188,15 +188,15 @@ func (c oneDriveCategory) unknownCat() categorizer {
// => {odUser: userPN, odFolder: folder, odFileID: fileID} // => {odUser: userPN, odFolder: folder, odFileID: fileID}
func (c oneDriveCategory) pathValues(path []string) map[categorizer]string { func (c oneDriveCategory) pathValues(path []string) map[categorizer]string {
m := map[categorizer]string{} m := map[categorizer]string{}
if len(path) < 2 { if len(path) < 3 {
return m return m
} }
m[OneDriveUser] = path[1] m[OneDriveUser] = path[2]
/* /*
TODO/Notice: TODO/Notice:
Files contain folder structures, identified Files contain folder structures, identified
in this code as being at index 3. This assumes a single in this code as being at index 4. This assumes a single
folder, while in reality users can express subfolder folder, while in reality users can express subfolder
hierarchies of arbirary depth. Subfolder handling is coming hierarchies of arbirary depth. Subfolder handling is coming
at a later time. at a later time.

View File

@ -287,11 +287,11 @@ const (
func pathTypeIn(p []string) pathType { func pathTypeIn(p []string) pathType {
// not all paths will be len=3. Most should be longer. // not all paths will be len=3. Most should be longer.
// This just protects us from panicing below. // This just protects us from panicing below.
if len(p) < 3 { if len(p) < 4 {
return unknownPathType return unknownPathType
} }
switch p[2] { switch p[3] {
case path.EmailCategory.String(): case path.EmailCategory.String():
return exchangeMailPath return exchangeMailPath
case path.ContactsCategory.String(): case path.ContactsCategory.String():

View File

@ -7,6 +7,7 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"github.com/alcionai/corso/internal/path"
"github.com/alcionai/corso/pkg/backup/details" "github.com/alcionai/corso/pkg/backup/details"
"github.com/alcionai/corso/pkg/filters" "github.com/alcionai/corso/pkg/filters"
) )
@ -241,12 +242,43 @@ func (suite *SelectorScopesSuite) TestReduce() {
} }
func (suite *SelectorScopesSuite) TestPathTypeIn() { func (suite *SelectorScopesSuite) TestPathTypeIn() {
t := suite.T() table := []struct {
assert.Equal(t, unknownPathType, pathTypeIn([]string{}), "empty") name string
assert.Equal(t, exchangeMailPath, pathTypeIn([]string{"", "", "email"}), "email") pathType pathType
assert.Equal(t, exchangeContactPath, pathTypeIn([]string{"", "", "contacts"}), "contact") pth []string
assert.Equal(t, exchangeEventPath, pathTypeIn([]string{"", "", "events"}), "event") }{
assert.Equal(t, unknownPathType, pathTypeIn([]string{"", "", "fnords"}), "bogus") {
name: "empty",
pathType: unknownPathType,
pth: []string{},
},
{
name: "email",
pathType: exchangeMailPath,
pth: stubPath(path.ExchangeService, path.EmailCategory, "", "", ""),
},
{
name: "contact",
pathType: exchangeContactPath,
pth: stubPath(path.ExchangeService, path.ContactsCategory, "", "", ""),
},
{
name: "event",
pathType: exchangeEventPath,
pth: stubPath(path.ExchangeService, path.EventsCategory, "", "", ""),
},
{
name: "bogus",
pathType: unknownPathType,
pth: []string{"", "", "", "fnords", "", ""},
},
}
for _, test := range table {
suite.T().Run(test.name, func(t *testing.T) {
result := pathTypeIn(test.pth)
assert.Equal(t, test.pathType, result)
})
}
} }
func (suite *SelectorScopesSuite) TestScopesByCategory() { func (suite *SelectorScopesSuite) TestScopesByCategory() {