OneDrive get and delete folder functions (#1093)
## Description Useful helper functions for the purge script ## Type of change <!--- Please check the type of change your PR introduces: ---> - [x] 🌻 Feature - [ ] 🐛 Bugfix - [ ] 🗺️ Documentation - [ ] 🤖 Test - [ ] 💻 CI/Deployment - [ ] 🐹 Trivial/Minor ## Issue(s) * #1090 ## Test Plan <!-- How will this be tested prior to merging.--> - [ ] 💪 Manual - [x] ⚡ Unit test - [ ] 💚 E2E
This commit is contained in:
parent
a5140d20b2
commit
dd7710ca5b
@ -3,6 +3,7 @@ package onedrive
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/microsoftgraph/msgraph-sdk-go/drives/item/items"
|
"github.com/microsoftgraph/msgraph-sdk-go/drives/item/items"
|
||||||
"github.com/microsoftgraph/msgraph-sdk-go/drives/item/items/item"
|
"github.com/microsoftgraph/msgraph-sdk-go/drives/item/items/item"
|
||||||
@ -158,3 +159,70 @@ func newItem(name string, folder bool) models.DriveItemable {
|
|||||||
|
|
||||||
return itemToCreate
|
return itemToCreate
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetAllFolders returns all folders in all drives for the given user. If a
|
||||||
|
// prefix is given, returns all folders with that prefix, regardless of if they
|
||||||
|
// are a subfolder or top-level folder in the hierarchy.
|
||||||
|
func GetAllFolders(
|
||||||
|
ctx context.Context,
|
||||||
|
gs graph.Service,
|
||||||
|
userID string,
|
||||||
|
prefix string,
|
||||||
|
) ([]models.DriveItemable, error) {
|
||||||
|
drives, err := drives(ctx, gs, userID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrap(err, "getting OneDrive folders")
|
||||||
|
}
|
||||||
|
|
||||||
|
res := []models.DriveItemable{}
|
||||||
|
|
||||||
|
for _, d := range drives {
|
||||||
|
err = collectItems(
|
||||||
|
ctx,
|
||||||
|
gs,
|
||||||
|
*d.GetId(),
|
||||||
|
func(innerCtx context.Context, driveID string, items []models.DriveItemable) error {
|
||||||
|
for _, item := range items {
|
||||||
|
// Skip the root item.
|
||||||
|
if item.GetRoot() != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only selecting folders right now, not packages.
|
||||||
|
if item.GetFolder() == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.HasPrefix(*item.GetName(), prefix) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the item instead of the folder because the item has more
|
||||||
|
// functionality.
|
||||||
|
res = append(res, item)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.Wrapf(err, "getting items for drive %s", *d.GetName())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteItem(
|
||||||
|
ctx context.Context,
|
||||||
|
gs graph.Service,
|
||||||
|
driveID string,
|
||||||
|
itemID string,
|
||||||
|
) error {
|
||||||
|
err := gs.Client().DrivesById(driveID).ItemsById(itemID).Delete(ctx, nil)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrapf(err, "deleting item with ID %s", itemID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
146
src/internal/connector/onedrive/drive_test.go
Normal file
146
src/internal/connector/onedrive/drive_test.go
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
package onedrive
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
msgraphsdk "github.com/microsoftgraph/msgraph-sdk-go"
|
||||||
|
"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/connector/graph"
|
||||||
|
"github.com/alcionai/corso/src/internal/tester"
|
||||||
|
"github.com/alcionai/corso/src/pkg/account"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TODO(ashmrtn): Merge with similar structs in graph and exchange packages.
|
||||||
|
type testService struct {
|
||||||
|
adapter msgraphsdk.GraphRequestAdapter
|
||||||
|
client msgraphsdk.GraphServiceClient
|
||||||
|
failFast bool
|
||||||
|
credentials account.M365Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ts *testService) Client() *msgraphsdk.GraphServiceClient {
|
||||||
|
return &ts.client
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ts *testService) Adapter() *msgraphsdk.GraphRequestAdapter {
|
||||||
|
return &ts.adapter
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ts *testService) ErrPolicy() bool {
|
||||||
|
return ts.failFast
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(ashmrtn): Merge with similar functions in connector and exchange
|
||||||
|
// packages.
|
||||||
|
func loadService(t *testing.T) *testService {
|
||||||
|
a := tester.NewM365Account(t)
|
||||||
|
m365, err := a.M365Config()
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
adapter, err := graph.CreateAdapter(
|
||||||
|
m365.TenantID,
|
||||||
|
m365.ClientID,
|
||||||
|
m365.ClientSecret,
|
||||||
|
)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
service := &testService{
|
||||||
|
adapter: *adapter,
|
||||||
|
client: *msgraphsdk.NewGraphServiceClient(adapter),
|
||||||
|
failFast: false,
|
||||||
|
credentials: m365,
|
||||||
|
}
|
||||||
|
|
||||||
|
return service
|
||||||
|
}
|
||||||
|
|
||||||
|
type OneDriveSuite struct {
|
||||||
|
suite.Suite
|
||||||
|
userID string
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestOneDriveDriveSuite(t *testing.T) {
|
||||||
|
if err := tester.RunOnAny(
|
||||||
|
tester.CorsoCITests,
|
||||||
|
tester.CorsoOneDriveTests,
|
||||||
|
); err != nil {
|
||||||
|
t.Skip(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
suite.Run(t, new(OneDriveSuite))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *OneDriveSuite) SetupSuite() {
|
||||||
|
suite.userID = tester.M365UserID(suite.T())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *OneDriveSuite) TestCreateGetDeleteFolder() {
|
||||||
|
t := suite.T()
|
||||||
|
ctx := context.Background()
|
||||||
|
folderIDs := []string{}
|
||||||
|
folderName1 := "Corso_Folder_Test_" + common.FormatNow(common.SimpleTimeTesting)
|
||||||
|
folderElements := []string{folderName1}
|
||||||
|
gs := loadService(t)
|
||||||
|
|
||||||
|
drives, err := drives(ctx, gs, suite.userID)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.NotEmpty(t, drives)
|
||||||
|
|
||||||
|
driveID := *drives[0].GetId()
|
||||||
|
|
||||||
|
folderID, err := createRestoreFolders(ctx, gs, driveID, folderElements)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
folderIDs = append(folderIDs, folderID)
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
assert.NoError(t, DeleteItem(ctx, gs, driveID, folderIDs[0]))
|
||||||
|
}()
|
||||||
|
|
||||||
|
folderName2 := "Corso_Folder_Test_" + common.FormatNow(common.SimpleTimeTesting)
|
||||||
|
folderElements = append(folderElements, folderName2)
|
||||||
|
|
||||||
|
folderID, err = createRestoreFolders(ctx, gs, driveID, folderElements)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
folderIDs = append(folderIDs, folderID)
|
||||||
|
|
||||||
|
table := []struct {
|
||||||
|
name string
|
||||||
|
prefix string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "NoPrefix",
|
||||||
|
prefix: "",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Prefix",
|
||||||
|
prefix: "Corso_Folder_Test",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range table {
|
||||||
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
|
allFolders, err := GetAllFolders(ctx, gs, suite.userID, test.prefix)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
foundFolderIDs := []string{}
|
||||||
|
|
||||||
|
for _, f := range allFolders {
|
||||||
|
if *f.GetName() == folderName1 || *f.GetName() == folderName2 {
|
||||||
|
foundFolderIDs = append(foundFolderIDs, *f.GetId())
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.True(t, strings.HasPrefix(*f.GetName(), test.prefix), "folder prefix")
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.ElementsMatch(t, folderIDs, foundFolderIDs)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -19,6 +19,7 @@ const (
|
|||||||
CorsoGraphConnectorTests = "CORSO_GRAPH_CONNECTOR_TESTS"
|
CorsoGraphConnectorTests = "CORSO_GRAPH_CONNECTOR_TESTS"
|
||||||
CorsoKopiaWrapperTests = "CORSO_KOPIA_WRAPPER_TESTS"
|
CorsoKopiaWrapperTests = "CORSO_KOPIA_WRAPPER_TESTS"
|
||||||
CorsoModelStoreTests = "CORSO_MODEL_STORE_TESTS"
|
CorsoModelStoreTests = "CORSO_MODEL_STORE_TESTS"
|
||||||
|
CorsoOneDriveTests = "CORSO_ONE_DRIVE_TESTS"
|
||||||
CorsoOperationTests = "CORSO_OPERATION_TESTS"
|
CorsoOperationTests = "CORSO_OPERATION_TESTS"
|
||||||
CorsoRepositoryTests = "CORSO_REPOSITORY_TESTS"
|
CorsoRepositoryTests = "CORSO_REPOSITORY_TESTS"
|
||||||
)
|
)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user