generates test lists for sanity test (#5035)
generates test lists for CI sanity tests #### Does this PR need a docs update or release note? - [ ] ✅ Yes, it's included - [ ] 🕐 Yes, but in a later PR - [x] ⛔ No #### Type of change <!--- Please check the type of change your PR introduces: ---> - [ ] 🌻 Feature - [ ] 🐛 Bugfix - [ ] 🗺️ Documentation - [x] 🤖 Supportability/Tests - [ ] 💻 CI/Deployment - [ ] 🧹 Tech Debt/Cleanup #### Issue(s) #4754 #### Test Plan <!-- How will this be tested prior to merging.--> - [x] 💪 Manual - [x] ⚡ Unit test - [x] 💚 E2E
This commit is contained in:
parent
07da7f16a1
commit
8ca1a05400
@ -18,6 +18,7 @@ import (
|
|||||||
"github.com/alcionai/corso/src/internal/m365"
|
"github.com/alcionai/corso/src/internal/m365"
|
||||||
exchMock "github.com/alcionai/corso/src/internal/m365/service/exchange/mock"
|
exchMock "github.com/alcionai/corso/src/internal/m365/service/exchange/mock"
|
||||||
odStub "github.com/alcionai/corso/src/internal/m365/service/onedrive/stub"
|
odStub "github.com/alcionai/corso/src/internal/m365/service/onedrive/stub"
|
||||||
|
siteMock "github.com/alcionai/corso/src/internal/m365/service/sharepoint/mock"
|
||||||
m365Stub "github.com/alcionai/corso/src/internal/m365/stub"
|
m365Stub "github.com/alcionai/corso/src/internal/m365/stub"
|
||||||
"github.com/alcionai/corso/src/internal/operations/inject"
|
"github.com/alcionai/corso/src/internal/operations/inject"
|
||||||
"github.com/alcionai/corso/src/internal/tester"
|
"github.com/alcionai/corso/src/internal/tester"
|
||||||
@ -58,7 +59,7 @@ func generateAndRestoreItems(
|
|||||||
service path.ServiceType,
|
service path.ServiceType,
|
||||||
cat path.CategoryType,
|
cat path.CategoryType,
|
||||||
sel selectors.Selector,
|
sel selectors.Selector,
|
||||||
tenantID, userID, destFldr string,
|
tenantID, resourceID, destFldr string,
|
||||||
howMany int,
|
howMany int,
|
||||||
dbf dataBuilderFunc,
|
dbf dataBuilderFunc,
|
||||||
opts control.Options,
|
opts control.Options,
|
||||||
@ -73,7 +74,7 @@ func generateAndRestoreItems(
|
|||||||
nowLegacy = dttm.FormatToLegacy(time.Now())
|
nowLegacy = dttm.FormatToLegacy(time.Now())
|
||||||
id = uuid.NewString()
|
id = uuid.NewString()
|
||||||
subject = "automated " + now[:16] + " - " + id[:8]
|
subject = "automated " + now[:16] + " - " + id[:8]
|
||||||
body = "automated " + cat.HumanString() + " generation for " + userID + " at " + now + " - " + id
|
body = "automated " + cat.HumanString() + " generation for " + resourceID + " at " + now + " - " + id
|
||||||
)
|
)
|
||||||
|
|
||||||
items = append(items, item{
|
items = append(items, item{
|
||||||
@ -94,7 +95,7 @@ func generateAndRestoreItems(
|
|||||||
|
|
||||||
dataColls, err := buildCollections(
|
dataColls, err := buildCollections(
|
||||||
service,
|
service,
|
||||||
tenantID, userID,
|
tenantID, resourceID,
|
||||||
restoreCfg,
|
restoreCfg,
|
||||||
collections)
|
collections)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -192,17 +193,44 @@ type collection struct {
|
|||||||
|
|
||||||
func buildCollections(
|
func buildCollections(
|
||||||
service path.ServiceType,
|
service path.ServiceType,
|
||||||
tenant, user string,
|
tenant, resource string,
|
||||||
restoreCfg control.RestoreConfig,
|
restoreCfg control.RestoreConfig,
|
||||||
colls []collection,
|
colls []collection,
|
||||||
) ([]data.RestoreCollection, error) {
|
) ([]data.RestoreCollection, error) {
|
||||||
collections := make([]data.RestoreCollection, 0, len(colls))
|
var (
|
||||||
|
collections = make([]data.RestoreCollection, 0, len(colls))
|
||||||
|
mc data.Collection
|
||||||
|
)
|
||||||
|
|
||||||
for _, c := range colls {
|
for _, c := range colls {
|
||||||
|
switch {
|
||||||
|
case service == path.ExchangeService:
|
||||||
|
emc, err := generateExchangeMockColls(tenant, resource, c)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
mc = emc
|
||||||
|
case service == path.SharePointService:
|
||||||
|
smc, err := generateSharepointListsMockColls(tenant, resource, c)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
mc = smc
|
||||||
|
}
|
||||||
|
|
||||||
|
collections = append(collections, data.NoFetchRestoreCollection{Collection: mc})
|
||||||
|
}
|
||||||
|
|
||||||
|
return collections, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateExchangeMockColls(tenant string, resource string, c collection) (*exchMock.DataCollection, error) {
|
||||||
pth, err := path.Build(
|
pth, err := path.Build(
|
||||||
tenant,
|
tenant,
|
||||||
user,
|
resource,
|
||||||
service,
|
path.ExchangeService,
|
||||||
c.category,
|
c.category,
|
||||||
false,
|
false,
|
||||||
c.PathElements...)
|
c.PathElements...)
|
||||||
@ -210,17 +238,35 @@ func buildCollections(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
mc := exchMock.NewCollection(pth, pth, len(c.items))
|
emc := exchMock.NewCollection(pth, pth, len(c.items))
|
||||||
|
|
||||||
for i := 0; i < len(c.items); i++ {
|
for i := 0; i < len(c.items); i++ {
|
||||||
mc.Names[i] = c.items[i].name
|
emc.Names[i] = c.items[i].name
|
||||||
mc.Data[i] = c.items[i].data
|
emc.Data[i] = c.items[i].data
|
||||||
}
|
}
|
||||||
|
|
||||||
collections = append(collections, data.NoFetchRestoreCollection{Collection: mc})
|
return emc, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateSharepointListsMockColls(tenant string, resource string, c collection) (*siteMock.ListCollection, error) {
|
||||||
|
pth, err := path.BuildOrPrefix(
|
||||||
|
tenant,
|
||||||
|
resource,
|
||||||
|
path.SharePointService,
|
||||||
|
c.category,
|
||||||
|
false)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return collections, nil
|
smc := siteMock.NewCollection(pth, pth, len(c.items))
|
||||||
|
|
||||||
|
for i := 0; i < len(c.items); i++ {
|
||||||
|
smc.Names[i] = c.items[i].name
|
||||||
|
smc.Data[i] = c.items[i].data
|
||||||
|
}
|
||||||
|
|
||||||
|
return smc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|||||||
@ -7,6 +7,8 @@ import (
|
|||||||
|
|
||||||
. "github.com/alcionai/corso/src/cli/print"
|
. "github.com/alcionai/corso/src/cli/print"
|
||||||
"github.com/alcionai/corso/src/cli/utils"
|
"github.com/alcionai/corso/src/cli/utils"
|
||||||
|
siteMock "github.com/alcionai/corso/src/internal/m365/service/sharepoint/mock"
|
||||||
|
"github.com/alcionai/corso/src/pkg/control"
|
||||||
"github.com/alcionai/corso/src/pkg/count"
|
"github.com/alcionai/corso/src/pkg/count"
|
||||||
"github.com/alcionai/corso/src/pkg/fault"
|
"github.com/alcionai/corso/src/pkg/fault"
|
||||||
"github.com/alcionai/corso/src/pkg/logger"
|
"github.com/alcionai/corso/src/pkg/logger"
|
||||||
@ -14,14 +16,23 @@ import (
|
|||||||
"github.com/alcionai/corso/src/pkg/selectors"
|
"github.com/alcionai/corso/src/pkg/selectors"
|
||||||
)
|
)
|
||||||
|
|
||||||
var spFilesCmd = &cobra.Command{
|
var (
|
||||||
|
spFilesCmd = &cobra.Command{
|
||||||
Use: "files",
|
Use: "files",
|
||||||
Short: "Generate SharePoint files",
|
Short: "Generate SharePoint files",
|
||||||
RunE: handleSharePointLibraryFileFactory,
|
RunE: handleSharePointLibraryFileFactory,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spListsCmd = &cobra.Command{
|
||||||
|
Use: "lists",
|
||||||
|
Short: "Generate SharePoint lists",
|
||||||
|
RunE: handleSharepointListsFactory,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
func AddSharePointCommands(cmd *cobra.Command) {
|
func AddSharePointCommands(cmd *cobra.Command) {
|
||||||
cmd.AddCommand(spFilesCmd)
|
cmd.AddCommand(spFilesCmd)
|
||||||
|
cmd.AddCommand(spListsCmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleSharePointLibraryFileFactory(cmd *cobra.Command, args []string) error {
|
func handleSharePointLibraryFileFactory(cmd *cobra.Command, args []string) error {
|
||||||
@ -70,3 +81,52 @@ func handleSharePointLibraryFileFactory(cmd *cobra.Command, args []string) error
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleSharepointListsFactory(cmd *cobra.Command, args []string) error {
|
||||||
|
var (
|
||||||
|
ctx = cmd.Context()
|
||||||
|
service = path.SharePointService
|
||||||
|
category = path.ListsCategory
|
||||||
|
errs = fault.New(false)
|
||||||
|
)
|
||||||
|
|
||||||
|
if utils.HasNoFlagsAndShownHelp(cmd) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ctrl, _, ins, err := getControllerAndVerifyResourceOwner(ctx, Site, path.SharePointService)
|
||||||
|
if err != nil {
|
||||||
|
return Only(ctx, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
deets, err := generateAndRestoreItems(
|
||||||
|
ctx,
|
||||||
|
ctrl,
|
||||||
|
service,
|
||||||
|
category,
|
||||||
|
selectors.NewSharePointRestore([]string{ins.ID()}).Selector,
|
||||||
|
Tenant, ins.ID(), Destination,
|
||||||
|
Count,
|
||||||
|
func(id, now, subject, body string) []byte {
|
||||||
|
listBytes, err := siteMock.ListBytes(id)
|
||||||
|
if err != nil {
|
||||||
|
logger.CtxErr(ctx, err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return listBytes
|
||||||
|
},
|
||||||
|
control.DefaultOptions(),
|
||||||
|
errs,
|
||||||
|
count.New())
|
||||||
|
if err != nil {
|
||||||
|
return Only(ctx, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, e := range errs.Recovered() {
|
||||||
|
logger.CtxErr(ctx, err).Error(e.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
deets.PrintEntries(ctx)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/alcionai/clues"
|
"github.com/alcionai/clues"
|
||||||
|
"github.com/google/uuid"
|
||||||
kjson "github.com/microsoft/kiota-serialization-json-go"
|
kjson "github.com/microsoft/kiota-serialization-json-go"
|
||||||
"github.com/microsoftgraph/msgraph-sdk-go/models"
|
"github.com/microsoftgraph/msgraph-sdk-go/models"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
@ -23,7 +24,7 @@ var (
|
|||||||
|
|
||||||
type ListCollection struct {
|
type ListCollection struct {
|
||||||
fullPath path.Path
|
fullPath path.Path
|
||||||
Data []*ListData
|
Data [][]byte
|
||||||
Names []string
|
Names []string
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,14 +57,39 @@ func (mlc *ListCollection) Items(
|
|||||||
go func() {
|
go func() {
|
||||||
defer close(res)
|
defer close(res)
|
||||||
|
|
||||||
for _, stream := range mlc.Data {
|
for i, stream := range mlc.Data {
|
||||||
res <- stream
|
res <- &ListData{
|
||||||
|
ItemID: mlc.Names[i],
|
||||||
|
Reader: io.NopCloser(bytes.NewReader(stream)),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewCollection(
|
||||||
|
storagePath path.Path,
|
||||||
|
locationPath path.Path,
|
||||||
|
numMessagesToReturn int,
|
||||||
|
) *ListCollection {
|
||||||
|
c := &ListCollection{
|
||||||
|
fullPath: storagePath,
|
||||||
|
Data: [][]byte{},
|
||||||
|
Names: []string{},
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < numMessagesToReturn; i++ {
|
||||||
|
// We can plug in whatever data we want here (can be an io.Reader to a test data file if needed)
|
||||||
|
name := uuid.NewString()
|
||||||
|
lb, _ := ListBytes("MockListing" + name)
|
||||||
|
c.Data = append(c.Data, lb)
|
||||||
|
c.Names = append(c.Names, name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
type ListData struct {
|
type ListData struct {
|
||||||
ItemID string
|
ItemID string
|
||||||
Reader io.ReadCloser
|
Reader io.ReadCloser
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user