add filtered details regression test

extends testing for filtered details results by
adding a regression test that crates a folder
with zero items, backs it up, and calls the
repo.BackupDetails to ensure that the folder
and its dirmeta files are not present.
This commit is contained in:
ryanfkeepers 2023-02-28 13:02:43 -07:00
parent 3cd6c803af
commit a931f40896
7 changed files with 89 additions and 7 deletions

View File

@ -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
}

View File

@ -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
}

View File

@ -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")
}

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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)
}
}