introduce intg and unit test setup packages (#5140)

corso has a thousand bespoke approaches to setting the same info in all of its tests.  This is a first step towards minimizing and standardizing the lift around that work. Future PRs will distribute these packages through the repo.

---

#### Does this PR need a docs update or release note?

- [x]  No

#### Type of change

- [x] 🤖 Supportability/Tests
- [x] 🧹 Tech Debt/Cleanup

#### Test Plan

- [x]  Unit test
- [x] 💚 E2E
This commit is contained in:
Keepers 2024-02-07 11:01:35 -07:00 committed by GitHub
parent a2d40b4d38
commit f00dd0f88a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
45 changed files with 1193 additions and 1532 deletions

View File

@ -18,6 +18,7 @@ import (
"github.com/alcionai/corso/src/internal/common/idname" "github.com/alcionai/corso/src/internal/common/idname"
"github.com/alcionai/corso/src/internal/operations" "github.com/alcionai/corso/src/internal/operations"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/config" "github.com/alcionai/corso/src/pkg/config"
"github.com/alcionai/corso/src/pkg/path" "github.com/alcionai/corso/src/pkg/path"
@ -39,7 +40,7 @@ var (
type NoBackupExchangeE2ESuite struct { type NoBackupExchangeE2ESuite struct {
tester.Suite tester.Suite
dpnd dependencies dpnd dependencies
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestNoBackupExchangeE2ESuite(t *testing.T) { func TestNoBackupExchangeE2ESuite(t *testing.T) {
@ -54,7 +55,7 @@ func (suite *NoBackupExchangeE2ESuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.its = newIntegrationTesterSetup(t) suite.m365 = its.GetM365(t)
suite.dpnd = prepM365Test(t, ctx, path.ExchangeService) suite.dpnd = prepM365Test(t, ctx, path.ExchangeService)
} }
@ -93,7 +94,7 @@ func (suite *NoBackupExchangeE2ESuite) TestExchangeBackupListCmd_noBackups() {
type BackupExchangeE2ESuite struct { type BackupExchangeE2ESuite struct {
tester.Suite tester.Suite
dpnd dependencies dpnd dependencies
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestBackupExchangeE2ESuite(t *testing.T) { func TestBackupExchangeE2ESuite(t *testing.T) {
@ -108,7 +109,7 @@ func (suite *BackupExchangeE2ESuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.its = newIntegrationTesterSetup(t) suite.m365 = its.GetM365(t)
suite.dpnd = prepM365Test(t, ctx, path.ExchangeService) suite.dpnd = prepM365Test(t, ctx, path.ExchangeService)
} }
@ -138,7 +139,7 @@ func runExchangeBackupCategoryTest(suite *BackupExchangeE2ESuite, category path.
cmd, ctx := buildExchangeBackupCmd( cmd, ctx := buildExchangeBackupCmd(
ctx, ctx,
suite.dpnd.configFilePath, suite.dpnd.configFilePath,
suite.its.user.ID, suite.m365.User.ID,
category.String(), category.String(),
&recorder) &recorder)
@ -150,7 +151,7 @@ func runExchangeBackupCategoryTest(suite *BackupExchangeE2ESuite, category path.
t.Log("backup results", result) t.Log("backup results", result)
// as an offhand check: the result should contain the m365 user id // as an offhand check: the result should contain the m365 user id
assert.Contains(t, result, suite.its.user.ID) assert.Contains(t, result, suite.m365.User.ID)
} }
func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_ServiceNotEnabled_email() { func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_ServiceNotEnabled_email() {
@ -173,7 +174,7 @@ func runExchangeBackupServiceNotEnabledTest(suite *BackupExchangeE2ESuite, categ
cmd, ctx := buildExchangeBackupCmd( cmd, ctx := buildExchangeBackupCmd(
ctx, ctx,
suite.dpnd.configFilePath, suite.dpnd.configFilePath,
fmt.Sprintf("%s,%s", tconfig.UnlicensedM365UserID(suite.T()), suite.its.user.ID), fmt.Sprintf("%s,%s", tconfig.UnlicensedM365UserID(suite.T()), suite.m365.User.ID),
category.String(), category.String(),
&recorder) &recorder)
err := cmd.ExecuteContext(ctx) err := cmd.ExecuteContext(ctx)
@ -183,7 +184,7 @@ func runExchangeBackupServiceNotEnabledTest(suite *BackupExchangeE2ESuite, categ
t.Log("backup results", result) t.Log("backup results", result)
// as an offhand check: the result should contain the m365 user id // as an offhand check: the result should contain the m365 user id
assert.Contains(t, result, suite.its.user.ID) assert.Contains(t, result, suite.m365.User.ID)
} }
func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_userNotFound_email() { func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_userNotFound_email() {
@ -242,7 +243,7 @@ func (suite *BackupExchangeE2ESuite) TestBackupCreateExchange_badAzureClientIDFl
cmd := cliTD.StubRootCmd( cmd := cliTD.StubRootCmd(
"backup", "create", "exchange", "backup", "create", "exchange",
"--user", suite.its.user.ID, "--user", suite.m365.User.ID,
"--azure-client-id", "invalid-value") "--azure-client-id", "invalid-value")
cli.BuildCommandTree(cmd) cli.BuildCommandTree(cmd)
@ -266,7 +267,7 @@ func (suite *BackupExchangeE2ESuite) TestBackupCreateExchange_fromConfigFile() {
cmd := cliTD.StubRootCmd( cmd := cliTD.StubRootCmd(
"backup", "create", "exchange", "backup", "create", "exchange",
"--user", suite.its.user.ID, "--user", suite.m365.User.ID,
"--"+flags.ConfigFileFN, suite.dpnd.configFilePath) "--"+flags.ConfigFileFN, suite.dpnd.configFilePath)
cli.BuildCommandTree(cmd) cli.BuildCommandTree(cmd)
@ -282,7 +283,7 @@ func (suite *BackupExchangeE2ESuite) TestBackupCreateExchange_fromConfigFile() {
t.Log("backup results", result) t.Log("backup results", result)
// as an offhand check: the result should contain the m365 user id // as an offhand check: the result should contain the m365 user id
assert.Contains(t, result, suite.its.user.ID) assert.Contains(t, result, suite.m365.User.ID)
} }
// AWS flags // AWS flags
@ -296,7 +297,7 @@ func (suite *BackupExchangeE2ESuite) TestBackupCreateExchange_badAWSFlags() {
cmd := cliTD.StubRootCmd( cmd := cliTD.StubRootCmd(
"backup", "create", "exchange", "backup", "create", "exchange",
"--user", suite.its.user.ID, "--user", suite.m365.User.ID,
"--aws-access-key", "invalid-value", "--aws-access-key", "invalid-value",
"--aws-secret-access-key", "some-invalid-value") "--aws-secret-access-key", "some-invalid-value")
cli.BuildCommandTree(cmd) cli.BuildCommandTree(cmd)
@ -319,7 +320,7 @@ type PreparedBackupExchangeE2ESuite struct {
tester.Suite tester.Suite
dpnd dependencies dpnd dependencies
backupOps map[path.CategoryType]string backupOps map[path.CategoryType]string
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestPreparedBackupExchangeE2ESuite(t *testing.T) { func TestPreparedBackupExchangeE2ESuite(t *testing.T) {
@ -336,13 +337,13 @@ func (suite *PreparedBackupExchangeE2ESuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.its = newIntegrationTesterSetup(t) suite.m365 = its.GetM365(t)
suite.dpnd = prepM365Test(t, ctx, path.ExchangeService) suite.dpnd = prepM365Test(t, ctx, path.ExchangeService)
suite.backupOps = make(map[path.CategoryType]string) suite.backupOps = make(map[path.CategoryType]string)
var ( var (
users = []string{suite.its.user.ID} users = []string{suite.m365.User.ID}
ins = idname.NewCache(map[string]string{suite.its.user.ID: suite.its.user.ID}) ins = idname.NewCache(map[string]string{suite.m365.User.ID: suite.m365.User.ID})
) )
for _, set := range []path.CategoryType{email, contacts, events} { for _, set := range []path.CategoryType{email, contacts, events} {

View File

@ -20,6 +20,7 @@ import (
"github.com/alcionai/corso/src/internal/common/idname" "github.com/alcionai/corso/src/internal/common/idname"
"github.com/alcionai/corso/src/internal/operations" "github.com/alcionai/corso/src/internal/operations"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/config" "github.com/alcionai/corso/src/pkg/config"
"github.com/alcionai/corso/src/pkg/path" "github.com/alcionai/corso/src/pkg/path"
@ -35,7 +36,7 @@ import (
type NoBackupGroupsE2ESuite struct { type NoBackupGroupsE2ESuite struct {
tester.Suite tester.Suite
dpnd dependencies dpnd dependencies
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestNoBackupGroupsE2ESuite(t *testing.T) { func TestNoBackupGroupsE2ESuite(t *testing.T) {
@ -50,7 +51,7 @@ func (suite *NoBackupGroupsE2ESuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.its = newIntegrationTesterSetup(t) suite.m365 = its.GetM365(t)
suite.dpnd = prepM365Test(t, ctx, path.GroupsService) suite.dpnd = prepM365Test(t, ctx, path.GroupsService)
} }
@ -89,7 +90,7 @@ func (suite *NoBackupGroupsE2ESuite) TestGroupsBackupListCmd_noBackups() {
type BackupGroupsE2ESuite struct { type BackupGroupsE2ESuite struct {
tester.Suite tester.Suite
dpnd dependencies dpnd dependencies
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestBackupGroupsE2ESuite(t *testing.T) { func TestBackupGroupsE2ESuite(t *testing.T) {
@ -104,7 +105,7 @@ func (suite *BackupGroupsE2ESuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.its = newIntegrationTesterSetup(t) suite.m365 = its.GetM365(t)
suite.dpnd = prepM365Test(t, ctx, path.GroupsService) suite.dpnd = prepM365Test(t, ctx, path.GroupsService)
} }
@ -134,7 +135,7 @@ func runGroupsBackupCategoryTest(suite *BackupGroupsE2ESuite, category string) {
cmd, ctx := buildGroupsBackupCmd( cmd, ctx := buildGroupsBackupCmd(
ctx, ctx,
suite.dpnd.configFilePath, suite.dpnd.configFilePath,
suite.its.group.ID, suite.m365.Group.ID,
category, category,
&recorder) &recorder)
@ -202,7 +203,7 @@ func (suite *BackupGroupsE2ESuite) TestBackupCreateGroups_badAzureClientIDFlag()
cmd := cliTD.StubRootCmd( cmd := cliTD.StubRootCmd(
"backup", "create", "groups", "backup", "create", "groups",
"--group", suite.its.group.ID, "--group", suite.m365.Group.ID,
"--azure-client-id", "invalid-value") "--azure-client-id", "invalid-value")
cli.BuildCommandTree(cmd) cli.BuildCommandTree(cmd)
@ -226,7 +227,7 @@ func (suite *BackupGroupsE2ESuite) TestBackupCreateGroups_fromConfigFile() {
cmd := cliTD.StubRootCmd( cmd := cliTD.StubRootCmd(
"backup", "create", "groups", "backup", "create", "groups",
"--group", suite.its.group.ID, "--group", suite.m365.Group.ID,
"--"+flags.ConfigFileFN, suite.dpnd.configFilePath) "--"+flags.ConfigFileFN, suite.dpnd.configFilePath)
cli.BuildCommandTree(cmd) cli.BuildCommandTree(cmd)
@ -250,7 +251,7 @@ func (suite *BackupGroupsE2ESuite) TestBackupCreateGroups_badAWSFlags() {
cmd := cliTD.StubRootCmd( cmd := cliTD.StubRootCmd(
"backup", "create", "groups", "backup", "create", "groups",
"--group", suite.its.group.ID, "--group", suite.m365.Group.ID,
"--aws-access-key", "invalid-value", "--aws-access-key", "invalid-value",
"--aws-secret-access-key", "some-invalid-value") "--aws-secret-access-key", "some-invalid-value")
cli.BuildCommandTree(cmd) cli.BuildCommandTree(cmd)
@ -273,7 +274,7 @@ type PreparedBackupGroupsE2ESuite struct {
tester.Suite tester.Suite
dpnd dependencies dpnd dependencies
backupOps map[path.CategoryType]string backupOps map[path.CategoryType]string
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestPreparedBackupGroupsE2ESuite(t *testing.T) { func TestPreparedBackupGroupsE2ESuite(t *testing.T) {
@ -290,13 +291,13 @@ func (suite *PreparedBackupGroupsE2ESuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.its = newIntegrationTesterSetup(t) suite.m365 = its.GetM365(t)
suite.dpnd = prepM365Test(t, ctx, path.GroupsService) suite.dpnd = prepM365Test(t, ctx, path.GroupsService)
suite.backupOps = make(map[path.CategoryType]string) suite.backupOps = make(map[path.CategoryType]string)
var ( var (
groups = []string{suite.its.group.ID} groups = []string{suite.m365.Group.ID}
ins = idname.NewCache(map[string]string{suite.its.group.ID: suite.its.group.ID}) ins = idname.NewCache(map[string]string{suite.m365.Group.ID: suite.m365.Group.ID})
cats = []path.CategoryType{ cats = []path.CategoryType{
path.ChannelMessagesCategory, path.ChannelMessagesCategory,
path.ConversationPostsCategory, path.ConversationPostsCategory,

View File

@ -14,141 +14,16 @@ import (
"github.com/alcionai/corso/src/cli/flags" "github.com/alcionai/corso/src/cli/flags"
"github.com/alcionai/corso/src/cli/print" "github.com/alcionai/corso/src/cli/print"
cliTD "github.com/alcionai/corso/src/cli/testdata" cliTD "github.com/alcionai/corso/src/cli/testdata"
"github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/config" "github.com/alcionai/corso/src/pkg/config"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
"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/repository" "github.com/alcionai/corso/src/pkg/repository"
"github.com/alcionai/corso/src/pkg/services/m365/api"
"github.com/alcionai/corso/src/pkg/services/m365/api/graph"
"github.com/alcionai/corso/src/pkg/storage" "github.com/alcionai/corso/src/pkg/storage"
"github.com/alcionai/corso/src/pkg/storage/testdata" "github.com/alcionai/corso/src/pkg/storage/testdata"
) )
// ---------------------------------------------------------------------------
// Gockable client
// ---------------------------------------------------------------------------
// GockClient produces a new exchange api client that can be
// mocked using gock.
func gockClient(creds account.M365Config, counter *count.Bus) (api.Client, error) {
s, err := graph.NewGockService(creds, counter)
if err != nil {
return api.Client{}, err
}
li, err := graph.NewGockService(creds, counter, graph.NoTimeout())
if err != nil {
return api.Client{}, err
}
return api.Client{
Credentials: creds,
Stable: s,
LargeItem: li,
}, nil
}
// ---------------------------------------------------------------------------
// Suite Setup
// ---------------------------------------------------------------------------
type ids struct {
ID string
DriveID string
DriveRootFolderID string
}
type intgTesterSetup struct {
acct account.Account
ac api.Client
gockAC api.Client
user ids
site ids
group ids
team ids
}
func newIntegrationTesterSetup(t *testing.T) intgTesterSetup {
its := intgTesterSetup{}
ctx, flush := tester.NewContext(t)
defer flush()
graph.InitializeConcurrencyLimiter(ctx, true, 4)
its.acct = tconfig.NewM365Account(t)
creds, err := its.acct.M365Config()
require.NoError(t, err, clues.ToCore(err))
its.ac, err = api.NewClient(
creds,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
its.gockAC, err = gockClient(creds, count.New())
require.NoError(t, err, clues.ToCore(err))
// user drive
uids := ids{}
uids.ID = tconfig.M365UserID(t)
userDrive, err := its.ac.Users().GetDefaultDrive(ctx, uids.ID)
require.NoError(t, err, clues.ToCore(err))
uids.DriveID = ptr.Val(userDrive.GetId())
userDriveRootFolder, err := its.ac.Drives().GetRootFolder(ctx, uids.DriveID)
require.NoError(t, err, clues.ToCore(err))
uids.DriveRootFolderID = ptr.Val(userDriveRootFolder.GetId())
its.user = uids
// site
sids := ids{}
sids.ID = tconfig.M365SiteID(t)
siteDrive, err := its.ac.Sites().GetDefaultDrive(ctx, sids.ID)
require.NoError(t, err, clues.ToCore(err))
sids.DriveID = ptr.Val(siteDrive.GetId())
siteDriveRootFolder, err := its.ac.Drives().GetRootFolder(ctx, sids.DriveID)
require.NoError(t, err, clues.ToCore(err))
sids.DriveRootFolderID = ptr.Val(siteDriveRootFolder.GetId())
its.site = sids
// group
gids := ids{}
// use of the TeamID is intentional here, so that we are assured
// the group has full usage of the teams api.
gids.ID = tconfig.M365TeamID(t)
its.group = gids
// team
tids := ids{}
tids.ID = tconfig.M365TeamID(t)
its.team = tids
return its
}
type dependencies struct { type dependencies struct {
st storage.Storage st storage.Storage
repo repository.Repositoryer repo repository.Repositoryer

View File

@ -20,6 +20,7 @@ import (
"github.com/alcionai/corso/src/internal/common/idname" "github.com/alcionai/corso/src/internal/common/idname"
"github.com/alcionai/corso/src/internal/operations" "github.com/alcionai/corso/src/internal/operations"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/backup/details" "github.com/alcionai/corso/src/pkg/backup/details"
"github.com/alcionai/corso/src/pkg/config" "github.com/alcionai/corso/src/pkg/config"
@ -89,7 +90,7 @@ func (suite *NoBackupSharePointE2ESuite) TestSharePointBackupListCmd_empty() {
type BackupSharepointE2ESuite struct { type BackupSharepointE2ESuite struct {
tester.Suite tester.Suite
dpnd dependencies dpnd dependencies
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestBackupSharepointE2ESuite(t *testing.T) { func TestBackupSharepointE2ESuite(t *testing.T) {
@ -104,7 +105,7 @@ func (suite *BackupSharepointE2ESuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.its = newIntegrationTesterSetup(t) suite.m365 = its.GetM365(t)
suite.dpnd = prepM365Test(t, ctx, path.SharePointService) suite.dpnd = prepM365Test(t, ctx, path.SharePointService)
} }
@ -128,7 +129,7 @@ func runSharepointBackupCategoryTest(suite *BackupSharepointE2ESuite, category s
cmd, ctx := buildSharepointBackupCmd( cmd, ctx := buildSharepointBackupCmd(
ctx, ctx,
suite.dpnd.configFilePath, suite.dpnd.configFilePath,
suite.its.site.ID, suite.m365.Site.ID,
category, category,
&recorder) &recorder)
@ -187,7 +188,7 @@ type PreparedBackupSharepointE2ESuite struct {
tester.Suite tester.Suite
dpnd dependencies dpnd dependencies
backupOps map[path.CategoryType]string backupOps map[path.CategoryType]string
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestPreparedBackupSharepointE2ESuite(t *testing.T) { func TestPreparedBackupSharepointE2ESuite(t *testing.T) {
@ -204,13 +205,13 @@ func (suite *PreparedBackupSharepointE2ESuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.its = newIntegrationTesterSetup(t) suite.m365 = its.GetM365(t)
suite.dpnd = prepM365Test(t, ctx, path.SharePointService) suite.dpnd = prepM365Test(t, ctx, path.SharePointService)
suite.backupOps = make(map[path.CategoryType]string) suite.backupOps = make(map[path.CategoryType]string)
var ( var (
sites = []string{suite.its.site.ID} sites = []string{suite.m365.Site.ID}
ins = idname.NewCache(map[string]string{suite.its.site.ID: suite.its.site.ID}) ins = idname.NewCache(map[string]string{suite.m365.Site.ID: suite.m365.Site.ID})
cats = []path.CategoryType{ cats = []path.CategoryType{
path.ListsCategory, path.ListsCategory,
} }

View File

@ -20,6 +20,7 @@ import (
"github.com/alcionai/corso/src/internal/common/idname" "github.com/alcionai/corso/src/internal/common/idname"
"github.com/alcionai/corso/src/internal/operations" "github.com/alcionai/corso/src/internal/operations"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/config" "github.com/alcionai/corso/src/pkg/config"
"github.com/alcionai/corso/src/pkg/path" "github.com/alcionai/corso/src/pkg/path"
@ -35,7 +36,7 @@ import (
type NoBackupTeamsChatsE2ESuite struct { type NoBackupTeamsChatsE2ESuite struct {
tester.Suite tester.Suite
dpnd dependencies dpnd dependencies
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestNoBackupTeamsChatsE2ESuite(t *testing.T) { func TestNoBackupTeamsChatsE2ESuite(t *testing.T) {
@ -51,7 +52,7 @@ func (suite *NoBackupTeamsChatsE2ESuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.its = newIntegrationTesterSetup(t) suite.m365 = its.GetM365(t)
suite.dpnd = prepM365Test(t, ctx, path.TeamsChatsService) suite.dpnd = prepM365Test(t, ctx, path.TeamsChatsService)
} }
@ -90,7 +91,7 @@ func (suite *NoBackupTeamsChatsE2ESuite) TestTeamsChatsBackupListCmd_noBackups()
type BackupTeamsChatsE2ESuite struct { type BackupTeamsChatsE2ESuite struct {
tester.Suite tester.Suite
dpnd dependencies dpnd dependencies
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestBackupTeamsChatsE2ESuite(t *testing.T) { func TestBackupTeamsChatsE2ESuite(t *testing.T) {
@ -106,7 +107,7 @@ func (suite *BackupTeamsChatsE2ESuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.its = newIntegrationTesterSetup(t) suite.m365 = its.GetM365(t)
suite.dpnd = prepM365Test(t, ctx, path.TeamsChatsService) suite.dpnd = prepM365Test(t, ctx, path.TeamsChatsService)
} }
@ -128,7 +129,7 @@ func runTeamsChatsBackupCategoryTest(suite *BackupTeamsChatsE2ESuite, category s
cmd, ctx := buildTeamsChatsBackupCmd( cmd, ctx := buildTeamsChatsBackupCmd(
ctx, ctx,
suite.dpnd.configFilePath, suite.dpnd.configFilePath,
suite.its.user.ID, suite.m365.User.ID,
category, category,
&recorder) &recorder)
@ -188,7 +189,7 @@ func (suite *BackupTeamsChatsE2ESuite) TestBackupCreateTeamsChats_badAzureClient
cmd := cliTD.StubRootCmd( cmd := cliTD.StubRootCmd(
"backup", "create", "chats", "backup", "create", "chats",
"--teamschat", suite.its.user.ID, "--teamschat", suite.m365.User.ID,
"--azure-client-id", "invalid-value") "--azure-client-id", "invalid-value")
cli.BuildCommandTree(cmd) cli.BuildCommandTree(cmd)
@ -212,7 +213,7 @@ func (suite *BackupTeamsChatsE2ESuite) TestBackupCreateTeamsChats_fromConfigFile
cmd := cliTD.StubRootCmd( cmd := cliTD.StubRootCmd(
"backup", "create", "chats", "backup", "create", "chats",
"--teamschat", suite.its.user.ID, "--teamschat", suite.m365.User.ID,
"--"+flags.ConfigFileFN, suite.dpnd.configFilePath) "--"+flags.ConfigFileFN, suite.dpnd.configFilePath)
cli.BuildCommandTree(cmd) cli.BuildCommandTree(cmd)
@ -236,7 +237,7 @@ func (suite *BackupTeamsChatsE2ESuite) TestBackupCreateTeamsChats_badAWSFlags()
cmd := cliTD.StubRootCmd( cmd := cliTD.StubRootCmd(
"backup", "create", "chats", "backup", "create", "chats",
"--teamschat", suite.its.user.ID, "--teamschat", suite.m365.User.ID,
"--aws-access-key", "invalid-value", "--aws-access-key", "invalid-value",
"--aws-secret-access-key", "some-invalid-value") "--aws-secret-access-key", "some-invalid-value")
cli.BuildCommandTree(cmd) cli.BuildCommandTree(cmd)
@ -259,7 +260,7 @@ type PreparedBackupTeamsChatsE2ESuite struct {
tester.Suite tester.Suite
dpnd dependencies dpnd dependencies
backupOps map[path.CategoryType]string backupOps map[path.CategoryType]string
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestPreparedBackupTeamsChatsE2ESuite(t *testing.T) { func TestPreparedBackupTeamsChatsE2ESuite(t *testing.T) {
@ -277,13 +278,13 @@ func (suite *PreparedBackupTeamsChatsE2ESuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.its = newIntegrationTesterSetup(t) suite.m365 = its.GetM365(t)
suite.dpnd = prepM365Test(t, ctx, path.TeamsChatsService) suite.dpnd = prepM365Test(t, ctx, path.TeamsChatsService)
suite.backupOps = make(map[path.CategoryType]string) suite.backupOps = make(map[path.CategoryType]string)
var ( var (
teamschats = []string{suite.its.user.ID} teamschats = []string{suite.m365.User.ID}
ins = idname.NewCache(map[string]string{suite.its.user.ID: suite.its.user.ID}) ins = idname.NewCache(map[string]string{suite.m365.User.ID: suite.m365.User.ID})
cats = []path.CategoryType{ cats = []path.CategoryType{
path.ChatsCategory, path.ChatsCategory,
} }

View File

@ -2,6 +2,7 @@ package m365
import ( import (
"context" "context"
"fmt"
"github.com/alcionai/clues" "github.com/alcionai/clues"
@ -109,7 +110,7 @@ func (ctrl *Controller) ProduceBackupCollections(
handler = teamschats.NewBackup() handler = teamschats.NewBackup()
default: default:
return nil, nil, false, clues.Wrap(clues.NewWC(ctx, service.String()), "service not supported") return nil, nil, false, clues.NewWC(ctx, fmt.Sprintf("service not supported: %s", service.HumanString()))
} }
colls, excludeItems, canUsePreviousBackup, err = handler.ProduceBackupCollections( colls, excludeItems, canUsePreviousBackup, err = handler.ProduceBackupCollections(
@ -173,7 +174,8 @@ func verifyBackupInputs(sel selectors.Selector, cachedIDs []string) error {
} }
if !filters.Contains(ids).Compare(sel.ID()) { if !filters.Contains(ids).Compare(sel.ID()) {
return clues.Stack(core.ErrNotFound).With("selector_protected_resource", sel.ID()) return clues.Wrap(core.ErrNotFound, "verifying existence of resource").
With("selector_protected_resource", sel.ID())
} }
return nil return nil

View File

@ -11,7 +11,6 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
inMock "github.com/alcionai/corso/src/internal/common/idname/mock" inMock "github.com/alcionai/corso/src/internal/common/idname/mock"
"github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/data" "github.com/alcionai/corso/src/internal/data"
"github.com/alcionai/corso/src/internal/data/mock" "github.com/alcionai/corso/src/internal/data/mock"
"github.com/alcionai/corso/src/internal/m365/service/exchange" "github.com/alcionai/corso/src/internal/m365/service/exchange"
@ -19,6 +18,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/service/sharepoint" "github.com/alcionai/corso/src/internal/m365/service/sharepoint"
"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"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/internal/version" "github.com/alcionai/corso/src/internal/version"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
@ -36,10 +36,7 @@ import (
type DataCollectionIntgSuite struct { type DataCollectionIntgSuite struct {
tester.Suite tester.Suite
user string m365 its.M365IntgTestSetup
site string
tenantID string
ac api.Client
} }
func TestDataCollectionIntgSuite(t *testing.T) { func TestDataCollectionIntgSuite(t *testing.T) {
@ -51,29 +48,14 @@ func TestDataCollectionIntgSuite(t *testing.T) {
} }
func (suite *DataCollectionIntgSuite) SetupSuite() { func (suite *DataCollectionIntgSuite) SetupSuite() {
t := suite.T() suite.m365 = its.GetM365(suite.T())
suite.user = tconfig.M365UserID(t)
suite.site = tconfig.M365SiteID(t)
acct := tconfig.NewM365Account(t)
creds, err := acct.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.tenantID = creds.AzureTenantID
suite.ac, err = api.NewClient(
creds,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
} }
func (suite *DataCollectionIntgSuite) TestExchangeDataCollection() { func (suite *DataCollectionIntgSuite) TestExchangeDataCollection() {
ctx, flush := tester.NewContext(suite.T()) ctx, flush := tester.NewContext(suite.T())
defer flush() defer flush()
selUsers := []string{suite.user} selUsers := []string{suite.m365.User.ID}
ctrl := newController(ctx, suite.T(), path.ExchangeService) ctrl := newController(ctx, suite.T(), path.ExchangeService)
tests := []struct { tests := []struct {
@ -85,7 +67,7 @@ func (suite *DataCollectionIntgSuite) TestExchangeDataCollection() {
getSelector: func(t *testing.T) selectors.Selector { getSelector: func(t *testing.T) selectors.Selector {
sel := selectors.NewExchangeBackup(selUsers) sel := selectors.NewExchangeBackup(selUsers)
sel.Include(sel.MailFolders([]string{api.MailInbox}, selectors.PrefixMatch())) sel.Include(sel.MailFolders([]string{api.MailInbox}, selectors.PrefixMatch()))
sel.DiscreteOwner = suite.user sel.DiscreteOwner = suite.m365.User.ID
return sel.Selector return sel.Selector
}, },
}, },
@ -94,7 +76,7 @@ func (suite *DataCollectionIntgSuite) TestExchangeDataCollection() {
getSelector: func(t *testing.T) selectors.Selector { getSelector: func(t *testing.T) selectors.Selector {
sel := selectors.NewExchangeBackup(selUsers) sel := selectors.NewExchangeBackup(selUsers)
sel.Include(sel.ContactFolders([]string{api.DefaultContacts}, selectors.PrefixMatch())) sel.Include(sel.ContactFolders([]string{api.DefaultContacts}, selectors.PrefixMatch()))
sel.DiscreteOwner = suite.user sel.DiscreteOwner = suite.m365.User.ID
return sel.Selector return sel.Selector
}, },
}, },
@ -142,8 +124,8 @@ func (suite *DataCollectionIntgSuite) TestExchangeDataCollection() {
collections, excludes, canUsePreviousBackup, err := exchange.NewBackup().ProduceBackupCollections( collections, excludes, canUsePreviousBackup, err := exchange.NewBackup().ProduceBackupCollections(
ctx, ctx,
bpc, bpc,
suite.ac, suite.m365.AC,
suite.ac.Credentials, suite.m365.Creds,
ctrl.UpdateStatus, ctrl.UpdateStatus,
count.New(), count.New(),
fault.New(true)) fault.New(true))
@ -270,7 +252,7 @@ func (suite *DataCollectionIntgSuite) TestSharePointDataCollection() {
ctx, flush := tester.NewContext(suite.T()) ctx, flush := tester.NewContext(suite.T())
defer flush() defer flush()
selSites := []string{suite.site} selSites := []string{suite.m365.Site.ID}
ctrl := newController(ctx, suite.T(), path.SharePointService) ctrl := newController(ctx, suite.T(), path.SharePointService)
tests := []struct { tests := []struct {
name string name string
@ -312,7 +294,7 @@ func (suite *DataCollectionIntgSuite) TestSharePointDataCollection() {
collections, excludes, canUsePreviousBackup, err := sharepoint.NewBackup().ProduceBackupCollections( collections, excludes, canUsePreviousBackup, err := sharepoint.NewBackup().ProduceBackupCollections(
ctx, ctx,
bpc, bpc,
suite.ac, suite.m365.AC,
ctrl.credentials, ctrl.credentials,
ctrl.UpdateStatus, ctrl.UpdateStatus,
count.New(), count.New(),
@ -351,8 +333,7 @@ func (suite *DataCollectionIntgSuite) TestSharePointDataCollection() {
type SPCollectionIntgSuite struct { type SPCollectionIntgSuite struct {
tester.Suite tester.Suite
connector *Controller m365 its.M365IntgTestSetup
user string
} }
func TestSPCollectionIntgSuite(t *testing.T) { func TestSPCollectionIntgSuite(t *testing.T) {
@ -364,13 +345,7 @@ func TestSPCollectionIntgSuite(t *testing.T) {
} }
func (suite *SPCollectionIntgSuite) SetupSuite() { func (suite *SPCollectionIntgSuite) SetupSuite() {
ctx, flush := tester.NewContext(suite.T()) suite.m365 = its.GetM365(suite.T())
defer flush()
suite.connector = newController(ctx, suite.T(), path.SharePointService)
suite.user = tconfig.M365UserID(suite.T())
tester.LogTimeOfTest(suite.T())
} }
func (suite *SPCollectionIntgSuite) TestCreateSharePointCollection_Libraries() { func (suite *SPCollectionIntgSuite) TestCreateSharePointCollection_Libraries() {
@ -379,25 +354,20 @@ func (suite *SPCollectionIntgSuite) TestCreateSharePointCollection_Libraries() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
var ( ctrl := newController(ctx, t, path.SharePointService)
siteID = tconfig.M365SiteID(t)
ctrl = newController(ctx, t, path.SharePointService)
siteIDs = []string{siteID}
)
site, err := ctrl.PopulateProtectedResourceIDAndName(ctx, siteID, nil) _, err := ctrl.PopulateProtectedResourceIDAndName(ctx, suite.m365.Site.ID, nil)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
sel := selectors.NewSharePointBackup(siteIDs) sel := selectors.NewSharePointBackup([]string{suite.m365.Site.ID})
sel.Include(sel.LibraryFolders([]string{"foo"}, selectors.PrefixMatch())) sel.Include(sel.LibraryFolders([]string{"foo"}, selectors.PrefixMatch()))
sel.Include(sel.Library("Documents")) sel.Include(sel.Library("Documents"))
sel.SetDiscreteOwnerIDName(suite.m365.Site.ID, suite.m365.Site.WebURL)
sel.SetDiscreteOwnerIDName(site.ID(), site.Name())
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: control.DefaultOptions(), Options: control.DefaultOptions(),
ProtectedResource: site, ProtectedResource: suite.m365.Site.Provider,
Selector: sel.Selector, Selector: sel.Selector,
} }
@ -415,15 +385,15 @@ func (suite *SPCollectionIntgSuite) TestCreateSharePointCollection_Libraries() {
) )
documentsColl, err := path.BuildPrefix( documentsColl, err := path.BuildPrefix(
suite.connector.tenant, suite.m365.TenantID,
siteID, suite.m365.Site.ID,
path.SharePointService, path.SharePointService,
path.LibrariesCategory) path.LibrariesCategory)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
metadataColl, err := path.BuildMetadata( metadataColl, err := path.BuildMetadata(
suite.connector.tenant, suite.m365.TenantID,
siteID, suite.m365.Site.ID,
path.SharePointService, path.SharePointService,
path.LibrariesCategory, path.LibrariesCategory,
false) false)
@ -450,24 +420,19 @@ func (suite *SPCollectionIntgSuite) TestCreateSharePointCollection_Lists() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
var ( ctrl := newController(ctx, t, path.SharePointService)
siteID = tconfig.M365SiteID(t)
ctrl = newController(ctx, t, path.SharePointService)
siteIDs = []string{siteID}
)
site, err := ctrl.PopulateProtectedResourceIDAndName(ctx, siteID, nil) _, err := ctrl.PopulateProtectedResourceIDAndName(ctx, suite.m365.Site.ID, nil)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
sel := selectors.NewSharePointBackup(siteIDs) sel := selectors.NewSharePointBackup([]string{suite.m365.Site.ID})
sel.Include(sel.Lists(selectors.Any())) sel.Include(sel.Lists(selectors.Any()))
sel.SetDiscreteOwnerIDName(suite.m365.Site.ID, suite.m365.Site.WebURL)
sel.SetDiscreteOwnerIDName(site.ID(), site.Name())
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: control.DefaultOptions(), Options: control.DefaultOptions(),
ProtectedResource: site, ProtectedResource: suite.m365.Site.Provider,
Selector: sel.Selector, Selector: sel.Selector,
} }
@ -502,9 +467,7 @@ func (suite *SPCollectionIntgSuite) TestCreateSharePointCollection_Lists() {
type GroupsCollectionIntgSuite struct { type GroupsCollectionIntgSuite struct {
tester.Suite tester.Suite
connector *Controller m365 its.M365IntgTestSetup
tenantID string
user string
} }
func TestGroupsCollectionIntgSuite(t *testing.T) { func TestGroupsCollectionIntgSuite(t *testing.T) {
@ -516,21 +479,7 @@ func TestGroupsCollectionIntgSuite(t *testing.T) {
} }
func (suite *GroupsCollectionIntgSuite) SetupSuite() { func (suite *GroupsCollectionIntgSuite) SetupSuite() {
t := suite.T() suite.m365 = its.GetM365(suite.T())
ctx, flush := tester.NewContext(t)
defer flush()
suite.connector = newController(ctx, t, path.GroupsService)
suite.user = tconfig.M365UserID(t)
acct := tconfig.NewM365Account(t)
creds, err := acct.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.tenantID = creds.AzureTenantID
tester.LogTimeOfTest(t)
} }
func (suite *GroupsCollectionIntgSuite) TestCreateGroupsCollection_SharePoint() { func (suite *GroupsCollectionIntgSuite) TestCreateGroupsCollection_SharePoint() {
@ -539,24 +488,19 @@ func (suite *GroupsCollectionIntgSuite) TestCreateGroupsCollection_SharePoint()
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
var ( ctrl := newController(ctx, t, path.GroupsService)
groupID = tconfig.M365TeamID(t)
ctrl = newController(ctx, t, path.GroupsService)
groupIDs = []string{groupID}
)
group, err := ctrl.PopulateProtectedResourceIDAndName(ctx, groupID, nil) _, err := ctrl.PopulateProtectedResourceIDAndName(ctx, suite.m365.Group.ID, nil)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
sel := selectors.NewGroupsBackup(groupIDs) sel := selectors.NewGroupsBackup([]string{suite.m365.Group.ID})
sel.Include(sel.LibraryFolders([]string{"test"}, selectors.PrefixMatch())) sel.Include(sel.LibraryFolders([]string{"test"}, selectors.PrefixMatch()))
sel.SetDiscreteOwnerIDName(suite.m365.Group.ID, suite.m365.Group.DisplayName)
sel.SetDiscreteOwnerIDName(group.ID(), group.Name())
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: control.DefaultOptions(), Options: control.DefaultOptions(),
ProtectedResource: group, ProtectedResource: suite.m365.Group.Provider,
Selector: sel.Selector, Selector: sel.Selector,
} }
@ -575,8 +519,8 @@ func (suite *GroupsCollectionIntgSuite) TestCreateGroupsCollection_SharePoint()
assert.Greater(t, len(collections), 1) assert.Greater(t, len(collections), 1)
p, err := path.BuildMetadata( p, err := path.BuildMetadata(
suite.tenantID, suite.m365.TenantID,
groupID, suite.m365.Group.ID,
path.GroupsService, path.GroupsService,
path.LibrariesCategory, path.LibrariesCategory,
false) false)
@ -614,31 +558,23 @@ func (suite *GroupsCollectionIntgSuite) TestCreateGroupsCollection_SharePoint_In
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
var ( ctrl := newController(ctx, t, path.GroupsService)
groupID = tconfig.M365TeamID(t)
ctrl = newController(ctx, t, path.GroupsService)
groupIDs = []string{groupID}
)
group, err := ctrl.PopulateProtectedResourceIDAndName(ctx, groupID, nil) _, err := ctrl.PopulateProtectedResourceIDAndName(ctx, suite.m365.Group.ID, nil)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
sel := selectors.NewGroupsBackup(groupIDs) sel := selectors.NewGroupsBackup([]string{suite.m365.Group.ID})
sel.Include(sel.LibraryFolders([]string{"test"}, selectors.PrefixMatch())) sel.Include(sel.LibraryFolders([]string{"test"}, selectors.PrefixMatch()))
sel.SetDiscreteOwnerIDName(suite.m365.Group.ID, suite.m365.Group.DisplayName)
sel.SetDiscreteOwnerIDName(group.ID(), group.Name())
site, err := suite.connector.AC.Groups().GetRootSite(ctx, groupID)
require.NoError(t, err, clues.ToCore(err))
pth, err := path.Build( pth, err := path.Build(
suite.tenantID, suite.m365.TenantID,
groupID, suite.m365.Group.ID,
path.GroupsService, path.GroupsService,
path.LibrariesCategory, path.LibrariesCategory,
true, true,
odConsts.SitesPathDir, odConsts.SitesPathDir,
ptr.Val(site.GetId())) suite.m365.Group.RootSite.ID)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
mmc := []data.RestoreCollection{ mmc := []data.RestoreCollection{
@ -656,7 +592,7 @@ func (suite *GroupsCollectionIntgSuite) TestCreateGroupsCollection_SharePoint_In
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: control.DefaultOptions(), Options: control.DefaultOptions(),
ProtectedResource: group, ProtectedResource: suite.m365.Group.Provider,
Selector: sel.Selector, Selector: sel.Selector,
MetadataCollections: mmc, MetadataCollections: mmc,
} }
@ -676,8 +612,8 @@ func (suite *GroupsCollectionIntgSuite) TestCreateGroupsCollection_SharePoint_In
assert.Greater(t, len(collections), 1) assert.Greater(t, len(collections), 1)
p, err := path.BuildMetadata( p, err := path.BuildMetadata(
suite.tenantID, suite.m365.TenantID,
groupID, suite.m365.Group.ID,
path.GroupsService, path.GroupsService,
path.LibrariesCategory, path.LibrariesCategory,
false) false)
@ -690,13 +626,13 @@ func (suite *GroupsCollectionIntgSuite) TestCreateGroupsCollection_SharePoint_In
foundRootTombstone := false foundRootTombstone := false
sp, err := path.BuildPrefix( sp, err := path.BuildPrefix(
suite.tenantID, suite.m365.TenantID,
groupID, suite.m365.Group.ID,
path.GroupsService, path.GroupsService,
path.LibrariesCategory) path.LibrariesCategory)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
sp, err = sp.Append(false, odConsts.SitesPathDir, ptr.Val(site.GetId())) sp, err = sp.Append(false, odConsts.SitesPathDir, suite.m365.Group.RootSite.ID)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
for _, coll := range collections { for _, coll := range collections {

View File

@ -22,8 +22,6 @@ import (
odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts" odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts"
"github.com/alcionai/corso/src/internal/m365/support" "github.com/alcionai/corso/src/internal/m365/support"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/backup/details" "github.com/alcionai/corso/src/pkg/backup/details"
bupMD "github.com/alcionai/corso/src/pkg/backup/metadata" bupMD "github.com/alcionai/corso/src/pkg/backup/metadata"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
@ -41,50 +39,6 @@ import (
const defaultFileSize int64 = 42 const defaultFileSize int64 = 42
// TODO(ashmrtn): Merge with similar structs in graph and exchange packages.
type oneDriveService struct {
credentials account.M365Config
status support.ControllerOperationStatus
ac api.Client
}
func newOneDriveService(credentials account.M365Config) (*oneDriveService, error) {
ac, err := api.NewClient(
credentials,
control.DefaultOptions(),
count.New())
if err != nil {
return nil, err
}
service := oneDriveService{
ac: ac,
credentials: credentials,
}
return &service, nil
}
func (ods *oneDriveService) updateStatus(status *support.ControllerOperationStatus) {
if status == nil {
return
}
ods.status = support.MergeStatus(ods.status, *status)
}
func loadTestService(t *testing.T) *oneDriveService {
a := tconfig.NewM365Account(t)
creds, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
service, err := newOneDriveService(creds)
require.NoError(t, err, clues.ToCore(err))
return service
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// collections // collections
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

View File

@ -12,6 +12,7 @@ import (
"github.com/alcionai/corso/src/internal/common/idname" "github.com/alcionai/corso/src/internal/common/idname"
"github.com/alcionai/corso/src/internal/common/prefixmatcher" "github.com/alcionai/corso/src/internal/common/prefixmatcher"
"github.com/alcionai/corso/src/internal/m365/support"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
@ -233,6 +234,18 @@ func (suite *OneDriveIntgSuite) SetupSuite() {
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
} }
type stubStatusUpdater struct {
status support.ControllerOperationStatus
}
func (ssu *stubStatusUpdater) updateStatus(status *support.ControllerOperationStatus) {
if status == nil {
return
}
ssu.status = support.MergeStatus(ssu.status, *status)
}
func (suite *OneDriveIntgSuite) TestOneDriveNewCollections() { func (suite *OneDriveIntgSuite) TestOneDriveNewCollections() {
creds, err := tconfig.NewM365Account(suite.T()).M365Config() creds, err := tconfig.NewM365Account(suite.T()).M365Config()
require.NoError(suite.T(), err, clues.ToCore(err)) require.NoError(suite.T(), err, clues.ToCore(err))
@ -258,10 +271,10 @@ func (suite *OneDriveIntgSuite) TestOneDriveNewCollections() {
defer flush() defer flush()
var ( var (
service = loadTestService(t)
scope = selectors. scope = selectors.
NewOneDriveBackup([]string{test.user}). NewOneDriveBackup([]string{test.user}).
AllData()[0] AllData()[0]
statusUpdater = stubStatusUpdater{}
) )
colls := NewCollections( colls := NewCollections(
@ -274,7 +287,7 @@ func (suite *OneDriveIntgSuite) TestOneDriveNewCollections() {
}, },
creds.AzureTenantID, creds.AzureTenantID,
idname.NewProvider(test.user, test.user), idname.NewProvider(test.user, test.user),
service.updateStatus, statusUpdater.updateStatus,
control.Options{ control.Options{
ToggleFeatures: control.Toggles{}, ToggleFeatures: control.Toggles{},
}, },

View File

@ -17,6 +17,7 @@ import (
"github.com/alcionai/corso/src/internal/common/ptr" "github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/common/str" "github.com/alcionai/corso/src/internal/common/str"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/control/testdata" "github.com/alcionai/corso/src/pkg/control/testdata"
@ -30,9 +31,7 @@ import (
type ItemIntegrationSuite struct { type ItemIntegrationSuite struct {
tester.Suite tester.Suite
user string m365 its.M365IntgTestSetup
userDriveID string
service *oneDriveService
} }
func TestItemIntegrationSuite(t *testing.T) { func TestItemIntegrationSuite(t *testing.T) {
@ -44,25 +43,7 @@ func TestItemIntegrationSuite(t *testing.T) {
} }
func (suite *ItemIntegrationSuite) SetupSuite() { func (suite *ItemIntegrationSuite) SetupSuite() {
t := suite.T() suite.m365 = its.GetM365(suite.T())
ctx, flush := tester.NewContext(t)
defer flush()
suite.service = loadTestService(t)
suite.user = tconfig.SecondaryM365UserID(t)
graph.InitializeConcurrencyLimiter(ctx, true, 4)
pager := suite.service.ac.Drives().NewUserDrivePager(suite.user, nil)
odDrives, err := api.GetAllDrives(ctx, pager)
require.NoError(t, err, clues.ToCore(err))
// Test Requirement 1: Need a drive
require.Greaterf(t, len(odDrives), 0, "user %s does not have a drive", suite.user)
// Pick the first drive
suite.userDriveID = ptr.Val(odDrives[0].GetId())
} }
func getOneDriveItem( func getOneDriveItem(
@ -103,23 +84,27 @@ func (suite *ItemIntegrationSuite) TestItemReader_oneDrive() {
defer flush() defer flush()
sc := selectors. sc := selectors.
NewOneDriveBackup([]string{suite.user}). NewOneDriveBackup([]string{suite.m365.User.ID}).
AllData()[0] AllData()[0]
driveItem := getOneDriveItem(ctx, t, suite.service.ac, suite.userDriveID) driveItem := getOneDriveItem(
ctx,
t,
suite.m365.AC,
suite.m365.User.DriveID)
// Test Requirement 2: Need a file // Test Requirement 2: Need a file
require.NotEmpty( require.NotEmpty(
t, t,
driveItem, driveItem,
"no file item found for user %s drive %s", "no file item found for user %q drive %q",
suite.user, suite.m365.User.ID,
suite.userDriveID) suite.m365.User.DriveID)
bh := &userDriveBackupHandler{ bh := &userDriveBackupHandler{
baseUserDriveHandler: baseUserDriveHandler{ baseUserDriveHandler: baseUserDriveHandler{
ac: suite.service.ac.Drives(), ac: suite.m365.AC.Drives(),
}, },
userID: suite.user, userID: suite.m365.User.ID,
scope: sc, scope: sc,
} }
@ -142,13 +127,13 @@ func (suite *ItemIntegrationSuite) TestIsURLExpired() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
driveItem := getOneDriveItem(ctx, t, suite.service.ac, suite.userDriveID) driveItem := getOneDriveItem(ctx, t, suite.m365.AC, suite.m365.User.DriveID)
require.NotEmpty( require.NotEmpty(
t, t,
driveItem, driveItem,
"no file item found for user %s drive %s", "no file item found for user %q drive %q",
suite.user, suite.m365.User.ID,
suite.userDriveID) suite.m365.User.DriveID)
var url string var url string
@ -173,7 +158,7 @@ func (suite *ItemIntegrationSuite) TestItemWriter() {
}{ }{
{ {
name: "", name: "",
driveID: suite.userDriveID, driveID: suite.m365.User.DriveID,
}, },
// { // {
// name: "sharePoint", // name: "sharePoint",
@ -183,12 +168,12 @@ func (suite *ItemIntegrationSuite) TestItemWriter() {
for _, test := range table { for _, test := range table {
suite.Run(test.name, func() { suite.Run(test.name, func() {
t := suite.T() t := suite.T()
rh := NewUserDriveRestoreHandler(suite.service.ac) rh := NewUserDriveRestoreHandler(suite.m365.AC)
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
root, err := suite.service.ac.Drives().GetRootFolder(ctx, test.driveID) root, err := suite.m365.AC.Drives().GetRootFolder(ctx, test.driveID)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
newFolderName := testdata.DefaultRestoreConfig("folder").Location newFolderName := testdata.DefaultRestoreConfig("folder").Location
@ -217,7 +202,7 @@ func (suite *ItemIntegrationSuite) TestItemWriter() {
// HACK: Leveraging this to test getFolder behavior for a file. `getFolder()` on the // HACK: Leveraging this to test getFolder behavior for a file. `getFolder()` on the
// newly created item should fail because it's a file not a folder // newly created item should fail because it's a file not a folder
_, err = suite.service.ac.Drives().GetFolderByName( _, err = suite.m365.AC.Drives().GetFolderByName(
ctx, ctx,
test.driveID, test.driveID,
ptr.Val(newFolder.GetId()), ptr.Val(newFolder.GetId()),
@ -261,7 +246,7 @@ func (suite *ItemIntegrationSuite) TestDriveGetFolder() {
}{ }{
{ {
name: "oneDrive", name: "oneDrive",
driveID: suite.userDriveID, driveID: suite.m365.User.DriveID,
}, },
// { // {
// name: "sharePoint", // name: "sharePoint",
@ -275,11 +260,11 @@ func (suite *ItemIntegrationSuite) TestDriveGetFolder() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
root, err := suite.service.ac.Drives().GetRootFolder(ctx, test.driveID) root, err := suite.m365.AC.Drives().GetRootFolder(ctx, test.driveID)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
// Lookup a folder that doesn't exist // Lookup a folder that doesn't exist
_, err = suite.service.ac.Drives().GetFolderByName( _, err = suite.m365.AC.Drives().GetFolderByName(
ctx, ctx,
test.driveID, test.driveID,
ptr.Val(root.GetId()), ptr.Val(root.GetId()),
@ -287,7 +272,7 @@ func (suite *ItemIntegrationSuite) TestDriveGetFolder() {
require.ErrorIs(t, err, api.ErrFolderNotFound, clues.ToCore(err)) require.ErrorIs(t, err, api.ErrFolderNotFound, clues.ToCore(err))
// Lookup a folder that does exist // Lookup a folder that does exist
_, err = suite.service.ac.Drives().GetFolderByName( _, err = suite.m365.AC.Drives().GetFolderByName(
ctx, ctx,
test.driveID, test.driveID,
ptr.Val(root.GetId()), ptr.Val(root.GetId()),

View File

@ -18,6 +18,7 @@ import (
"github.com/alcionai/corso/src/internal/common/ptr" "github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/control/testdata" "github.com/alcionai/corso/src/pkg/control/testdata"
@ -34,9 +35,7 @@ import (
type URLCacheIntegrationSuite struct { type URLCacheIntegrationSuite struct {
tester.Suite tester.Suite
ac api.Client m365 its.M365IntgTestSetup
user string
driveID string
} }
func TestURLCacheIntegrationSuite(t *testing.T) { func TestURLCacheIntegrationSuite(t *testing.T) {
@ -49,29 +48,12 @@ func TestURLCacheIntegrationSuite(t *testing.T) {
func (suite *URLCacheIntegrationSuite) SetupSuite() { func (suite *URLCacheIntegrationSuite) SetupSuite() {
t := suite.T() t := suite.T()
suite.m365 = its.GetM365(t)
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
graph.InitializeConcurrencyLimiter(ctx, true, 4) graph.InitializeConcurrencyLimiter(ctx, true, 4)
suite.user = tconfig.SecondaryM365UserID(t)
acct := tconfig.NewM365Account(t)
creds, err := acct.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.ac, err = api.NewClient(
creds,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
drive, err := suite.ac.Users().GetDefaultDrive(ctx, suite.user)
require.NoError(t, err, clues.ToCore(err))
suite.driveID = ptr.Val(drive.GetId())
} }
// Basic test for urlCache. Create some files in onedrive, then access them via // Basic test for urlCache. Create some files in onedrive, then access them via
@ -79,22 +61,18 @@ func (suite *URLCacheIntegrationSuite) SetupSuite() {
func (suite *URLCacheIntegrationSuite) TestURLCacheBasic() { func (suite *URLCacheIntegrationSuite) TestURLCacheBasic() {
var ( var (
t = suite.T() t = suite.T()
ac = suite.ac.Drives() ac = suite.m365.AC.Drives()
driveID = suite.driveID driveID = suite.m365.User.DriveID
newFolderName = testdata.DefaultRestoreConfig("folder").Location newFolderName = testdata.DefaultRestoreConfig("folder").Location
) )
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
// Create a new test folder
root, err := ac.GetRootFolder(ctx, driveID)
require.NoError(t, err, clues.ToCore(err))
newFolder, err := ac.PostItemInContainer( newFolder, err := ac.PostItemInContainer(
ctx, ctx,
driveID, driveID,
ptr.Val(root.GetId()), suite.m365.User.DriveRootFolderID,
api.NewDriveItem(newFolderName, true), api.NewDriveItem(newFolderName, true),
control.Copy) control.Copy)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
@ -105,7 +83,7 @@ func (suite *URLCacheIntegrationSuite) TestURLCacheBasic() {
// Get the previous delta to feed into url cache // Get the previous delta to feed into url cache
pager := ac.EnumerateDriveItemsDelta( pager := ac.EnumerateDriveItemsDelta(
ctx, ctx,
suite.driveID, driveID,
"", "",
api.CallConfig{ api.CallConfig{
Select: api.URLCacheDriveItemProps(), Select: api.URLCacheDriveItemProps(),
@ -142,10 +120,10 @@ func (suite *URLCacheIntegrationSuite) TestURLCacheBasic() {
// Create a new URL cache with a long TTL // Create a new URL cache with a long TTL
uc, err := newURLCache( uc, err := newURLCache(
suite.driveID, driveID,
du.URL, du.URL,
1*time.Hour, 1*time.Hour,
suite.ac.Drives(), ac,
count.New(), count.New(),
fault.New(true)) fault.New(true))
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))

View File

@ -24,6 +24,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/support" "github.com/alcionai/corso/src/internal/m365/support"
"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"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/internal/version" "github.com/alcionai/corso/src/internal/version"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
@ -472,10 +473,7 @@ func newStatusUpdater(t *testing.T, wg *sync.WaitGroup) func(status *support.Con
type BackupIntgSuite struct { type BackupIntgSuite struct {
tester.Suite tester.Suite
user string m365 its.M365IntgTestSetup
site string
tenantID string
ac api.Client
} }
func TestBackupIntgSuite(t *testing.T) { func TestBackupIntgSuite(t *testing.T) {
@ -488,35 +486,18 @@ func TestBackupIntgSuite(t *testing.T) {
func (suite *BackupIntgSuite) SetupSuite() { func (suite *BackupIntgSuite) SetupSuite() {
t := suite.T() t := suite.T()
suite.m365 = its.GetM365(t)
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
graph.InitializeConcurrencyLimiter(ctx, true, 4) graph.InitializeConcurrencyLimiter(ctx, true, 4)
suite.user = tconfig.M365UserID(t)
suite.site = tconfig.M365SiteID(t)
acct := tconfig.NewM365Account(t)
creds, err := acct.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.ac, err = api.NewClient(
creds,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
suite.tenantID = creds.AzureTenantID
tester.LogTimeOfTest(t)
} }
func (suite *BackupIntgSuite) TestMailFetch() { func (suite *BackupIntgSuite) TestMailFetch() {
var ( var (
userID = tconfig.M365UserID(suite.T()) users = []string{suite.m365.User.ID}
users = []string{userID} handlers = BackupHandlers(suite.m365.AC)
handlers = BackupHandlers(suite.ac)
) )
tests := []struct { tests := []struct {
@ -560,14 +541,14 @@ func (suite *BackupIntgSuite) TestMailFetch() {
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: ctrlOpts, Options: ctrlOpts,
ProtectedResource: inMock.NewProvider(userID, userID), ProtectedResource: suite.m365.User.Provider,
} }
collections, err := CreateCollections( collections, err := CreateCollections(
ctx, ctx,
bpc, bpc,
handlers, handlers,
suite.tenantID, suite.m365.TenantID,
test.scope, test.scope,
metadata.DeltaPaths{}, metadata.DeltaPaths{},
func(status *support.ControllerOperationStatus) {}, func(status *support.ControllerOperationStatus) {},
@ -602,9 +583,8 @@ func (suite *BackupIntgSuite) TestMailFetch() {
func (suite *BackupIntgSuite) TestDelta() { func (suite *BackupIntgSuite) TestDelta() {
var ( var (
userID = tconfig.M365UserID(suite.T()) users = []string{suite.m365.User.ID}
users = []string{userID} handlers = BackupHandlers(suite.m365.AC)
handlers = BackupHandlers(suite.ac)
) )
tests := []struct { tests := []struct {
@ -640,7 +620,7 @@ func (suite *BackupIntgSuite) TestDelta() {
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: control.DefaultOptions(), Options: control.DefaultOptions(),
ProtectedResource: inMock.NewProvider(userID, userID), ProtectedResource: suite.m365.User.Provider,
} }
// get collections without providing any delta history (ie: full backup) // get collections without providing any delta history (ie: full backup)
@ -648,7 +628,7 @@ func (suite *BackupIntgSuite) TestDelta() {
ctx, ctx,
bpc, bpc,
handlers, handlers,
suite.tenantID, suite.m365.TenantID,
test.scope, test.scope,
metadata.DeltaPaths{}, metadata.DeltaPaths{},
func(status *support.ControllerOperationStatus) {}, func(status *support.ControllerOperationStatus) {},
@ -681,7 +661,7 @@ func (suite *BackupIntgSuite) TestDelta() {
ctx, ctx,
bpc, bpc,
handlers, handlers,
suite.tenantID, suite.m365.TenantID,
test.scope, test.scope,
dps, dps,
func(status *support.ControllerOperationStatus) {}, func(status *support.ControllerOperationStatus) {},
@ -703,8 +683,8 @@ func (suite *BackupIntgSuite) TestMailSerializationRegression() {
var ( var (
wg sync.WaitGroup wg sync.WaitGroup
users = []string{suite.user} users = []string{suite.m365.User.ID}
handlers = BackupHandlers(suite.ac) handlers = BackupHandlers(suite.m365.AC)
) )
sel := selectors.NewExchangeBackup(users) sel := selectors.NewExchangeBackup(users)
@ -713,7 +693,7 @@ func (suite *BackupIntgSuite) TestMailSerializationRegression() {
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: control.DefaultOptions(), Options: control.DefaultOptions(),
ProtectedResource: inMock.NewProvider(suite.user, suite.user), ProtectedResource: suite.m365.User.Provider,
Selector: sel.Selector, Selector: sel.Selector,
} }
@ -721,7 +701,7 @@ func (suite *BackupIntgSuite) TestMailSerializationRegression() {
ctx, ctx,
bpc, bpc,
handlers, handlers,
suite.tenantID, suite.m365.TenantID,
sel.Scopes()[0], sel.Scopes()[0],
metadata.DeltaPaths{}, metadata.DeltaPaths{},
newStatusUpdater(t, &wg), newStatusUpdater(t, &wg),
@ -773,8 +753,8 @@ func (suite *BackupIntgSuite) TestMailSerializationRegression() {
// a regression test to ensure that downloaded items can be uploaded. // a regression test to ensure that downloaded items can be uploaded.
func (suite *BackupIntgSuite) TestContactSerializationRegression() { func (suite *BackupIntgSuite) TestContactSerializationRegression() {
var ( var (
users = []string{suite.user} users = []string{suite.m365.User.ID}
handlers = BackupHandlers(suite.ac) handlers = BackupHandlers(suite.m365.AC)
) )
tests := []struct { tests := []struct {
@ -801,14 +781,14 @@ func (suite *BackupIntgSuite) TestContactSerializationRegression() {
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: control.DefaultOptions(), Options: control.DefaultOptions(),
ProtectedResource: inMock.NewProvider(suite.user, suite.user), ProtectedResource: suite.m365.User.Provider,
} }
edcs, err := CreateCollections( edcs, err := CreateCollections(
ctx, ctx,
bpc, bpc,
handlers, handlers,
suite.tenantID, suite.m365.TenantID,
test.scope, test.scope,
metadata.DeltaPaths{}, metadata.DeltaPaths{},
newStatusUpdater(t, &wg), newStatusUpdater(t, &wg),
@ -875,8 +855,8 @@ func (suite *BackupIntgSuite) TestContactSerializationRegression() {
// to be able to successfully query, download and restore event objects // to be able to successfully query, download and restore event objects
func (suite *BackupIntgSuite) TestEventsSerializationRegression() { func (suite *BackupIntgSuite) TestEventsSerializationRegression() {
var ( var (
users = []string{suite.user} users = []string{suite.m365.User.ID}
handlers = BackupHandlers(suite.ac) handlers = BackupHandlers(suite.m365.AC)
) )
tests := []struct { tests := []struct {
@ -911,14 +891,14 @@ func (suite *BackupIntgSuite) TestEventsSerializationRegression() {
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: control.DefaultOptions(), Options: control.DefaultOptions(),
ProtectedResource: inMock.NewProvider(suite.user, suite.user), ProtectedResource: suite.m365.User.Provider,
} }
collections, err := CreateCollections( collections, err := CreateCollections(
ctx, ctx,
bpc, bpc,
handlers, handlers,
suite.tenantID, suite.m365.TenantID,
test.scope, test.scope,
metadata.DeltaPaths{}, metadata.DeltaPaths{},
newStatusUpdater(t, &wg), newStatusUpdater(t, &wg),

View File

@ -12,6 +12,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/service/exchange/mock" "github.com/alcionai/corso/src/internal/m365/service/exchange/mock"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/control/testdata" "github.com/alcionai/corso/src/pkg/control/testdata"
@ -54,7 +55,7 @@ func (m *contactRestoreMock) DeleteItem(
type ContactsRestoreIntgSuite struct { type ContactsRestoreIntgSuite struct {
tester.Suite tester.Suite
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestContactsRestoreIntgSuite(t *testing.T) { func TestContactsRestoreIntgSuite(t *testing.T) {
@ -66,17 +67,17 @@ func TestContactsRestoreIntgSuite(t *testing.T) {
} }
func (suite *ContactsRestoreIntgSuite) SetupSuite() { func (suite *ContactsRestoreIntgSuite) SetupSuite() {
suite.its = newIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
// Testing to ensure that cache system works for in multiple different environments // Testing to ensure that cache system works for in multiple different environments
func (suite *ContactsRestoreIntgSuite) TestCreateContainerDestination() { func (suite *ContactsRestoreIntgSuite) TestCreateContainerDestination() {
runCreateDestinationTest( runCreateDestinationTest(
suite.T(), suite.T(),
newContactRestoreHandler(suite.its.ac), newContactRestoreHandler(suite.m365.AC),
path.ContactsCategory, path.ContactsCategory,
suite.its.creds.AzureTenantID, suite.m365.TenantID,
suite.its.userID, suite.m365.User.ID,
testdata.DefaultRestoreConfig("").Location, testdata.DefaultRestoreConfig("").Location,
[]string{"Hufflepuff"}, []string{"Hufflepuff"},
[]string{"Ravenclaw"}) []string{"Ravenclaw"})
@ -207,17 +208,16 @@ func (suite *ContactsRestoreIntgSuite) TestRestoreContact() {
for _, test := range table { for _, test := range table {
suite.Run(test.name, func() { suite.Run(test.name, func() {
t := suite.T() t := suite.T()
ctr := count.New()
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
ctr := count.New()
_, err := restoreContact( _, err := restoreContact(
ctx, ctx,
test.apiMock, test.apiMock,
body, body,
suite.its.userID, suite.m365.User.ID,
"destination", "destination",
test.collisionMap, test.collisionMap,
test.onCollision, test.onCollision,

View File

@ -16,10 +16,8 @@ import (
"github.com/alcionai/corso/src/internal/common/ptr" "github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/count"
"github.com/alcionai/corso/src/pkg/errs/core" "github.com/alcionai/corso/src/pkg/errs/core"
"github.com/alcionai/corso/src/pkg/fault" "github.com/alcionai/corso/src/pkg/fault"
"github.com/alcionai/corso/src/pkg/path" "github.com/alcionai/corso/src/pkg/path"
@ -1019,49 +1017,37 @@ func (suite *ConfiguredFolderCacheUnitSuite) TestAddToCache() {
assert.Equal(t, m.expectedLocation, l.String(), "location path") assert.Equal(t, m.expectedLocation, l.String(), "location path")
} }
type ContainerResolverSuite struct { type ContainerResolverIntgSuite struct {
tester.Suite tester.Suite
credentials account.M365Config m365 its.M365IntgTestSetup
} }
func TestContainerResolverIntegrationSuite(t *testing.T) { func TestContainerResolverIntgSuite(t *testing.T) {
suite.Run(t, &ContainerResolverSuite{ suite.Run(t, &ContainerResolverIntgSuite{
Suite: tester.NewIntegrationSuite( Suite: tester.NewIntegrationSuite(
t, t,
[][]string{tconfig.M365AcctCredEnvs}), [][]string{tconfig.M365AcctCredEnvs}),
}) })
} }
func (suite *ContainerResolverSuite) SetupSuite() { func (suite *ContainerResolverIntgSuite) SetupSuite() {
t := suite.T() suite.m365 = its.GetM365(suite.T())
a := tconfig.NewM365Account(t)
m365, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.credentials = m365
} }
func (suite *ContainerResolverSuite) TestPopulate() { func (suite *ContainerResolverIntgSuite) TestPopulate() {
ac, err := api.NewClient(
suite.credentials,
control.DefaultOptions(),
count.New())
require.NoError(suite.T(), err, clues.ToCore(err))
eventFunc := func(t *testing.T) graph.ContainerResolver { eventFunc := func(t *testing.T) graph.ContainerResolver {
return &eventContainerCache{ return &eventContainerCache{
userID: tconfig.M365UserID(t), userID: tconfig.M365UserID(t),
enumer: ac.Events(), enumer: suite.m365.AC.Events(),
getter: ac.Events(), getter: suite.m365.AC.Events(),
} }
} }
contactFunc := func(t *testing.T) graph.ContainerResolver { contactFunc := func(t *testing.T) graph.ContainerResolver {
return &contactContainerCache{ return &contactContainerCache{
userID: tconfig.M365UserID(t), userID: tconfig.M365UserID(t),
enumer: ac.Contacts(), enumer: suite.m365.AC.Contacts(),
getter: ac.Contacts(), getter: suite.m365.AC.Contacts(),
} }
} }

View File

@ -13,6 +13,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/service/exchange/mock" "github.com/alcionai/corso/src/internal/m365/service/exchange/mock"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/control/testdata" "github.com/alcionai/corso/src/pkg/control/testdata"
@ -101,7 +102,7 @@ func (m *eventRestoreMock) PatchItem(
type EventsRestoreIntgSuite struct { type EventsRestoreIntgSuite struct {
tester.Suite tester.Suite
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestEventsRestoreIntgSuite(t *testing.T) { func TestEventsRestoreIntgSuite(t *testing.T) {
@ -113,17 +114,17 @@ func TestEventsRestoreIntgSuite(t *testing.T) {
} }
func (suite *EventsRestoreIntgSuite) SetupSuite() { func (suite *EventsRestoreIntgSuite) SetupSuite() {
suite.its = newIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
// Testing to ensure that cache system works for in multiple different environments // Testing to ensure that cache system works for in multiple different environments
func (suite *EventsRestoreIntgSuite) TestCreateContainerDestination() { func (suite *EventsRestoreIntgSuite) TestCreateContainerDestination() {
runCreateDestinationTest( runCreateDestinationTest(
suite.T(), suite.T(),
newEventRestoreHandler(suite.its.ac), newEventRestoreHandler(suite.m365.AC),
path.EventsCategory, path.EventsCategory,
suite.its.creds.AzureTenantID, suite.m365.TenantID,
suite.its.userID, suite.m365.User.ID,
testdata.DefaultRestoreConfig("").Location, testdata.DefaultRestoreConfig("").Location,
[]string{"Durmstrang"}, []string{"Durmstrang"},
[]string{"Beauxbatons"}) []string{"Beauxbatons"})
@ -264,7 +265,7 @@ func (suite *EventsRestoreIntgSuite) TestRestoreEvent() {
ctx, ctx,
test.apiMock, test.apiMock,
body, body,
suite.its.userID, suite.m365.User.ID,
"destination", "destination",
test.collisionMap, test.collisionMap,
test.onCollision, test.onCollision,

View File

@ -1,44 +0,0 @@
package exchange
import (
"testing"
"github.com/alcionai/clues"
"github.com/stretchr/testify/require"
"github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/count"
"github.com/alcionai/corso/src/pkg/services/m365/api"
)
type intgTesterSetup struct {
ac api.Client
creds account.M365Config
userID string
}
func newIntegrationTesterSetup(t *testing.T) intgTesterSetup {
its := intgTesterSetup{}
ctx, flush := tester.NewContext(t)
defer flush()
a := tconfig.NewM365Account(t)
creds, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
its.creds = creds
its.ac, err = api.NewClient(
creds,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
its.userID = tconfig.GetM365UserID(ctx)
return its
}

View File

@ -10,10 +10,8 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/control"
"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/services/m365/api" "github.com/alcionai/corso/src/pkg/services/m365/api"
) )
@ -30,30 +28,24 @@ const (
expectedFolderPath = "toplevel/subFolder/subsubfolder" expectedFolderPath = "toplevel/subFolder/subsubfolder"
) )
type MailFolderCacheIntegrationSuite struct { type MailFolderCacheIntgSuite struct {
tester.Suite tester.Suite
credentials account.M365Config m365 its.M365IntgTestSetup
} }
func TestMailFolderCacheIntegrationSuite(t *testing.T) { func TestMailFolderCacheIntegrationSuite(t *testing.T) {
suite.Run(t, &MailFolderCacheIntegrationSuite{ suite.Run(t, &MailFolderCacheIntgSuite{
Suite: tester.NewIntegrationSuite( Suite: tester.NewIntegrationSuite(
t, t,
[][]string{tconfig.M365AcctCredEnvs}), [][]string{tconfig.M365AcctCredEnvs}),
}) })
} }
func (suite *MailFolderCacheIntegrationSuite) SetupSuite() { func (suite *MailFolderCacheIntgSuite) SetupSuite() {
t := suite.T() suite.m365 = its.GetM365(suite.T())
a := tconfig.NewM365Account(t)
m365, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.credentials = m365
} }
func (suite *MailFolderCacheIntegrationSuite) TestDeltaFetch() { func (suite *MailFolderCacheIntgSuite) TestDeltaFetch() {
suite.T().Skipf("Test depends on hardcoded folder names. Skipping till that is fixed") suite.T().Skipf("Test depends on hardcoded folder names. Skipping till that is fixed")
tests := []struct { tests := []struct {
@ -75,7 +67,6 @@ func (suite *MailFolderCacheIntegrationSuite) TestDeltaFetch() {
path: []string{"some", "leading", "path"}, path: []string{"some", "leading", "path"},
}, },
} }
userID := tconfig.M365UserID(suite.T())
for _, test := range tests { for _, test := range tests {
suite.Run(test.name, func() { suite.Run(test.name, func() {
@ -84,21 +75,15 @@ func (suite *MailFolderCacheIntegrationSuite) TestDeltaFetch() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
ac, err := api.NewClient( acm := suite.m365.AC.Mail()
suite.credentials,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
acm := ac.Mail()
mfc := mailContainerCache{ mfc := mailContainerCache{
userID: userID, userID: suite.m365.User.ID,
enumer: acm, enumer: acm,
getter: acm, getter: acm,
} }
err = mfc.Populate(ctx, fault.New(true), test.root, test.path...) err := mfc.Populate(ctx, fault.New(true), test.root, test.path...)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
p, l, err := mfc.IDToPath(ctx, testFolderID) p, l, err := mfc.IDToPath(ctx, testFolderID)

View File

@ -13,6 +13,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/service/exchange/mock" "github.com/alcionai/corso/src/internal/m365/service/exchange/mock"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/control/testdata" "github.com/alcionai/corso/src/pkg/control/testdata"
@ -72,7 +73,7 @@ func (m *mailRestoreMock) PostLargeAttachment(
type MailRestoreIntgSuite struct { type MailRestoreIntgSuite struct {
tester.Suite tester.Suite
its intgTesterSetup m365 its.M365IntgTestSetup
} }
func TestMailRestoreIntgSuite(t *testing.T) { func TestMailRestoreIntgSuite(t *testing.T) {
@ -84,16 +85,16 @@ func TestMailRestoreIntgSuite(t *testing.T) {
} }
func (suite *MailRestoreIntgSuite) SetupSuite() { func (suite *MailRestoreIntgSuite) SetupSuite() {
suite.its = newIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *MailRestoreIntgSuite) TestCreateContainerDestination() { func (suite *MailRestoreIntgSuite) TestCreateContainerDestination() {
runCreateDestinationTest( runCreateDestinationTest(
suite.T(), suite.T(),
newMailRestoreHandler(suite.its.ac), newMailRestoreHandler(suite.m365.AC),
path.EmailCategory, path.EmailCategory,
suite.its.creds.AzureTenantID, suite.m365.TenantID,
suite.its.userID, suite.m365.User.ID,
testdata.DefaultRestoreConfig("").Location, testdata.DefaultRestoreConfig("").Location,
[]string{"Griffindor", "Croix"}, []string{"Griffindor", "Croix"},
[]string{"Griffindor", "Felicius"}) []string{"Griffindor", "Felicius"})
@ -234,7 +235,7 @@ func (suite *MailRestoreIntgSuite) TestRestoreMail() {
ctx, ctx,
test.apiMock, test.apiMock,
body, body,
suite.its.userID, suite.m365.User.ID,
"destination", "destination",
test.collisionMap, test.collisionMap,
test.onCollision, test.onCollision,

View File

@ -12,8 +12,8 @@ import (
"github.com/alcionai/corso/src/internal/common/ptr" "github.com/alcionai/corso/src/internal/common/ptr"
exchMock "github.com/alcionai/corso/src/internal/m365/service/exchange/mock" exchMock "github.com/alcionai/corso/src/internal/m365/service/exchange/mock"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/control/testdata" "github.com/alcionai/corso/src/pkg/control/testdata"
"github.com/alcionai/corso/src/pkg/count" "github.com/alcionai/corso/src/pkg/count"
@ -24,8 +24,7 @@ import (
type RestoreIntgSuite struct { type RestoreIntgSuite struct {
tester.Suite tester.Suite
credentials account.M365Config m365 its.M365IntgTestSetup
ac api.Client
} }
func TestRestoreIntgSuite(t *testing.T) { func TestRestoreIntgSuite(t *testing.T) {
@ -37,18 +36,7 @@ func TestRestoreIntgSuite(t *testing.T) {
} }
func (suite *RestoreIntgSuite) SetupSuite() { func (suite *RestoreIntgSuite) SetupSuite() {
t := suite.T() suite.m365 = its.GetM365(suite.T())
a := tconfig.NewM365Account(t)
m365, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.credentials = m365
suite.ac, err = api.NewClient(
m365,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
} }
// TestRestoreContact ensures contact object can be created, placed into // TestRestoreContact ensures contact object can be created, placed into
@ -60,26 +48,26 @@ func (suite *RestoreIntgSuite) TestRestoreContact() {
defer flush() defer flush()
var ( var (
userID = tconfig.M365UserID(t)
folderName = testdata.DefaultRestoreConfig("contact").Location folderName = testdata.DefaultRestoreConfig("contact").Location
handler = newContactRestoreHandler(suite.ac) handler = newContactRestoreHandler(suite.m365.AC)
) )
aFolder, err := handler.ac.CreateContainer(ctx, userID, "", folderName) aFolder, err := handler.ac.CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
folderID := ptr.Val(aFolder.GetId()) folderID := ptr.Val(aFolder.GetId())
defer func() { defer func() {
// Remove the folder containing contact prior to exiting test // Remove the folder containing contact prior to exiting test
err = suite.ac.Contacts().DeleteContainer(ctx, userID, folderID) err = suite.m365.AC.Contacts().DeleteContainer(ctx, suite.m365.User.ID, folderID)
assert.NoError(t, err, clues.ToCore(err)) assert.NoError(t, err, clues.ToCore(err))
}() }()
info, err := handler.restore( info, err := handler.restore(
ctx, ctx,
exchMock.ContactBytes("Corso TestContact"), exchMock.ContactBytes("Corso TestContact"),
userID, folderID, suite.m365.User.ID,
folderID,
nil, nil,
control.Copy, control.Copy,
fault.New(true), fault.New(true),
@ -97,19 +85,18 @@ func (suite *RestoreIntgSuite) TestRestoreEvent() {
defer flush() defer flush()
var ( var (
userID = tconfig.M365UserID(t)
subject = testdata.DefaultRestoreConfig("event").Location subject = testdata.DefaultRestoreConfig("event").Location
handler = newEventRestoreHandler(suite.ac) handler = newEventRestoreHandler(suite.m365.AC)
) )
calendar, err := handler.ac.CreateContainer(ctx, userID, "", subject) calendar, err := handler.ac.CreateContainer(ctx, suite.m365.User.ID, "", subject)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
calendarID := ptr.Val(calendar.GetId()) calendarID := ptr.Val(calendar.GetId())
defer func() { defer func() {
// Removes calendar containing events created during the test // Removes calendar containing events created during the test
err = suite.ac.Events().DeleteContainer(ctx, userID, calendarID) err = suite.m365.AC.Events().DeleteContainer(ctx, suite.m365.User.ID, calendarID)
assert.NoError(t, err, clues.ToCore(err)) assert.NoError(t, err, clues.ToCore(err))
}() }()
@ -154,7 +141,8 @@ func (suite *RestoreIntgSuite) TestRestoreEvent() {
info, err := handler.restore( info, err := handler.restore(
ctx, ctx,
test.bytes, test.bytes,
userID, calendarID, suite.m365.User.ID,
calendarID,
nil, nil,
control.Copy, control.Copy,
fault.New(true), fault.New(true),
@ -168,10 +156,7 @@ func (suite *RestoreIntgSuite) TestRestoreEvent() {
// TestRestoreExchangeObject verifies path.Category usage for restored objects // TestRestoreExchangeObject verifies path.Category usage for restored objects
func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
t := suite.T() t := suite.T()
handlers := RestoreHandlers(suite.m365.AC)
handlers := RestoreHandlers(suite.ac)
userID := tconfig.M365UserID(suite.T())
tests := []struct { tests := []struct {
name string name string
@ -186,7 +171,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("mailobj").Location folderName := testdata.DefaultRestoreConfig("mailobj").Location
folder, err := handlers[path.EmailCategory]. folder, err := handlers[path.EmailCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -199,7 +184,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("mailwattch").Location folderName := testdata.DefaultRestoreConfig("mailwattch").Location
folder, err := handlers[path.EmailCategory]. folder, err := handlers[path.EmailCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -212,7 +197,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("eventwattch").Location folderName := testdata.DefaultRestoreConfig("eventwattch").Location
folder, err := handlers[path.EmailCategory]. folder, err := handlers[path.EmailCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -225,7 +210,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("mailitemattch").Location folderName := testdata.DefaultRestoreConfig("mailitemattch").Location
folder, err := handlers[path.EmailCategory]. folder, err := handlers[path.EmailCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -240,7 +225,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("mailbasicattch").Location folderName := testdata.DefaultRestoreConfig("mailbasicattch").Location
folder, err := handlers[path.EmailCategory]. folder, err := handlers[path.EmailCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -255,7 +240,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("mailnestattch").Location folderName := testdata.DefaultRestoreConfig("mailnestattch").Location
folder, err := handlers[path.EmailCategory]. folder, err := handlers[path.EmailCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -270,7 +255,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("mailcontactattch").Location folderName := testdata.DefaultRestoreConfig("mailcontactattch").Location
folder, err := handlers[path.EmailCategory]. folder, err := handlers[path.EmailCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -283,7 +268,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("nestedattch").Location folderName := testdata.DefaultRestoreConfig("nestedattch").Location
folder, err := handlers[path.EmailCategory]. folder, err := handlers[path.EmailCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -296,7 +281,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("maillargeattch").Location folderName := testdata.DefaultRestoreConfig("maillargeattch").Location
folder, err := handlers[path.EmailCategory]. folder, err := handlers[path.EmailCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -309,7 +294,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("mailtwoattch").Location folderName := testdata.DefaultRestoreConfig("mailtwoattch").Location
folder, err := handlers[path.EmailCategory]. folder, err := handlers[path.EmailCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -322,7 +307,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("mailrefattch").Location folderName := testdata.DefaultRestoreConfig("mailrefattch").Location
folder, err := handlers[path.EmailCategory]. folder, err := handlers[path.EmailCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -335,7 +320,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("contact").Location folderName := testdata.DefaultRestoreConfig("contact").Location
folder, err := handlers[path.ContactsCategory]. folder, err := handlers[path.ContactsCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(folder.GetId()) return ptr.Val(folder.GetId())
@ -348,7 +333,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("event").Location folderName := testdata.DefaultRestoreConfig("event").Location
calendar, err := handlers[path.EventsCategory]. calendar, err := handlers[path.EventsCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(calendar.GetId()) return ptr.Val(calendar.GetId())
@ -361,7 +346,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
destination: func(t *testing.T, ctx context.Context) string { destination: func(t *testing.T, ctx context.Context) string {
folderName := testdata.DefaultRestoreConfig("eventobj").Location folderName := testdata.DefaultRestoreConfig("eventobj").Location
calendar, err := handlers[path.EventsCategory]. calendar, err := handlers[path.EventsCategory].
CreateContainer(ctx, userID, "", folderName) CreateContainer(ctx, suite.m365.User.ID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
return ptr.Val(calendar.GetId()) return ptr.Val(calendar.GetId())
@ -380,7 +365,8 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() {
info, err := handlers[test.category].restore( info, err := handlers[test.category].restore(
ctx, ctx,
test.bytes, test.bytes,
userID, destination, suite.m365.User.ID,
destination,
nil, nil,
control.Copy, control.Copy,
fault.New(true), fault.New(true),
@ -400,12 +386,11 @@ func (suite *RestoreIntgSuite) TestRestoreAndBackupEvent_recurringInstancesWithA
defer flush() defer flush()
var ( var (
userID = tconfig.M365UserID(t)
subject = testdata.DefaultRestoreConfig("event").Location subject = testdata.DefaultRestoreConfig("event").Location
handler = newEventRestoreHandler(suite.ac) handler = newEventRestoreHandler(suite.m365.AC)
) )
calendar, err := handler.ac.CreateContainer(ctx, userID, "", subject) calendar, err := handler.ac.CreateContainer(ctx, suite.m365.User.ID, "", subject)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
calendarID := ptr.Val(calendar.GetId()) calendarID := ptr.Val(calendar.GetId())
@ -414,7 +399,8 @@ func (suite *RestoreIntgSuite) TestRestoreAndBackupEvent_recurringInstancesWithA
info, err := handler.restore( info, err := handler.restore(
ctx, ctx,
bytes, bytes,
userID, calendarID, suite.m365.User.ID,
calendarID,
nil, nil,
control.Copy, control.Copy,
fault.New(true), fault.New(true),
@ -425,7 +411,7 @@ func (suite *RestoreIntgSuite) TestRestoreAndBackupEvent_recurringInstancesWithA
ec, err := handler.ac.Stable. ec, err := handler.ac.Stable.
Client(). Client().
Users(). Users().
ByUserId(userID). ByUserId(suite.m365.User.ID).
Calendars(). Calendars().
ByCalendarId(calendarID). ByCalendarId(calendarID).
Events(). Events().
@ -435,17 +421,25 @@ func (suite *RestoreIntgSuite) TestRestoreAndBackupEvent_recurringInstancesWithA
evts := ec.GetValue() evts := ec.GetValue()
assert.Len(t, evts, 1, "count of events") assert.Len(t, evts, 1, "count of events")
sp, info, err := suite.ac.Events().GetItem(ctx, userID, ptr.Val(evts[0].GetId()), fault.New(true)) sp, info, err := suite.m365.AC.Events().GetItem(
ctx,
suite.m365.User.ID,
ptr.Val(evts[0].GetId()),
fault.New(true))
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
assert.NotNil(t, info, "event item info") assert.NotNil(t, info, "event item info")
body, err := suite.ac.Events().Serialize(ctx, sp, userID, ptr.Val(evts[0].GetId())) body, err := suite.m365.AC.Events().Serialize(
ctx,
sp,
suite.m365.User.ID,
ptr.Val(evts[0].GetId()))
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
event, err := api.BytesToEventable(body) event, err := api.BytesToEventable(body)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
assert.NotNil(t, event.GetRecurrence(), "recurrence") assert.NotNil(t, event.GetRecurrence(), "recurrence")
eo := event.GetAdditionalData()["exceptionOccurrences"] eo := event.GetAdditionalData()["exceptionOccurrences"]
assert.NotNil(t, eo, "exceptionOccurrences") assert.NotNil(t, eo, "exceptionOccurrences")

View File

@ -18,6 +18,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/support" "github.com/alcionai/corso/src/internal/m365/support"
"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"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/internal/version" "github.com/alcionai/corso/src/internal/version"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
@ -964,9 +965,7 @@ func (suite *BackupUnitSuite) TestPopulateCollections_ConversationsIncremental()
type BackupIntgSuite struct { type BackupIntgSuite struct {
tester.Suite tester.Suite
resource string m365 its.M365IntgTestSetup
tenantID string
ac api.Client
} }
func TestBackupIntgSuite(t *testing.T) { func TestBackupIntgSuite(t *testing.T) {
@ -979,32 +978,19 @@ func TestBackupIntgSuite(t *testing.T) {
func (suite *BackupIntgSuite) SetupSuite() { func (suite *BackupIntgSuite) SetupSuite() {
t := suite.T() t := suite.T()
suite.m365 = its.GetM365(t)
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
graph.InitializeConcurrencyLimiter(ctx, true, 4) graph.InitializeConcurrencyLimiter(ctx, true, 4)
suite.resource = tconfig.M365TeamID(t)
acct := tconfig.NewM365Account(t)
creds, err := acct.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.ac, err = api.NewClient(
creds,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
suite.tenantID = creds.AzureTenantID
} }
func (suite *BackupIntgSuite) TestCreateCollections() { func (suite *BackupIntgSuite) TestCreateCollections() {
var ( var (
protectedResource = tconfig.M365TeamID(suite.T()) protectedResource = suite.m365.Group.ID
resources = []string{protectedResource} resources = []string{suite.m365.Group.ID}
handler = NewChannelBackupHandler(protectedResource, suite.ac.Channels()) handler = NewChannelBackupHandler(protectedResource, suite.m365.AC.Channels())
) )
tests := []struct { tests := []struct {
@ -1030,13 +1016,13 @@ func (suite *BackupIntgSuite) TestCreateCollections() {
ctrlOpts := control.DefaultOptions() ctrlOpts := control.DefaultOptions()
sel := selectors.NewGroupsBackup([]string{protectedResource}) sel := selectors.NewGroupsBackup([]string{suite.m365.Group.ID})
sel.Include(selTD.GroupsBackupChannelScope(sel)) sel.Include(selTD.GroupsBackupChannelScope(sel))
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: ctrlOpts, Options: ctrlOpts,
ProtectedResource: inMock.NewProvider(protectedResource, protectedResource), ProtectedResource: suite.m365.Group.Provider,
Selector: sel.Selector, Selector: sel.Selector,
} }
@ -1044,7 +1030,7 @@ func (suite *BackupIntgSuite) TestCreateCollections() {
ctx, ctx,
bpc, bpc,
handler, handler,
suite.tenantID, suite.m365.TenantID,
test.scope, test.scope,
func(status *support.ControllerOperationStatus) {}, func(status *support.ControllerOperationStatus) {},
false, false,

View File

@ -18,6 +18,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/support" "github.com/alcionai/corso/src/internal/m365/support"
"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"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/internal/version" "github.com/alcionai/corso/src/internal/version"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
@ -328,59 +329,49 @@ func (suite *SharePointBackupUnitSuite) TestPopulateListsCollections_incremental
} }
} }
type SharePointSuite struct { type SharePointBackupIntgSuite struct {
tester.Suite tester.Suite
m365 its.M365IntgTestSetup
} }
func TestSharePointSuite(t *testing.T) { func TestSharePointSuite(t *testing.T) {
suite.Run(t, &SharePointSuite{ suite.Run(t, &SharePointBackupIntgSuite{
Suite: tester.NewIntegrationSuite( Suite: tester.NewIntegrationSuite(
t, t,
[][]string{tconfig.M365AcctCredEnvs}), [][]string{tconfig.M365AcctCredEnvs}),
}) })
} }
func (suite *SharePointSuite) SetupSuite() { func (suite *SharePointBackupIntgSuite) SetupSuite() {
ctx, flush := tester.NewContext(suite.T()) t := suite.T()
suite.m365 = its.GetM365(t)
ctx, flush := tester.NewContext(t)
defer flush() defer flush()
graph.InitializeConcurrencyLimiter(ctx, false, 4) graph.InitializeConcurrencyLimiter(ctx, false, 4)
} }
func (suite *SharePointSuite) TestCollectPages() { func (suite *SharePointBackupIntgSuite) TestCollectPages() {
t := suite.T() t := suite.T()
counter := count.New()
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
var (
siteID = tconfig.M365SiteID(t)
a = tconfig.NewM365Account(t)
counter = count.New()
)
creds, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
ac, err := api.NewClient(
creds,
control.DefaultOptions(),
counter)
require.NoError(t, err, clues.ToCore(err))
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: control.DefaultOptions(), Options: control.DefaultOptions(),
ProtectedResource: mock.NewProvider(siteID, siteID), ProtectedResource: suite.m365.Site.Provider,
} }
sel := selectors.NewSharePointBackup([]string{siteID}) sel := selectors.NewSharePointBackup([]string{suite.m365.Site.ID})
col, err := CollectPages( col, err := CollectPages(
ctx, ctx,
bpc, bpc,
creds, suite.m365.Creds,
ac, suite.m365.AC,
sel.Lists(selectors.Any())[0], sel.Lists(selectors.Any())[0],
(&MockGraphService{}).UpdateStatus, (&MockGraphService{}).UpdateStatus,
counter, counter,
@ -389,43 +380,27 @@ func (suite *SharePointSuite) TestCollectPages() {
assert.NotEmpty(t, col) assert.NotEmpty(t, col)
} }
func (suite *SharePointSuite) TestCollectLists() { func (suite *SharePointBackupIntgSuite) TestCollectLists() {
t := suite.T() t := suite.T()
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
var (
siteID = tconfig.M365SiteID(t)
a = tconfig.NewM365Account(t)
counter = count.New()
)
creds, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
ac, err := api.NewClient(
creds,
control.DefaultOptions(),
counter)
require.NoError(t, err, clues.ToCore(err))
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: control.DefaultOptions(), Options: control.DefaultOptions(),
ProtectedResource: mock.NewProvider(siteID, siteID), ProtectedResource: suite.m365.Site.Provider,
} }
sel := selectors.NewSharePointBackup([]string{siteID}) sel := selectors.NewSharePointBackup([]string{suite.m365.Site.ID})
bh := NewListsBackupHandler(suite.m365.Site.ID, suite.m365.AC.Lists())
bh := NewListsBackupHandler(bpc.ProtectedResource.ID(), ac.Lists())
col, _, err := CollectLists( col, _, err := CollectLists(
ctx, ctx,
bh, bh,
bpc, bpc,
ac, suite.m365.AC,
creds.AzureTenantID, suite.m365.Creds.AzureTenantID,
sel.Lists(selectors.Any())[0], sel.Lists(selectors.Any())[0],
(&MockGraphService{}).UpdateStatus, (&MockGraphService{}).UpdateStatus,
count.New(), count.New(),
@ -445,7 +420,7 @@ func (suite *SharePointSuite) TestCollectLists() {
assert.True(t, metadataFound) assert.True(t, metadataFound)
} }
func (suite *SharePointSuite) TestParseListsMetadataCollections() { func (suite *SharePointBackupIntgSuite) TestParseListsMetadataCollections() {
type fileValues struct { type fileValues struct {
fileName string fileName string
value string value string
@ -580,7 +555,7 @@ func (f failingColl) FetchItemByName(context.Context, string) (data.Item, error)
return nil, nil return nil, nil
} }
func (suite *SharePointSuite) TestParseListsMetadataCollections_ReadFailure() { func (suite *SharePointBackupIntgSuite) TestParseListsMetadataCollections_ReadFailure() {
t := suite.T() t := suite.T()
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)

View File

@ -20,6 +20,7 @@ import (
spMock "github.com/alcionai/corso/src/internal/m365/service/sharepoint/mock" spMock "github.com/alcionai/corso/src/internal/m365/service/sharepoint/mock"
"github.com/alcionai/corso/src/internal/m365/support" "github.com/alcionai/corso/src/internal/m365/support"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/backup/details" "github.com/alcionai/corso/src/pkg/backup/details"
@ -113,34 +114,17 @@ func (suite *SharePointCollectionUnitSuite) TestPrefetchCollection_state() {
} }
} }
type SharePointCollectionSuite struct { type SharePointCollIntgSuite struct {
tester.Suite tester.Suite
siteID string m365 its.M365IntgTestSetup
creds account.M365Config
ac api.Client
} }
func (suite *SharePointCollectionSuite) SetupSuite() { func (suite *SharePointCollIntgSuite) SetupSuite() {
t := suite.T() suite.m365 = its.GetM365(suite.T())
suite.siteID = tconfig.M365SiteID(t)
a := tconfig.NewM365Account(t)
m365, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.creds = m365
ac, err := api.NewClient(
m365,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
suite.ac = ac
} }
func TestSharePointCollectionSuite(t *testing.T) { func TestSharePointCollectionSuite(t *testing.T) {
suite.Run(t, &SharePointCollectionSuite{ suite.Run(t, &SharePointCollIntgSuite{
Suite: tester.NewIntegrationSuite( Suite: tester.NewIntegrationSuite(
t, t,
[][]string{tconfig.M365AcctCredEnvs}), [][]string{tconfig.M365AcctCredEnvs}),
@ -149,15 +133,13 @@ func TestSharePointCollectionSuite(t *testing.T) {
// TestListCollection tests basic functionality to create // TestListCollection tests basic functionality to create
// SharePoint collection and to use the data stream channel. // SharePoint collection and to use the data stream channel.
func (suite *SharePointCollectionSuite) TestPrefetchCollection_Items() { func (suite *SharePointCollIntgSuite) TestPrefetchCollection_Items() {
var ( var (
tenant = "some"
user = "user"
prevRoot = "prev" prevRoot = "prev"
dirRoot = "directory" dirRoot = "directory"
) )
sel := selectors.NewSharePointBackup([]string{"site"}) sel := selectors.NewSharePointBackup([]string{suite.m365.Site.ID})
tables := []struct { tables := []struct {
name, itemName string name, itemName string
@ -183,8 +165,8 @@ func (suite *SharePointCollectionSuite) TestPrefetchCollection_Items() {
getter: &mock.ListHandler{}, getter: &mock.ListHandler{},
getDir: func(t *testing.T, root string) path.Path { getDir: func(t *testing.T, root string) path.Path {
dir, err := path.Build( dir, err := path.Build(
tenant, suite.m365.TenantID,
user, suite.m365.User.ID,
path.SharePointService, path.SharePointService,
path.ListsCategory, path.ListsCategory,
false, false,
@ -232,8 +214,8 @@ func (suite *SharePointCollectionSuite) TestPrefetchCollection_Items() {
getter: nil, getter: nil,
getDir: func(t *testing.T, root string) path.Path { getDir: func(t *testing.T, root string) path.Path {
dir, err := path.Build( dir, err := path.Build(
tenant, suite.m365.TenantID,
user, suite.m365.User.ID,
path.SharePointService, path.SharePointService,
path.PagesCategory, path.PagesCategory,
false, false,
@ -270,7 +252,7 @@ func (suite *SharePointCollectionSuite) TestPrefetchCollection_Items() {
test.getDir(t, test.curr), test.getDir(t, test.curr),
test.getDir(t, test.prev), test.getDir(t, test.prev),
test.locPb, test.locPb,
suite.ac, suite.m365.AC,
test.scope, test.scope,
nil, nil,
control.DefaultOptions(), control.DefaultOptions(),
@ -306,7 +288,7 @@ func (suite *SharePointCollectionSuite) TestPrefetchCollection_Items() {
} }
} }
func (suite *SharePointCollectionSuite) TestLazyCollection_Items() { func (suite *SharePointCollIntgSuite) TestLazyCollection_Items() {
var ( var (
t = suite.T() t = suite.T()
errs = fault.New(true) errs = fault.New(true)
@ -416,7 +398,7 @@ func (suite *SharePointCollectionSuite) TestLazyCollection_Items() {
} }
} }
func (suite *SharePointCollectionSuite) TestLazyItem() { func (suite *SharePointCollIntgSuite) TestLazyItem() {
var ( var (
t = suite.T() t = suite.T()
now = time.Now() now = time.Now()
@ -460,7 +442,7 @@ func (suite *SharePointCollectionSuite) TestLazyItem() {
assert.Equal(t, now, info.Modified()) assert.Equal(t, now, info.Modified())
} }
func (suite *SharePointCollectionSuite) TestLazyItem_ReturnsEmptyReaderOnDeletedInFlight() { func (suite *SharePointCollIntgSuite) TestLazyItem_ReturnsEmptyReaderOnDeletedInFlight() {
var ( var (
t = suite.T() t = suite.T()
now = time.Now() now = time.Now()

View File

@ -21,8 +21,8 @@ import (
siteMock "github.com/alcionai/corso/src/internal/m365/collection/site/mock" siteMock "github.com/alcionai/corso/src/internal/m365/collection/site/mock"
spMock "github.com/alcionai/corso/src/internal/m365/service/sharepoint/mock" spMock "github.com/alcionai/corso/src/internal/m365/service/sharepoint/mock"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/backup/details" "github.com/alcionai/corso/src/pkg/backup/details"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/control/testdata" "github.com/alcionai/corso/src/pkg/control/testdata"
@ -87,32 +87,17 @@ func (suite *SharePointCollectionUnitSuite) TestFormatListsRestoreDestination()
type SharePointRestoreSuite struct { type SharePointRestoreSuite struct {
tester.Suite tester.Suite
siteID string m365 its.M365IntgTestSetup
creds account.M365Config
ac api.Client
} }
func (suite *SharePointRestoreSuite) SetupSuite() { func (suite *SharePointRestoreSuite) SetupSuite() {
t := suite.T() t := suite.T()
suite.m365 = its.GetM365(t)
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
graph.InitializeConcurrencyLimiter(ctx, false, 4) graph.InitializeConcurrencyLimiter(ctx, false, 4)
suite.siteID = tconfig.M365SiteID(t)
a := tconfig.NewM365Account(t)
m365, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.creds = m365
ac, err := api.NewClient(
m365,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
suite.ac = ac
} }
func TestSharePointRestoreSuite(t *testing.T) { func TestSharePointRestoreSuite(t *testing.T) {
@ -135,8 +120,8 @@ func (suite *SharePointRestoreSuite) TestListCollection_Restore() {
listTemplate = "genericList" listTemplate = "genericList"
restoreCfg = testdata.DefaultRestoreConfig("") restoreCfg = testdata.DefaultRestoreConfig("")
destName = restoreCfg.Location destName = restoreCfg.Location
lrh = NewListsRestoreHandler(suite.siteID, suite.ac.Lists()) lrh = NewListsRestoreHandler(suite.m365.Site.ID, suite.m365.AC.Lists())
service = createTestService(t, suite.creds) service = createTestService(t, suite.m365.Creds)
list = stubList(listTemplate, listName) list = stubList(listTemplate, listName)
mockData = generateListData(t, service, list) mockData = generateListData(t, service, list)
) )
@ -147,7 +132,7 @@ func (suite *SharePointRestoreSuite) TestListCollection_Restore() {
ctx, ctx,
lrh, lrh,
mockData, mockData,
suite.siteID, suite.m365.Site.ID,
restoreCfg, restoreCfg,
nil, nil,
count.New(), count.New(),
@ -156,7 +141,7 @@ func (suite *SharePointRestoreSuite) TestListCollection_Restore() {
assert.Equal(t, fmt.Sprintf("%s_%s", destName, listName), deets.SharePoint.List.Name) assert.Equal(t, fmt.Sprintf("%s_%s", destName, listName), deets.SharePoint.List.Name)
// Clean-Up // Clean-Up
deleteList(ctx, t, suite.siteID, lrh, deets) deleteList(ctx, t, suite.m365.Site.ID, lrh, deets)
} }
func (suite *SharePointRestoreSuite) TestListCollection_Restore_invalidListTemplate() { func (suite *SharePointRestoreSuite) TestListCollection_Restore_invalidListTemplate() {
@ -166,10 +151,10 @@ func (suite *SharePointRestoreSuite) TestListCollection_Restore_invalidListTempl
defer flush() defer flush()
var ( var (
lrh = NewListsRestoreHandler(suite.siteID, suite.ac.Lists()) lrh = NewListsRestoreHandler(suite.m365.Site.ID, suite.m365.AC.Lists())
listName = "MockListing" listName = "MockListing"
restoreCfg = testdata.DefaultRestoreConfig("") restoreCfg = testdata.DefaultRestoreConfig("")
service = createTestService(t, suite.creds) service = createTestService(t, suite.m365.Creds)
) )
restoreCfg.OnCollision = control.Copy restoreCfg.OnCollision = control.Copy
@ -201,7 +186,7 @@ func (suite *SharePointRestoreSuite) TestListCollection_Restore_invalidListTempl
ctx, ctx,
lrh, lrh,
listData, listData,
suite.siteID, suite.m365.Site.ID,
restoreCfg, restoreCfg,
nil, nil,
count.New(), count.New(),
@ -222,8 +207,8 @@ func (suite *SharePointRestoreSuite) TestListCollection_RestoreInPlace_skip() {
listName = "MockListing" listName = "MockListing"
listTemplate = "genericList" listTemplate = "genericList"
restoreCfg = testdata.DefaultRestoreConfig("") restoreCfg = testdata.DefaultRestoreConfig("")
lrh = NewListsRestoreHandler(suite.siteID, suite.ac.Lists()) lrh = NewListsRestoreHandler(suite.m365.Site.ID, suite.m365.AC.Lists())
service = createTestService(t, suite.creds) service = createTestService(t, suite.m365.Creds)
list = stubList(listTemplate, listName) list = stubList(listTemplate, listName)
newList = stubList(listTemplate, listName) newList = stubList(listTemplate, listName)
cl = count.New() cl = count.New()
@ -239,7 +224,7 @@ func (suite *SharePointRestoreSuite) TestListCollection_RestoreInPlace_skip() {
ctx, ctx,
lrh, lrh,
mockData, mockData,
suite.siteID, suite.m365.Site.ID,
restoreCfg, // OnCollision is skip by default restoreCfg, // OnCollision is skip by default
collisionKeyToItemID, collisionKeyToItemID,
cl, cl,
@ -261,7 +246,7 @@ func (suite *SharePointRestoreSuite) TestListCollection_RestoreInPlace_copy() {
listTemplate = "genericList" listTemplate = "genericList"
listID = "some-list-id" listID = "some-list-id"
restoreCfg = testdata.DefaultRestoreConfig("") restoreCfg = testdata.DefaultRestoreConfig("")
service = createTestService(t, suite.creds) service = createTestService(t, suite.m365.Creds)
policyToKey = map[control.CollisionPolicy]count.Key{ policyToKey = map[control.CollisionPolicy]count.Key{
control.Replace: count.CollisionReplace, control.Replace: count.CollisionReplace,
@ -354,7 +339,7 @@ func (suite *SharePointRestoreSuite) TestListCollection_RestoreInPlace_copy() {
ctx, ctx,
test.lrh, test.lrh,
mockData, mockData,
suite.siteID, suite.m365.Site.ID,
restoreCfg, restoreCfg,
collisionKeyToItemID, collisionKeyToItemID,
cl, cl,

View File

@ -17,6 +17,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/support" "github.com/alcionai/corso/src/internal/m365/support"
"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"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/internal/version" "github.com/alcionai/corso/src/internal/version"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
@ -255,9 +256,7 @@ func (suite *BackupUnitSuite) TestPopulateCollections() {
type BackupIntgSuite struct { type BackupIntgSuite struct {
tester.Suite tester.Suite
resource string m365 its.M365IntgTestSetup
tenantID string
ac api.Client
} }
func TestBackupIntgSuite(t *testing.T) { func TestBackupIntgSuite(t *testing.T) {
@ -270,33 +269,20 @@ func TestBackupIntgSuite(t *testing.T) {
func (suite *BackupIntgSuite) SetupSuite() { func (suite *BackupIntgSuite) SetupSuite() {
t := suite.T() t := suite.T()
suite.m365 = its.GetM365(t)
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
graph.InitializeConcurrencyLimiter(ctx, true, 4) graph.InitializeConcurrencyLimiter(ctx, true, 4)
suite.resource = tconfig.M365TeamID(t)
acct := tconfig.NewM365Account(t)
creds, err := acct.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.ac, err = api.NewClient(
creds,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
suite.tenantID = creds.AzureTenantID
} }
func (suite *BackupIntgSuite) TestCreateCollections() { func (suite *BackupIntgSuite) TestCreateCollections() {
var ( var (
tenant = tconfig.M365TenantID(suite.T()) tenant = suite.m365.TenantID
protectedResource = tconfig.M365TeamID(suite.T()) protectedResource = suite.m365.Group.ID
resources = []string{protectedResource} resources = []string{protectedResource}
handler = NewUsersChatsBackupHandler(tenant, protectedResource, suite.ac.Chats()) handler = NewUsersChatsBackupHandler(tenant, protectedResource, suite.m365.AC.Chats())
) )
tests := []struct { tests := []struct {
@ -322,13 +308,13 @@ func (suite *BackupIntgSuite) TestCreateCollections() {
ctrlOpts := control.DefaultOptions() ctrlOpts := control.DefaultOptions()
sel := selectors.NewTeamsChatsBackup([]string{protectedResource}) sel := selectors.NewTeamsChatsBackup([]string{suite.m365.Group.ID})
sel.Include(selTD.TeamsChatsBackupChatScope(sel)) sel.Include(selTD.TeamsChatsBackupChatScope(sel))
bpc := inject.BackupProducerConfig{ bpc := inject.BackupProducerConfig{
LastBackupVersion: version.NoBackup, LastBackupVersion: version.NoBackup,
Options: ctrlOpts, Options: ctrlOpts,
ProtectedResource: inMock.NewProvider(protectedResource, protectedResource), ProtectedResource: suite.m365.Group.Provider,
Selector: sel.Selector, Selector: sel.Selector,
} }
@ -336,7 +322,7 @@ func (suite *BackupIntgSuite) TestCreateCollections() {
ctx, ctx,
bpc, bpc,
handler, handler,
suite.tenantID, suite.m365.TenantID,
test.scope, test.scope,
func(status *support.ControllerOperationStatus) {}, func(status *support.ControllerOperationStatus) {},
false, false,

View File

@ -23,6 +23,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/support" "github.com/alcionai/corso/src/internal/m365/support"
"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"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/internal/version" "github.com/alcionai/corso/src/internal/version"
"github.com/alcionai/corso/src/pkg/backup/details" "github.com/alcionai/corso/src/pkg/backup/details"
@ -414,8 +415,7 @@ func (suite *ControllerUnitSuite) TestController_CacheItemInfo() {
type ControllerIntegrationSuite struct { type ControllerIntegrationSuite struct {
tester.Suite tester.Suite
ctrl *Controller ctrl *Controller
user string m365 its.M365IntgTestSetup
secondaryUser string
} }
func TestControllerIntegrationSuite(t *testing.T) { func TestControllerIntegrationSuite(t *testing.T) {
@ -428,15 +428,12 @@ func TestControllerIntegrationSuite(t *testing.T) {
func (suite *ControllerIntegrationSuite) SetupSuite() { func (suite *ControllerIntegrationSuite) SetupSuite() {
t := suite.T() t := suite.T()
suite.m365 = its.GetM365(t)
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
suite.ctrl = newController(ctx, t, path.ExchangeService) suite.ctrl = newController(ctx, t, path.ExchangeService)
suite.user = tconfig.M365UserID(t)
suite.secondaryUser = tconfig.SecondaryM365UserID(t)
tester.LogTimeOfTest(t)
} }
func (suite *ControllerIntegrationSuite) TestEmptyCollections() { func (suite *ControllerIntegrationSuite) TestEmptyCollections() {
@ -1064,7 +1061,7 @@ func (suite *ControllerIntegrationSuite) TestRestoreAndBackup_core() {
suite.Run(test.name, func() { suite.Run(test.name, func() {
cfg := stub.ConfigInfo{ cfg := stub.ConfigInfo{
Tenant: suite.ctrl.tenant, Tenant: suite.ctrl.tenant,
ResourceOwners: []string{suite.user}, ResourceOwners: []string{suite.m365.User.ID},
Service: test.service, Service: test.service,
Opts: control.DefaultOptions(), Opts: control.DefaultOptions(),
RestoreCfg: control.DefaultRestoreConfig(dttm.SafeForTesting), RestoreCfg: control.DefaultRestoreConfig(dttm.SafeForTesting),
@ -1143,7 +1140,7 @@ func (suite *ControllerIntegrationSuite) TestMultiFolderBackupDifferentNames() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
restoreSel := getSelectorWith(t, test.service, []string{suite.user}, true) restoreSel := getSelectorWith(t, test.service, []string{suite.m365.User.ID}, true)
expectedDests := make([]destAndCats, 0, len(test.collections)) expectedDests := make([]destAndCats, 0, len(test.collections))
allItems := 0 allItems := 0
allExpectedData := map[string]map[string][]byte{} allExpectedData := map[string]map[string][]byte{}
@ -1154,7 +1151,7 @@ func (suite *ControllerIntegrationSuite) TestMultiFolderBackupDifferentNames() {
restoreCfg.IncludePermissions = true restoreCfg.IncludePermissions = true
expectedDests = append(expectedDests, destAndCats{ expectedDests = append(expectedDests, destAndCats{
resourceOwner: suite.user, resourceOwner: suite.m365.User.ID,
dest: restoreCfg.Location, dest: restoreCfg.Location,
cats: map[path.CategoryType]struct{}{ cats: map[path.CategoryType]struct{}{
collection.Category: {}, collection.Category: {},
@ -1164,7 +1161,7 @@ func (suite *ControllerIntegrationSuite) TestMultiFolderBackupDifferentNames() {
totalItems, _, collections, expectedData, err := stub.CollectionsForInfo( totalItems, _, collections, expectedData, err := stub.CollectionsForInfo(
test.service, test.service,
suite.ctrl.tenant, suite.ctrl.tenant,
suite.user, suite.m365.User.ID,
restoreCfg, restoreCfg,
[]stub.ColInfo{collection}, []stub.ColInfo{collection},
version.Backup) version.Backup)
@ -1289,7 +1286,7 @@ func (suite *ControllerIntegrationSuite) TestRestoreAndBackup_largeMailAttachmen
cfg := stub.ConfigInfo{ cfg := stub.ConfigInfo{
Tenant: suite.ctrl.tenant, Tenant: suite.ctrl.tenant,
ResourceOwners: []string{suite.user}, ResourceOwners: []string{suite.m365.User.ID},
Service: test.service, Service: test.service,
Opts: control.DefaultOptions(), Opts: control.DefaultOptions(),
RestoreCfg: restoreCfg, RestoreCfg: restoreCfg,
@ -1310,7 +1307,7 @@ func (suite *ControllerIntegrationSuite) TestProduceBackupCollections_createsPre
name: "Exchange", name: "Exchange",
resourceCat: resource.Users, resourceCat: resource.Users,
selectorFunc: func(t *testing.T) selectors.Selector { selectorFunc: func(t *testing.T) selectors.Selector {
sel := selectors.NewExchangeBackup([]string{suite.user}) sel := selectors.NewExchangeBackup([]string{suite.m365.User.ID})
sel.Include( sel.Include(
sel.ContactFolders(selectors.None()), sel.ContactFolders(selectors.None()),
sel.EventCalendars(selectors.None()), sel.EventCalendars(selectors.None()),
@ -1329,7 +1326,7 @@ func (suite *ControllerIntegrationSuite) TestProduceBackupCollections_createsPre
name: "OneDrive", name: "OneDrive",
resourceCat: resource.Users, resourceCat: resource.Users,
selectorFunc: func(t *testing.T) selectors.Selector { selectorFunc: func(t *testing.T) selectors.Selector {
sel := selectors.NewOneDriveBackup([]string{suite.user}) sel := selectors.NewOneDriveBackup([]string{suite.m365.User.ID})
sel.Include(sel.Folders(selectors.None())) sel.Include(sel.Folders(selectors.None()))
return sel.Selector return sel.Selector

View File

@ -1,30 +1,26 @@
package m365 package m365
import ( import (
"context"
"fmt" "fmt"
"strings" "strings"
"testing" "testing"
"github.com/alcionai/clues" "github.com/alcionai/clues"
"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"
"github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata" "github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts" odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts"
"github.com/alcionai/corso/src/internal/m365/service/onedrive/stub" "github.com/alcionai/corso/src/internal/m365/service/onedrive/stub"
m365Stub "github.com/alcionai/corso/src/internal/m365/stub" m365Stub "github.com/alcionai/corso/src/internal/m365/stub"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/internal/version" "github.com/alcionai/corso/src/internal/version"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/control/testdata" "github.com/alcionai/corso/src/pkg/control/testdata"
"github.com/alcionai/corso/src/pkg/dttm" "github.com/alcionai/corso/src/pkg/dttm"
"github.com/alcionai/corso/src/pkg/path" "github.com/alcionai/corso/src/pkg/path"
"github.com/alcionai/corso/src/pkg/services/m365/api"
) )
var ( var (
@ -44,119 +40,6 @@ var (
readPerm = []string{"read"} readPerm = []string{"read"}
) )
func mustGetDefaultDriveID(
t *testing.T,
ctx context.Context, //revive:disable-line:context-as-argument
ac api.Client,
service path.ServiceType,
resourceOwner string,
) string {
var (
err error
d models.Driveable
)
switch service {
case path.OneDriveService:
d, err = ac.Users().GetDefaultDrive(ctx, resourceOwner)
case path.SharePointService:
d, err = ac.Sites().GetDefaultDrive(ctx, resourceOwner)
default:
assert.FailNowf(t, "unknown service type %s", service.String())
}
if err != nil {
err = clues.Wrap(err, "retrieving drive")
}
require.NoError(t, err, clues.ToCore(err))
id := ptr.Val(d.GetId())
require.NotEmpty(t, id)
return id
}
type suiteInfo interface {
APIClient() api.Client
Tenant() string
// Returns (username, user ID) for the user. These values are used for
// permissions.
PrimaryUser() (string, string)
SecondaryUser() (string, string)
TertiaryUser() (string, string)
// ResourceOwner returns the resource owner to run the backup/restore
// with. This can be different from the values used for permissions and it can
// also be a site.
ResourceOwner() string
Service() path.ServiceType
}
type oneDriveSuite interface {
tester.Suite
suiteInfo
}
type suiteInfoImpl struct {
ac api.Client
controller *Controller
resourceOwner string
secondaryUser string
secondaryUserID string
service path.ServiceType
tertiaryUser string
tertiaryUserID string
user string
userID string
}
func NewSuiteInfoImpl(
t *testing.T,
ctx context.Context, //revive:disable-line:context-as-argument
resourceOwner string,
service path.ServiceType,
) suiteInfoImpl {
ctrl := newController(ctx, t, path.OneDriveService)
return suiteInfoImpl{
ac: ctrl.AC,
controller: ctrl,
resourceOwner: resourceOwner,
secondaryUser: tconfig.SecondaryM365UserID(t),
service: service,
tertiaryUser: tconfig.TertiaryM365UserID(t),
user: tconfig.M365UserID(t),
}
}
func (si suiteInfoImpl) APIClient() api.Client {
return si.ac
}
func (si suiteInfoImpl) Tenant() string {
return si.controller.tenant
}
func (si suiteInfoImpl) PrimaryUser() (string, string) {
return si.user, si.userID
}
func (si suiteInfoImpl) SecondaryUser() (string, string) {
return si.secondaryUser, si.secondaryUserID
}
func (si suiteInfoImpl) TertiaryUser() (string, string) {
return si.tertiaryUser, si.tertiaryUserID
}
func (si suiteInfoImpl) ResourceOwner() string {
return si.resourceOwner
}
func (si suiteInfoImpl) Service() path.ServiceType {
return si.service
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// SharePoint Libraries // SharePoint Libraries
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@ -166,7 +49,8 @@ func (si suiteInfoImpl) Service() path.ServiceType {
type SharePointIntegrationSuite struct { type SharePointIntegrationSuite struct {
tester.Suite tester.Suite
suiteInfo m365 its.M365IntgTestSetup
resourceAndSvc its.ResourceServicer
} }
func TestSharePointIntegrationSuite(t *testing.T) { func TestSharePointIntegrationSuite(t *testing.T) {
@ -178,57 +62,38 @@ func TestSharePointIntegrationSuite(t *testing.T) {
} }
func (suite *SharePointIntegrationSuite) SetupSuite() { func (suite *SharePointIntegrationSuite) SetupSuite() {
t := suite.T() suite.m365 = its.GetM365(suite.T())
suite.resourceAndSvc = its.NewResourceService(suite.m365.Site, path.SharePointService)
ctx, flush := tester.NewContext(t)
defer flush()
si := NewSuiteInfoImpl(suite.T(), ctx, tconfig.M365SiteID(suite.T()), path.SharePointService)
// users needed for permissions
user, err := si.controller.AC.Users().GetByID(ctx, si.user, api.CallConfig{})
require.NoError(t, err, "fetching user", si.user, clues.ToCore(err))
si.userID = ptr.Val(user.GetId())
secondaryUser, err := si.controller.AC.Users().GetByID(ctx, si.secondaryUser, api.CallConfig{})
require.NoError(t, err, "fetching user", si.secondaryUser, clues.ToCore(err))
si.secondaryUserID = ptr.Val(secondaryUser.GetId())
tertiaryUser, err := si.controller.AC.Users().GetByID(ctx, si.tertiaryUser, api.CallConfig{})
require.NoError(t, err, "fetching user", si.tertiaryUser, clues.ToCore(err))
si.tertiaryUserID = ptr.Val(tertiaryUser.GetId())
suite.suiteInfo = si
} }
func (suite *SharePointIntegrationSuite) TestRestoreAndBackup_MultipleFilesAndFolders_NoPermissions() { func (suite *SharePointIntegrationSuite) TestRestoreAndBackup_MultipleFilesAndFolders_NoPermissions() {
testRestoreAndBackupMultipleFilesAndFoldersNoPermissions(suite, version.Backup) testRestoreAndBackupMultipleFilesAndFoldersNoPermissions(suite, suite.m365, suite.resourceAndSvc, version.Backup)
} }
// TODO: Re-enable these tests (disabled as it currently acting up CI) // TODO: Re-enable these tests (disabled as it currently acting up CI)
func (suite *SharePointIntegrationSuite) TestPermissionsRestoreAndBackup() { func (suite *SharePointIntegrationSuite) TestPermissionsRestoreAndBackup() {
suite.T().Skip("Temporarily disabled due to CI issues") suite.T().Skip("Temporarily disabled due to CI issues")
testPermissionsRestoreAndBackup(suite, version.Backup) testPermissionsRestoreAndBackup(suite, suite.m365, suite.resourceAndSvc, version.Backup)
} }
func (suite *SharePointIntegrationSuite) TestRestoreNoPermissionsAndBackup() { func (suite *SharePointIntegrationSuite) TestRestoreNoPermissionsAndBackup() {
suite.T().Skip("Temporarily disabled due to CI issues") suite.T().Skip("Temporarily disabled due to CI issues")
testRestoreNoPermissionsAndBackup(suite, version.Backup) testRestoreNoPermissionsAndBackup(suite, suite.m365, suite.resourceAndSvc, version.Backup)
} }
func (suite *SharePointIntegrationSuite) TestPermissionsInheritanceRestoreAndBackup() { func (suite *SharePointIntegrationSuite) TestPermissionsInheritanceRestoreAndBackup() {
suite.T().Skip("Temporarily disabled due to CI issues") suite.T().Skip("Temporarily disabled due to CI issues")
testPermissionsInheritanceRestoreAndBackup(suite, version.Backup) testPermissionsInheritanceRestoreAndBackup(suite, suite.m365, suite.resourceAndSvc, version.Backup)
} }
func (suite *SharePointIntegrationSuite) TestLinkSharesInheritanceRestoreAndBackup() { func (suite *SharePointIntegrationSuite) TestLinkSharesInheritanceRestoreAndBackup() {
suite.T().Skip("Temporarily disabled due to CI issues") suite.T().Skip("Temporarily disabled due to CI issues")
testLinkSharesInheritanceRestoreAndBackup(suite, version.Backup) testLinkSharesInheritanceRestoreAndBackup(suite, suite.m365, suite.resourceAndSvc, version.Backup)
} }
func (suite *SharePointIntegrationSuite) TestRestoreFolderNamedFolderRegression() { func (suite *SharePointIntegrationSuite) TestRestoreFolderNamedFolderRegression() {
// No reason why it couldn't work with previous versions, but this is when it got introduced. // No reason why it couldn't work with previous versions, but this is when it got introduced.
testRestoreFolderNamedFolderRegression(suite, version.All8MigrateUserPNToID) testRestoreFolderNamedFolderRegression(suite, suite.m365, suite.resourceAndSvc, version.All8MigrateUserPNToID)
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@ -236,7 +101,8 @@ func (suite *SharePointIntegrationSuite) TestRestoreFolderNamedFolderRegression(
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
type OneDriveIntegrationSuite struct { type OneDriveIntegrationSuite struct {
tester.Suite tester.Suite
suiteInfo m365 its.M365IntgTestSetup
resourceAndSvc its.ResourceServicer
} }
func TestOneDriveIntegrationSuite(t *testing.T) { func TestOneDriveIntegrationSuite(t *testing.T) {
@ -248,51 +114,33 @@ func TestOneDriveIntegrationSuite(t *testing.T) {
} }
func (suite *OneDriveIntegrationSuite) SetupSuite() { func (suite *OneDriveIntegrationSuite) SetupSuite() {
t := suite.T() suite.m365 = its.GetM365(suite.T())
suite.resourceAndSvc = its.NewResourceService(suite.m365.User, path.OneDriveService)
ctx, flush := tester.NewContext(t)
defer flush()
si := NewSuiteInfoImpl(t, ctx, tconfig.M365UserID(t), path.OneDriveService)
user, err := si.controller.AC.Users().GetByID(ctx, si.user, api.CallConfig{})
require.NoError(t, err, "fetching user", si.user, clues.ToCore(err))
si.userID = ptr.Val(user.GetId())
secondaryUser, err := si.controller.AC.Users().GetByID(ctx, si.secondaryUser, api.CallConfig{})
require.NoError(t, err, "fetching user", si.secondaryUser, clues.ToCore(err))
si.secondaryUserID = ptr.Val(secondaryUser.GetId())
tertiaryUser, err := si.controller.AC.Users().GetByID(ctx, si.tertiaryUser, api.CallConfig{})
require.NoError(t, err, "fetching user", si.tertiaryUser, clues.ToCore(err))
si.tertiaryUserID = ptr.Val(tertiaryUser.GetId())
suite.suiteInfo = si
} }
func (suite *OneDriveIntegrationSuite) TestRestoreAndBackup_MultipleFilesAndFolders_NoPermissions() { func (suite *OneDriveIntegrationSuite) TestRestoreAndBackup_MultipleFilesAndFolders_NoPermissions() {
testRestoreAndBackupMultipleFilesAndFoldersNoPermissions(suite, version.Backup) testRestoreAndBackupMultipleFilesAndFoldersNoPermissions(suite, suite.m365, suite.resourceAndSvc, version.Backup)
} }
func (suite *OneDriveIntegrationSuite) TestPermissionsRestoreAndBackup() { func (suite *OneDriveIntegrationSuite) TestPermissionsRestoreAndBackup() {
testPermissionsRestoreAndBackup(suite, version.Backup) testPermissionsRestoreAndBackup(suite, suite.m365, suite.resourceAndSvc, version.Backup)
} }
func (suite *OneDriveIntegrationSuite) TestRestoreNoPermissionsAndBackup() { func (suite *OneDriveIntegrationSuite) TestRestoreNoPermissionsAndBackup() {
testRestoreNoPermissionsAndBackup(suite, version.Backup) testRestoreNoPermissionsAndBackup(suite, suite.m365, suite.resourceAndSvc, version.Backup)
} }
func (suite *OneDriveIntegrationSuite) TestPermissionsInheritanceRestoreAndBackup() { func (suite *OneDriveIntegrationSuite) TestPermissionsInheritanceRestoreAndBackup() {
testPermissionsInheritanceRestoreAndBackup(suite, version.Backup) testPermissionsInheritanceRestoreAndBackup(suite, suite.m365, suite.resourceAndSvc, version.Backup)
} }
func (suite *OneDriveIntegrationSuite) TestLinkSharesInheritanceRestoreAndBackup() { func (suite *OneDriveIntegrationSuite) TestLinkSharesInheritanceRestoreAndBackup() {
testLinkSharesInheritanceRestoreAndBackup(suite, version.Backup) testLinkSharesInheritanceRestoreAndBackup(suite, suite.m365, suite.resourceAndSvc, version.Backup)
} }
func (suite *OneDriveIntegrationSuite) TestRestoreFolderNamedFolderRegression() { func (suite *OneDriveIntegrationSuite) TestRestoreFolderNamedFolderRegression() {
// No reason why it couldn't work with previous versions, but this is when it got introduced. // No reason why it couldn't work with previous versions, but this is when it got introduced.
testRestoreFolderNamedFolderRegression(suite, version.All8MigrateUserPNToID) testRestoreFolderNamedFolderRegression(suite, suite.m365, suite.resourceAndSvc, version.All8MigrateUserPNToID)
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@ -300,7 +148,8 @@ func (suite *OneDriveIntegrationSuite) TestRestoreFolderNamedFolderRegression()
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
type OneDriveNightlySuite struct { type OneDriveNightlySuite struct {
tester.Suite tester.Suite
suiteInfo m365 its.M365IntgTestSetup
resourceAndSvc its.ResourceServicer
} }
func TestOneDriveNightlySuite(t *testing.T) { func TestOneDriveNightlySuite(t *testing.T) {
@ -312,70 +161,48 @@ func TestOneDriveNightlySuite(t *testing.T) {
} }
func (suite *OneDriveNightlySuite) SetupSuite() { func (suite *OneDriveNightlySuite) SetupSuite() {
t := suite.T() suite.m365 = its.GetM365(suite.T())
suite.resourceAndSvc = its.NewResourceService(suite.m365.User, path.OneDriveService)
ctx, flush := tester.NewContext(t)
defer flush()
si := NewSuiteInfoImpl(t, ctx, tconfig.M365UserID(t), path.OneDriveService)
user, err := si.controller.AC.Users().GetByID(ctx, si.user, api.CallConfig{})
require.NoError(t, err, "fetching user", si.user, clues.ToCore(err))
si.userID = ptr.Val(user.GetId())
secondaryUser, err := si.controller.AC.Users().GetByID(ctx, si.secondaryUser, api.CallConfig{})
require.NoError(t, err, "fetching user", si.secondaryUser, clues.ToCore(err))
si.secondaryUserID = ptr.Val(secondaryUser.GetId())
tertiaryUser, err := si.controller.AC.Users().GetByID(ctx, si.tertiaryUser, api.CallConfig{})
require.NoError(t, err, "fetching user", si.tertiaryUser, clues.ToCore(err))
si.tertiaryUserID = ptr.Val(tertiaryUser.GetId())
suite.suiteInfo = si
} }
func (suite *OneDriveNightlySuite) TestRestoreAndBackup_MultipleFilesAndFolders_NoPermissions() { func (suite *OneDriveNightlySuite) TestRestoreAndBackup_MultipleFilesAndFolders_NoPermissions() {
testRestoreAndBackupMultipleFilesAndFoldersNoPermissions(suite, 0) testRestoreAndBackupMultipleFilesAndFoldersNoPermissions(suite, suite.m365, suite.resourceAndSvc, 0)
} }
func (suite *OneDriveNightlySuite) TestPermissionsRestoreAndBackup() { func (suite *OneDriveNightlySuite) TestPermissionsRestoreAndBackup() {
testPermissionsRestoreAndBackup(suite, version.OneDrive1DataAndMetaFiles) testPermissionsRestoreAndBackup(suite, suite.m365, suite.resourceAndSvc, version.OneDrive1DataAndMetaFiles)
} }
func (suite *OneDriveNightlySuite) TestRestoreNoPermissionsAndBackup() { func (suite *OneDriveNightlySuite) TestRestoreNoPermissionsAndBackup() {
testRestoreNoPermissionsAndBackup(suite, version.OneDrive1DataAndMetaFiles) testRestoreNoPermissionsAndBackup(suite, suite.m365, suite.resourceAndSvc, version.OneDrive1DataAndMetaFiles)
} }
func (suite *OneDriveNightlySuite) TestPermissionsInheritanceRestoreAndBackup() { func (suite *OneDriveNightlySuite) TestPermissionsInheritanceRestoreAndBackup() {
// No reason why it couldn't work with previous versions, but this is when it got introduced. // No reason why it couldn't work with previous versions, but this is when it got introduced.
testPermissionsInheritanceRestoreAndBackup(suite, version.OneDrive4DirIncludesPermissions) testPermissionsInheritanceRestoreAndBackup(
suite,
suite.m365,
suite.resourceAndSvc,
version.OneDrive4DirIncludesPermissions)
} }
func (suite *OneDriveNightlySuite) TestLinkSharesInheritanceRestoreAndBackup() { func (suite *OneDriveNightlySuite) TestLinkSharesInheritanceRestoreAndBackup() {
testLinkSharesInheritanceRestoreAndBackup(suite, version.Backup) testLinkSharesInheritanceRestoreAndBackup(suite, suite.m365, suite.resourceAndSvc, version.Backup)
} }
func (suite *OneDriveNightlySuite) TestRestoreFolderNamedFolderRegression() { func (suite *OneDriveNightlySuite) TestRestoreFolderNamedFolderRegression() {
// No reason why it couldn't work with previous versions, but this is when it got introduced. // No reason why it couldn't work with previous versions, but this is when it got introduced.
testRestoreFolderNamedFolderRegression(suite, version.All8MigrateUserPNToID) testRestoreFolderNamedFolderRegression(suite, suite.m365, suite.resourceAndSvc, version.All8MigrateUserPNToID)
} }
func testRestoreAndBackupMultipleFilesAndFoldersNoPermissions( func testRestoreAndBackupMultipleFilesAndFoldersNoPermissions(
suite oneDriveSuite, suite tester.Suite,
m365 its.M365IntgTestSetup,
resourceAndSvc its.ResourceServicer,
startVersion int, startVersion int,
) { ) {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
// Get the default drive ID for the test user. // Get the default drive ID for the test user.
driveID := mustGetDefaultDriveID( driveID := resourceAndSvc.Resource().DriveID
t,
ctx,
suite.APIClient(),
suite.Service(),
suite.ResourceOwner())
rootPath := []string{ rootPath := []string{
odConsts.DrivesPathDir, odConsts.DrivesPathDir,
@ -488,17 +315,17 @@ func testRestoreAndBackupMultipleFilesAndFoldersNoPermissions(
}, },
} }
expected, err := stub.DataForInfo(suite.Service(), cols, version.Backup) expected, err := stub.DataForInfo(resourceAndSvc.Service(), cols, version.Backup)
require.NoError(suite.T(), err) require.NoError(suite.T(), err)
for vn := startVersion; vn <= version.Backup; vn++ { for vn := startVersion; vn <= version.Backup; vn++ {
suite.Run(fmt.Sprintf("Version%d", vn), func() { suite.Run(fmt.Sprintf("Version%d", vn), func() {
t := suite.T() t := suite.T()
input, err := stub.DataForInfo(suite.Service(), cols, vn) input, err := stub.DataForInfo(resourceAndSvc.Service(), cols, vn)
require.NoError(suite.T(), err) require.NoError(suite.T(), err)
testData := restoreBackupInfoMultiVersion{ testData := restoreBackupInfoMultiVersion{
service: suite.Service(), service: resourceAndSvc.Service(),
backupVersion: vn, backupVersion: vn,
collectionsPrevious: input, collectionsPrevious: input,
collectionsLatest: expected, collectionsLatest: expected,
@ -511,8 +338,8 @@ func testRestoreAndBackupMultipleFilesAndFoldersNoPermissions(
opts := control.DefaultOptions() opts := control.DefaultOptions()
cfg := m365Stub.ConfigInfo{ cfg := m365Stub.ConfigInfo{
Tenant: suite.Tenant(), Tenant: m365.TenantID,
ResourceOwners: []string{suite.ResourceOwner()}, ResourceOwners: []string{resourceAndSvc.Resource().ID},
Service: testData.service, Service: testData.service,
Opts: opts, Opts: opts,
RestoreCfg: restoreCfg, RestoreCfg: restoreCfg,
@ -523,21 +350,14 @@ func testRestoreAndBackupMultipleFilesAndFoldersNoPermissions(
} }
} }
func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) { func testPermissionsRestoreAndBackup(
t := suite.T() suite tester.Suite,
m365 its.M365IntgTestSetup,
ctx, flush := tester.NewContext(t) resourceAndSvc its.ResourceServicer,
defer flush() startVersion int,
) {
secondaryUserName, secondaryUserID := suite.SecondaryUser()
// Get the default drive ID for the test user. // Get the default drive ID for the test user.
driveID := mustGetDefaultDriveID( driveID := resourceAndSvc.Resource().DriveID
t,
ctx,
suite.APIClient(),
suite.Service(),
suite.ResourceOwner())
fileName2 := "test-file2.txt" fileName2 := "test-file2.txt"
folderCName := "folder-c" folderCName := "folder-c"
@ -587,8 +407,8 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
Data: fileAData, Data: fileAData,
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: secondaryUserName, User: m365.SecondaryUser.Email,
EntityID: secondaryUserID, EntityID: m365.SecondaryUser.ID,
Roles: writePerm, Roles: writePerm,
}, },
}, },
@ -614,8 +434,8 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
Name: folderAName, Name: folderAName,
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: secondaryUserName, User: m365.SecondaryUser.Email,
EntityID: secondaryUserID, EntityID: m365.SecondaryUser.ID,
Roles: readPerm, Roles: readPerm,
}, },
}, },
@ -624,8 +444,8 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
Name: folderCName, Name: folderCName,
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: secondaryUserName, User: m365.SecondaryUser.Email,
EntityID: secondaryUserID, EntityID: m365.SecondaryUser.ID,
Roles: readPerm, Roles: readPerm,
}, },
}, },
@ -645,8 +465,8 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
Data: fileBData, Data: fileBData,
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: secondaryUserName, User: m365.SecondaryUser.Email,
EntityID: secondaryUserID, EntityID: m365.SecondaryUser.ID,
Roles: writePerm, Roles: writePerm,
}, },
}, },
@ -657,8 +477,8 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
Name: folderAName, Name: folderAName,
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: secondaryUserName, User: m365.SecondaryUser.Email,
EntityID: secondaryUserID, EntityID: m365.SecondaryUser.ID,
Roles: readPerm, Roles: readPerm,
}, },
}, },
@ -676,15 +496,15 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
// name: fileName, // name: fileName,
// data: fileDData, // data: fileDData,
// perms: stub.PermData{ // perms: stub.PermData{
// user: secondaryUserName, // user: m365.SecondaryUser.Email,
// entityID: secondaryUserID, // entityID: m365.SecondaryUser.ID,
// roles: readPerm, // roles: readPerm,
// }, // },
// }, // },
// }, // },
// Perms: stub.PermData{ // Perms: stub.PermData{
// User: secondaryUserName, // User: m365.SecondaryUser.Email,
// EntityID: secondaryUserID, // EntityID: m365.SecondaryUser.ID,
// Roles: readPerm, // Roles: readPerm,
// }, // },
// }, // },
@ -698,8 +518,8 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
Data: fileEData, Data: fileEData,
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: secondaryUserName, User: m365.SecondaryUser.Email,
EntityID: secondaryUserID, EntityID: m365.SecondaryUser.ID,
Roles: writePerm, Roles: writePerm,
}, },
}, },
@ -707,8 +527,8 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
}, },
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: secondaryUserName, User: m365.SecondaryUser.Email,
EntityID: secondaryUserID, EntityID: m365.SecondaryUser.ID,
Roles: readPerm, Roles: readPerm,
}, },
}, },
@ -728,17 +548,18 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
}, },
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: secondaryUserName, User: m365.SecondaryUser.Email,
EntityID: secondaryUserID, EntityID: m365.SecondaryUser.ID,
Roles: readPerm, Roles: readPerm,
}, },
}, },
}, },
} }
expected, err := stub.DataForInfo(suite.Service(), cols, version.Backup) expected, err := stub.DataForInfo(resourceAndSvc.Service(), cols, version.Backup)
require.NoError(suite.T(), err) require.NoError(suite.T(), err)
bss := suite.Service().String()
bss := resourceAndSvc.Service().String()
for vn := startVersion; vn <= version.Backup; vn++ { for vn := startVersion; vn <= version.Backup; vn++ {
suite.Run(fmt.Sprintf("%s-Version%d", bss, vn), func() { suite.Run(fmt.Sprintf("%s-Version%d", bss, vn), func() {
@ -746,11 +567,11 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
// Ideally this can always be true or false and still // Ideally this can always be true or false and still
// work, but limiting older versions to use emails so as // work, but limiting older versions to use emails so as
// to validate that flow as well. // to validate that flow as well.
input, err := stub.DataForInfo(suite.Service(), cols, vn) input, err := stub.DataForInfo(resourceAndSvc.Service(), cols, vn)
require.NoError(suite.T(), err) require.NoError(suite.T(), err)
testData := restoreBackupInfoMultiVersion{ testData := restoreBackupInfoMultiVersion{
service: suite.Service(), service: resourceAndSvc.Service(),
backupVersion: vn, backupVersion: vn,
collectionsPrevious: input, collectionsPrevious: input,
collectionsLatest: expected, collectionsLatest: expected,
@ -763,8 +584,8 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
opts := control.DefaultOptions() opts := control.DefaultOptions()
cfg := m365Stub.ConfigInfo{ cfg := m365Stub.ConfigInfo{
Tenant: suite.Tenant(), Tenant: m365.TenantID,
ResourceOwners: []string{suite.ResourceOwner()}, ResourceOwners: []string{resourceAndSvc.Resource().ID},
Service: testData.service, Service: testData.service,
Opts: opts, Opts: opts,
RestoreCfg: restoreCfg, RestoreCfg: restoreCfg,
@ -775,21 +596,14 @@ func testPermissionsRestoreAndBackup(suite oneDriveSuite, startVersion int) {
} }
} }
func testRestoreNoPermissionsAndBackup(suite oneDriveSuite, startVersion int) { func testRestoreNoPermissionsAndBackup(
t := suite.T() suite tester.Suite,
m365 its.M365IntgTestSetup,
ctx, flush := tester.NewContext(t) resourceAndSvc its.ResourceServicer,
defer flush() startVersion int,
) {
secondaryUserName, secondaryUserID := suite.SecondaryUser()
// Get the default drive ID for the test user. // Get the default drive ID for the test user.
driveID := mustGetDefaultDriveID( driveID := resourceAndSvc.Resource().DriveID
t,
ctx,
suite.APIClient(),
suite.Service(),
suite.ResourceOwner())
inputCols := []stub.ColInfo{ inputCols := []stub.ColInfo{
{ {
@ -804,8 +618,8 @@ func testRestoreNoPermissionsAndBackup(suite oneDriveSuite, startVersion int) {
Data: fileAData, Data: fileAData,
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: secondaryUserName, User: m365.SecondaryUser.Email,
EntityID: secondaryUserID, EntityID: m365.SecondaryUser.ID,
Roles: writePerm, Roles: writePerm,
}, },
SharingMode: metadata.SharingModeCustom, SharingMode: metadata.SharingModeCustom,
@ -832,18 +646,20 @@ func testRestoreNoPermissionsAndBackup(suite oneDriveSuite, startVersion int) {
}, },
} }
expected, err := stub.DataForInfo(suite.Service(), expectedCols, version.Backup) expected, err := stub.DataForInfo(resourceAndSvc.Service(), expectedCols, version.Backup)
require.NoError(suite.T(), err) require.NoError(suite.T(), err, clues.ToCore(err))
bss := suite.Service().String()
bss := resourceAndSvc.Service().String()
for vn := startVersion; vn <= version.Backup; vn++ { for vn := startVersion; vn <= version.Backup; vn++ {
suite.Run(fmt.Sprintf("%s-Version%d", bss, vn), func() { suite.Run(fmt.Sprintf("%s-Version%d", bss, vn), func() {
t := suite.T() t := suite.T()
input, err := stub.DataForInfo(suite.Service(), inputCols, vn)
require.NoError(suite.T(), err) input, err := stub.DataForInfo(resourceAndSvc.Service(), inputCols, vn)
require.NoError(t, err, clues.ToCore(err))
testData := restoreBackupInfoMultiVersion{ testData := restoreBackupInfoMultiVersion{
service: suite.Service(), service: resourceAndSvc.Service(),
backupVersion: vn, backupVersion: vn,
collectionsPrevious: input, collectionsPrevious: input,
collectionsLatest: expected, collectionsLatest: expected,
@ -856,8 +672,8 @@ func testRestoreNoPermissionsAndBackup(suite oneDriveSuite, startVersion int) {
opts := control.DefaultOptions() opts := control.DefaultOptions()
cfg := m365Stub.ConfigInfo{ cfg := m365Stub.ConfigInfo{
Tenant: suite.Tenant(), Tenant: m365.TenantID,
ResourceOwners: []string{suite.ResourceOwner()}, ResourceOwners: []string{resourceAndSvc.Resource().ID},
Service: testData.service, Service: testData.service,
Opts: opts, Opts: opts,
RestoreCfg: restoreCfg, RestoreCfg: restoreCfg,
@ -870,22 +686,14 @@ func testRestoreNoPermissionsAndBackup(suite oneDriveSuite, startVersion int) {
// This is similar to TestPermissionsRestoreAndBackup but tests purely // This is similar to TestPermissionsRestoreAndBackup but tests purely
// for inheritance and that too only with newer versions // for inheritance and that too only with newer versions
func testPermissionsInheritanceRestoreAndBackup(suite oneDriveSuite, startVersion int) { func testPermissionsInheritanceRestoreAndBackup(
t := suite.T() suite tester.Suite,
m365 its.M365IntgTestSetup,
ctx, flush := tester.NewContext(t) resourceAndSvc its.ResourceServicer,
defer flush() startVersion int,
) {
secondaryUserName, secondaryUserID := suite.SecondaryUser()
tertiaryUserName, tertiaryUserID := suite.TertiaryUser()
// Get the default drive ID for the test user. // Get the default drive ID for the test user.
driveID := mustGetDefaultDriveID( driveID := resourceAndSvc.Resource().DriveID
t,
ctx,
suite.APIClient(),
suite.Service(),
suite.ResourceOwner())
folderAName := "custom" folderAName := "custom"
folderBName := "inherited" folderBName := "inherited"
@ -929,8 +737,8 @@ func testPermissionsInheritanceRestoreAndBackup(suite oneDriveSuite, startVersio
Data: fileAData, Data: fileAData,
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: secondaryUserName, User: m365.SecondaryUser.Email,
EntityID: secondaryUserID, EntityID: m365.SecondaryUser.ID,
Roles: writePerm, Roles: writePerm,
}, },
SharingMode: metadata.SharingModeCustom, SharingMode: metadata.SharingModeCustom,
@ -1002,8 +810,8 @@ func testPermissionsInheritanceRestoreAndBackup(suite oneDriveSuite, startVersio
}, },
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: tertiaryUserName, User: m365.TertiaryUser.Email,
EntityID: tertiaryUserID, EntityID: m365.TertiaryUser.ID,
Roles: readPerm, Roles: readPerm,
}, },
SharingMode: metadata.SharingModeCustom, SharingMode: metadata.SharingModeCustom,
@ -1014,8 +822,8 @@ func testPermissionsInheritanceRestoreAndBackup(suite oneDriveSuite, startVersio
Files: fileSet, Files: fileSet,
Meta: stub.MetaData{ Meta: stub.MetaData{
Perms: stub.PermData{ Perms: stub.PermData{
User: tertiaryUserName, User: m365.TertiaryUser.Email,
EntityID: tertiaryUserID, EntityID: m365.TertiaryUser.ID,
Roles: writePerm, Roles: writePerm,
}, },
SharingMode: metadata.SharingModeCustom, SharingMode: metadata.SharingModeCustom,
@ -1037,9 +845,10 @@ func testPermissionsInheritanceRestoreAndBackup(suite oneDriveSuite, startVersio
}, },
} }
expected, err := stub.DataForInfo(suite.Service(), cols, version.Backup) expected, err := stub.DataForInfo(resourceAndSvc.Service(), cols, version.Backup)
require.NoError(suite.T(), err) require.NoError(suite.T(), err)
bss := suite.Service().String()
bss := resourceAndSvc.Service().String()
for vn := startVersion; vn <= version.Backup; vn++ { for vn := startVersion; vn <= version.Backup; vn++ {
suite.Run(fmt.Sprintf("%s-Version%d", bss, vn), func() { suite.Run(fmt.Sprintf("%s-Version%d", bss, vn), func() {
@ -1047,11 +856,11 @@ func testPermissionsInheritanceRestoreAndBackup(suite oneDriveSuite, startVersio
// Ideally this can always be true or false and still // Ideally this can always be true or false and still
// work, but limiting older versions to use emails so as // work, but limiting older versions to use emails so as
// to validate that flow as well. // to validate that flow as well.
input, err := stub.DataForInfo(suite.Service(), cols, vn) input, err := stub.DataForInfo(resourceAndSvc.Service(), cols, vn)
require.NoError(suite.T(), err) require.NoError(suite.T(), err)
testData := restoreBackupInfoMultiVersion{ testData := restoreBackupInfoMultiVersion{
service: suite.Service(), service: resourceAndSvc.Service(),
backupVersion: vn, backupVersion: vn,
collectionsPrevious: input, collectionsPrevious: input,
collectionsLatest: expected, collectionsLatest: expected,
@ -1064,8 +873,8 @@ func testPermissionsInheritanceRestoreAndBackup(suite oneDriveSuite, startVersio
opts := control.DefaultOptions() opts := control.DefaultOptions()
cfg := m365Stub.ConfigInfo{ cfg := m365Stub.ConfigInfo{
Tenant: suite.Tenant(), Tenant: m365.TenantID,
ResourceOwners: []string{suite.ResourceOwner()}, ResourceOwners: []string{resourceAndSvc.Resource().ID},
Service: testData.service, Service: testData.service,
Opts: opts, Opts: opts,
RestoreCfg: restoreCfg, RestoreCfg: restoreCfg,
@ -1076,33 +885,26 @@ func testPermissionsInheritanceRestoreAndBackup(suite oneDriveSuite, startVersio
} }
} }
func testLinkSharesInheritanceRestoreAndBackup(suite oneDriveSuite, startVersion int) { func testLinkSharesInheritanceRestoreAndBackup(
t := suite.T() suite tester.Suite,
m365 its.M365IntgTestSetup,
ctx, flush := tester.NewContext(t) resourceAndSvc its.ResourceServicer,
defer flush() startVersion int,
) {
secondaryUserName, secondaryUserID := suite.SecondaryUser()
secondaryUser := metadata.Entity{ secondaryUser := metadata.Entity{
ID: secondaryUserID, ID: m365.SecondaryUser.ID,
Email: secondaryUserName, Email: m365.SecondaryUser.Email,
EntityType: metadata.GV2User, EntityType: metadata.GV2User,
} }
tertiaryUserName, tertiaryUserID := suite.TertiaryUser()
tertiaryUser := metadata.Entity{ tertiaryUser := metadata.Entity{
ID: tertiaryUserID, ID: m365.TertiaryUser.ID,
Email: tertiaryUserName, Email: m365.TertiaryUser.Email,
EntityType: metadata.GV2User, EntityType: metadata.GV2User,
} }
// Get the default drive ID for the test user. // Get the default drive ID for the test user.
driveID := mustGetDefaultDriveID( driveID := resourceAndSvc.Resource().DriveID
t,
ctx,
suite.APIClient(),
suite.Service(),
suite.ResourceOwner())
folderAName := "custom" folderAName := "custom"
folderBName := "inherited" folderBName := "inherited"
@ -1246,9 +1048,10 @@ func testLinkSharesInheritanceRestoreAndBackup(suite oneDriveSuite, startVersion
}, },
} }
expected, err := stub.DataForInfo(suite.Service(), cols, version.Backup) expected, err := stub.DataForInfo(resourceAndSvc.Service(), cols, version.Backup)
require.NoError(suite.T(), err) require.NoError(suite.T(), err)
bss := suite.Service().String()
bss := resourceAndSvc.Service().String()
for vn := startVersion; vn <= version.Backup; vn++ { for vn := startVersion; vn <= version.Backup; vn++ {
suite.Run(fmt.Sprintf("%s-Version%d", bss, vn), func() { suite.Run(fmt.Sprintf("%s-Version%d", bss, vn), func() {
@ -1256,11 +1059,11 @@ func testLinkSharesInheritanceRestoreAndBackup(suite oneDriveSuite, startVersion
// Ideally this can always be true or false and still // Ideally this can always be true or false and still
// work, but limiting older versions to use emails so as // work, but limiting older versions to use emails so as
// to validate that flow as well. // to validate that flow as well.
input, err := stub.DataForInfo(suite.Service(), cols, vn) input, err := stub.DataForInfo(resourceAndSvc.Service(), cols, vn)
require.NoError(suite.T(), err) require.NoError(suite.T(), err)
testData := restoreBackupInfoMultiVersion{ testData := restoreBackupInfoMultiVersion{
service: suite.Service(), service: resourceAndSvc.Service(),
backupVersion: vn, backupVersion: vn,
collectionsPrevious: input, collectionsPrevious: input,
collectionsLatest: expected, collectionsLatest: expected,
@ -1273,8 +1076,8 @@ func testLinkSharesInheritanceRestoreAndBackup(suite oneDriveSuite, startVersion
opts := control.DefaultOptions() opts := control.DefaultOptions()
cfg := m365Stub.ConfigInfo{ cfg := m365Stub.ConfigInfo{
Tenant: suite.Tenant(), Tenant: m365.TenantID,
ResourceOwners: []string{suite.ResourceOwner()}, ResourceOwners: []string{resourceAndSvc.Resource().ID},
Service: testData.service, Service: testData.service,
Opts: opts, Opts: opts,
RestoreCfg: restoreCfg, RestoreCfg: restoreCfg,
@ -1286,21 +1089,13 @@ func testLinkSharesInheritanceRestoreAndBackup(suite oneDriveSuite, startVersion
} }
func testRestoreFolderNamedFolderRegression( func testRestoreFolderNamedFolderRegression(
suite oneDriveSuite, suite tester.Suite,
m365 its.M365IntgTestSetup,
resourceAndSvc its.ResourceServicer,
startVersion int, startVersion int,
) { ) {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
// Get the default drive ID for the test user. // Get the default drive ID for the test user.
driveID := mustGetDefaultDriveID( driveID := resourceAndSvc.Resource().DriveID
suite.T(),
ctx,
suite.APIClient(),
suite.Service(),
suite.ResourceOwner())
rootPath := []string{ rootPath := []string{
odConsts.DrivesPathDir, odConsts.DrivesPathDir,
@ -1369,18 +1164,19 @@ func testRestoreFolderNamedFolderRegression(
}, },
} }
expected, err := stub.DataForInfo(suite.Service(), cols, version.Backup) expected, err := stub.DataForInfo(resourceAndSvc.Service(), cols, version.Backup)
require.NoError(suite.T(), err) require.NoError(suite.T(), err)
bss := suite.Service().String()
bss := resourceAndSvc.Service().String()
for vn := startVersion; vn <= version.Backup; vn++ { for vn := startVersion; vn <= version.Backup; vn++ {
suite.Run(fmt.Sprintf("%s-Version%d", bss, vn), func() { suite.Run(fmt.Sprintf("%s-Version%d", bss, vn), func() {
t := suite.T() t := suite.T()
input, err := stub.DataForInfo(suite.Service(), cols, vn) input, err := stub.DataForInfo(resourceAndSvc.Service(), cols, vn)
require.NoError(suite.T(), err) require.NoError(suite.T(), err)
testData := restoreBackupInfoMultiVersion{ testData := restoreBackupInfoMultiVersion{
service: suite.Service(), service: resourceAndSvc.Service(),
backupVersion: vn, backupVersion: vn,
collectionsPrevious: input, collectionsPrevious: input,
collectionsLatest: expected, collectionsLatest: expected,
@ -1392,8 +1188,8 @@ func testRestoreFolderNamedFolderRegression(
opts := control.DefaultOptions() opts := control.DefaultOptions()
cfg := m365Stub.ConfigInfo{ cfg := m365Stub.ConfigInfo{
Tenant: suite.Tenant(), Tenant: m365.TenantID,
ResourceOwners: []string{suite.ResourceOwner()}, ResourceOwners: []string{resourceAndSvc.Resource().ID},
Service: testData.service, Service: testData.service,
Opts: opts, Opts: opts,
RestoreCfg: restoreCfg, RestoreCfg: restoreCfg,

View File

@ -9,14 +9,12 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"golang.org/x/exp/slices" "golang.org/x/exp/slices"
"github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/data" "github.com/alcionai/corso/src/internal/data"
"github.com/alcionai/corso/src/internal/data/mock" "github.com/alcionai/corso/src/internal/data/mock"
"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"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/control"
"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/path" "github.com/alcionai/corso/src/pkg/path"
"github.com/alcionai/corso/src/pkg/services/m365/api" "github.com/alcionai/corso/src/pkg/services/m365/api"
@ -64,9 +62,7 @@ func (suite *GroupsUnitSuite) TestConsumeRestoreCollections_noErrorOnGroups() {
type groupsIntegrationSuite struct { type groupsIntegrationSuite struct {
tester.Suite tester.Suite
resource string m365 its.M365IntgTestSetup
tenantID string
ac api.Client
} }
func TestGroupsIntegrationSuite(t *testing.T) { func TestGroupsIntegrationSuite(t *testing.T) {
@ -79,25 +75,12 @@ func TestGroupsIntegrationSuite(t *testing.T) {
func (suite *groupsIntegrationSuite) SetupSuite() { func (suite *groupsIntegrationSuite) SetupSuite() {
t := suite.T() t := suite.T()
suite.m365 = its.GetM365(t)
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
graph.InitializeConcurrencyLimiter(ctx, true, 4) graph.InitializeConcurrencyLimiter(ctx, true, 4)
suite.resource = tconfig.M365TeamID(t)
acct := tconfig.NewM365Account(t)
creds, err := acct.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.ac, err = api.NewClient(
creds,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
suite.tenantID = creds.AzureTenantID
} }
// test for getSiteName // test for getSiteName
@ -107,12 +90,9 @@ func (suite *groupsIntegrationSuite) TestGetSiteName() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
rootSite, err := suite.ac.Groups().GetRootSite(ctx, suite.resource)
require.NoError(t, err, clues.ToCore(err))
// Generate a fake site ID that appears valid to graph API but doesn't actually exist. // Generate a fake site ID that appears valid to graph API but doesn't actually exist.
// This "could" be flaky, but highly unlikely // This "could" be flaky, but highly unlikely
unavailableSiteID := []rune(ptr.Val(rootSite.GetId())) unavailableSiteID := []rune(suite.m365.Group.RootSite.ID)
firstIDChar := slices.Index(unavailableSiteID, ',') + 1 firstIDChar := slices.Index(unavailableSiteID, ',') + 1
if unavailableSiteID[firstIDChar] != '2' { if unavailableSiteID[firstIDChar] != '2' {
@ -131,9 +111,9 @@ func (suite *groupsIntegrationSuite) TestGetSiteName() {
}{ }{
{ {
name: "valid", name: "valid",
siteID: ptr.Val(rootSite.GetId()), siteID: suite.m365.Group.RootSite.ID,
webURL: ptr.Val(rootSite.GetWebUrl()), webURL: suite.m365.Group.RootSite.WebURL,
siteName: *rootSite.GetDisplayName(), siteName: suite.m365.Group.RootSite.DisplayName,
webURLToSiteNames: map[string]string{}, webURLToSiteNames: map[string]string{},
expectErr: assert.NoError, expectErr: assert.NoError,
}, },
@ -163,7 +143,7 @@ func (suite *groupsIntegrationSuite) TestGetSiteName() {
ctx, ctx,
test.siteID, test.siteID,
test.webURL, test.webURL,
suite.ac.Sites(), suite.m365.AC.Sites(),
test.webURLToSiteNames) test.webURLToSiteNames)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))

View File

@ -32,6 +32,7 @@ import (
"github.com/alcionai/corso/src/internal/streamstore" "github.com/alcionai/corso/src/internal/streamstore"
ssmock "github.com/alcionai/corso/src/internal/streamstore/mock" ssmock "github.com/alcionai/corso/src/internal/streamstore/mock"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/backup" "github.com/alcionai/corso/src/pkg/backup"
@ -47,7 +48,6 @@ import (
"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"
"github.com/alcionai/corso/src/pkg/services/m365/api"
"github.com/alcionai/corso/src/pkg/services/m365/api/graph" "github.com/alcionai/corso/src/pkg/services/m365/api/graph"
storeTD "github.com/alcionai/corso/src/pkg/storage/testdata" storeTD "github.com/alcionai/corso/src/pkg/storage/testdata"
"github.com/alcionai/corso/src/pkg/store" "github.com/alcionai/corso/src/pkg/store"
@ -1506,8 +1506,7 @@ func withoutModified(de details.Entry) details.Entry {
type BackupOpIntegrationSuite struct { type BackupOpIntegrationSuite struct {
tester.Suite tester.Suite
user, site string m365 its.M365IntgTestSetup
ac api.Client
} }
func TestBackupOpIntegrationSuite(t *testing.T) { func TestBackupOpIntegrationSuite(t *testing.T) {
@ -1520,25 +1519,12 @@ func TestBackupOpIntegrationSuite(t *testing.T) {
func (suite *BackupOpIntegrationSuite) SetupSuite() { func (suite *BackupOpIntegrationSuite) SetupSuite() {
t := suite.T() t := suite.T()
suite.m365 = its.GetM365(t)
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
graph.InitializeConcurrencyLimiter(ctx, true, 4) graph.InitializeConcurrencyLimiter(ctx, true, 4)
suite.user = tconfig.M365UserID(t)
suite.site = tconfig.M365SiteID(t)
a := tconfig.NewM365Account(t)
creds, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.ac, err = api.NewClient(
creds,
control.DefaultOptions(),
count.New())
require.NoError(t, err, clues.ToCore(err))
} }
func (suite *BackupOpIntegrationSuite) TestNewBackupOperation() { func (suite *BackupOpIntegrationSuite) TestNewBackupOperation() {
@ -1546,8 +1532,8 @@ func (suite *BackupOpIntegrationSuite) TestNewBackupOperation() {
kw = &kopia.Wrapper{} kw = &kopia.Wrapper{}
sw = store.NewWrapper(&kopia.ModelStore{}) sw = store.NewWrapper(&kopia.ModelStore{})
ctrl = &mock.Controller{} ctrl = &mock.Controller{}
acct = tconfig.NewM365Account(suite.T())
opts = control.DefaultOptions() opts = control.DefaultOptions()
acct = suite.m365.Acct
) )
table := []struct { table := []struct {
@ -1745,7 +1731,7 @@ func makeMockItem(
func (suite *AssistBackupIntegrationSuite) TestBackupTypesForFailureModes() { func (suite *AssistBackupIntegrationSuite) TestBackupTypesForFailureModes() {
var ( var (
acct = tconfig.NewM365Account(suite.T()) acct = tconfig.NewM365Account(suite.T())
tenantID = acct.Config[account.AzureTenantIDKey] tenantID = acct.ID()
osel = selectors.NewOneDriveBackup([]string{userID}) osel = selectors.NewOneDriveBackup([]string{userID})
) )
@ -2074,7 +2060,7 @@ func selectFilesFromDeets(d details.Details) map[string]details.Entry {
func (suite *AssistBackupIntegrationSuite) TestExtensionsIncrementals() { func (suite *AssistBackupIntegrationSuite) TestExtensionsIncrementals() {
var ( var (
acct = tconfig.NewM365Account(suite.T()) acct = tconfig.NewM365Account(suite.T())
tenantID = acct.Config[account.AzureTenantIDKey] tenantID = acct.ID()
opts = control.DefaultOptions() opts = control.DefaultOptions()
osel = selectors.NewOneDriveBackup([]string{userID}) osel = selectors.NewOneDriveBackup([]string{userID})
// Default policy used by SDK clients // Default policy used by SDK clients

View File

@ -24,6 +24,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/collection/drive/metadata" "github.com/alcionai/corso/src/internal/m365/collection/drive/metadata"
odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts" odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/internal/version" "github.com/alcionai/corso/src/internal/version"
"github.com/alcionai/corso/src/pkg/backup/details" "github.com/alcionai/corso/src/pkg/backup/details"
@ -988,7 +989,7 @@ func RunDriveRestoreToAlternateProtectedResource(
suite tester.Suite, suite tester.Suite,
ac api.Client, ac api.Client,
sel selectors.Selector, // owner should match 'from', both Restore and Backup types work. sel selectors.Selector, // owner should match 'from', both Restore and Backup types work.
driveFrom, driveTo IDs, driveFrom, driveTo its.IDs,
toResource string, toResource string,
) { ) {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)

View File

@ -21,6 +21,7 @@ import (
exchTD "github.com/alcionai/corso/src/internal/m365/service/exchange/testdata" exchTD "github.com/alcionai/corso/src/internal/m365/service/exchange/testdata"
. "github.com/alcionai/corso/src/internal/operations/test/m365" . "github.com/alcionai/corso/src/internal/operations/test/m365"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/internal/version" "github.com/alcionai/corso/src/internal/version"
"github.com/alcionai/corso/src/pkg/backup/details" "github.com/alcionai/corso/src/pkg/backup/details"
@ -41,7 +42,7 @@ import (
type ExchangeBackupIntgSuite struct { type ExchangeBackupIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestExchangeBackupIntgSuite(t *testing.T) { func TestExchangeBackupIntgSuite(t *testing.T) {
@ -53,7 +54,7 @@ func TestExchangeBackupIntgSuite(t *testing.T) {
} }
func (suite *ExchangeBackupIntgSuite) SetupSuite() { func (suite *ExchangeBackupIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
// MetadataFileNames produces the category-specific set of filenames used to // MetadataFileNames produces the category-specific set of filenames used to
@ -80,9 +81,9 @@ func (suite *ExchangeBackupIntgSuite) TestBackup_Run_exchange() {
{ {
name: "Mail", name: "Mail",
selector: func() *selectors.ExchangeBackup { selector: func() *selectors.ExchangeBackup {
sel := selectors.NewExchangeBackup([]string{suite.its.User.ID}) sel := selectors.NewExchangeBackup([]string{suite.m365.User.ID})
sel.Include(sel.MailFolders([]string{api.MailInbox}, selectors.PrefixMatch())) sel.Include(sel.MailFolders([]string{api.MailInbox}, selectors.PrefixMatch()))
sel.DiscreteOwner = suite.its.User.ID sel.DiscreteOwner = suite.m365.User.ID
return sel return sel
}, },
@ -92,7 +93,7 @@ func (suite *ExchangeBackupIntgSuite) TestBackup_Run_exchange() {
{ {
name: "Contacts", name: "Contacts",
selector: func() *selectors.ExchangeBackup { selector: func() *selectors.ExchangeBackup {
sel := selectors.NewExchangeBackup([]string{suite.its.User.ID}) sel := selectors.NewExchangeBackup([]string{suite.m365.User.ID})
sel.Include(sel.ContactFolders([]string{api.DefaultContacts}, selectors.PrefixMatch())) sel.Include(sel.ContactFolders([]string{api.DefaultContacts}, selectors.PrefixMatch()))
return sel return sel
}, },
@ -102,7 +103,7 @@ func (suite *ExchangeBackupIntgSuite) TestBackup_Run_exchange() {
{ {
name: "Calendar Events", name: "Calendar Events",
selector: func() *selectors.ExchangeBackup { selector: func() *selectors.ExchangeBackup {
sel := selectors.NewExchangeBackup([]string{suite.its.User.ID}) sel := selectors.NewExchangeBackup([]string{suite.m365.User.ID})
sel.Include(sel.EventCalendars([]string{api.DefaultCalendar}, selectors.PrefixMatch())) sel.Include(sel.EventCalendars([]string{api.DefaultCalendar}, selectors.PrefixMatch()))
return sel return sel
}, },
@ -270,7 +271,7 @@ func testExchangeContinuousBackups(suite *ExchangeBackupIntgSuite, toggles contr
// later on during the tests. Putting their identifiers into the selector // later on during the tests. Putting their identifiers into the selector
// at this point is harmless. // at this point is harmless.
containers = []string{container1, container2, container3, containerRename} containers = []string{container1, container2, container3, containerRename}
sel = selectors.NewExchangeBackup([]string{suite.its.User.ID}) sel = selectors.NewExchangeBackup([]string{suite.m365.User.ID})
whatSet = deeTD.CategoryFromRepoRef whatSet = deeTD.CategoryFromRepoRef
opts = control.DefaultOptions() opts = control.DefaultOptions()
) )
@ -310,7 +311,7 @@ func testExchangeContinuousBackups(suite *ExchangeBackupIntgSuite, toggles contr
mailDBF := func(id, timeStamp, subject, body string) []byte { mailDBF := func(id, timeStamp, subject, body string) []byte {
return exchMock.MessageWith( return exchMock.MessageWith(
suite.its.User.ID, suite.its.User.ID, suite.its.User.ID, suite.m365.User.ID, suite.m365.User.ID, suite.m365.User.ID,
subject, body, body, subject, body, body,
now, now, now, now) now, now, now, now)
} }
@ -327,7 +328,7 @@ func testExchangeContinuousBackups(suite *ExchangeBackupIntgSuite, toggles contr
eventDBF := func(id, timeStamp, subject, body string) []byte { eventDBF := func(id, timeStamp, subject, body string) []byte {
return exchMock.EventWith( return exchMock.EventWith(
suite.its.User.ID, subject, body, body, suite.m365.User.ID, subject, body, body,
exchMock.NoOriginalStartDate, now, now, exchMock.NoOriginalStartDate, now, now,
exchMock.NoRecurrence, exchMock.NoAttendees, exchMock.NoRecurrence, exchMock.NoAttendees,
exchMock.NoAttachments, exchMock.NoCancelledOccurrences, exchMock.NoAttachments, exchMock.NoCancelledOccurrences,
@ -596,7 +597,7 @@ func testExchangeContinuousBackups(suite *ExchangeBackupIntgSuite, toggles contr
service, service,
category, category,
selectors.NewExchangeRestore([]string{uidn.ID()}).Selector, selectors.NewExchangeRestore([]string{uidn.ID()}).Selector,
creds.AzureTenantID, suite.its.User.ID, "", "", container3, creds.AzureTenantID, suite.m365.User.ID, "", "", container3,
2, 2,
version.Backup, version.Backup,
gen.dbf) gen.dbf)
@ -889,7 +890,7 @@ func testExchangeContinuousBackups(suite *ExchangeBackupIntgSuite, toggles contr
type ExchangeBackupNightlyIntgSuite struct { type ExchangeBackupNightlyIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestExchangeBackupNightlyIntgSuite(t *testing.T) { func TestExchangeBackupNightlyIntgSuite(t *testing.T) {
@ -901,11 +902,11 @@ func TestExchangeBackupNightlyIntgSuite(t *testing.T) {
} }
func (suite *ExchangeBackupNightlyIntgSuite) SetupSuite() { func (suite *ExchangeBackupNightlyIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *ExchangeBackupNightlyIntgSuite) TestBackup_Run_exchangeVersion9MergeBase() { func (suite *ExchangeBackupNightlyIntgSuite) TestBackup_Run_exchangeVersion9MergeBase() {
sel := selectors.NewExchangeBackup([]string{suite.its.User.ID}) sel := selectors.NewExchangeBackup([]string{suite.m365.User.ID})
sel.Include( sel.Include(
sel.ContactFolders([]string{api.DefaultContacts}, selectors.PrefixMatch()), sel.ContactFolders([]string{api.DefaultContacts}, selectors.PrefixMatch()),
// sel.EventCalendars([]string{api.DefaultCalendar}, selectors.PrefixMatch()), // sel.EventCalendars([]string{api.DefaultCalendar}, selectors.PrefixMatch()),
@ -916,7 +917,7 @@ func (suite *ExchangeBackupNightlyIntgSuite) TestBackup_Run_exchangeVersion9Merg
type ExchangeRestoreNightlyIntgSuite struct { type ExchangeRestoreNightlyIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestExchangeRestoreIntgSuite(t *testing.T) { func TestExchangeRestoreIntgSuite(t *testing.T) {
@ -928,7 +929,7 @@ func TestExchangeRestoreIntgSuite(t *testing.T) {
} }
func (suite *ExchangeRestoreNightlyIntgSuite) SetupSuite() { func (suite *ExchangeRestoreNightlyIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
type clientItemPager interface { type clientItemPager interface {
@ -959,7 +960,7 @@ func (suite *ExchangeRestoreNightlyIntgSuite) TestRestore_Run_exchangeWithAdvanc
// a backup is required to run restores // a backup is required to run restores
baseSel := selectors.NewExchangeBackup([]string{suite.its.User.ID}) baseSel := selectors.NewExchangeBackup([]string{suite.m365.User.ID})
baseSel.Include( baseSel.Include(
// events cannot be run, for the same reason as incremental backups: the user needs // events cannot be run, for the same reason as incremental backups: the user needs
// to have their account recycled. // to have their account recycled.
@ -967,7 +968,7 @@ func (suite *ExchangeRestoreNightlyIntgSuite) TestRestore_Run_exchangeWithAdvanc
baseSel.ContactFolders([]string{api.DefaultContacts}, selectors.PrefixMatch()), baseSel.ContactFolders([]string{api.DefaultContacts}, selectors.PrefixMatch()),
baseSel.MailFolders([]string{api.MailInbox}, selectors.PrefixMatch())) baseSel.MailFolders([]string{api.MailInbox}, selectors.PrefixMatch()))
baseSel.DiscreteOwner = suite.its.User.ID baseSel.DiscreteOwner = suite.m365.User.ID
var ( var (
mb = evmock.NewBus() mb = evmock.NewBus()
@ -1002,8 +1003,8 @@ func (suite *ExchangeRestoreNightlyIntgSuite) TestRestore_Run_exchangeWithAdvanc
} }
testCategories = map[path.CategoryType]clientItemPager{ testCategories = map[path.CategoryType]clientItemPager{
path.ContactsCategory: suite.its.AC.Contacts(), path.ContactsCategory: suite.m365.AC.Contacts(),
path.EmailCategory: suite.its.AC.Mail(), path.EmailCategory: suite.m365.AC.Mail(),
// path.EventsCategory: suite.its.ac.Events(), // path.EventsCategory: suite.its.ac.Events(),
} }
) )
@ -1276,7 +1277,7 @@ func (suite *ExchangeRestoreNightlyIntgSuite) TestRestore_Run_exchangeAlternateP
// a backup is required to run restores // a backup is required to run restores
baseSel := selectors.NewExchangeBackup([]string{suite.its.User.ID}) baseSel := selectors.NewExchangeBackup([]string{suite.m365.User.ID})
baseSel.Include( baseSel.Include(
// events cannot be run, for the same reason as incremental backups: the user needs // events cannot be run, for the same reason as incremental backups: the user needs
// to have their account recycled. // to have their account recycled.
@ -1284,7 +1285,7 @@ func (suite *ExchangeRestoreNightlyIntgSuite) TestRestore_Run_exchangeAlternateP
baseSel.ContactFolders([]string{api.DefaultContacts}, selectors.PrefixMatch()), baseSel.ContactFolders([]string{api.DefaultContacts}, selectors.PrefixMatch()),
baseSel.MailFolders([]string{api.MailInbox}, selectors.PrefixMatch())) baseSel.MailFolders([]string{api.MailInbox}, selectors.PrefixMatch()))
baseSel.DiscreteOwner = suite.its.User.ID baseSel.DiscreteOwner = suite.m365.User.ID
var ( var (
mb = evmock.NewBus() mb = evmock.NewBus()
@ -1303,11 +1304,11 @@ func (suite *ExchangeRestoreNightlyIntgSuite) TestRestore_Run_exchangeAlternateP
var ( var (
restoreCfg = ctrlTD.DefaultRestoreConfig("exchange_restore_to_user") restoreCfg = ctrlTD.DefaultRestoreConfig("exchange_restore_to_user")
sel = rsel.Selector sel = rsel.Selector
userID = suite.its.User.ID userID = suite.m365.User.ID
secondaryUserID = suite.its.SecondaryUser.ID secondaryUserID = suite.m365.SecondaryUser.ID
uid = userID uid = userID
acCont = suite.its.AC.Contacts() acCont = suite.m365.AC.Contacts()
acMail = suite.its.AC.Mail() acMail = suite.m365.AC.Mail()
// acEvts = suite.its.ac.Events() // acEvts = suite.its.ac.Events()
firstCtr = count.New() firstCtr = count.New()
) )

View File

@ -14,6 +14,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/collection/drive" "github.com/alcionai/corso/src/internal/m365/collection/drive"
. "github.com/alcionai/corso/src/internal/operations/test/m365" . "github.com/alcionai/corso/src/internal/operations/test/m365"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"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"
@ -28,7 +29,7 @@ import (
type GroupsBackupIntgSuite struct { type GroupsBackupIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestGroupsBackupIntgSuite(t *testing.T) { func TestGroupsBackupIntgSuite(t *testing.T) {
@ -40,12 +41,12 @@ func TestGroupsBackupIntgSuite(t *testing.T) {
} }
func (suite *GroupsBackupIntgSuite) SetupSuite() { func (suite *GroupsBackupIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *GroupsBackupIntgSuite) TestBackup_Run_groups() { func (suite *GroupsBackupIntgSuite) TestBackup_Run_groups() {
var ( var (
resourceID = suite.its.Group.ID resourceID = suite.m365.Group.ID
sel = selectors.NewGroupsBackup([]string{resourceID}) sel = selectors.NewGroupsBackup([]string{resourceID})
) )
@ -59,12 +60,12 @@ func (suite *GroupsBackupIntgSuite) TestBackup_Run_groups() {
} }
func (suite *GroupsBackupIntgSuite) TestBackup_Run_incrementalGroups() { func (suite *GroupsBackupIntgSuite) TestBackup_Run_incrementalGroups() {
runGroupsIncrementalBackupTests(suite, suite.its, control.DefaultOptions()) runGroupsIncrementalBackupTests(suite, suite.m365, control.DefaultOptions())
} }
func (suite *GroupsBackupIntgSuite) TestBackup_Run_extensionsGroups() { func (suite *GroupsBackupIntgSuite) TestBackup_Run_extensionsGroups() {
var ( var (
resourceID = suite.its.Group.ID resourceID = suite.m365.Group.ID
sel = selectors.NewGroupsBackup([]string{resourceID}) sel = selectors.NewGroupsBackup([]string{resourceID})
) )
@ -84,7 +85,7 @@ func (suite *GroupsBackupIntgSuite) TestBackup_Run_extensionsGroups() {
type GroupsBackupTreeIntgSuite struct { type GroupsBackupTreeIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestGroupsBackupTreeIntgSuite(t *testing.T) { func TestGroupsBackupTreeIntgSuite(t *testing.T) {
@ -96,12 +97,12 @@ func TestGroupsBackupTreeIntgSuite(t *testing.T) {
} }
func (suite *GroupsBackupTreeIntgSuite) SetupSuite() { func (suite *GroupsBackupTreeIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *GroupsBackupTreeIntgSuite) TestBackup_Run_treeGroups() { func (suite *GroupsBackupTreeIntgSuite) TestBackup_Run_treeGroups() {
var ( var (
resourceID = suite.its.Group.ID resourceID = suite.m365.Group.ID
sel = selectors.NewGroupsBackup([]string{resourceID}) sel = selectors.NewGroupsBackup([]string{resourceID})
opts = control.DefaultOptions() opts = control.DefaultOptions()
) )
@ -117,12 +118,12 @@ func (suite *GroupsBackupTreeIntgSuite) TestBackup_Run_treeGroups() {
func (suite *GroupsBackupTreeIntgSuite) TestBackup_Run_treeIncrementalGroups() { func (suite *GroupsBackupTreeIntgSuite) TestBackup_Run_treeIncrementalGroups() {
opts := control.DefaultOptions() opts := control.DefaultOptions()
runGroupsIncrementalBackupTests(suite, suite.its, opts) runGroupsIncrementalBackupTests(suite, suite.m365, opts)
} }
func (suite *GroupsBackupTreeIntgSuite) TestBackup_Run_treeExtensionsGroups() { func (suite *GroupsBackupTreeIntgSuite) TestBackup_Run_treeExtensionsGroups() {
var ( var (
resourceID = suite.its.Group.ID resourceID = suite.m365.Group.ID
sel = selectors.NewGroupsBackup([]string{resourceID}) sel = selectors.NewGroupsBackup([]string{resourceID})
opts = control.DefaultOptions() opts = control.DefaultOptions()
) )
@ -142,10 +143,10 @@ func (suite *GroupsBackupTreeIntgSuite) TestBackup_Run_treeExtensionsGroups() {
func runGroupsIncrementalBackupTests( func runGroupsIncrementalBackupTests(
suite tester.Suite, suite tester.Suite,
its IntgTesterSetup, m365 its.M365IntgTestSetup,
opts control.Options, opts control.Options,
) { ) {
sel := selectors.NewGroupsRestore([]string{its.Group.ID}) sel := selectors.NewGroupsRestore([]string{m365.Group.ID})
ic := func(cs []string) selectors.Selector { ic := func(cs []string) selectors.Selector {
sel.Include(sel.LibraryFolders(cs, selectors.PrefixMatch())) sel.Include(sel.LibraryFolders(cs, selectors.PrefixMatch()))
@ -156,14 +157,14 @@ func runGroupsIncrementalBackupTests(
t *testing.T, t *testing.T,
ctx context.Context, ctx context.Context,
) string { ) string {
return its.Group.RootSite.DriveID return m365.Group.RootSite.DriveID
} }
gtsi := func( gtsi := func(
t *testing.T, t *testing.T,
ctx context.Context, ctx context.Context,
) string { ) string {
return its.Group.RootSite.ID return m365.Group.RootSite.ID
} }
grh := func(ac api.Client) drive.RestoreHandler { grh := func(ac api.Client) drive.RestoreHandler {
@ -173,8 +174,8 @@ func runGroupsIncrementalBackupTests(
RunIncrementalDriveishBackupTest( RunIncrementalDriveishBackupTest(
suite, suite,
opts, opts,
its.Group.ID, m365.Group.ID,
its.User.ID, m365.User.ID,
path.GroupsService, path.GroupsService,
path.LibrariesCategory, path.LibrariesCategory,
ic, ic,
@ -193,7 +194,7 @@ func (suite *GroupsBackupIntgSuite) TestBackup_Run_groupsBasic() {
var ( var (
mb = evmock.NewBus() mb = evmock.NewBus()
counter = count.New() counter = count.New()
sel = selectors.NewGroupsBackup([]string{suite.its.Group.ID}) sel = selectors.NewGroupsBackup([]string{suite.m365.Group.ID})
opts = control.DefaultOptions() opts = control.DefaultOptions()
whatSet = deeTD.CategoryFromRepoRef whatSet = deeTD.CategoryFromRepoRef
) )
@ -306,7 +307,7 @@ func (suite *GroupsBackupIntgSuite) TestBackup_Run_groupsBasic() {
type GroupsBackupNightlyIntgSuite struct { type GroupsBackupNightlyIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestGroupsBackupNightlyIntgSuite(t *testing.T) { func TestGroupsBackupNightlyIntgSuite(t *testing.T) {
@ -318,11 +319,11 @@ func TestGroupsBackupNightlyIntgSuite(t *testing.T) {
} }
func (suite *GroupsBackupNightlyIntgSuite) SetupSuite() { func (suite *GroupsBackupNightlyIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *GroupsBackupNightlyIntgSuite) TestBackup_Run_groupsVersion9MergeBase() { func (suite *GroupsBackupNightlyIntgSuite) TestBackup_Run_groupsVersion9MergeBase() {
sel := selectors.NewGroupsBackup([]string{suite.its.Group.ID}) sel := selectors.NewGroupsBackup([]string{suite.m365.Group.ID})
sel.Include( sel.Include(
selTD.GroupsBackupLibraryFolderScope(sel), selTD.GroupsBackupLibraryFolderScope(sel),
selTD.GroupsBackupChannelScope(sel), selTD.GroupsBackupChannelScope(sel),
@ -332,7 +333,7 @@ func (suite *GroupsBackupNightlyIntgSuite) TestBackup_Run_groupsVersion9MergeBas
} }
func (suite *GroupsBackupNightlyIntgSuite) TestBackup_Run_groupsVersion9AssistBases() { func (suite *GroupsBackupNightlyIntgSuite) TestBackup_Run_groupsVersion9AssistBases() {
sel := selectors.NewGroupsBackup([]string{suite.its.Group.ID}) sel := selectors.NewGroupsBackup([]string{suite.m365.Group.ID})
sel.Include( sel.Include(
selTD.GroupsBackupLibraryFolderScope(sel), selTD.GroupsBackupLibraryFolderScope(sel),
selTD.GroupsBackupChannelScope(sel), selTD.GroupsBackupChannelScope(sel),
@ -343,7 +344,7 @@ func (suite *GroupsBackupNightlyIntgSuite) TestBackup_Run_groupsVersion9AssistBa
type GroupsRestoreNightlyIntgSuite struct { type GroupsRestoreNightlyIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestGroupsRestoreIntgSuite(t *testing.T) { func TestGroupsRestoreIntgSuite(t *testing.T) {
@ -355,20 +356,20 @@ func TestGroupsRestoreIntgSuite(t *testing.T) {
} }
func (suite *GroupsRestoreNightlyIntgSuite) SetupSuite() { func (suite *GroupsRestoreNightlyIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *GroupsRestoreNightlyIntgSuite) TestRestore_Run_groupsWithAdvancedOptions() { func (suite *GroupsRestoreNightlyIntgSuite) TestRestore_Run_groupsWithAdvancedOptions() {
sel := selectors.NewGroupsBackup([]string{suite.its.Group.ID}) sel := selectors.NewGroupsBackup([]string{suite.m365.Group.ID})
sel.Include(selTD.GroupsBackupLibraryFolderScope(sel)) sel.Include(selTD.GroupsBackupLibraryFolderScope(sel))
sel.Filter(sel.Library("documents")) sel.Filter(sel.Library("documents"))
sel.DiscreteOwner = suite.its.Group.ID sel.DiscreteOwner = suite.m365.Group.ID
RunDriveRestoreWithAdvancedOptions( RunDriveRestoreWithAdvancedOptions(
suite.T(), suite.T(),
suite, suite,
suite.its.AC, suite.m365.AC,
sel.Selector, sel.Selector,
suite.its.Group.RootSite.DriveID, suite.m365.Group.RootSite.DriveID,
suite.its.Group.RootSite.DriveRootFolderID) suite.m365.Group.RootSite.DriveRootFolderID)
} }

View File

@ -11,7 +11,6 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/alcionai/corso/src/internal/common/idname" "github.com/alcionai/corso/src/internal/common/idname"
"github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/data" "github.com/alcionai/corso/src/internal/data"
"github.com/alcionai/corso/src/internal/kopia" "github.com/alcionai/corso/src/internal/kopia"
"github.com/alcionai/corso/src/internal/m365" "github.com/alcionai/corso/src/internal/m365"
@ -19,8 +18,6 @@ import (
odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts" odConsts "github.com/alcionai/corso/src/internal/m365/service/onedrive/consts"
"github.com/alcionai/corso/src/internal/model" "github.com/alcionai/corso/src/internal/model"
"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/tconfig"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/backup" "github.com/alcionai/corso/src/pkg/backup"
"github.com/alcionai/corso/src/pkg/backup/details" "github.com/alcionai/corso/src/pkg/backup/details"
@ -357,125 +354,6 @@ func ControllerWithSelector(
// Suite Setup // Suite Setup
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
type IDs struct {
ID string
DriveID string
DriveRootFolderID string
}
type GIDs struct {
ID string
RootSite IDs
}
type IntgTesterSetup struct {
AC api.Client
GockAC api.Client
User IDs
SecondaryUser IDs
Site IDs
SecondarySite IDs
Group GIDs
SecondaryGroup GIDs
}
func NewIntegrationTesterSetup(t *testing.T) IntgTesterSetup {
its := IntgTesterSetup{}
ctx, flush := tester.NewContext(t)
defer flush()
graph.InitializeConcurrencyLimiter(ctx, true, 4)
a := tconfig.NewM365Account(t)
creds, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
counter := count.New()
its.AC, err = api.NewClient(
creds,
control.DefaultOptions(),
counter)
require.NoError(t, err, clues.ToCore(err))
its.GockAC, err = GockClient(creds, counter)
require.NoError(t, err, clues.ToCore(err))
its.User = userIDs(t, tconfig.M365UserID(t), its.AC)
its.SecondaryUser = userIDs(t, tconfig.SecondaryM365UserID(t), its.AC)
its.Site = siteIDs(t, tconfig.M365SiteID(t), its.AC)
its.SecondarySite = siteIDs(t, tconfig.SecondaryM365SiteID(t), its.AC)
// teamID is used here intentionally. We want the group
// to have access to teams data
its.Group = groupIDs(t, tconfig.M365TeamID(t), its.AC)
its.SecondaryGroup = groupIDs(t, tconfig.SecondaryM365TeamID(t), its.AC)
return its
}
func userIDs(t *testing.T, id string, ac api.Client) IDs {
ctx, flush := tester.NewContext(t)
defer flush()
r := IDs{ID: id}
drive, err := ac.Users().GetDefaultDrive(ctx, id)
require.NoError(t, err, clues.ToCore(err))
r.DriveID = ptr.Val(drive.GetId())
driveRootFolder, err := ac.Drives().GetRootFolder(ctx, r.DriveID)
require.NoError(t, err, clues.ToCore(err))
r.DriveRootFolderID = ptr.Val(driveRootFolder.GetId())
return r
}
func siteIDs(t *testing.T, id string, ac api.Client) IDs {
ctx, flush := tester.NewContext(t)
defer flush()
r := IDs{ID: id}
drive, err := ac.Sites().GetDefaultDrive(ctx, id)
require.NoError(t, err, clues.ToCore(err))
r.DriveID = ptr.Val(drive.GetId())
driveRootFolder, err := ac.Drives().GetRootFolder(ctx, r.DriveID)
require.NoError(t, err, clues.ToCore(err))
r.DriveRootFolderID = ptr.Val(driveRootFolder.GetId())
return r
}
func groupIDs(t *testing.T, id string, ac api.Client) GIDs {
ctx, flush := tester.NewContext(t)
defer flush()
r := GIDs{ID: id}
site, err := ac.Groups().GetRootSite(ctx, id)
require.NoError(t, err, clues.ToCore(err))
r.RootSite.ID = ptr.Val(site.GetId())
drive, err := ac.Sites().GetDefaultDrive(ctx, r.RootSite.ID)
require.NoError(t, err, clues.ToCore(err))
r.RootSite.DriveID = ptr.Val(drive.GetId())
driveRootFolder, err := ac.Drives().GetRootFolder(ctx, r.RootSite.DriveID)
require.NoError(t, err, clues.ToCore(err))
r.RootSite.DriveRootFolderID = ptr.Val(driveRootFolder.GetId())
return r
}
func GetTestExtensionFactories() []extensions.CreateItemExtensioner { func GetTestExtensionFactories() []extensions.CreateItemExtensioner {
return []extensions.CreateItemExtensioner{ return []extensions.CreateItemExtensioner{
&extensions.MockItemExtensionFactory{}, &extensions.MockItemExtensionFactory{},

View File

@ -13,12 +13,13 @@ import (
"github.com/alcionai/corso/src/internal/common/ptr" "github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/events" "github.com/alcionai/corso/src/internal/events"
evmock "github.com/alcionai/corso/src/internal/events/mock" evmock "github.com/alcionai/corso/src/internal/events/mock"
"github.com/alcionai/corso/src/internal/m365" m365Ctrl "github.com/alcionai/corso/src/internal/m365"
"github.com/alcionai/corso/src/internal/m365/collection/drive" "github.com/alcionai/corso/src/internal/m365/collection/drive"
"github.com/alcionai/corso/src/internal/model" "github.com/alcionai/corso/src/internal/model"
. "github.com/alcionai/corso/src/internal/operations/test/m365" . "github.com/alcionai/corso/src/internal/operations/test/m365"
"github.com/alcionai/corso/src/internal/streamstore" "github.com/alcionai/corso/src/internal/streamstore"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/internal/version" "github.com/alcionai/corso/src/internal/version"
"github.com/alcionai/corso/src/pkg/backup" "github.com/alcionai/corso/src/pkg/backup"
@ -36,7 +37,7 @@ import (
type OneDriveBackupIntgSuite struct { type OneDriveBackupIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestOneDriveBackupIntgSuite(t *testing.T) { func TestOneDriveBackupIntgSuite(t *testing.T) {
@ -48,12 +49,12 @@ func TestOneDriveBackupIntgSuite(t *testing.T) {
} }
func (suite *OneDriveBackupIntgSuite) SetupSuite() { func (suite *OneDriveBackupIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *OneDriveBackupIntgSuite) TestBackup_Run_oneDrive() { func (suite *OneDriveBackupIntgSuite) TestBackup_Run_oneDrive() {
var ( var (
resourceID = suite.its.SecondaryUser.ID resourceID = suite.m365.SecondaryUser.ID
sel = selectors.NewOneDriveBackup([]string{resourceID}) sel = selectors.NewOneDriveBackup([]string{resourceID})
) )
@ -67,12 +68,12 @@ func (suite *OneDriveBackupIntgSuite) TestBackup_Run_oneDrive() {
} }
func (suite *OneDriveBackupIntgSuite) TestBackup_Run_incrementalOneDrive() { func (suite *OneDriveBackupIntgSuite) TestBackup_Run_incrementalOneDrive() {
runOneDriveIncrementalBackupTests(suite, suite.its, control.DefaultOptions()) runOneDriveIncrementalBackupTests(suite, suite.m365, control.DefaultOptions())
} }
func (suite *OneDriveBackupIntgSuite) TestBackup_Run_extensionsOneDrive() { func (suite *OneDriveBackupIntgSuite) TestBackup_Run_extensionsOneDrive() {
var ( var (
resourceID = suite.its.SecondaryUser.ID resourceID = suite.m365.SecondaryUser.ID
sel = selectors.NewOneDriveBackup([]string{resourceID}) sel = selectors.NewOneDriveBackup([]string{resourceID})
) )
@ -91,7 +92,7 @@ func (suite *OneDriveBackupIntgSuite) TestBackup_Run_extensionsOneDrive() {
type OneDriveBackupTreeIntgSuite struct { type OneDriveBackupTreeIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestOneDriveBackupTreeIntgSuite(t *testing.T) { func TestOneDriveBackupTreeIntgSuite(t *testing.T) {
@ -103,12 +104,12 @@ func TestOneDriveBackupTreeIntgSuite(t *testing.T) {
} }
func (suite *OneDriveBackupTreeIntgSuite) SetupSuite() { func (suite *OneDriveBackupTreeIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *OneDriveBackupTreeIntgSuite) TestBackup_Run_treeOneDrive() { func (suite *OneDriveBackupTreeIntgSuite) TestBackup_Run_treeOneDrive() {
var ( var (
resourceID = suite.its.SecondaryUser.ID resourceID = suite.m365.SecondaryUser.ID
sel = selectors.NewOneDriveBackup([]string{resourceID}) sel = selectors.NewOneDriveBackup([]string{resourceID})
opts = control.DefaultOptions() opts = control.DefaultOptions()
) )
@ -124,12 +125,12 @@ func (suite *OneDriveBackupTreeIntgSuite) TestBackup_Run_treeOneDrive() {
func (suite *OneDriveBackupTreeIntgSuite) TestBackup_Run_treeIncrementalOneDrive() { func (suite *OneDriveBackupTreeIntgSuite) TestBackup_Run_treeIncrementalOneDrive() {
opts := control.DefaultOptions() opts := control.DefaultOptions()
runOneDriveIncrementalBackupTests(suite, suite.its, opts) runOneDriveIncrementalBackupTests(suite, suite.m365, opts)
} }
func (suite *OneDriveBackupTreeIntgSuite) TestBackup_Run_treeExtensionsOneDrive() { func (suite *OneDriveBackupTreeIntgSuite) TestBackup_Run_treeExtensionsOneDrive() {
var ( var (
resourceID = suite.its.SecondaryUser.ID resourceID = suite.m365.SecondaryUser.ID
sel = selectors.NewOneDriveBackup([]string{resourceID}) sel = selectors.NewOneDriveBackup([]string{resourceID})
opts = control.DefaultOptions() opts = control.DefaultOptions()
) )
@ -149,10 +150,10 @@ func (suite *OneDriveBackupTreeIntgSuite) TestBackup_Run_treeExtensionsOneDrive(
func runOneDriveIncrementalBackupTests( func runOneDriveIncrementalBackupTests(
suite tester.Suite, suite tester.Suite,
its IntgTesterSetup, m365 its.M365IntgTestSetup,
opts control.Options, opts control.Options,
) { ) {
sel := selectors.NewOneDriveRestore([]string{its.User.ID}) sel := selectors.NewOneDriveRestore([]string{m365.User.ID})
ic := func(cs []string) selectors.Selector { ic := func(cs []string) selectors.Selector {
sel.Include(sel.Folders(cs, selectors.PrefixMatch())) sel.Include(sel.Folders(cs, selectors.PrefixMatch()))
@ -163,10 +164,10 @@ func runOneDriveIncrementalBackupTests(
t *testing.T, t *testing.T,
ctx context.Context, ctx context.Context,
) string { ) string {
d, err := its.AC.Users().GetDefaultDrive(ctx, its.User.ID) d, err := m365.AC.Users().GetDefaultDrive(ctx, m365.User.ID)
if err != nil { if err != nil {
err = clues.Wrap(err, "retrieving default user drive"). err = clues.Wrap(err, "retrieving default user drive").
With("user", its.User.ID) With("user", m365.User.ID)
} }
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
@ -184,8 +185,8 @@ func runOneDriveIncrementalBackupTests(
RunIncrementalDriveishBackupTest( RunIncrementalDriveishBackupTest(
suite, suite,
opts, opts,
its.User.ID, m365.User.ID,
its.User.ID, m365.User.ID,
path.OneDriveService, path.OneDriveService,
path.FilesCategory, path.FilesCategory,
ic, ic,
@ -219,7 +220,7 @@ func (suite *OneDriveBackupIntgSuite) TestBackup_Run_oneDriveOwnerMigration() {
creds, err := acct.M365Config() creds, err := acct.M365Config()
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
ctrl, err := m365.NewController( ctrl, err := m365Ctrl.NewController(
ctx, ctx,
acct, acct,
path.OneDriveService, path.OneDriveService,
@ -229,7 +230,7 @@ func (suite *OneDriveBackupIntgSuite) TestBackup_Run_oneDriveOwnerMigration() {
userable, err := ctrl.AC.Users().GetByID( userable, err := ctrl.AC.Users().GetByID(
ctx, ctx,
suite.its.User.ID, suite.m365.User.ID,
api.CallConfig{}) api.CallConfig{})
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
@ -333,7 +334,7 @@ func (suite *OneDriveBackupIntgSuite) TestBackup_Run_oneDriveOwnerMigration() {
type OneDriveBackupNightlyIntgSuite struct { type OneDriveBackupNightlyIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestOneDriveBackupNightlyIntgSuite(t *testing.T) { func TestOneDriveBackupNightlyIntgSuite(t *testing.T) {
@ -345,11 +346,11 @@ func TestOneDriveBackupNightlyIntgSuite(t *testing.T) {
} }
func (suite *OneDriveBackupNightlyIntgSuite) SetupSuite() { func (suite *OneDriveBackupNightlyIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *OneDriveBackupNightlyIntgSuite) TestBackup_Run_oneDriveVersion9MergeBase() { func (suite *OneDriveBackupNightlyIntgSuite) TestBackup_Run_oneDriveVersion9MergeBase() {
sel := selectors.NewOneDriveBackup([]string{suite.its.User.ID}) sel := selectors.NewOneDriveBackup([]string{suite.m365.User.ID})
sel.Include(selTD.OneDriveBackupFolderScope(sel)) sel.Include(selTD.OneDriveBackupFolderScope(sel))
RunMergeBaseGroupsUpdate(suite, sel.Selector, true) RunMergeBaseGroupsUpdate(suite, sel.Selector, true)
@ -364,7 +365,7 @@ func (suite *OneDriveBackupNightlyIntgSuite) TestBackup_Run_oneDriveVersion9Merg
type OneDriveRestoreNightlyIntgSuite struct { type OneDriveRestoreNightlyIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestOneDriveRestoreIntgSuite(t *testing.T) { func TestOneDriveRestoreIntgSuite(t *testing.T) {
@ -376,34 +377,34 @@ func TestOneDriveRestoreIntgSuite(t *testing.T) {
} }
func (suite *OneDriveRestoreNightlyIntgSuite) SetupSuite() { func (suite *OneDriveRestoreNightlyIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *OneDriveRestoreNightlyIntgSuite) TestRestore_Run_onedriveWithAdvancedOptions() { func (suite *OneDriveRestoreNightlyIntgSuite) TestRestore_Run_onedriveWithAdvancedOptions() {
sel := selectors.NewOneDriveBackup([]string{suite.its.User.ID}) sel := selectors.NewOneDriveBackup([]string{suite.m365.User.ID})
sel.Include(selTD.OneDriveBackupFolderScope(sel)) sel.Include(selTD.OneDriveBackupFolderScope(sel))
sel.DiscreteOwner = suite.its.User.ID sel.DiscreteOwner = suite.m365.User.ID
RunDriveRestoreWithAdvancedOptions( RunDriveRestoreWithAdvancedOptions(
suite.T(), suite.T(),
suite, suite,
suite.its.AC, suite.m365.AC,
sel.Selector, sel.Selector,
suite.its.User.DriveID, suite.m365.User.DriveID,
suite.its.User.DriveRootFolderID) suite.m365.User.DriveRootFolderID)
} }
func (suite *OneDriveRestoreNightlyIntgSuite) TestRestore_Run_onedriveAlternateProtectedResource() { func (suite *OneDriveRestoreNightlyIntgSuite) TestRestore_Run_onedriveAlternateProtectedResource() {
sel := selectors.NewOneDriveBackup([]string{suite.its.User.ID}) sel := selectors.NewOneDriveBackup([]string{suite.m365.User.ID})
sel.Include(selTD.OneDriveBackupFolderScope(sel)) sel.Include(selTD.OneDriveBackupFolderScope(sel))
sel.DiscreteOwner = suite.its.User.ID sel.DiscreteOwner = suite.m365.User.ID
RunDriveRestoreToAlternateProtectedResource( RunDriveRestoreToAlternateProtectedResource(
suite.T(), suite.T(),
suite, suite,
suite.its.AC, suite.m365.AC,
sel.Selector, sel.Selector,
suite.its.User, suite.m365.User,
suite.its.SecondaryUser, suite.m365.SecondaryUser,
suite.its.SecondaryUser.ID) suite.m365.SecondaryUser.ID)
} }

View File

@ -16,6 +16,7 @@ import (
"github.com/alcionai/corso/src/internal/m365/collection/drive" "github.com/alcionai/corso/src/internal/m365/collection/drive"
. "github.com/alcionai/corso/src/internal/operations/test/m365" . "github.com/alcionai/corso/src/internal/operations/test/m365"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"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"
@ -31,7 +32,7 @@ import (
type SharePointBackupIntgSuite struct { type SharePointBackupIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestSharePointBackupIntgSuite(t *testing.T) { func TestSharePointBackupIntgSuite(t *testing.T) {
@ -43,12 +44,12 @@ func TestSharePointBackupIntgSuite(t *testing.T) {
} }
func (suite *SharePointBackupIntgSuite) SetupSuite() { func (suite *SharePointBackupIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *SharePointBackupIntgSuite) TestBackup_Run_sharePoint() { func (suite *SharePointBackupIntgSuite) TestBackup_Run_sharePoint() {
var ( var (
resourceID = suite.its.Site.ID resourceID = suite.m365.Site.ID
sel = selectors.NewSharePointBackup([]string{resourceID}) sel = selectors.NewSharePointBackup([]string{resourceID})
) )
@ -68,7 +69,7 @@ func (suite *SharePointBackupIntgSuite) TestBackup_Run_sharePointList() {
defer flush() defer flush()
var ( var (
resourceID = suite.its.Site.ID resourceID = suite.m365.Site.ID
sel = selectors.NewSharePointBackup([]string{resourceID}) sel = selectors.NewSharePointBackup([]string{resourceID})
tenID = tconfig.M365TenantID(t) tenID = tconfig.M365TenantID(t)
mb = evmock.NewBus() mb = evmock.NewBus()
@ -123,12 +124,12 @@ func (suite *SharePointBackupIntgSuite) TestBackup_Run_sharePointList() {
} }
func (suite *SharePointBackupIntgSuite) TestBackup_Run_incrementalSharePoint() { func (suite *SharePointBackupIntgSuite) TestBackup_Run_incrementalSharePoint() {
runSharePointIncrementalBackupTests(suite, suite.its, control.DefaultOptions()) runSharePointIncrementalBackupTests(suite, suite.m365, control.DefaultOptions())
} }
func (suite *SharePointBackupIntgSuite) TestBackup_Run_extensionsSharePoint() { func (suite *SharePointBackupIntgSuite) TestBackup_Run_extensionsSharePoint() {
var ( var (
resourceID = suite.its.Site.ID resourceID = suite.m365.Site.ID
sel = selectors.NewSharePointBackup([]string{resourceID}) sel = selectors.NewSharePointBackup([]string{resourceID})
) )
@ -147,7 +148,7 @@ func (suite *SharePointBackupIntgSuite) TestBackup_Run_extensionsSharePoint() {
type SharePointBackupTreeIntgSuite struct { type SharePointBackupTreeIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestSharePointBackupTreeIntgSuite(t *testing.T) { func TestSharePointBackupTreeIntgSuite(t *testing.T) {
@ -159,12 +160,12 @@ func TestSharePointBackupTreeIntgSuite(t *testing.T) {
} }
func (suite *SharePointBackupTreeIntgSuite) SetupSuite() { func (suite *SharePointBackupTreeIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *SharePointBackupTreeIntgSuite) TestBackup_Run_treeSharePoint() { func (suite *SharePointBackupTreeIntgSuite) TestBackup_Run_treeSharePoint() {
var ( var (
resourceID = suite.its.Site.ID resourceID = suite.m365.Site.ID
sel = selectors.NewSharePointBackup([]string{resourceID}) sel = selectors.NewSharePointBackup([]string{resourceID})
opts = control.DefaultOptions() opts = control.DefaultOptions()
) )
@ -180,12 +181,12 @@ func (suite *SharePointBackupTreeIntgSuite) TestBackup_Run_treeSharePoint() {
func (suite *SharePointBackupTreeIntgSuite) TestBackup_Run_treeIncrementalSharePoint() { func (suite *SharePointBackupTreeIntgSuite) TestBackup_Run_treeIncrementalSharePoint() {
opts := control.DefaultOptions() opts := control.DefaultOptions()
runSharePointIncrementalBackupTests(suite, suite.its, opts) runSharePointIncrementalBackupTests(suite, suite.m365, opts)
} }
func (suite *SharePointBackupTreeIntgSuite) TestBackup_Run_treeExtensionsSharePoint() { func (suite *SharePointBackupTreeIntgSuite) TestBackup_Run_treeExtensionsSharePoint() {
var ( var (
resourceID = suite.its.Site.ID resourceID = suite.m365.Site.ID
sel = selectors.NewSharePointBackup([]string{resourceID}) sel = selectors.NewSharePointBackup([]string{resourceID})
opts = control.DefaultOptions() opts = control.DefaultOptions()
) )
@ -205,10 +206,10 @@ func (suite *SharePointBackupTreeIntgSuite) TestBackup_Run_treeExtensionsSharePo
func runSharePointIncrementalBackupTests( func runSharePointIncrementalBackupTests(
suite tester.Suite, suite tester.Suite,
its IntgTesterSetup, m365 its.M365IntgTestSetup,
opts control.Options, opts control.Options,
) { ) {
sel := selectors.NewSharePointRestore([]string{its.Site.ID}) sel := selectors.NewSharePointRestore([]string{m365.Site.ID})
ic := func(cs []string) selectors.Selector { ic := func(cs []string) selectors.Selector {
sel.Include(sel.LibraryFolders(cs, selectors.PrefixMatch())) sel.Include(sel.LibraryFolders(cs, selectors.PrefixMatch()))
@ -219,10 +220,10 @@ func runSharePointIncrementalBackupTests(
t *testing.T, t *testing.T,
ctx context.Context, ctx context.Context,
) string { ) string {
d, err := its.AC.Sites().GetDefaultDrive(ctx, its.Site.ID) d, err := m365.AC.Sites().GetDefaultDrive(ctx, m365.Site.ID)
if err != nil { if err != nil {
err = clues.Wrap(err, "retrieving default site drive"). err = clues.Wrap(err, "retrieving default site drive").
With("site", its.Site.ID) With("site", m365.Site.ID)
} }
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
@ -240,8 +241,8 @@ func runSharePointIncrementalBackupTests(
RunIncrementalDriveishBackupTest( RunIncrementalDriveishBackupTest(
suite, suite,
opts, opts,
its.Site.ID, m365.Site.ID,
its.User.ID, m365.User.ID,
path.SharePointService, path.SharePointService,
path.LibrariesCategory, path.LibrariesCategory,
ic, ic,
@ -253,7 +254,7 @@ func runSharePointIncrementalBackupTests(
type SharePointBackupNightlyIntgSuite struct { type SharePointBackupNightlyIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestSharePointBackupNightlyIntgSuite(t *testing.T) { func TestSharePointBackupNightlyIntgSuite(t *testing.T) {
@ -265,18 +266,18 @@ func TestSharePointBackupNightlyIntgSuite(t *testing.T) {
} }
func (suite *SharePointBackupNightlyIntgSuite) SetupSuite() { func (suite *SharePointBackupNightlyIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *SharePointBackupNightlyIntgSuite) TestBackup_Run_sharePointVersion9MergeBase() { func (suite *SharePointBackupNightlyIntgSuite) TestBackup_Run_sharePointVersion9MergeBase() {
sel := selectors.NewSharePointBackup([]string{suite.its.Site.ID}) sel := selectors.NewSharePointBackup([]string{suite.m365.Site.ID})
sel.Include(selTD.SharePointBackupFolderScope(sel)) sel.Include(selTD.SharePointBackupFolderScope(sel))
RunMergeBaseGroupsUpdate(suite, sel.Selector, true) RunMergeBaseGroupsUpdate(suite, sel.Selector, true)
} }
func (suite *SharePointBackupNightlyIntgSuite) TestBackup_Run_sharePointVersion9AssistBases() { func (suite *SharePointBackupNightlyIntgSuite) TestBackup_Run_sharePointVersion9AssistBases() {
sel := selectors.NewSharePointBackup([]string{suite.its.Site.ID}) sel := selectors.NewSharePointBackup([]string{suite.m365.Site.ID})
sel.Include(selTD.SharePointBackupFolderScope(sel)) sel.Include(selTD.SharePointBackupFolderScope(sel))
RunDriveAssistBaseGroupsUpdate(suite, sel.Selector, true) RunDriveAssistBaseGroupsUpdate(suite, sel.Selector, true)
@ -284,7 +285,7 @@ func (suite *SharePointBackupNightlyIntgSuite) TestBackup_Run_sharePointVersion9
type SharePointRestoreNightlyIntgSuite struct { type SharePointRestoreNightlyIntgSuite struct {
tester.Suite tester.Suite
its IntgTesterSetup m365 its.M365IntgTestSetup
} }
func TestSharePointRestoreIntgSuite(t *testing.T) { func TestSharePointRestoreIntgSuite(t *testing.T) {
@ -296,38 +297,38 @@ func TestSharePointRestoreIntgSuite(t *testing.T) {
} }
func (suite *SharePointRestoreNightlyIntgSuite) SetupSuite() { func (suite *SharePointRestoreNightlyIntgSuite) SetupSuite() {
suite.its = NewIntegrationTesterSetup(suite.T()) suite.m365 = its.GetM365(suite.T())
} }
func (suite *SharePointRestoreNightlyIntgSuite) TestRestore_Run_sharepointWithAdvancedOptions() { func (suite *SharePointRestoreNightlyIntgSuite) TestRestore_Run_sharepointWithAdvancedOptions() {
sel := selectors.NewSharePointBackup([]string{suite.its.Site.ID}) sel := selectors.NewSharePointBackup([]string{suite.m365.Site.ID})
sel.Include(selTD.SharePointBackupFolderScope(sel)) sel.Include(selTD.SharePointBackupFolderScope(sel))
sel.Filter(sel.Library("documents")) sel.Filter(sel.Library("documents"))
sel.DiscreteOwner = suite.its.Site.ID sel.DiscreteOwner = suite.m365.Site.ID
RunDriveRestoreWithAdvancedOptions( RunDriveRestoreWithAdvancedOptions(
suite.T(), suite.T(),
suite, suite,
suite.its.AC, suite.m365.AC,
sel.Selector, sel.Selector,
suite.its.Site.DriveID, suite.m365.Site.DriveID,
suite.its.Site.DriveRootFolderID) suite.m365.Site.DriveRootFolderID)
} }
func (suite *SharePointRestoreNightlyIntgSuite) TestRestore_Run_sharepointAlternateProtectedResource() { func (suite *SharePointRestoreNightlyIntgSuite) TestRestore_Run_sharepointAlternateProtectedResource() {
sel := selectors.NewSharePointBackup([]string{suite.its.Site.ID}) sel := selectors.NewSharePointBackup([]string{suite.m365.Site.ID})
sel.Include(selTD.SharePointBackupFolderScope(sel)) sel.Include(selTD.SharePointBackupFolderScope(sel))
sel.Filter(sel.Library("documents")) sel.Filter(sel.Library("documents"))
sel.DiscreteOwner = suite.its.Site.ID sel.DiscreteOwner = suite.m365.Site.ID
RunDriveRestoreToAlternateProtectedResource( RunDriveRestoreToAlternateProtectedResource(
suite.T(), suite.T(),
suite, suite,
suite.its.AC, suite.m365.AC,
sel.Selector, sel.Selector,
suite.its.Site, suite.m365.Site,
suite.its.SecondarySite, suite.m365.SecondarySite,
suite.its.SecondarySite.ID) suite.m365.SecondarySite.ID)
} }
func (suite *SharePointRestoreNightlyIntgSuite) TestRestore_Run_sharepointDeletedDrives() { func (suite *SharePointRestoreNightlyIntgSuite) TestRestore_Run_sharepointDeletedDrives() {
@ -344,13 +345,13 @@ func (suite *SharePointRestoreNightlyIntgSuite) TestRestore_Run_sharepointDelete
rc.OnCollision = control.Copy rc.OnCollision = control.Copy
// create a new drive // create a new drive
md, err := suite.its.AC.Lists().PostDrive(ctx, suite.its.Site.ID, rc.Location) md, err := suite.m365.AC.Lists().PostDrive(ctx, suite.m365.Site.ID, rc.Location)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
driveID := ptr.Val(md.GetId()) driveID := ptr.Val(md.GetId())
// get the root folder // get the root folder
mdi, err := suite.its.AC.Drives().GetRootFolder(ctx, driveID) mdi, err := suite.m365.AC.Drives().GetRootFolder(ctx, driveID)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
rootFolderID := ptr.Val(mdi.GetId()) rootFolderID := ptr.Val(mdi.GetId())
@ -364,7 +365,7 @@ func (suite *SharePointRestoreNightlyIntgSuite) TestRestore_Run_sharepointDelete
file := models.NewFile() file := models.NewFile()
item.SetFile(file) item.SetFile(file)
_, err = suite.its.AC.Drives().PostItemInContainer( _, err = suite.m365.AC.Drives().PostItemInContainer(
ctx, ctx,
driveID, driveID,
rootFolderID, rootFolderID,
@ -377,13 +378,13 @@ func (suite *SharePointRestoreNightlyIntgSuite) TestRestore_Run_sharepointDelete
mb = evmock.NewBus() mb = evmock.NewBus()
counter = count.New() counter = count.New()
opts = control.DefaultOptions() opts = control.DefaultOptions()
graphClient = suite.its.AC.Stable.Client() graphClient = suite.m365.AC.Stable.Client()
) )
bsel := selectors.NewSharePointBackup([]string{suite.its.Site.ID}) bsel := selectors.NewSharePointBackup([]string{suite.m365.Site.ID})
bsel.Include(selTD.SharePointBackupFolderScope(bsel)) bsel.Include(selTD.SharePointBackupFolderScope(bsel))
bsel.Filter(bsel.Library(rc.Location)) bsel.Filter(bsel.Library(rc.Location))
bsel.DiscreteOwner = suite.its.Site.ID bsel.DiscreteOwner = suite.m365.Site.ID
bo, bod := PrepNewTestBackupOp(t, ctx, mb, bsel.Selector, opts, version.Backup, counter) bo, bod := PrepNewTestBackupOp(t, ctx, mb, bsel.Selector, opts, version.Backup, counter)
defer bod.Close(t, ctx) defer bod.Close(t, ctx)
@ -481,9 +482,9 @@ func (suite *SharePointRestoreNightlyIntgSuite) TestRestore_Run_sharepointDelete
RunAndCheckRestore(t, ctx, &ro, mb, false) RunAndCheckRestore(t, ctx, &ro, mb, false)
assert.Equal(t, 1, ctr.Get(count.NewItemCreated), "restored an item") assert.Equal(t, 1, ctr.Get(count.NewItemCreated), "restored an item")
pgr := suite.its.AC. pgr := suite.m365.AC.
Drives(). Drives().
NewSiteDrivePager(suite.its.Site.ID, []string{"id", "name"}) NewSiteDrivePager(suite.m365.Site.ID, []string{"id", "name"})
drives, err := api.GetAllDrives(ctx, pgr) drives, err := api.GetAllDrives(ctx, pgr)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
@ -502,7 +503,7 @@ func (suite *SharePointRestoreNightlyIntgSuite) TestRestore_Run_sharepointDelete
md = created md = created
driveID = ptr.Val(md.GetId()) driveID = ptr.Val(md.GetId())
mdi, err := suite.its.AC.Drives().GetRootFolder(ctx, driveID) mdi, err := suite.m365.AC.Drives().GetRootFolder(ctx, driveID)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
rootFolderID = ptr.Val(mdi.GetId()) rootFolderID = ptr.Val(mdi.GetId())

View File

@ -0,0 +1,258 @@
package its
import (
"strings"
"testing"
"github.com/alcionai/clues"
"github.com/h2non/gock"
"github.com/stretchr/testify/require"
"github.com/alcionai/corso/src/internal/common/idname"
"github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/control"
"github.com/alcionai/corso/src/pkg/count"
"github.com/alcionai/corso/src/pkg/services/m365/api"
"github.com/alcionai/corso/src/pkg/services/m365/api/graph"
)
// ---------------------------------------------------------------------------
// Gockable client
// ---------------------------------------------------------------------------
// GockClient produces a new exchange api client that can be
// mocked using gock.
func gockClient(creds account.M365Config, counter *count.Bus) (api.Client, error) {
s, err := graph.NewGockService(creds, counter)
if err != nil {
return api.Client{}, err
}
li, err := graph.NewGockService(creds, counter, graph.NoTimeout())
if err != nil {
return api.Client{}, err
}
return api.Client{
Credentials: creds,
Stable: s,
LargeItem: li,
}, nil
}
// ---------------------------------------------------------------------------
// Intercepting calls with Gock
// ---------------------------------------------------------------------------
const graphAPIHostURL = "https://graph.microsoft.com"
func V1APIURLPath(parts ...string) string {
return strings.Join(append([]string{"/v1.0"}, parts...), "/")
}
func InterceptV1Path(pathParts ...string) *gock.Request {
return gock.New(graphAPIHostURL).Get(V1APIURLPath(pathParts...))
}
// ---------------------------------------------------------------------------
// Suite Setup
// ---------------------------------------------------------------------------
type IDs struct {
Provider idname.Provider
ID string
Email string
DisplayName string
DriveID string
DriveRootFolderID string
WebURL string
// TestContainerID is used to store the ID of the primary container under
// test. Normally this will be empty, but in certain services or data
// categories, especially those where we don't have canonical containers
// to isolate for testing, we may specify a TestContainer here instead.
TestContainerID string
// a "RootSite" is used by resources that own one or more sites.
// ex: groups and teams. Each of those resources should designate
// a "root" site (aka: the "default" site). That site gets embedded
// here because we probably interface with it as its own resource
// within the drive processors.
RootSite struct {
Provider idname.Provider
ID string
DisplayName string
DriveID string
DriveRootFolderID string
WebURL string
}
}
// M365IntgTestSetup provides all the common references used in an m365 integration
// test suite. Call `its.GetM365()` to get the singleton for your test suite.
// If you're looking for unit testing setup, use `uts.GetM365()` instead.
type M365IntgTestSetup struct {
Acct account.Account
Creds account.M365Config
TenantID string
AC api.Client
GockAC api.Client
Site IDs
SecondarySite IDs
Group IDs
SecondaryGroup IDs
User IDs
SecondaryUser IDs
TertiaryUser IDs
}
// GetM365 returns the populated its.m365 singleton.
func GetM365(t *testing.T) M365IntgTestSetup {
var err error
setup := M365IntgTestSetup{}
ctx, flush := tester.NewContext(t)
defer flush()
graph.InitializeConcurrencyLimiter(ctx, true, 4)
setup.Acct = tconfig.NewM365Account(t)
setup.Creds, err = setup.Acct.M365Config()
require.NoError(t, err, clues.ToCore(err))
setup.TenantID = setup.Creds.AzureTenantID
setup.AC, err = api.NewClient(setup.Creds, control.DefaultOptions(), count.New())
require.NoError(t, err, clues.ToCore(err))
setup.GockAC, err = gockClient(setup.Creds, count.New())
require.NoError(t, err, clues.ToCore(err))
// users
fillUser(t, setup.AC, tconfig.M365UserID(t), &setup.User)
fillUser(t, setup.AC, tconfig.SecondaryM365UserID(t), &setup.SecondaryUser)
fillUser(t, setup.AC, tconfig.TertiaryM365UserID(t), &setup.TertiaryUser)
// site
fillSite(t, setup.AC, tconfig.M365SiteID(t), &setup.Site)
fillSite(t, setup.AC, tconfig.SecondaryM365SiteID(t), &setup.SecondarySite)
// team
fillTeam(t, setup.AC, tconfig.M365TeamID(t), &setup.Group)
fillTeam(t, setup.AC, tconfig.SecondaryM365TeamID(t), &setup.SecondaryGroup)
return setup
}
func fillUser(
t *testing.T,
ac api.Client,
uid string,
ids *IDs,
) {
ctx, flush := tester.NewContext(t)
defer flush()
ids.ID = tconfig.M365UserID(t)
user, err := ac.Users().GetByID(ctx, uid, api.CallConfig{})
require.NoError(t, err, clues.ToCore(err))
ids.ID = ptr.Val(user.GetId())
ids.Email = ptr.Val(user.GetUserPrincipalName())
ids.Provider = idname.NewProvider(ids.ID, ids.Email)
ids.DisplayName = ptr.Val(user.GetDisplayName())
drive, err := ac.Users().GetDefaultDrive(ctx, ids.ID)
require.NoError(t, err, clues.ToCore(err))
ids.DriveID = ptr.Val(drive.GetId())
rootFolder, err := ac.Drives().GetRootFolder(ctx, ids.DriveID)
require.NoError(t, err, clues.ToCore(err))
ids.DriveRootFolderID = ptr.Val(rootFolder.GetId())
}
func fillSite(
t *testing.T,
ac api.Client,
sid string,
ids *IDs,
) {
ctx, flush := tester.NewContext(t)
defer flush()
site, err := ac.Sites().GetByID(ctx, sid, api.CallConfig{})
require.NoError(t, err, clues.ToCore(err))
ids.ID = ptr.Val(site.GetId())
ids.WebURL = ptr.Val(site.GetWebUrl())
ids.Provider = idname.NewProvider(ids.ID, ids.WebURL)
ids.DisplayName = ptr.Val(site.GetDisplayName())
drive, err := ac.Sites().GetDefaultDrive(ctx, ids.ID)
require.NoError(t, err, clues.ToCore(err))
ids.DriveID = ptr.Val(drive.GetId())
rootFolder, err := ac.Drives().GetRootFolder(ctx, ids.DriveID)
require.NoError(t, err, clues.ToCore(err))
ids.DriveRootFolderID = ptr.Val(rootFolder.GetId())
}
func fillTeam(
t *testing.T,
ac api.Client,
gid string,
ids *IDs,
) {
ctx, flush := tester.NewContext(t)
defer flush()
team, err := ac.Groups().GetByID(ctx, gid, api.CallConfig{})
require.NoError(t, err, clues.ToCore(err))
ids.ID = ptr.Val(team.GetId())
ids.Email = ptr.Val(team.GetMail())
ids.Provider = idname.NewProvider(ids.ID, ids.Email)
ids.DisplayName = ptr.Val(team.GetDisplayName())
channel, err := ac.Channels().
GetChannelByName(
ctx,
ids.ID,
"Test")
require.NoError(t, err, clues.ToCore(err))
require.Equal(t, "Test", ptr.Val(channel.GetDisplayName()))
ids.TestContainerID = ptr.Val(channel.GetId())
site, err := ac.Groups().GetRootSite(ctx, gid)
require.NoError(t, err, clues.ToCore(err))
ids.RootSite.ID = ptr.Val(site.GetId())
ids.RootSite.WebURL = ptr.Val(site.GetWebUrl())
ids.RootSite.DisplayName = ptr.Val(site.GetDisplayName())
ids.RootSite.Provider = idname.NewProvider(ids.RootSite.ID, ids.RootSite.WebURL)
drive, err := ac.Sites().GetDefaultDrive(ctx, ids.RootSite.ID)
require.NoError(t, err, clues.ToCore(err))
ids.RootSite.DriveID = ptr.Val(drive.GetId())
rootFolder, err := ac.Drives().GetRootFolder(ctx, ids.RootSite.DriveID)
require.NoError(t, err, clues.ToCore(err))
ids.RootSite.DriveRootFolderID = ptr.Val(rootFolder.GetId())
}

View File

@ -0,0 +1,154 @@
package its
import (
"slices"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
"github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/tconfig"
storeTD "github.com/alcionai/corso/src/pkg/storage/testdata"
)
type M365IntgSuite struct {
tester.Suite
}
func TestM365IntgSuite(t *testing.T) {
suite.Run(t, &M365IntgSuite{
Suite: tester.NewIntegrationSuite(
t,
[][]string{tconfig.M365AcctCredEnvs, storeTD.AWSStorageCredEnvs}),
})
}
func (suite *M365IntgSuite) TestGetM365() {
t := suite.T()
result := GetM365(t)
assert.NotEmpty(t, result.Acct)
assert.NotEmpty(t, result.Creds)
assert.NotEmpty(t, result.AC)
assert.NotEmpty(t, result.GockAC)
assert.NotEmpty(t, result.TenantID)
var (
none = []string{}
expectSite = []string{id, weburl, provider, displayname, driveid, driverootfolderid}
expectRootSite = []string{id, weburl, provider, displayname, driveid, driverootfolderid}
expectGroup = []string{id, email, provider, displayname, testcontainerid}
expectUser = []string{id, email, provider, displayname, driveid, driverootfolderid}
)
assertIDs(t, result.Site, expectSite, none)
assertIDs(t, result.SecondarySite, expectSite, none)
assertIDs(t, result.Group, expectGroup, expectRootSite)
assertIDs(t, result.SecondaryGroup, expectGroup, expectRootSite)
assertIDs(t, result.User, expectUser, none)
assertIDs(t, result.SecondaryUser, expectUser, none)
assertIDs(t, result.TertiaryUser, expectUser, none)
}
const (
provider = "provider"
id = "id"
email = "email"
displayname = "displayname"
driveid = "driveid"
driverootfolderid = "driverootfolderid"
testcontainerid = "testcontainerid"
weburl = "weburl"
)
func assertIDs(
t *testing.T,
ids IDs,
expect []string,
expectRootSite []string,
) {
assert.NotEmpty(t, ids)
if slices.Contains(expect, provider) {
assert.NotNil(t, ids.Provider)
assert.NotEmpty(t, ids.Provider.ID())
assert.NotEmpty(t, ids.Provider.Name())
} else {
assert.Nil(t, ids.Provider)
}
if slices.Contains(expect, id) {
assert.NotEmpty(t, ids.ID)
} else {
assert.Empty(t, ids.ID)
}
if slices.Contains(expect, email) {
assert.NotEmpty(t, ids.Email)
} else {
assert.Empty(t, ids.Email)
}
if slices.Contains(expect, driveid) {
assert.NotEmpty(t, ids.DriveID)
} else {
assert.Empty(t, ids.DriveID)
}
if slices.Contains(expect, driverootfolderid) {
assert.NotEmpty(t, ids.DriveRootFolderID)
} else {
assert.Empty(t, ids.DriveRootFolderID)
}
if slices.Contains(expect, testcontainerid) {
assert.NotEmpty(t, ids.TestContainerID)
} else {
assert.Empty(t, ids.TestContainerID)
}
if slices.Contains(expect, weburl) {
assert.NotEmpty(t, ids.WebURL)
} else {
assert.Empty(t, ids.WebURL)
}
if slices.Contains(expectRootSite, provider) {
assert.NotNil(t, ids.RootSite.Provider)
assert.NotEmpty(t, ids.RootSite.Provider.ID())
assert.NotEmpty(t, ids.RootSite.Provider.Name())
} else {
assert.Nil(t, ids.RootSite.Provider)
}
if slices.Contains(expectRootSite, id) {
assert.NotEmpty(t, ids.RootSite.ID)
} else {
assert.Empty(t, ids.RootSite.ID)
}
if slices.Contains(expectRootSite, driveid) {
assert.NotEmpty(t, ids.RootSite.DriveID)
} else {
assert.Empty(t, ids.RootSite.DriveID)
}
if slices.Contains(expectRootSite, displayname) {
assert.NotEmpty(t, ids.RootSite.DisplayName)
} else {
assert.Empty(t, ids.RootSite.DisplayName)
}
if slices.Contains(expectRootSite, driverootfolderid) {
assert.NotEmpty(t, ids.RootSite.DriveRootFolderID)
} else {
assert.Empty(t, ids.RootSite.DriveRootFolderID)
}
if slices.Contains(expectRootSite, weburl) {
assert.NotEmpty(t, ids.RootSite.WebURL)
} else {
assert.Empty(t, ids.RootSite.WebURL)
}
}

View File

@ -0,0 +1,30 @@
package its
import "github.com/alcionai/corso/src/pkg/path"
type ResourceServicer interface {
Resource() IDs
Service() path.ServiceType
}
var _ ResourceServicer = resourceAndService{}
type resourceAndService struct {
protectedResource IDs
serviceType path.ServiceType
}
func (ras resourceAndService) Resource() IDs {
return ras.protectedResource
}
func (ras resourceAndService) Service() path.ServiceType {
return ras.serviceType
}
func NewResourceService(r IDs, s path.ServiceType) ResourceServicer {
return &resourceAndService{
protectedResource: r,
serviceType: s,
}
}

View File

@ -37,10 +37,10 @@ func NewFakeM365Account(t *testing.T) account.Account {
account.ProviderM365, account.ProviderM365,
account.M365Config{ account.M365Config{
M365: credentials.M365{ M365: credentials.M365{
AzureClientID: "12345", AzureClientID: "client-12345",
AzureClientSecret: "abcde", AzureClientSecret: "secret-abcde",
}, },
AzureTenantID: "09876", AzureTenantID: "tenant-09876",
}) })
require.NoError(t, err, "initializing mock account", clues.ToCore(err)) require.NoError(t, err, "initializing mock account", clues.ToCore(err))

View File

@ -16,6 +16,7 @@ import (
"github.com/alcionai/corso/src/cli/flags" "github.com/alcionai/corso/src/cli/flags"
"github.com/alcionai/corso/src/internal/common/str" "github.com/alcionai/corso/src/internal/common/str"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/control/repository" "github.com/alcionai/corso/src/pkg/control/repository"
@ -399,6 +400,7 @@ func (suite *ConfigSuite) TestReadFromFlags() {
type ConfigIntegrationSuite struct { type ConfigIntegrationSuite struct {
tester.Suite tester.Suite
m365 its.M365IntgTestSetup
} }
func TestConfigIntegrationSuite(t *testing.T) { func TestConfigIntegrationSuite(t *testing.T) {
@ -407,6 +409,10 @@ func TestConfigIntegrationSuite(t *testing.T) {
[][]string{storeTD.AWSStorageCredEnvs, tconfig.M365AcctCredEnvs})}) [][]string{storeTD.AWSStorageCredEnvs, tconfig.M365AcctCredEnvs})})
} }
func (suite *ConfigIntegrationSuite) SetupSuite() {
suite.m365 = its.GetM365(suite.T())
}
func (suite *ConfigIntegrationSuite) TestGetStorageAndAccount() { func (suite *ConfigIntegrationSuite) TestGetStorageAndAccount() {
t := suite.T() t := suite.T()
vpr := viper.New() vpr := viper.New()
@ -418,7 +424,6 @@ func (suite *ConfigIntegrationSuite) TestGetStorageAndAccount() {
bkt = "get-storage-and-account-bucket" bkt = "get-storage-and-account-bucket"
end = "https://get-storage-and-account.com" end = "https://get-storage-and-account.com"
pfx = "get-storage-and-account-prefix/" pfx = "get-storage-and-account-prefix/"
tid = "3a2faa4e-a882-445c-9d27-f552ef189381"
) )
// Configure viper to read test config file // Configure viper to read test config file
@ -434,9 +439,10 @@ func (suite *ConfigIntegrationSuite) TestGetStorageAndAccount() {
DoNotVerifyTLS: true, DoNotVerifyTLS: true,
DoNotUseTLS: true, DoNotUseTLS: true,
} }
m365 := account.M365Config{AzureTenantID: tid}
err = writeRepoConfigWithViper(vpr, s3Cfg, m365, repository.Options{}, "repoid") creds := suite.m365.Creds
err = writeRepoConfigWithViper(vpr, s3Cfg, creds, repository.Options{}, "repoid")
require.NoError(t, err, "writing repo config", clues.ToCore(err)) require.NoError(t, err, "writing repo config", clues.ToCore(err))
require.Equal( require.Equal(
@ -484,13 +490,12 @@ func (suite *ConfigIntegrationSuite) TestGetStorageAndAccount_noFileOnlyOverride
bkt = "get-storage-and-account-no-file-bucket" bkt = "get-storage-and-account-no-file-bucket"
end = "https://get-storage-and-account.com/no-file" end = "https://get-storage-and-account.com/no-file"
pfx = "get-storage-and-account-no-file-prefix/" pfx = "get-storage-and-account-no-file-prefix/"
tid = "88f8522b-18e4-4d0f-b514-2d7b34d4c5a1"
) )
m365 := account.M365Config{AzureTenantID: tid} creds := suite.m365.Creds
overrides := map[string]string{ overrides := map[string]string{
account.AzureTenantID: tid, account.AzureTenantID: suite.m365.TenantID,
account.AccountProviderTypeKey: account.ProviderM365.String(), account.AccountProviderTypeKey: account.ProviderM365.String(),
storage.Bucket: bkt, storage.Bucket: bkt,
storage.Endpoint: end, storage.Endpoint: end,
@ -519,7 +524,7 @@ func (suite *ConfigIntegrationSuite) TestGetStorageAndAccount_noFileOnlyOverride
readM365, err := cfg.Account.M365Config() readM365, err := cfg.Account.M365Config()
require.NoError(t, err, "reading m365 config from account", clues.ToCore(err)) require.NoError(t, err, "reading m365 config from account", clues.ToCore(err))
assert.Equal(t, readM365.AzureTenantID, m365.AzureTenantID) assert.Equal(t, readM365.AzureTenantID, creds.AzureTenantID)
assert.Equal(t, readM365.AzureClientID, os.Getenv(credentials.AzureClientID)) assert.Equal(t, readM365.AzureClientID, os.Getenv(credentials.AzureClientID))
assert.Equal(t, readM365.AzureClientSecret, os.Getenv(credentials.AzureClientSecret)) assert.Equal(t, readM365.AzureClientSecret, os.Getenv(credentials.AzureClientSecret))
} }

View File

@ -523,16 +523,16 @@ func (c Events) PostLargeAttachment(
return "", clues.Wrap(err, "uploading large event attachment") return "", clues.Wrap(err, "uploading large event attachment")
} }
url := ptr.Val(us.GetUploadUrl()) var (
w := graph.NewLargeItemWriter(parentItemID, url, size, c.counter) url = ptr.Val(us.GetUploadUrl())
copyBuffer := make([]byte, graph.AttachmentChunkSize) w = graph.NewLargeItemWriter(parentItemID, url, size, c.counter)
reader = bytes.NewReader(content)
copyBuffer = make([]byte, graph.AttachmentChunkSize)
)
_, err = io.CopyBuffer(w, bytes.NewReader(content), copyBuffer) _, err = io.CopyBuffer(w, reader, copyBuffer)
if err != nil {
return "", clues.WrapWC(ctx, err, "buffering large attachment content")
}
return w.ID, nil return w.ID, clues.WrapWC(ctx, err, "buffering large attachment content").OrNil()
} }
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

View File

@ -241,27 +241,30 @@ func (suite *EventsAPIIntgSuite) TestEvents_RestoreLargeAttachment() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
userID := tconfig.M365UserID(suite.T()) var (
evts = suite.its.ac.Events()
userID = suite.its.user.id
folderName = testdata.DefaultRestoreConfig("eventlargeattachmenttest").Location
tomorrow = time.Now().Add(24 * time.Hour)
item models.Eventable
start = models.NewDateTimeTimeZone()
end = models.NewDateTimeTimeZone()
)
folderName := testdata.DefaultRestoreConfig("eventlargeattachmenttest").Location
evts := suite.its.ac.Events()
calendar, err := evts.CreateContainer(ctx, userID, "", folderName) calendar, err := evts.CreateContainer(ctx, userID, "", folderName)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
tomorrow := time.Now().Add(24 * time.Hour) start.SetDateTime(ptr.To(dttm.Format(tomorrow)))
evt := models.NewEvent() start.SetTimeZone(ptr.To("UTC"))
sdtz := models.NewDateTimeTimeZone() end.SetDateTime(ptr.To(dttm.Format(tomorrow.Add(30 * time.Minute))))
edtz := models.NewDateTimeTimeZone() end.SetTimeZone(ptr.To("UTC"))
evt.SetSubject(ptr.To("Event with attachment")) item = models.NewEvent()
sdtz.SetDateTime(ptr.To(dttm.Format(tomorrow))) item.SetSubject(ptr.To("Event with attachment"))
sdtz.SetTimeZone(ptr.To("UTC")) item.SetStart(start)
edtz.SetDateTime(ptr.To(dttm.Format(tomorrow.Add(30 * time.Minute)))) item.SetEnd(end)
edtz.SetTimeZone(ptr.To("UTC"))
evt.SetStart(sdtz)
evt.SetEnd(edtz)
item, err := evts.PostItem(ctx, userID, ptr.Val(calendar.GetId()), evt) item, err = evts.PostItem(ctx, userID, ptr.Val(calendar.GetId()), item)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
id, err := evts.PostLargeAttachment( id, err := evts.PostLargeAttachment(
@ -269,10 +272,10 @@ func (suite *EventsAPIIntgSuite) TestEvents_RestoreLargeAttachment() {
userID, userID,
ptr.Val(calendar.GetId()), ptr.Val(calendar.GetId()),
ptr.Val(item.GetId()), ptr.Val(item.GetId()),
"raboganm", "rabognam",
[]byte("mangobar")) []byte("mangobar"))
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
require.NotEmpty(t, id, "empty id for large attachment") require.NotEmpty(t, id, "attachment should have an id after uploading")
} }
func (suite *EventsAPIIntgSuite) TestEvents_canFindNonStandardFolder() { func (suite *EventsAPIIntgSuite) TestEvents_canFindNonStandardFolder() {

View File

@ -12,6 +12,7 @@ import (
"github.com/alcionai/corso/src/internal/common/ptr" "github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/errs" "github.com/alcionai/corso/src/pkg/errs"
"github.com/alcionai/corso/src/pkg/errs/core" "github.com/alcionai/corso/src/pkg/errs/core"
@ -21,6 +22,7 @@ import (
type GroupsIntgSuite struct { type GroupsIntgSuite struct {
tester.Suite tester.Suite
cli client cli client
m365 its.M365IntgTestSetup
} }
func TestGroupsIntgSuite(t *testing.T) { func TestGroupsIntgSuite(t *testing.T) {
@ -37,12 +39,12 @@ func (suite *GroupsIntgSuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
acct := tconfig.NewM365Account(t) suite.m365 = its.GetM365(t)
var err error
// will init the concurrency limiter // will init the concurrency limiter
suite.cli, err = NewM365Client(ctx, acct) var err error
suite.cli, err = NewM365Client(ctx, suite.m365.Acct)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
} }
@ -52,7 +54,7 @@ func (suite *GroupsIntgSuite) TestGroupByID() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
gid := tconfig.M365TeamID(t) gid := suite.m365.Group.ID
group, err := suite.cli.GroupByID(ctx, gid) group, err := suite.cli.GroupByID(ctx, gid)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
@ -68,7 +70,7 @@ func (suite *GroupsIntgSuite) TestGroupByID_ByEmail() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
gid := tconfig.M365TeamID(t) gid := suite.m365.Group.ID
group, err := suite.cli.GroupByID(ctx, gid) group, err := suite.cli.GroupByID(ctx, gid)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
@ -77,7 +79,7 @@ func (suite *GroupsIntgSuite) TestGroupByID_ByEmail() {
assert.Equal(t, gid, group.ID, "must match expected id") assert.Equal(t, gid, group.ID, "must match expected id")
assert.NotEmpty(t, group.DisplayName) assert.NotEmpty(t, group.DisplayName)
gemail := tconfig.M365TeamEmail(t) gemail := suite.m365.Group.Email
groupByEmail, err := suite.cli.GroupByID(ctx, gemail) groupByEmail, err := suite.cli.GroupByID(ctx, gemail)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
@ -92,7 +94,7 @@ func (suite *GroupsIntgSuite) TestTeamByID() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
gid := tconfig.M365TeamID(t) gid := suite.m365.Group.ID
group, err := suite.cli.TeamByID(ctx, gid) group, err := suite.cli.TeamByID(ctx, gid)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
@ -132,7 +134,7 @@ func (suite *GroupsIntgSuite) TestGroups() {
assert.NotEmpty(t, group.DisplayName) assert.NotEmpty(t, group.DisplayName)
// at least one known group should be a team // at least one known group should be a team
if group.ID == tconfig.M365TeamID(t) { if group.ID == suite.m365.Group.ID {
assert.True(t, group.IsTeam) assert.True(t, group.IsTeam)
} }
}) })
@ -145,7 +147,7 @@ func (suite *GroupsIntgSuite) TestSitesInGroup() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
gid := tconfig.M365TeamID(t) gid := suite.m365.Group.ID
sites, err := suite.cli.SitesInGroup(ctx, gid, fault.New(true)) sites, err := suite.cli.SitesInGroup(ctx, gid, fault.New(true))
assert.NoError(t, err, clues.ToCore(err)) assert.NoError(t, err, clues.ToCore(err))

View File

@ -8,12 +8,14 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
) )
type M365IntgSuite struct { type M365IntgSuite struct {
tester.Suite tester.Suite
m365 its.M365IntgTestSetup
} }
func TestM365IntgSuite(t *testing.T) { func TestM365IntgSuite(t *testing.T) {
@ -24,26 +26,29 @@ func TestM365IntgSuite(t *testing.T) {
}) })
} }
func (suite *userIntegrationSuite) TestNewM365Client() { func (suite *M365IntgSuite) SetupSuite() {
t := suite.T() suite.m365 = its.GetM365(suite.T())
ctx, flush := tester.NewContext(t)
defer flush()
_, err := NewM365Client(ctx, tconfig.NewM365Account(t))
assert.NoError(t, err, clues.ToCore(err))
} }
func (suite *userIntegrationSuite) TestNewM365Client_invalidCredentials() { func (suite *M365IntgSuite) TestNewM365Client() {
table := []struct { table := []struct {
name string name string
acct func(t *testing.T) account.Account acct func(t *testing.T) account.Account
expectErr assert.ErrorAssertionFunc
}{ }{
{
name: "Valid Credentials",
acct: func(t *testing.T) account.Account {
return suite.m365.Acct
},
expectErr: assert.NoError,
},
{ {
name: "Invalid Credentials", name: "Invalid Credentials",
acct: func(t *testing.T) account.Account { acct: func(t *testing.T) account.Account {
return tconfig.NewFakeM365Account(t) return tconfig.NewFakeM365Account(t)
}, },
expectErr: assert.Error,
}, },
} }
@ -55,7 +60,7 @@ func (suite *userIntegrationSuite) TestNewM365Client_invalidCredentials() {
defer flush() defer flush()
_, err := NewM365Client(ctx, test.acct(t)) _, err := NewM365Client(ctx, test.acct(t))
assert.Error(t, err, clues.ToCore(err)) test.expectErr(t, err, clues.ToCore(err))
}) })
} }
} }

View File

@ -13,6 +13,7 @@ import (
"github.com/alcionai/corso/src/internal/common/ptr" "github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/errs/core" "github.com/alcionai/corso/src/pkg/errs/core"
"github.com/alcionai/corso/src/pkg/fault" "github.com/alcionai/corso/src/pkg/fault"
@ -24,6 +25,7 @@ import (
type siteIntegrationSuite struct { type siteIntegrationSuite struct {
tester.Suite tester.Suite
cli client cli client
m365 its.M365IntgTestSetup
} }
func TestSiteIntegrationSuite(t *testing.T) { func TestSiteIntegrationSuite(t *testing.T) {
@ -40,12 +42,12 @@ func (suite *siteIntegrationSuite) SetupSuite() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
acct := tconfig.NewM365Account(t) suite.m365 = its.GetM365(t)
var err error
// will init the concurrency limiter // will init the concurrency limiter
suite.cli, err = NewM365Client(ctx, acct) var err error
suite.cli, err = NewM365Client(ctx, suite.m365.Acct)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
} }
@ -258,9 +260,9 @@ func (suite *siteUnitSuite) TestGetSites() {
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
gas := test.mock(ctx) getAllSites := test.mock(ctx)
site, err := getSiteByID(ctx, gas, "id", api.CallConfig{}) site, err := getSiteByID(ctx, getAllSites, "id", api.CallConfig{})
test.expectSite(t, site) test.expectSite(t, site)
test.expectErr(t, err, clues.ToCore(err)) test.expectErr(t, err, clues.ToCore(err))
}) })

View File

@ -10,6 +10,7 @@ import (
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/internal/tester/its"
"github.com/alcionai/corso/src/internal/tester/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
"github.com/alcionai/corso/src/pkg/services/m365/api" "github.com/alcionai/corso/src/pkg/services/m365/api"
) )
@ -17,6 +18,7 @@ import (
type userIntegrationSuite struct { type userIntegrationSuite struct {
tester.Suite tester.Suite
cli client cli client
m365 its.M365IntgTestSetup
} }
func TestUserIntegrationSuite(t *testing.T) { func TestUserIntegrationSuite(t *testing.T) {
@ -28,17 +30,18 @@ func TestUserIntegrationSuite(t *testing.T) {
} }
func (suite *userIntegrationSuite) SetupSuite() { func (suite *userIntegrationSuite) SetupSuite() {
t := suite.T() var (
t = suite.T()
err error
)
suite.m365 = its.GetM365(t)
ctx, flush := tester.NewContext(t) ctx, flush := tester.NewContext(t)
defer flush() defer flush()
acct := tconfig.NewM365Account(t)
var err error
// will init the concurrency limiter // will init the concurrency limiter
suite.cli, err = NewM365Client(ctx, acct) suite.cli, err = NewM365Client(ctx, suite.m365.Acct)
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
} }
@ -64,9 +67,6 @@ func (suite *userIntegrationSuite) TestUsersCompat_HasNoInfo() {
} }
func (suite *userIntegrationSuite) TestUserHasMailbox() { func (suite *userIntegrationSuite) TestUserHasMailbox() {
t := suite.T()
userID := tconfig.M365UserID(t)
table := []struct { table := []struct {
name string name string
user string user string
@ -79,7 +79,7 @@ func (suite *userIntegrationSuite) TestUserHasMailbox() {
}, },
{ {
name: "user with mailbox", name: "user with mailbox",
user: userID, user: suite.m365.User.ID,
expect: true, expect: true,
}, },
} }
@ -98,9 +98,6 @@ func (suite *userIntegrationSuite) TestUserHasMailbox() {
} }
func (suite *userIntegrationSuite) TestUserHasDrive() { func (suite *userIntegrationSuite) TestUserHasDrive() {
t := suite.T()
userID := tconfig.M365UserID(t)
table := []struct { table := []struct {
name string name string
user string user string
@ -115,7 +112,7 @@ func (suite *userIntegrationSuite) TestUserHasDrive() {
}, },
{ {
name: "user with drive", name: "user with drive",
user: userID, user: suite.m365.User.ID,
expect: true, expect: true,
expectErr: require.NoError, expectErr: require.NoError,
}, },
@ -135,9 +132,6 @@ func (suite *userIntegrationSuite) TestUserHasDrive() {
} }
func (suite *userIntegrationSuite) TestUserGetMailboxInfo() { func (suite *userIntegrationSuite) TestUserGetMailboxInfo() {
t := suite.T()
userID := tconfig.M365UserID(t)
table := []struct { table := []struct {
name string name string
user string user string
@ -155,7 +149,7 @@ func (suite *userIntegrationSuite) TestUserGetMailboxInfo() {
}, },
{ {
name: "user mailbox", name: "user mailbox",
user: userID, user: suite.m365.User.ID,
expect: func(t *testing.T, info api.MailboxInfo) { expect: func(t *testing.T, info api.MailboxInfo) {
require.NotNil(t, info) require.NotNil(t, info)
assert.Equal(t, "user", info.Purpose) assert.Equal(t, "user", info.Purpose)
@ -201,9 +195,6 @@ func (suite *userIntegrationSuite) TestUserGetMailboxInfo() {
func (suite *userIntegrationSuite) TestUserAssignedLicenses() { func (suite *userIntegrationSuite) TestUserAssignedLicenses() {
t := suite.T() t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
runs := []struct { runs := []struct {
name string name string
@ -219,7 +210,7 @@ func (suite *userIntegrationSuite) TestUserAssignedLicenses() {
}, },
{ {
name: "user with licenses", name: "user with licenses",
userID: tconfig.M365UserID(t), userID: suite.m365.User.ID,
expect: 2, expect: 2,
expectErr: require.NoError, expectErr: require.NoError,
}, },
@ -232,7 +223,12 @@ func (suite *userIntegrationSuite) TestUserAssignedLicenses() {
} }
for _, run := range runs { for _, run := range runs {
t.Run(run.name, func(t *testing.T) { suite.Run(run.name, func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
user, err := suite.cli.UserAssignedLicenses(ctx, run.userID) user, err := suite.cli.UserAssignedLicenses(ctx, run.userID)
run.expectErr(t, err, clues.ToCore(err)) run.expectErr(t, err, clues.ToCore(err))
assert.Equal(t, run.expect, user) assert.Equal(t, run.expect, user)