diff --git a/src/internal/common/ptr/pointer.go b/src/internal/common/ptr/pointer.go index a8f9a02b9..e3d4e7eda 100644 --- a/src/internal/common/ptr/pointer.go +++ b/src/internal/common/ptr/pointer.go @@ -43,3 +43,10 @@ func OrNow(t *time.Time) time.Time { return *t } + +// To makes it easy to get a pointer to ad-hoc primitives +// without needing to declare additional variables. +// ex: ptr.To("a string") +func To[T any](t T) *T { + return &t +} diff --git a/src/internal/connector/onedrive/collections.go b/src/internal/connector/onedrive/collections.go index 2899e83fc..86a0048a2 100644 --- a/src/internal/connector/onedrive/collections.go +++ b/src/internal/connector/onedrive/collections.go @@ -272,7 +272,7 @@ func (c *Collections) Get( retry := c.source == OneDriveSource - drives, err := drives(ctx, pager, retry) + drives, err := Drives(ctx, pager, retry) if err != nil { return nil, nil, err } diff --git a/src/internal/connector/onedrive/drive.go b/src/internal/connector/onedrive/drive.go index bcc78b124..c93658f40 100644 --- a/src/internal/connector/onedrive/drive.go +++ b/src/internal/connector/onedrive/drive.go @@ -72,7 +72,7 @@ func PagerForSource( } } -func drives( +func Drives( ctx context.Context, pager drivePager, retry bool, @@ -362,7 +362,7 @@ func GetAllFolders( prefix string, errs *fault.Bus, ) ([]*Displayable, error) { - drives, err := drives(ctx, pager, true) + drives, err := Drives(ctx, pager, true) if err != nil { return nil, errors.Wrap(err, "getting OneDrive folders") } diff --git a/src/internal/connector/onedrive/drive_test.go b/src/internal/connector/onedrive/drive_test.go index f72514baf..28296fc19 100644 --- a/src/internal/connector/onedrive/drive_test.go +++ b/src/internal/connector/onedrive/drive_test.go @@ -313,7 +313,7 @@ func (suite *OneDriveUnitSuite) TestDrives() { toReturn: test.pagerResults, } - drives, err := drives(ctx, pager, test.retry) + drives, err := Drives(ctx, pager, test.retry) test.expectedErr(t, err) assert.ElementsMatch(t, test.expectedResults, drives) @@ -355,7 +355,7 @@ func (suite *OneDriveSuite) TestCreateGetDeleteFolder() { pager, err := PagerForSource(OneDriveSource, gs, suite.userID, nil) require.NoError(t, err) - drives, err := drives(ctx, pager, true) + drives, err := Drives(ctx, pager, true) require.NoError(t, err) require.NotEmpty(t, drives) diff --git a/src/internal/connector/onedrive/item_test.go b/src/internal/connector/onedrive/item_test.go index fca6a5614..e02e8f968 100644 --- a/src/internal/connector/onedrive/item_test.go +++ b/src/internal/connector/onedrive/item_test.go @@ -46,7 +46,7 @@ func (suite *ItemIntegrationSuite) SetupSuite() { pager, err := PagerForSource(OneDriveSource, suite.service, suite.user, nil) require.NoError(t, err) - odDrives, err := drives(ctx, pager, true) + odDrives, err := Drives(ctx, pager, true) require.NoError(t, err) // Test Requirement 1: Need a drive require.Greaterf(t, len(odDrives), 0, "user %s does not have a drive", suite.user) diff --git a/src/pkg/repository/loadtest/repository_load_test.go b/src/pkg/repository/loadtest/repository_load_test.go index b29c00dcb..7592bfa40 100644 --- a/src/pkg/repository/loadtest/repository_load_test.go +++ b/src/pkg/repository/loadtest/repository_load_test.go @@ -395,7 +395,7 @@ func normalizeCategorySet(t *testing.T, cats map[string]struct{}) []string { // multiple users type RepositoryLoadTestExchangeSuite struct { - suite.Suite + tester.Suite ctx context.Context repo repository.Repository acct account.Account //lint:ignore U1000 future test use diff --git a/src/pkg/repository/repository_test.go b/src/pkg/repository/repository_test.go index 301dda50e..6d0821ca2 100644 --- a/src/pkg/repository/repository_test.go +++ b/src/pkg/repository/repository_test.go @@ -3,10 +3,15 @@ package repository_test import ( "testing" + "github.com/microsoftgraph/msgraph-sdk-go/models" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" + "github.com/alcionai/corso/src/internal/common" + "github.com/alcionai/corso/src/internal/common/ptr" + "github.com/alcionai/corso/src/internal/connector/graph" + "github.com/alcionai/corso/src/internal/connector/onedrive" "github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/control" @@ -97,6 +102,7 @@ func (suite *RepositorySuite) TestConnect() { type RepositoryIntegrationSuite struct { tester.Suite + userID string } func TestRepositoryIntegrationSuite(t *testing.T) { @@ -109,6 +115,10 @@ func TestRepositoryIntegrationSuite(t *testing.T) { }) } +func (suite *RepositoryIntegrationSuite) SetupSuite() { + suite.userID = tester.M365UserID(suite.T()) +} + func (suite *RepositoryIntegrationSuite) TestInitialize() { ctx, flush := tester.NewContext() defer flush() @@ -219,3 +229,68 @@ func (suite *RepositoryIntegrationSuite) TestNewRestore() { require.NoError(t, err) require.NotNil(t, ro) } + +func (suite *RepositoryIntegrationSuite) TestBackupDetails_regression() { + ctx, flush := tester.NewContext() + defer flush() + + var ( + t = suite.T() + acct = tester.NewM365Account(t) + st = tester.NewPrefixedS3Storage(t) + dest = "Corso_Restore_empty_" + common.FormatNow(common.SimpleTimeTesting) + ) + + m365, err := acct.M365Config() + require.NoError(t, err) + + adpt, err := graph.CreateAdapter(acct.ID(), m365.AzureClientID, m365.AzureClientSecret) + require.NoError(t, err) + + srv := graph.NewService(adpt) + + pager, err := onedrive.PagerForSource(onedrive.OneDriveSource, srv, suite.userID, nil) + require.NoError(t, err) + + drives, err := onedrive.Drives(ctx, pager, false) + require.NoError(t, err) + + d0 := drives[0] + body := models.DriveItem{} + body.SetName(&dest) + + fld := models.Folder{} + fld.SetChildCount(ptr.To[int32](0)) + body.SetFolder(&fld) + // body.SetWebUrl(ptr.To(ptr.Val(d0.GetWebUrl()) + "/" + dest)) + + _, err = srv.Client(). + UsersById(suite.userID). + DrivesById(*d0.GetId()). + Items(). + Post(ctx, &body, nil) + require.NoErrorf(t, err, "%+v", graph.ErrData(err)) + + r, err := repository.Initialize(ctx, acct, st, control.Options{}) + require.NoError(t, err) + + sel := selectors.NewOneDriveBackup([]string{suite.userID}) + sel.Include(sel.Folders([]string{dest})) + + op, err := r.NewBackup(ctx, sel.Selector) + require.NoError(t, err) + require.NoError(t, op.Run(ctx)) + require.NotZero(t, op.Results.ItemsWritten) + + // the actual test. The backup details, having backed up an empty folder, + // should not return the folder within the backup details. That value + // should get filtered out, along with .meta and .dirmeta files. + deets, _, ferr := r.BackupDetails(ctx, string(op.Results.BackupID)) + require.NoError(t, ferr.Failure()) + + for _, ent := range deets.Entries { + assert.NotContains(t, ent.RepoRef, dest) + assert.NotContains(t, ent.RepoRef, onedrive.MetaFileSuffix) + assert.NotContains(t, ent.RepoRef, onedrive.DirMetaFileSuffix) + } +}