Abin Simon 80f11d9876
Restore for Groups SharePoint Sites (#4209)
Still a few pending items like CLI handling and restoring specific items. Will be handled in a follow up.

---

#### Does this PR need a docs update or release note?

- [ ]  Yes, it's included
- [x] 🕐 Yes, but in a later PR
- [ ]  No

#### Type of change

<!--- Please check the type of change your PR introduces: --->
- [x] 🌻 Feature
- [ ] 🐛 Bugfix
- [ ] 🗺️ Documentation
- [ ] 🤖 Supportability/Tests
- [ ] 💻 CI/Deployment
- [ ] 🧹 Tech Debt/Cleanup

#### Issue(s)

<!-- Can reference multiple issues. Use one of the following "magic words" - "closes, fixes" to auto-close the Github issue. -->
* https://github.com/alcionai/corso/issues/3992

#### Test Plan

<!-- How will this be tested prior to merging.-->
- [ ] 💪 Manual
- [x]  Unit test
- [ ] 💚 E2E
2023-09-14 08:49:34 +00:00

1085 lines
35 KiB
Go

package testdata
import (
"strings"
"testing"
"time"
"github.com/stretchr/testify/require"
"golang.org/x/exp/slices"
"github.com/alcionai/corso/src/internal/version"
"github.com/alcionai/corso/src/pkg/backup/details"
"github.com/alcionai/corso/src/pkg/path"
)
// mustParsePath takes a string representing a resource path and returns a path
// instance. Panics if the path cannot be parsed. Useful for simple variable
// assignments.
func mustParsePath(ref string, isItem bool) path.Path {
p, err := path.FromDataLayerPath(ref, isItem)
if err != nil {
panic(err)
}
return p
}
// mustAppendPath takes a Path, string representing a path element, and whether
// the element is an item and returns a path instance representing the original
// path with the element appended to it. Panics if the path cannot be parsed.
// Useful for simple variable assignments.
func mustAppendPath(p path.Path, newElement string, isItem bool) path.Path {
newP, err := p.Append(isItem, newElement)
if err != nil {
panic(err)
}
return newP
}
func locFromRepo(rr path.Path, isItem bool) *path.Builder {
loc := &path.Builder{}
for _, e := range rr.Folders() {
loc = loc.Append(strings.TrimSuffix(e, folderSuffix))
}
if rr.Service() == path.GroupsService {
loc = loc.PopFront().PopFront().PopFront()
} else if rr.Service() == path.OneDriveService || rr.Category() == path.LibrariesCategory {
loc = loc.PopFront()
}
// Folders don't have their final element in the location.
if !isItem {
loc = loc.Dir()
}
return loc
}
type repoRefAndLocRef struct {
RR path.Path
Loc *path.Builder
}
func (p repoRefAndLocRef) MustAppend(newElement string, isItem bool) repoRefAndLocRef {
e := newElement + folderSuffix
if isItem {
e = newElement + fileSuffix
}
res := repoRefAndLocRef{
RR: mustAppendPath(p.RR, e, isItem),
}
res.Loc = locFromRepo(res.RR, isItem)
return res
}
func (p repoRefAndLocRef) ItemLocation() string {
return strings.TrimSuffix(p.RR.Item(), fileSuffix)
}
func (p repoRefAndLocRef) FolderLocation() string {
lastElem := p.RR.ToBuilder().LastElem()
if len(p.RR.Item()) > 0 {
f := p.RR.Folders()
lastElem = f[len(f)-2]
}
return p.Loc.Append(strings.TrimSuffix(lastElem, folderSuffix)).String()
}
// locationAsRepoRef returns a path.Path where the LocationRef is used for the
// folder path instead of the id-based path elements. This is useful for
// generating paths for older versions of Corso.
func (p repoRefAndLocRef) locationAsRepoRef() path.Path {
tmp := p.Loc
if len(p.ItemLocation()) > 0 {
tmp = tmp.Append(p.ItemLocation())
}
res, err := tmp.ToDataLayerPath(
p.RR.Tenant(),
p.RR.ProtectedResource(),
p.RR.Service(),
p.RR.Category(),
len(p.ItemLocation()) > 0)
if err != nil {
panic(err)
}
return res
}
func mustPathRep(ref string, isItem bool) repoRefAndLocRef {
res := repoRefAndLocRef{}
tmp := mustParsePath(ref, isItem)
// Now append stuff to the RepoRef elements so we have distinct LocationRef
// and RepoRef elements to simulate using IDs in the path instead of display
// names.
rrPB := &path.Builder{}
for _, e := range tmp.Folders() {
rrPB = rrPB.Append(e + folderSuffix)
}
if isItem {
rrPB = rrPB.Append(tmp.Item() + fileSuffix)
}
rr, err := rrPB.ToDataLayerPath(
tmp.Tenant(),
tmp.ProtectedResource(),
tmp.Service(),
tmp.Category(),
isItem)
if err != nil {
panic(err)
}
res.RR = rr
res.Loc = locFromRepo(rr, isItem)
return res
}
const (
folderSuffix = ".d"
fileSuffix = ".f"
ItemName1 = "item1"
ItemName2 = "item2"
ItemName3 = "item3"
UserEmail1 = "user1@email.com"
UserEmail2 = "user2@email.com"
)
var (
Time1 = time.Date(2022, 9, 21, 10, 0, 0, 0, time.UTC)
Time2 = time.Date(2022, 10, 21, 10, 0, 0, 0, time.UTC)
Time3 = time.Date(2023, 9, 21, 10, 0, 0, 0, time.UTC)
Time4 = time.Date(2023, 10, 21, 10, 0, 0, 0, time.UTC)
ExchangeEmailInboxPath = mustPathRep("tenant-id/exchange/user-id/email/Inbox", false)
ExchangeEmailBasePath = ExchangeEmailInboxPath.MustAppend("subfolder", false)
ExchangeEmailBasePath2 = ExchangeEmailInboxPath.MustAppend("othersubfolder/", false)
ExchangeEmailBasePath3 = ExchangeEmailBasePath2.MustAppend("subsubfolder", false)
ExchangeEmailItemPath1 = ExchangeEmailBasePath.MustAppend(ItemName1, true)
ExchangeEmailItemPath2 = ExchangeEmailBasePath2.MustAppend(ItemName2, true)
ExchangeEmailItemPath3 = ExchangeEmailBasePath3.MustAppend(ItemName3, true)
// These all represent the same set of items however, the different versions
// have varying amounts of information.
exchangeEmailItemsByVersion = map[int][]details.Entry{
version.All8MigrateUserPNToID: {
{
RepoRef: ExchangeEmailItemPath1.RR.String(),
ShortRef: ExchangeEmailItemPath1.RR.ShortRef(),
ParentRef: ExchangeEmailItemPath1.RR.ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeEmailItemPath1.ItemLocation(),
LocationRef: ExchangeEmailItemPath1.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeMail,
Sender: "a-person",
Subject: "foo",
Received: Time1,
},
},
},
{
RepoRef: ExchangeEmailItemPath2.RR.String(),
ShortRef: ExchangeEmailItemPath2.RR.ShortRef(),
ParentRef: ExchangeEmailItemPath2.RR.ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeEmailItemPath2.ItemLocation(),
LocationRef: ExchangeEmailItemPath2.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeMail,
Sender: "a-person",
Subject: "bar",
Received: Time2,
},
},
},
{
RepoRef: ExchangeEmailItemPath3.RR.String(),
ShortRef: ExchangeEmailItemPath3.RR.ShortRef(),
ParentRef: ExchangeEmailItemPath3.RR.ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeEmailItemPath3.ItemLocation(),
LocationRef: ExchangeEmailItemPath3.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeMail,
Sender: "another-person",
Subject: "baz",
Received: Time2,
},
},
},
},
version.OneDrive7LocationRef: {
{
RepoRef: ExchangeEmailItemPath1.locationAsRepoRef().String(),
ShortRef: ExchangeEmailItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeEmailItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeEmailItemPath1.ItemLocation(),
LocationRef: ExchangeEmailItemPath1.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeMail,
Sender: "a-person",
Subject: "foo",
Received: Time1,
},
},
},
{
RepoRef: ExchangeEmailItemPath2.locationAsRepoRef().String(),
ShortRef: ExchangeEmailItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeEmailItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeEmailItemPath2.ItemLocation(),
LocationRef: ExchangeEmailItemPath2.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeMail,
Sender: "a-person",
Subject: "bar",
Received: Time2,
},
},
},
{
RepoRef: ExchangeEmailItemPath3.locationAsRepoRef().String(),
ShortRef: ExchangeEmailItemPath3.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeEmailItemPath3.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeEmailItemPath3.ItemLocation(),
LocationRef: ExchangeEmailItemPath3.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeMail,
Sender: "another-person",
Subject: "baz",
Received: Time2,
},
},
},
},
0: {
{
RepoRef: ExchangeEmailItemPath1.locationAsRepoRef().String(),
ShortRef: ExchangeEmailItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeEmailItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeMail,
Sender: "a-person",
Subject: "foo",
Received: Time1,
},
},
},
{
RepoRef: ExchangeEmailItemPath2.locationAsRepoRef().String(),
ShortRef: ExchangeEmailItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeEmailItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeMail,
Sender: "a-person",
Subject: "bar",
Received: Time2,
},
},
},
{
RepoRef: ExchangeEmailItemPath3.locationAsRepoRef().String(),
ShortRef: ExchangeEmailItemPath3.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeEmailItemPath3.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeMail,
Sender: "another-person",
Subject: "baz",
Received: Time2,
},
},
},
},
}
ExchangeContactsRootPath = mustPathRep("tenant-id/exchange/user-id/contacts/contacts", false)
ExchangeContactsBasePath = ExchangeContactsRootPath.MustAppend("contacts", false)
ExchangeContactsBasePath2 = ExchangeContactsRootPath.MustAppend("morecontacts", false)
ExchangeContactsItemPath1 = ExchangeContactsBasePath.MustAppend(ItemName1, true)
ExchangeContactsItemPath2 = ExchangeContactsBasePath2.MustAppend(ItemName2, true)
exchangeContactsItemsByVersion = map[int][]details.Entry{
version.All8MigrateUserPNToID: {
{
RepoRef: ExchangeContactsItemPath1.RR.String(),
ShortRef: ExchangeContactsItemPath1.RR.ShortRef(),
ParentRef: ExchangeContactsItemPath1.RR.ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeContactsItemPath1.ItemLocation(),
LocationRef: ExchangeContactsItemPath1.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeContact,
ContactName: "a-person",
},
},
},
{
RepoRef: ExchangeContactsItemPath2.RR.String(),
ShortRef: ExchangeContactsItemPath2.RR.ShortRef(),
ParentRef: ExchangeContactsItemPath2.RR.ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeContactsItemPath2.ItemLocation(),
LocationRef: ExchangeContactsItemPath2.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeContact,
ContactName: "another-person",
},
},
},
},
version.OneDrive7LocationRef: {
{
RepoRef: ExchangeContactsItemPath1.locationAsRepoRef().String(),
ShortRef: ExchangeContactsItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeContactsItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeContactsItemPath1.ItemLocation(),
LocationRef: ExchangeContactsItemPath1.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeContact,
ContactName: "a-person",
},
},
},
{
RepoRef: ExchangeContactsItemPath2.locationAsRepoRef().String(),
ShortRef: ExchangeContactsItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeContactsItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeContactsItemPath2.ItemLocation(),
LocationRef: ExchangeContactsItemPath2.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeContact,
ContactName: "another-person",
},
},
},
},
0: {
{
RepoRef: ExchangeContactsItemPath1.locationAsRepoRef().String(),
ShortRef: ExchangeContactsItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeContactsItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeContact,
ContactName: "a-person",
},
},
},
{
RepoRef: ExchangeContactsItemPath2.locationAsRepoRef().String(),
ShortRef: ExchangeContactsItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeContactsItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeContact,
ContactName: "another-person",
},
},
},
},
}
ExchangeEventsBasePath = mustPathRep("tenant-id/exchange/user-id/events/holidays", false)
ExchangeEventsBasePath2 = mustPathRep("tenant-id/exchange/user-id/events/moreholidays", false)
ExchangeEventsItemPath1 = ExchangeEventsBasePath.MustAppend(ItemName1, true)
ExchangeEventsItemPath2 = ExchangeEventsBasePath2.MustAppend(ItemName2, true)
exchangeEventsItemsByVersion = map[int][]details.Entry{
version.All8MigrateUserPNToID: {
{
RepoRef: ExchangeEventsItemPath1.RR.String(),
ShortRef: ExchangeEventsItemPath1.RR.ShortRef(),
ParentRef: ExchangeEventsItemPath1.RR.ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeEventsItemPath1.ItemLocation(),
LocationRef: ExchangeEventsItemPath1.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeEvent,
Organizer: "a-person",
Subject: "foo",
EventStart: Time1,
EventRecurs: false,
},
},
},
{
RepoRef: ExchangeEventsItemPath2.RR.String(),
ShortRef: ExchangeEventsItemPath2.RR.ShortRef(),
ParentRef: ExchangeEventsItemPath2.RR.ToBuilder().Dir().ShortRef(),
ItemRef: ExchangeEventsItemPath2.ItemLocation(),
LocationRef: ExchangeEventsItemPath2.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeEvent,
Organizer: "a-person",
Subject: "foo",
EventStart: Time2,
EventRecurs: true,
},
},
},
},
2: {
{
RepoRef: ExchangeEventsItemPath1.RR.String(),
ShortRef: ExchangeEventsItemPath1.RR.ShortRef(),
ParentRef: ExchangeEventsItemPath1.RR.ToBuilder().Dir().ShortRef(),
LocationRef: ExchangeEventsItemPath1.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeEvent,
Organizer: "a-person",
Subject: "foo",
EventStart: Time1,
EventRecurs: false,
},
},
},
{
RepoRef: ExchangeEventsItemPath2.RR.String(),
ShortRef: ExchangeEventsItemPath2.RR.ShortRef(),
ParentRef: ExchangeEventsItemPath2.RR.ToBuilder().Dir().ShortRef(),
LocationRef: ExchangeEventsItemPath2.Loc.String(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeEvent,
Organizer: "a-person",
Subject: "foo",
EventStart: Time2,
EventRecurs: true,
},
},
},
},
0: {
{
RepoRef: ExchangeEventsItemPath1.locationAsRepoRef().String(),
ShortRef: ExchangeEventsItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeEventsItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeEvent,
Organizer: "a-person",
Subject: "foo",
EventStart: Time1,
EventRecurs: false,
},
},
},
{
RepoRef: ExchangeEventsItemPath2.locationAsRepoRef().String(),
ShortRef: ExchangeEventsItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: ExchangeEventsItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
Exchange: &details.ExchangeInfo{
ItemType: details.ExchangeEvent,
Organizer: "a-person",
Subject: "foo",
EventStart: Time2,
EventRecurs: true,
},
},
},
},
}
OneDriveRootPath = mustPathRep("tenant-id/onedrive/user-id/files/drives/foo/root:", false)
OneDriveFolderPath = OneDriveRootPath.MustAppend("folder", false)
OneDriveBasePath1 = OneDriveFolderPath.MustAppend("a", false)
OneDriveBasePath2 = OneDriveFolderPath.MustAppend("b", false)
OneDriveItemPath1 = OneDriveFolderPath.MustAppend(ItemName1, true)
OneDriveItemPath2 = OneDriveBasePath1.MustAppend(ItemName2, true)
OneDriveItemPath3 = OneDriveBasePath2.MustAppend(ItemName3, true)
OneDriveFolderFolder = OneDriveFolderPath.Loc.PopFront().String()
OneDriveParentFolder1 = OneDriveBasePath1.Loc.PopFront().String()
OneDriveParentFolder2 = OneDriveBasePath2.Loc.PopFront().String()
oneDriveItemsByVersion = map[int][]details.Entry{
version.All8MigrateUserPNToID: {
{
RepoRef: OneDriveItemPath1.locationAsRepoRef().String(),
ShortRef: OneDriveItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemRef: OneDriveItemPath1.ItemLocation(),
LocationRef: OneDriveItemPath1.Loc.String(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveFolderFolder,
ItemName: OneDriveItemPath1.ItemLocation() + "name",
Size: int64(23),
Owner: UserEmail1,
Created: Time2,
Modified: Time4,
},
},
},
{
RepoRef: OneDriveItemPath2.locationAsRepoRef().String(),
ShortRef: OneDriveItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemRef: OneDriveItemPath2.ItemLocation(),
LocationRef: OneDriveItemPath2.Loc.String(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveParentFolder1,
ItemName: OneDriveItemPath2.ItemLocation() + "name",
Size: int64(42),
Owner: UserEmail1,
Created: Time1,
Modified: Time3,
},
},
},
{
RepoRef: OneDriveItemPath3.locationAsRepoRef().String(),
ShortRef: OneDriveItemPath3.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath3.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemRef: OneDriveItemPath3.ItemLocation(),
LocationRef: OneDriveItemPath3.Loc.String(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveParentFolder2,
ItemName: OneDriveItemPath3.ItemLocation() + "name",
Size: int64(19),
Owner: UserEmail2,
Created: Time2,
Modified: Time4,
},
},
},
},
version.OneDrive7LocationRef: {
{
RepoRef: OneDriveItemPath1.locationAsRepoRef().String(),
ShortRef: OneDriveItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
LocationRef: OneDriveItemPath1.Loc.String(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveFolderFolder,
ItemName: OneDriveItemPath1.ItemLocation() + "name",
Size: int64(23),
Owner: UserEmail1,
Created: Time2,
Modified: Time4,
},
},
},
{
RepoRef: OneDriveItemPath2.locationAsRepoRef().String(),
ShortRef: OneDriveItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
LocationRef: OneDriveItemPath2.Loc.String(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveParentFolder1,
ItemName: OneDriveItemPath2.ItemLocation() + "name",
Size: int64(42),
Owner: UserEmail1,
Created: Time1,
Modified: Time3,
},
},
},
{
RepoRef: OneDriveItemPath3.locationAsRepoRef().String(),
ShortRef: OneDriveItemPath3.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath3.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
LocationRef: OneDriveItemPath3.Loc.String(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveParentFolder2,
ItemName: OneDriveItemPath3.ItemLocation() + "name",
Size: int64(19),
Owner: UserEmail2,
Created: Time2,
Modified: Time4,
},
},
},
},
version.OneDrive6NameInMeta: {
{
RepoRef: OneDriveItemPath1.locationAsRepoRef().String(),
ShortRef: OneDriveItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveFolderFolder,
ItemName: OneDriveItemPath1.ItemLocation() + "name",
Size: int64(23),
Owner: UserEmail1,
Created: Time2,
Modified: Time4,
},
},
},
{
RepoRef: OneDriveItemPath2.locationAsRepoRef().String(),
ShortRef: OneDriveItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveParentFolder1,
ItemName: OneDriveItemPath2.ItemLocation() + "name",
Size: int64(42),
Owner: UserEmail1,
Created: Time1,
Modified: Time3,
},
},
},
{
RepoRef: OneDriveItemPath3.locationAsRepoRef().String(),
ShortRef: OneDriveItemPath3.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath3.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveParentFolder2,
ItemName: OneDriveItemPath3.ItemLocation() + "name",
Size: int64(19),
Owner: UserEmail2,
Created: Time2,
Modified: Time4,
},
},
},
},
0: {
{
RepoRef: OneDriveItemPath1.locationAsRepoRef().String() + "name",
ShortRef: OneDriveItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveFolderFolder,
ItemName: OneDriveItemPath1.ItemLocation() + "name",
Size: int64(23),
Owner: UserEmail1,
Created: Time2,
Modified: Time4,
},
},
},
{
RepoRef: OneDriveItemPath2.locationAsRepoRef().String() + "name",
ShortRef: OneDriveItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveParentFolder1,
ItemName: OneDriveItemPath2.ItemLocation() + "name",
Size: int64(42),
Owner: UserEmail1,
Created: Time1,
Modified: Time3,
},
},
},
{
RepoRef: OneDriveItemPath3.locationAsRepoRef().String() + "name",
ShortRef: OneDriveItemPath3.locationAsRepoRef().ShortRef(),
ParentRef: OneDriveItemPath3.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
OneDrive: &details.OneDriveInfo{
ItemType: details.OneDriveItem,
ParentPath: OneDriveParentFolder2,
ItemName: OneDriveItemPath3.ItemLocation() + "name",
Size: int64(19),
Owner: UserEmail2,
Created: Time2,
Modified: Time4,
},
},
},
},
}
GroupsRootPath = mustPathRep("tenant-id/groups/group-id/libraries/sites/site-id/drives/foo/root:", false)
SharePointRootPath = mustPathRep("tenant-id/sharepoint/site-id/libraries/drives/foo/root:", false)
SharePointLibraryPath = SharePointRootPath.MustAppend("library", false)
SharePointBasePath1 = SharePointLibraryPath.MustAppend("a", false)
SharePointBasePath2 = SharePointLibraryPath.MustAppend("b", false)
SharePointLibraryItemPath1 = SharePointLibraryPath.MustAppend(ItemName1, true)
SharePointLibraryItemPath2 = SharePointBasePath1.MustAppend(ItemName2, true)
SharePointLibraryItemPath3 = SharePointBasePath2.MustAppend(ItemName3, true)
SharePointLibraryFolder = SharePointLibraryPath.Loc.PopFront().String()
SharePointParentLibrary1 = SharePointBasePath1.Loc.PopFront().String()
SharePointParentLibrary2 = SharePointBasePath2.Loc.PopFront().String()
sharePointLibraryItemsByVersion = map[int][]details.Entry{
version.All8MigrateUserPNToID: {
{
RepoRef: SharePointLibraryItemPath1.locationAsRepoRef().String(),
ShortRef: SharePointLibraryItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemRef: SharePointLibraryItemPath1.ItemLocation(),
LocationRef: SharePointLibraryItemPath1.Loc.String(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.SharePointLibrary,
ParentPath: SharePointLibraryFolder,
ItemName: SharePointLibraryItemPath1.ItemLocation() + "name",
Size: int64(23),
Owner: UserEmail1,
Created: Time2,
Modified: Time4,
},
},
},
{
RepoRef: SharePointLibraryItemPath2.locationAsRepoRef().String(),
ShortRef: SharePointLibraryItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemRef: SharePointLibraryItemPath2.ItemLocation(),
LocationRef: SharePointLibraryItemPath2.Loc.String(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.SharePointLibrary,
ParentPath: SharePointParentLibrary1,
ItemName: SharePointLibraryItemPath2.ItemLocation() + "name",
Size: int64(42),
Owner: UserEmail1,
Created: Time1,
Modified: Time3,
},
},
},
{
RepoRef: SharePointLibraryItemPath3.locationAsRepoRef().String(),
ShortRef: SharePointLibraryItemPath3.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath3.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemRef: SharePointLibraryItemPath3.ItemLocation(),
LocationRef: SharePointLibraryItemPath3.Loc.String(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.SharePointLibrary,
ParentPath: SharePointParentLibrary2,
ItemName: SharePointLibraryItemPath3.ItemLocation() + "name",
Size: int64(19),
Owner: UserEmail2,
Created: Time2,
Modified: Time4,
},
},
},
},
version.OneDrive7LocationRef: {
{
RepoRef: SharePointLibraryItemPath1.locationAsRepoRef().String(),
ShortRef: SharePointLibraryItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
LocationRef: SharePointLibraryItemPath1.Loc.String(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.OneDriveItem,
ParentPath: SharePointLibraryFolder,
ItemName: SharePointLibraryItemPath1.ItemLocation() + "name",
Size: int64(23),
Owner: UserEmail1,
Created: Time2,
Modified: Time4,
},
},
},
{
RepoRef: SharePointLibraryItemPath2.locationAsRepoRef().String(),
ShortRef: SharePointLibraryItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
LocationRef: SharePointLibraryItemPath2.Loc.String(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.OneDriveItem,
ParentPath: SharePointParentLibrary1,
ItemName: SharePointLibraryItemPath2.ItemLocation() + "name",
Size: int64(42),
Owner: UserEmail1,
Created: Time1,
Modified: Time3,
},
},
},
{
RepoRef: SharePointLibraryItemPath3.locationAsRepoRef().String(),
ShortRef: SharePointLibraryItemPath3.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath3.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
LocationRef: SharePointLibraryItemPath3.Loc.String(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.OneDriveItem,
ParentPath: SharePointParentLibrary2,
ItemName: SharePointLibraryItemPath3.ItemLocation() + "name",
Size: int64(19),
Owner: UserEmail2,
Created: Time2,
Modified: Time4,
},
},
},
},
version.OneDrive6NameInMeta: {
{
RepoRef: SharePointLibraryItemPath1.locationAsRepoRef().String(),
ShortRef: SharePointLibraryItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.OneDriveItem,
ParentPath: SharePointLibraryFolder,
ItemName: SharePointLibraryItemPath1.ItemLocation() + "name",
Size: int64(23),
Owner: UserEmail1,
Created: Time2,
Modified: Time4,
},
},
},
{
RepoRef: SharePointLibraryItemPath2.locationAsRepoRef().String(),
ShortRef: SharePointLibraryItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.OneDriveItem,
ParentPath: SharePointParentLibrary1,
ItemName: SharePointLibraryItemPath2.ItemLocation() + "name",
Size: int64(42),
Owner: UserEmail1,
Created: Time1,
Modified: Time3,
},
},
},
{
RepoRef: SharePointLibraryItemPath3.locationAsRepoRef().String(),
ShortRef: SharePointLibraryItemPath3.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath3.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.OneDriveItem,
ParentPath: SharePointParentLibrary2,
ItemName: SharePointLibraryItemPath3.ItemLocation() + "name",
Size: int64(19),
Owner: UserEmail2,
Created: Time2,
Modified: Time4,
},
},
},
},
0: {
{
RepoRef: SharePointLibraryItemPath1.locationAsRepoRef().String() + "name",
ShortRef: SharePointLibraryItemPath1.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath1.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.OneDriveItem,
ParentPath: SharePointLibraryFolder,
ItemName: SharePointLibraryItemPath1.ItemLocation() + "name",
Size: int64(23),
Owner: UserEmail1,
Created: Time2,
Modified: Time4,
},
},
},
{
RepoRef: SharePointLibraryItemPath2.locationAsRepoRef().String() + "name",
ShortRef: SharePointLibraryItemPath2.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath2.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.OneDriveItem,
ParentPath: SharePointParentLibrary1,
ItemName: SharePointLibraryItemPath2.ItemLocation() + "name",
Size: int64(42),
Owner: UserEmail1,
Created: Time1,
Modified: Time3,
},
},
},
{
RepoRef: SharePointLibraryItemPath3.locationAsRepoRef().String() + "name",
ShortRef: SharePointLibraryItemPath3.locationAsRepoRef().ShortRef(),
ParentRef: SharePointLibraryItemPath3.locationAsRepoRef().ToBuilder().Dir().ShortRef(),
ItemInfo: details.ItemInfo{
SharePoint: &details.SharePointInfo{
ItemType: details.OneDriveItem,
ParentPath: SharePointParentLibrary2,
ItemName: SharePointLibraryItemPath3.ItemLocation() + "name",
Size: int64(19),
Owner: UserEmail2,
Created: Time2,
Modified: Time4,
},
},
},
},
}
)
func GetDetailsSetForVersion(t *testing.T, wantedVersion int) *details.Details {
entries := []details.Entry{}
// TODO(ashmrtn): At some point make an exported variable somewhere that has
// all the valid service/category pairs.
dataTypes := map[path.ServiceType][]path.CategoryType{
path.ExchangeService: {
path.EmailCategory,
path.EventsCategory,
path.ContactsCategory,
},
path.OneDriveService: {
path.FilesCategory,
},
path.SharePointService: {
path.LibrariesCategory,
},
}
for s, cats := range dataTypes {
for _, cat := range cats {
entries = append(entries, GetDeetsForVersion(t, s, cat, wantedVersion)...)
}
}
return &details.Details{
DetailsModel: details.DetailsModel{
Entries: entries,
},
}
}
// GetItemsForVersion returns the set of items for the requested
// (service, category, version) tuple that reside at the indicated indices. If
// -1 is the only index provided then returns all items.
func GetItemsForVersion(
t *testing.T,
service path.ServiceType,
cat path.CategoryType,
wantVersion int,
indices ...int,
) []details.Entry {
deets := GetDeetsForVersion(t, service, cat, wantVersion)
if len(indices) == 1 && indices[0] == -1 {
return deets
}
var res []details.Entry
for _, i := range indices {
require.Less(t, i, len(deets), "requested index out of bounds", i, len(deets))
res = append(res, deets[i])
}
return res
}
// GetDeetsForVersion returns the set of details with the highest
// version <= the requested version.
func GetDeetsForVersion(
t *testing.T,
service path.ServiceType,
cat path.CategoryType,
wantVersion int,
) []details.Entry {
var input map[int][]details.Entry
switch service {
case path.ExchangeService:
switch cat {
case path.EmailCategory:
input = exchangeEmailItemsByVersion
case path.EventsCategory:
input = exchangeEventsItemsByVersion
case path.ContactsCategory:
input = exchangeContactsItemsByVersion
}
case path.OneDriveService:
if cat == path.FilesCategory {
input = oneDriveItemsByVersion
}
case path.SharePointService:
if cat == path.LibrariesCategory {
input = sharePointLibraryItemsByVersion
}
}
require.NotNil(
t,
input,
"unsupported (service, category)",
service.String(),
cat.String())
return getDeetsForVersion(t, wantVersion, input)
}
func getDeetsForVersion(
t *testing.T,
wantVersion int,
deetsSet map[int][]details.Entry,
) []details.Entry {
var (
res []details.Entry
resVersion = version.NoBackup
)
for v, deets := range deetsSet {
if v <= wantVersion && v > resVersion {
resVersion = v
res = deets
}
}
require.NotEmpty(t, res, "unable to find details for version", wantVersion)
return slices.Clone(res)
}