add integration tests for missing drives
This commit is contained in:
parent
8db03d4cd7
commit
919d59dd69
@ -5,6 +5,9 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/alcionai/clues"
|
"github.com/alcionai/clues"
|
||||||
|
"github.com/google/uuid"
|
||||||
|
"github.com/microsoftgraph/msgraph-sdk-go/models"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
|
||||||
@ -19,6 +22,8 @@ import (
|
|||||||
"github.com/alcionai/corso/src/internal/version"
|
"github.com/alcionai/corso/src/internal/version"
|
||||||
deeTD "github.com/alcionai/corso/src/pkg/backup/details/testdata"
|
deeTD "github.com/alcionai/corso/src/pkg/backup/details/testdata"
|
||||||
"github.com/alcionai/corso/src/pkg/control"
|
"github.com/alcionai/corso/src/pkg/control"
|
||||||
|
ctrlTD "github.com/alcionai/corso/src/pkg/control/testdata"
|
||||||
|
"github.com/alcionai/corso/src/pkg/count"
|
||||||
"github.com/alcionai/corso/src/pkg/path"
|
"github.com/alcionai/corso/src/pkg/path"
|
||||||
"github.com/alcionai/corso/src/pkg/selectors"
|
"github.com/alcionai/corso/src/pkg/selectors"
|
||||||
selTD "github.com/alcionai/corso/src/pkg/selectors/testdata"
|
selTD "github.com/alcionai/corso/src/pkg/selectors/testdata"
|
||||||
@ -196,7 +201,7 @@ func (suite *SharePointRestoreIntgSuite) SetupSuite() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (suite *SharePointRestoreIntgSuite) TestRestore_Run_sharepointWithAdvancedOptions() {
|
func (suite *SharePointRestoreIntgSuite) TestRestore_Run_sharepointWithAdvancedOptions() {
|
||||||
sel := selectors.NewSharePointBackup([]string{suite.its.userID})
|
sel := selectors.NewSharePointBackup([]string{suite.its.siteID})
|
||||||
sel.Include(selTD.SharePointBackupFolderScope(sel))
|
sel.Include(selTD.SharePointBackupFolderScope(sel))
|
||||||
sel.Filter(sel.Library("documents"))
|
sel.Filter(sel.Library("documents"))
|
||||||
sel.DiscreteOwner = suite.its.siteID
|
sel.DiscreteOwner = suite.its.siteID
|
||||||
@ -209,3 +214,235 @@ func (suite *SharePointRestoreIntgSuite) TestRestore_Run_sharepointWithAdvancedO
|
|||||||
suite.its.siteDriveID,
|
suite.its.siteDriveID,
|
||||||
suite.its.siteDriveRootFolderID)
|
suite.its.siteDriveRootFolderID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *SharePointRestoreIntgSuite) TestRestore_Run_sharepointDeletedDrives() {
|
||||||
|
t := suite.T()
|
||||||
|
|
||||||
|
ctx, flush := tester.NewContext(t)
|
||||||
|
defer flush()
|
||||||
|
|
||||||
|
rc := ctrlTD.DefaultRestoreConfig("restore_deleted_drives")
|
||||||
|
rc.OnCollision = control.Copy
|
||||||
|
|
||||||
|
// create a new drive
|
||||||
|
md, err := suite.its.ac.Lists().PostDrive(ctx, suite.its.siteID, rc.Location)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
driveID := ptr.Val(md.GetId())
|
||||||
|
|
||||||
|
// get the root folder
|
||||||
|
mdi, err := suite.its.ac.Drives().GetRootFolder(ctx, driveID)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
rootFolderID := ptr.Val(mdi.GetId())
|
||||||
|
|
||||||
|
// add an item to it
|
||||||
|
itemName := uuid.NewString()
|
||||||
|
|
||||||
|
item := models.NewDriveItem()
|
||||||
|
item.SetName(ptr.To(itemName + ".txt"))
|
||||||
|
|
||||||
|
file := models.NewFile()
|
||||||
|
item.SetFile(file)
|
||||||
|
|
||||||
|
_, err = suite.its.ac.Drives().PostItemInContainer(
|
||||||
|
ctx,
|
||||||
|
driveID,
|
||||||
|
rootFolderID,
|
||||||
|
item,
|
||||||
|
control.Copy)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
// run a backup
|
||||||
|
var (
|
||||||
|
mb = evmock.NewBus()
|
||||||
|
opts = control.Defaults()
|
||||||
|
graphClient = suite.its.ac.Stable.Client()
|
||||||
|
)
|
||||||
|
|
||||||
|
bsel := selectors.NewSharePointBackup([]string{suite.its.siteID})
|
||||||
|
bsel.Include(selTD.SharePointBackupFolderScope(bsel))
|
||||||
|
bsel.Filter(bsel.Library(rc.Location))
|
||||||
|
bsel.DiscreteOwner = suite.its.siteID
|
||||||
|
|
||||||
|
bo, bod := prepNewTestBackupOp(t, ctx, mb, bsel.Selector, opts, version.Backup)
|
||||||
|
defer bod.close(t, ctx)
|
||||||
|
|
||||||
|
runAndCheckBackup(t, ctx, &bo, mb, false)
|
||||||
|
|
||||||
|
// test cases:
|
||||||
|
|
||||||
|
// first test, we take the current drive and rename it.
|
||||||
|
// the restore should find the drive by id and restore items
|
||||||
|
// into it like normal. Due to collision handling, this should
|
||||||
|
// create a copy of the current item.
|
||||||
|
suite.Run("renamed drive", func() {
|
||||||
|
t := suite.T()
|
||||||
|
|
||||||
|
ctx, flush := tester.NewContext(t)
|
||||||
|
defer flush()
|
||||||
|
|
||||||
|
md.SetName(ptr.To("some other name"))
|
||||||
|
|
||||||
|
md, err = graphClient.
|
||||||
|
Drives().
|
||||||
|
ByDriveId(driveID).
|
||||||
|
Patch(ctx, md, nil)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
var (
|
||||||
|
mb = evmock.NewBus()
|
||||||
|
ctr = count.New()
|
||||||
|
)
|
||||||
|
|
||||||
|
ro, _ := prepNewTestRestoreOp(
|
||||||
|
t,
|
||||||
|
ctx,
|
||||||
|
bod.st,
|
||||||
|
bo.Results.BackupID,
|
||||||
|
mb,
|
||||||
|
ctr,
|
||||||
|
bod.sel,
|
||||||
|
opts,
|
||||||
|
rc)
|
||||||
|
|
||||||
|
runAndCheckRestore(t, ctx, &ro, mb, false)
|
||||||
|
assert.Equal(t, 1, ctr.Get(count.NewItemCreated), "restored an item")
|
||||||
|
|
||||||
|
resp, err := graphClient.
|
||||||
|
Drives().
|
||||||
|
ByDriveId(driveID).
|
||||||
|
Items().
|
||||||
|
ByDriveItemId(rootFolderID).
|
||||||
|
Children().
|
||||||
|
Get(ctx, nil)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
items := resp.GetValue()
|
||||||
|
assert.Len(t, items, 2)
|
||||||
|
|
||||||
|
for _, item := range items {
|
||||||
|
assert.Contains(t, ptr.Val(item.GetName()), itemName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// second test, we delete the drive altogether. the restore should find
|
||||||
|
// no existing drives, but it should have the old drive's name and attempt
|
||||||
|
// to recreate that drive by name.
|
||||||
|
suite.Run("deleted drive", func() {
|
||||||
|
t := suite.T()
|
||||||
|
|
||||||
|
ctx, flush := tester.NewContext(t)
|
||||||
|
defer flush()
|
||||||
|
|
||||||
|
err = graphClient.
|
||||||
|
Drives().
|
||||||
|
ByDriveId(driveID).
|
||||||
|
Delete(ctx, nil)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
var (
|
||||||
|
mb = evmock.NewBus()
|
||||||
|
ctr = count.New()
|
||||||
|
)
|
||||||
|
|
||||||
|
ro, _ := prepNewTestRestoreOp(
|
||||||
|
t,
|
||||||
|
ctx,
|
||||||
|
bod.st,
|
||||||
|
bo.Results.BackupID,
|
||||||
|
mb,
|
||||||
|
ctr,
|
||||||
|
bod.sel,
|
||||||
|
opts,
|
||||||
|
rc)
|
||||||
|
|
||||||
|
runAndCheckRestore(t, ctx, &ro, mb, false)
|
||||||
|
assert.Equal(t, 1, ctr.Get(count.NewItemCreated), "restored an item")
|
||||||
|
|
||||||
|
pgr := suite.its.ac.
|
||||||
|
Drives().
|
||||||
|
NewSiteDrivePager(suite.its.siteID, []string{"id", "name"})
|
||||||
|
|
||||||
|
drives, err := api.GetAllDrives(ctx, pgr, false, -1)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
var created models.Driveable
|
||||||
|
|
||||||
|
for _, drive := range drives {
|
||||||
|
if ptr.Val(drive.GetName()) == ptr.Val(created.GetName()) &&
|
||||||
|
ptr.Val(drive.GetId()) != driveID {
|
||||||
|
created = drive
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NotNil(t, created, "found the restored drive by name")
|
||||||
|
md = created
|
||||||
|
driveID = ptr.Val(md.GetId())
|
||||||
|
|
||||||
|
mdi, err := suite.its.ac.Drives().GetRootFolder(ctx, driveID)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
rootFolderID = ptr.Val(mdi.GetId())
|
||||||
|
|
||||||
|
resp, err := graphClient.
|
||||||
|
Drives().
|
||||||
|
ByDriveId(driveID).
|
||||||
|
Items().
|
||||||
|
ByDriveItemId(rootFolderID).
|
||||||
|
Children().
|
||||||
|
Get(ctx, nil)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
items := resp.GetValue()
|
||||||
|
assert.Len(t, items, 1)
|
||||||
|
|
||||||
|
assert.Equal(t, ptr.Val(items[0].GetName()), itemName+".txt")
|
||||||
|
})
|
||||||
|
|
||||||
|
// final test, run a follow-up restore. This should match the
|
||||||
|
// drive we created in the prior test by name, but not by ID.
|
||||||
|
suite.Run("different drive - same name", func() {
|
||||||
|
t := suite.T()
|
||||||
|
|
||||||
|
ctx, flush := tester.NewContext(t)
|
||||||
|
defer flush()
|
||||||
|
|
||||||
|
var (
|
||||||
|
mb = evmock.NewBus()
|
||||||
|
ctr = count.New()
|
||||||
|
)
|
||||||
|
|
||||||
|
ro, _ := prepNewTestRestoreOp(
|
||||||
|
t,
|
||||||
|
ctx,
|
||||||
|
bod.st,
|
||||||
|
bo.Results.BackupID,
|
||||||
|
mb,
|
||||||
|
ctr,
|
||||||
|
bod.sel,
|
||||||
|
opts,
|
||||||
|
rc)
|
||||||
|
|
||||||
|
runAndCheckRestore(t, ctx, &ro, mb, false)
|
||||||
|
|
||||||
|
assert.Equal(t, 1, ctr.Get(count.NewItemCreated), "restored an item")
|
||||||
|
|
||||||
|
resp, err := graphClient.
|
||||||
|
Drives().
|
||||||
|
ByDriveId(driveID).
|
||||||
|
Items().
|
||||||
|
ByDriveItemId(rootFolderID).
|
||||||
|
Children().
|
||||||
|
Get(ctx, nil)
|
||||||
|
require.NoError(t, err, clues.ToCore(err))
|
||||||
|
|
||||||
|
items := resp.GetValue()
|
||||||
|
assert.Len(t, items, 2)
|
||||||
|
|
||||||
|
for _, item := range items {
|
||||||
|
assert.Contains(t, ptr.Val(item.GetName()), itemName)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user