Multi folder backup of contacts and events (#1016)
## Description Test ability to backup multiple disjoint folders in contacts and events ## Type of change <!--- Please check the type of change your PR introduces: ---> - [ ] 🌻 Feature - [ ] 🐛 Bugfix - [ ] 🗺️ Documentation - [x] 🤖 Test - [ ] 💻 CI/Deployment - [ ] 🐹 Trivial/Minor ## Issue(s) * #913 merge after * #995 ## Test Plan <!-- How will this be tested prior to merging.--> - [ ] 💪 Manual - [x] ⚡ Unit test - [ ] 💚 E2E
This commit is contained in:
parent
3719c36bce
commit
116d6e9df6
@ -731,17 +731,53 @@ func (suite *GraphConnectorIntegrationSuite) TestMultiFolderBackupDifferentNames
|
|||||||
bodyText := "This email has some text. However, all the text is on the same line."
|
bodyText := "This email has some text. However, all the text is on the same line."
|
||||||
subjectText := "Test message for restore"
|
subjectText := "Test message for restore"
|
||||||
|
|
||||||
|
// TODO(ashmrtn): Update if we start mixing categories during backup/restore.
|
||||||
|
backupSelFunc := func(
|
||||||
|
dests []control.RestoreDestination,
|
||||||
|
category path.CategoryType,
|
||||||
|
backupUser string,
|
||||||
|
) selectors.Selector {
|
||||||
|
destNames := make([]string, 0, len(dests))
|
||||||
|
|
||||||
|
for _, d := range dests {
|
||||||
|
destNames = append(destNames, d.ContainerName)
|
||||||
|
}
|
||||||
|
|
||||||
|
backupSel := selectors.NewExchangeBackup()
|
||||||
|
|
||||||
|
switch category {
|
||||||
|
case path.EmailCategory:
|
||||||
|
backupSel.Include(backupSel.MailFolders(
|
||||||
|
[]string{backupUser},
|
||||||
|
destNames,
|
||||||
|
))
|
||||||
|
case path.ContactsCategory:
|
||||||
|
backupSel.Include(backupSel.ContactFolders(
|
||||||
|
[]string{backupUser},
|
||||||
|
destNames,
|
||||||
|
))
|
||||||
|
case path.EventsCategory:
|
||||||
|
backupSel.Include(backupSel.EventCalendars(
|
||||||
|
[]string{backupUser},
|
||||||
|
destNames,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
return backupSel.Selector
|
||||||
|
}
|
||||||
|
|
||||||
table := []struct {
|
table := []struct {
|
||||||
name string
|
name string
|
||||||
service path.ServiceType
|
service path.ServiceType
|
||||||
|
category path.CategoryType
|
||||||
// Each collection will be restored separately, creating multiple folders to
|
// Each collection will be restored separately, creating multiple folders to
|
||||||
// backup later.
|
// backup later.
|
||||||
collections []colInfo
|
collections []colInfo
|
||||||
backupSelFunc func(dests []control.RestoreDestination, backupUser string) selectors.Selector
|
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Email",
|
name: "Email",
|
||||||
service: path.ExchangeService,
|
service: path.ExchangeService,
|
||||||
|
category: path.EmailCategory,
|
||||||
collections: []colInfo{
|
collections: []colInfo{
|
||||||
{
|
{
|
||||||
pathElements: []string{"Inbox"},
|
pathElements: []string{"Inbox"},
|
||||||
@ -772,22 +808,63 @@ func (suite *GraphConnectorIntegrationSuite) TestMultiFolderBackupDifferentNames
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
// TODO(ashmrtn): Generalize this once we know the path transforms that
|
},
|
||||||
// occur during restore.
|
{
|
||||||
backupSelFunc: func(dests []control.RestoreDestination, backupUser string) selectors.Selector {
|
name: "Contacts",
|
||||||
destNames := make([]string, 0, len(dests))
|
service: path.ExchangeService,
|
||||||
|
category: path.ContactsCategory,
|
||||||
for _, d := range dests {
|
collections: []colInfo{
|
||||||
destNames = append(destNames, d.ContainerName)
|
{
|
||||||
}
|
pathElements: []string{"Work"},
|
||||||
|
category: path.ContactsCategory,
|
||||||
backupSel := selectors.NewExchangeBackup()
|
items: []itemInfo{
|
||||||
backupSel.Include(backupSel.MailFolders(
|
{
|
||||||
[]string{backupUser},
|
name: "someencodeditemID",
|
||||||
destNames,
|
data: mockconnector.GetMockContactBytes("Ghimley"),
|
||||||
))
|
lookupKey: "Ghimley",
|
||||||
|
},
|
||||||
return backupSel.Selector
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pathElements: []string{"Personal"},
|
||||||
|
category: path.ContactsCategory,
|
||||||
|
items: []itemInfo{
|
||||||
|
{
|
||||||
|
name: "someencodeditemID2",
|
||||||
|
data: mockconnector.GetMockContactBytes("Irgot"),
|
||||||
|
lookupKey: "Irgot",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Events",
|
||||||
|
service: path.ExchangeService,
|
||||||
|
category: path.EventsCategory,
|
||||||
|
collections: []colInfo{
|
||||||
|
{
|
||||||
|
pathElements: []string{"Work"},
|
||||||
|
category: path.EventsCategory,
|
||||||
|
items: []itemInfo{
|
||||||
|
{
|
||||||
|
name: "someencodeditemID",
|
||||||
|
data: mockconnector.GetMockEventWithSubjectBytes("Ghimley"),
|
||||||
|
lookupKey: "Ghimley",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pathElements: []string{"Personal"},
|
||||||
|
category: path.EventsCategory,
|
||||||
|
items: []itemInfo{
|
||||||
|
{
|
||||||
|
name: "someencodeditemID2",
|
||||||
|
data: mockconnector.GetMockEventWithSubjectBytes("Irgot"),
|
||||||
|
lookupKey: "Irgot",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -801,7 +878,9 @@ func (suite *GraphConnectorIntegrationSuite) TestMultiFolderBackupDifferentNames
|
|||||||
allExpectedData := map[string]map[string][]byte{}
|
allExpectedData := map[string]map[string][]byte{}
|
||||||
|
|
||||||
for i, collection := range test.collections {
|
for i, collection := range test.collections {
|
||||||
// Get a dest per collection so they're independent.
|
// Get a dest per collection. Ensure they're independent with a small
|
||||||
|
// sleep.
|
||||||
|
time.Sleep(time.Second * 1)
|
||||||
dest := control.DefaultRestoreDestination(common.SimpleDateTimeFormatOneDrive)
|
dest := control.DefaultRestoreDestination(common.SimpleDateTimeFormatOneDrive)
|
||||||
dests = append(dests, dest)
|
dests = append(dests, dest)
|
||||||
|
|
||||||
@ -846,7 +925,7 @@ func (suite *GraphConnectorIntegrationSuite) TestMultiFolderBackupDifferentNames
|
|||||||
// Run a backup and compare its output with what we put in.
|
// Run a backup and compare its output with what we put in.
|
||||||
|
|
||||||
backupGC := loadConnector(ctx, t)
|
backupGC := loadConnector(ctx, t)
|
||||||
backupSel := test.backupSelFunc(dests, suite.user)
|
backupSel := backupSelFunc(dests, test.category, suite.user)
|
||||||
t.Logf("Selective backup of %s\n", backupSel)
|
t.Logf("Selective backup of %s\n", backupSel)
|
||||||
|
|
||||||
dcs, err := backupGC.DataCollections(ctx, backupSel)
|
dcs, err := backupGC.DataCollections(ctx, backupSel)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user