clean up cli e2e tests (#3068)
deduplicate some e2e boilerplate setup. Also, transitions exchange e2e tests from an in- test loop over categories, to a well-defined test func per category. The former design doesn't play well with go test --run ./testName, and causes all tests to run even if they don't match the string. --- #### 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] 💚 E2E
This commit is contained in:
parent
dfb69da44b
commit
43c9ad4a01
@ -1,12 +1,14 @@
|
||||
package backup_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/alcionai/clues"
|
||||
"github.com/google/uuid"
|
||||
"github.com/spf13/cobra"
|
||||
"github.com/spf13/viper"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
@ -21,7 +23,6 @@ import (
|
||||
"github.com/alcionai/corso/src/internal/operations"
|
||||
"github.com/alcionai/corso/src/internal/tester"
|
||||
"github.com/alcionai/corso/src/pkg/account"
|
||||
"github.com/alcionai/corso/src/pkg/control"
|
||||
"github.com/alcionai/corso/src/pkg/path"
|
||||
"github.com/alcionai/corso/src/pkg/repository"
|
||||
"github.com/alcionai/corso/src/pkg/selectors"
|
||||
@ -34,8 +35,6 @@ var (
|
||||
events = path.EventsCategory
|
||||
)
|
||||
|
||||
var backupDataSets = []path.CategoryType{email, contacts, events}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// tests with no backups
|
||||
// ---------------------------------------------------------------------------
|
||||
@ -60,33 +59,19 @@ func TestNoBackupExchangeE2ESuite(t *testing.T) {
|
||||
}
|
||||
|
||||
func (suite *NoBackupExchangeE2ESuite) SetupSuite() {
|
||||
t := suite.T()
|
||||
ctx, flush := tester.NewContext()
|
||||
|
||||
defer flush()
|
||||
|
||||
// prepare common details
|
||||
suite.acct = tester.NewM365Account(t)
|
||||
suite.st = tester.NewPrefixedS3Storage(t)
|
||||
suite.recorder = strings.Builder{}
|
||||
t := suite.T()
|
||||
acct, st, repo, vpr, recorder, cfgFilePath := prepM365Test(t, ctx)
|
||||
|
||||
cfg, err := suite.st.S3Config()
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
force := map[string]string{
|
||||
tester.TestCfgAccountProvider: "M365",
|
||||
tester.TestCfgStorageProvider: "S3",
|
||||
tester.TestCfgPrefix: cfg.Prefix,
|
||||
}
|
||||
|
||||
suite.vpr, suite.cfgFP = tester.MakeTempTestConfigClone(t, force)
|
||||
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
suite.acct = acct
|
||||
suite.st = st
|
||||
suite.repo = repo
|
||||
suite.vpr = vpr
|
||||
suite.recorder = recorder
|
||||
suite.cfgFP = cfgFilePath
|
||||
suite.m365UserID = tester.M365UserID(t)
|
||||
|
||||
// init the repo first
|
||||
suite.repo, err = repository.Initialize(ctx, suite.acct, suite.st, control.Options{})
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
}
|
||||
|
||||
func (suite *NoBackupExchangeE2ESuite) TestExchangeBackupListCmd_empty() {
|
||||
@ -140,110 +125,94 @@ func TestBackupExchangeE2ESuite(t *testing.T) {
|
||||
}
|
||||
|
||||
func (suite *BackupExchangeE2ESuite) SetupSuite() {
|
||||
t := suite.T()
|
||||
ctx, flush := tester.NewContext()
|
||||
defer flush()
|
||||
|
||||
t := suite.T()
|
||||
acct, st, repo, vpr, _, cfgFilePath := prepM365Test(t, ctx)
|
||||
|
||||
suite.acct = acct
|
||||
suite.st = st
|
||||
suite.repo = repo
|
||||
suite.vpr = vpr
|
||||
suite.cfgFP = cfgFilePath
|
||||
suite.m365UserID = tester.M365UserID(t)
|
||||
}
|
||||
|
||||
func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_email() {
|
||||
runExchangeBackupCategoryTest(suite, "email")
|
||||
}
|
||||
|
||||
func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_contacts() {
|
||||
runExchangeBackupCategoryTest(suite, "contacts")
|
||||
}
|
||||
|
||||
func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_events() {
|
||||
runExchangeBackupCategoryTest(suite, "events")
|
||||
}
|
||||
|
||||
func runExchangeBackupCategoryTest(suite *BackupExchangeE2ESuite, category string) {
|
||||
recorder := strings.Builder{}
|
||||
recorder.Reset()
|
||||
|
||||
t := suite.T()
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
|
||||
defer flush()
|
||||
|
||||
// prepare common details
|
||||
suite.acct = tester.NewM365Account(t)
|
||||
suite.st = tester.NewPrefixedS3Storage(t)
|
||||
cmd, ctx := buildExchangeBackupCmd(ctx, suite.cfgFP, suite.m365UserID, category, &recorder)
|
||||
|
||||
cfg, err := suite.st.S3Config()
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
force := map[string]string{
|
||||
tester.TestCfgAccountProvider: "M365",
|
||||
tester.TestCfgStorageProvider: "S3",
|
||||
tester.TestCfgPrefix: cfg.Prefix,
|
||||
}
|
||||
result := recorder.String()
|
||||
t.Log("backup results", result)
|
||||
|
||||
suite.vpr, suite.cfgFP = tester.MakeTempTestConfigClone(t, force)
|
||||
// as an offhand check: the result should contain the m365 user id
|
||||
assert.Contains(t, result, suite.m365UserID)
|
||||
}
|
||||
|
||||
func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_userNotFound_email() {
|
||||
runExchangeBackupUserNotFoundTest(suite, "email")
|
||||
}
|
||||
|
||||
func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_userNotFound_contacts() {
|
||||
runExchangeBackupUserNotFoundTest(suite, "contacts")
|
||||
}
|
||||
|
||||
func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_userNotFound_events() {
|
||||
runExchangeBackupUserNotFoundTest(suite, "events")
|
||||
}
|
||||
|
||||
func runExchangeBackupUserNotFoundTest(suite *BackupExchangeE2ESuite, category string) {
|
||||
recorder := strings.Builder{}
|
||||
recorder.Reset()
|
||||
|
||||
t := suite.T()
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
suite.m365UserID = tester.M365UserID(t)
|
||||
|
||||
// init the repo first
|
||||
suite.repo, err = repository.Initialize(ctx, suite.acct, suite.st, control.Options{})
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
}
|
||||
defer flush()
|
||||
|
||||
func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd() {
|
||||
recorder := strings.Builder{}
|
||||
cmd, ctx := buildExchangeBackupCmd(ctx, suite.cfgFP, "foo@not-there.com", category, &recorder)
|
||||
|
||||
for _, set := range backupDataSets {
|
||||
recorder.Reset()
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.Error(t, err, clues.ToCore(err))
|
||||
assert.Contains(
|
||||
t,
|
||||
err.Error(),
|
||||
"not found in tenant", "error missing user not found")
|
||||
assert.NotContains(t, err.Error(), "runtime error", "panic happened")
|
||||
|
||||
suite.Run(set.String(), func() {
|
||||
t := suite.T()
|
||||
t.Logf("backup error message: %s", err.Error())
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
defer flush()
|
||||
|
||||
cmd := tester.StubRootCmd(
|
||||
"backup", "create", "exchange",
|
||||
"--config-file", suite.cfgFP,
|
||||
"--"+utils.UserFN, suite.m365UserID,
|
||||
"--"+utils.CategoryDataFN, set.String())
|
||||
cli.BuildCommandTree(cmd)
|
||||
|
||||
cmd.SetOut(&recorder)
|
||||
|
||||
ctx = print.SetRootCmd(ctx, cmd)
|
||||
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
result := recorder.String()
|
||||
t.Log("backup results", result)
|
||||
|
||||
// as an offhand check: the result should contain the m365 user id
|
||||
assert.Contains(t, result, suite.m365UserID)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_UserNotInTenant() {
|
||||
recorder := strings.Builder{}
|
||||
|
||||
for _, set := range backupDataSets {
|
||||
recorder.Reset()
|
||||
|
||||
suite.Run(set.String(), func() {
|
||||
t := suite.T()
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
defer flush()
|
||||
|
||||
cmd := tester.StubRootCmd(
|
||||
"backup", "create", "exchange",
|
||||
"--config-file", suite.cfgFP,
|
||||
"--"+utils.UserFN, "foo@nothere.com",
|
||||
"--"+utils.CategoryDataFN, set.String())
|
||||
cli.BuildCommandTree(cmd)
|
||||
|
||||
cmd.SetOut(&recorder)
|
||||
|
||||
ctx = print.SetRootCmd(ctx, cmd)
|
||||
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.Error(t, err, clues.ToCore(err))
|
||||
assert.Contains(
|
||||
t,
|
||||
err.Error(),
|
||||
"not found in tenant", "error missing user not found")
|
||||
assert.NotContains(t, err.Error(), "runtime error", "panic happened")
|
||||
|
||||
t.Logf("backup error message: %s", err.Error())
|
||||
|
||||
result := recorder.String()
|
||||
t.Log("backup results", result)
|
||||
})
|
||||
}
|
||||
result := recorder.String()
|
||||
t.Log("backup results", result)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
@ -271,34 +240,19 @@ func TestPreparedBackupExchangeE2ESuite(t *testing.T) {
|
||||
}
|
||||
|
||||
func (suite *PreparedBackupExchangeE2ESuite) SetupSuite() {
|
||||
t := suite.T()
|
||||
|
||||
// prepare common details
|
||||
suite.acct = tester.NewM365Account(t)
|
||||
suite.st = tester.NewPrefixedS3Storage(t)
|
||||
suite.recorder = strings.Builder{}
|
||||
|
||||
cfg, err := suite.st.S3Config()
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
force := map[string]string{
|
||||
tester.TestCfgAccountProvider: "M365",
|
||||
tester.TestCfgStorageProvider: "S3",
|
||||
tester.TestCfgPrefix: cfg.Prefix,
|
||||
}
|
||||
suite.vpr, suite.cfgFP = tester.MakeTempTestConfigClone(t, force)
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
|
||||
defer flush()
|
||||
|
||||
suite.m365UserID = strings.ToLower(tester.M365UserID(t))
|
||||
|
||||
// init the repo first
|
||||
suite.repo, err = repository.Initialize(ctx, suite.acct, suite.st, control.Options{})
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
t := suite.T()
|
||||
acct, st, repo, vpr, recorder, cfgFilePath := prepM365Test(t, ctx)
|
||||
|
||||
suite.acct = acct
|
||||
suite.st = st
|
||||
suite.repo = repo
|
||||
suite.vpr = vpr
|
||||
suite.recorder = recorder
|
||||
suite.cfgFP = cfgFilePath
|
||||
suite.m365UserID = tester.M365UserID(t)
|
||||
suite.backupOps = make(map[path.CategoryType]string)
|
||||
|
||||
var (
|
||||
@ -311,7 +265,7 @@ func (suite *PreparedBackupExchangeE2ESuite) SetupSuite() {
|
||||
}
|
||||
)
|
||||
|
||||
for _, set := range backupDataSets {
|
||||
for _, set := range []path.CategoryType{email, contacts, events} {
|
||||
var (
|
||||
sel = selectors.NewExchangeBackup(users)
|
||||
scopes []selectors.ExchangeScope
|
||||
@ -342,6 +296,7 @@ func (suite *PreparedBackupExchangeE2ESuite) SetupSuite() {
|
||||
b, err := suite.repo.Backup(ctx, string(bop.Results.BackupID))
|
||||
require.NoError(t, err, "retrieving recent backup by ID")
|
||||
require.Equal(t, bIDs, string(b.ID), "repo backup matches results id")
|
||||
|
||||
_, b, errs := suite.repo.GetBackupDetails(ctx, bIDs)
|
||||
require.NoError(t, errs.Failure(), "retrieving recent backup details by ID")
|
||||
require.Empty(t, errs.Recovered(), "retrieving recent backup details by ID")
|
||||
@ -351,151 +306,173 @@ func (suite *PreparedBackupExchangeE2ESuite) SetupSuite() {
|
||||
}
|
||||
}
|
||||
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeListCmd() {
|
||||
for _, set := range backupDataSets {
|
||||
suite.recorder.Reset()
|
||||
|
||||
suite.Run(set.String(), func() {
|
||||
t := suite.T()
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
defer flush()
|
||||
|
||||
cmd := tester.StubRootCmd(
|
||||
"backup", "list", "exchange",
|
||||
"--config-file", suite.cfgFP)
|
||||
cli.BuildCommandTree(cmd)
|
||||
|
||||
cmd.SetOut(&suite.recorder)
|
||||
|
||||
ctx = print.SetRootCmd(ctx, cmd)
|
||||
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
// compare the output
|
||||
result := suite.recorder.String()
|
||||
assert.Contains(t, result, suite.backupOps[set])
|
||||
})
|
||||
}
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeListCmd_email() {
|
||||
runExchangeListCmdTest(suite, email)
|
||||
}
|
||||
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeListCmd_singleID() {
|
||||
for _, set := range backupDataSets {
|
||||
suite.recorder.Reset()
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeListCmd_contacts() {
|
||||
runExchangeListCmdTest(suite, contacts)
|
||||
}
|
||||
|
||||
suite.Run(set.String(), func() {
|
||||
t := suite.T()
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeListCmd_events() {
|
||||
runExchangeListCmdTest(suite, events)
|
||||
}
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
defer flush()
|
||||
func runExchangeListCmdTest(suite *PreparedBackupExchangeE2ESuite, category path.CategoryType) {
|
||||
suite.recorder.Reset()
|
||||
|
||||
bID := suite.backupOps[set]
|
||||
t := suite.T()
|
||||
|
||||
cmd := tester.StubRootCmd(
|
||||
"backup", "list", "exchange",
|
||||
"--config-file", suite.cfgFP,
|
||||
"--backup", string(bID))
|
||||
cli.BuildCommandTree(cmd)
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
|
||||
cmd.SetOut(&suite.recorder)
|
||||
defer flush()
|
||||
|
||||
ctx = print.SetRootCmd(ctx, cmd)
|
||||
cmd := tester.StubRootCmd(
|
||||
"backup", "list", "exchange",
|
||||
"--config-file", suite.cfgFP)
|
||||
cli.BuildCommandTree(cmd)
|
||||
cmd.SetOut(&suite.recorder)
|
||||
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
ctx = print.SetRootCmd(ctx, cmd)
|
||||
|
||||
// compare the output
|
||||
result := suite.recorder.String()
|
||||
assert.Contains(t, result, bID)
|
||||
})
|
||||
}
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
// compare the output
|
||||
result := suite.recorder.String()
|
||||
assert.Contains(t, result, suite.backupOps[category])
|
||||
}
|
||||
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeListCmd_singleID_email() {
|
||||
runExchangeListSingleCmdTest(suite, email)
|
||||
}
|
||||
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeListCmd_singleID_contacts() {
|
||||
runExchangeListSingleCmdTest(suite, contacts)
|
||||
}
|
||||
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeListCmd_singleID_events() {
|
||||
runExchangeListSingleCmdTest(suite, events)
|
||||
}
|
||||
|
||||
func runExchangeListSingleCmdTest(suite *PreparedBackupExchangeE2ESuite, category path.CategoryType) {
|
||||
suite.recorder.Reset()
|
||||
|
||||
t := suite.T()
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
|
||||
defer flush()
|
||||
|
||||
bID := suite.backupOps[category]
|
||||
|
||||
cmd := tester.StubRootCmd(
|
||||
"backup", "list", "exchange",
|
||||
"--config-file", suite.cfgFP,
|
||||
"--backup", string(bID))
|
||||
cli.BuildCommandTree(cmd)
|
||||
|
||||
cmd.SetOut(&suite.recorder)
|
||||
|
||||
ctx = print.SetRootCmd(ctx, cmd)
|
||||
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
// compare the output
|
||||
result := suite.recorder.String()
|
||||
assert.Contains(t, result, bID)
|
||||
}
|
||||
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeListCmd_badID() {
|
||||
for _, set := range backupDataSets {
|
||||
suite.Run(set.String(), func() {
|
||||
t := suite.T()
|
||||
t := suite.T()
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
defer flush()
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
|
||||
cmd := tester.StubRootCmd(
|
||||
"backup", "list", "exchange",
|
||||
"--config-file", suite.cfgFP,
|
||||
"--backup", "smarfs")
|
||||
cli.BuildCommandTree(cmd)
|
||||
defer flush()
|
||||
|
||||
ctx = print.SetRootCmd(ctx, cmd)
|
||||
cmd := tester.StubRootCmd(
|
||||
"backup", "list", "exchange",
|
||||
"--config-file", suite.cfgFP,
|
||||
"--backup", "smarfs")
|
||||
cli.BuildCommandTree(cmd)
|
||||
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.Error(t, err, clues.ToCore(err))
|
||||
})
|
||||
}
|
||||
ctx = print.SetRootCmd(ctx, cmd)
|
||||
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.Error(t, err, clues.ToCore(err))
|
||||
}
|
||||
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeDetailsCmd() {
|
||||
for _, set := range backupDataSets {
|
||||
suite.recorder.Reset()
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeDetailsCmd_email() {
|
||||
runExchangeDetailsCmdTest(suite, email)
|
||||
}
|
||||
|
||||
suite.Run(set.String(), func() {
|
||||
t := suite.T()
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeDetailsCmd_contacts() {
|
||||
runExchangeDetailsCmdTest(suite, contacts)
|
||||
}
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
defer flush()
|
||||
func (suite *PreparedBackupExchangeE2ESuite) TestExchangeDetailsCmd_events() {
|
||||
runExchangeDetailsCmdTest(suite, events)
|
||||
}
|
||||
|
||||
bID := suite.backupOps[set]
|
||||
func runExchangeDetailsCmdTest(suite *PreparedBackupExchangeE2ESuite, category path.CategoryType) {
|
||||
suite.recorder.Reset()
|
||||
|
||||
// fetch the details from the repo first
|
||||
deets, _, errs := suite.repo.GetBackupDetails(ctx, string(bID))
|
||||
require.NoError(t, errs.Failure(), clues.ToCore(errs.Failure()))
|
||||
require.Empty(t, errs.Recovered())
|
||||
t := suite.T()
|
||||
|
||||
cmd := tester.StubRootCmd(
|
||||
"backup", "details", "exchange",
|
||||
"--config-file", suite.cfgFP,
|
||||
"--"+utils.BackupFN, string(bID))
|
||||
cli.BuildCommandTree(cmd)
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
|
||||
cmd.SetOut(&suite.recorder)
|
||||
defer flush()
|
||||
|
||||
ctx = print.SetRootCmd(ctx, cmd)
|
||||
bID := suite.backupOps[category]
|
||||
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
// fetch the details from the repo first
|
||||
deets, _, errs := suite.repo.GetBackupDetails(ctx, string(bID))
|
||||
require.NoError(t, errs.Failure(), clues.ToCore(errs.Failure()))
|
||||
require.Empty(t, errs.Recovered())
|
||||
|
||||
// compare the output
|
||||
result := suite.recorder.String()
|
||||
cmd := tester.StubRootCmd(
|
||||
"backup", "details", "exchange",
|
||||
"--config-file", suite.cfgFP,
|
||||
"--"+utils.BackupFN, string(bID))
|
||||
cli.BuildCommandTree(cmd)
|
||||
cmd.SetOut(&suite.recorder)
|
||||
|
||||
i := 0
|
||||
foundFolders := 0
|
||||
ctx = print.SetRootCmd(ctx, cmd)
|
||||
|
||||
for _, ent := range deets.Entries {
|
||||
// Skip folders as they don't mean anything to the end user.
|
||||
if ent.Folder != nil {
|
||||
foundFolders++
|
||||
continue
|
||||
}
|
||||
// run the command
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
suite.Run(fmt.Sprintf("detail %d", i), func() {
|
||||
assert.Contains(suite.T(), result, ent.ShortRef)
|
||||
})
|
||||
// compare the output
|
||||
result := suite.recorder.String()
|
||||
|
||||
i++
|
||||
}
|
||||
i := 0
|
||||
foundFolders := 0
|
||||
|
||||
// At least the prefix of the path should be encoded as folders.
|
||||
assert.Greater(t, foundFolders, 4)
|
||||
for _, ent := range deets.Entries {
|
||||
// Skip folders as they don't mean anything to the end user.
|
||||
if ent.Folder != nil {
|
||||
foundFolders++
|
||||
continue
|
||||
}
|
||||
|
||||
suite.Run(fmt.Sprintf("detail %d", i), func() {
|
||||
assert.Contains(suite.T(), result, ent.ShortRef)
|
||||
})
|
||||
|
||||
i++
|
||||
}
|
||||
|
||||
// At least the prefix of the path should be encoded as folders.
|
||||
assert.Greater(t, foundFolders, 4)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
@ -523,30 +500,17 @@ func TestBackupDeleteExchangeE2ESuite(t *testing.T) {
|
||||
}
|
||||
|
||||
func (suite *BackupDeleteExchangeE2ESuite) SetupSuite() {
|
||||
t := suite.T()
|
||||
|
||||
// prepare common details
|
||||
suite.acct = tester.NewM365Account(t)
|
||||
suite.st = tester.NewPrefixedS3Storage(t)
|
||||
|
||||
cfg, err := suite.st.S3Config()
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
force := map[string]string{
|
||||
tester.TestCfgAccountProvider: "M365",
|
||||
tester.TestCfgStorageProvider: "S3",
|
||||
tester.TestCfgPrefix: cfg.Prefix,
|
||||
}
|
||||
suite.vpr, suite.cfgFP = tester.MakeTempTestConfigClone(t, force)
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
|
||||
defer flush()
|
||||
|
||||
// init the repo first
|
||||
suite.repo, err = repository.Initialize(ctx, suite.acct, suite.st, control.Options{})
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
t := suite.T()
|
||||
acct, st, repo, vpr, _, cfgFilePath := prepM365Test(t, ctx)
|
||||
|
||||
suite.acct = acct
|
||||
suite.st = st
|
||||
suite.repo = repo
|
||||
suite.vpr = vpr
|
||||
suite.cfgFP = cfgFilePath
|
||||
|
||||
m365UserID := tester.M365UserID(t)
|
||||
users := []string{m365UserID}
|
||||
@ -555,9 +519,11 @@ func (suite *BackupDeleteExchangeE2ESuite) SetupSuite() {
|
||||
sel := selectors.NewExchangeBackup(users)
|
||||
sel.Include(sel.MailFolders([]string{exchange.DefaultMailFolder}, selectors.PrefixMatch()))
|
||||
|
||||
suite.backupOp, err = suite.repo.NewBackup(ctx, sel.Selector)
|
||||
backupOp, err := suite.repo.NewBackup(ctx, sel.Selector)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
suite.backupOp = backupOp
|
||||
|
||||
err = suite.backupOp.Run(ctx)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
}
|
||||
@ -607,3 +573,23 @@ func (suite *BackupDeleteExchangeE2ESuite) TestExchangeBackupDeleteCmd_UnknownID
|
||||
err := cmd.ExecuteContext(ctx)
|
||||
require.Error(t, err, clues.ToCore(err))
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
func buildExchangeBackupCmd(
|
||||
ctx context.Context,
|
||||
configFile, user, category string,
|
||||
recorder *strings.Builder,
|
||||
) (*cobra.Command, context.Context) {
|
||||
cmd := tester.StubRootCmd(
|
||||
"backup", "create", "exchange",
|
||||
"--config-file", configFile,
|
||||
"--"+utils.UserFN, user,
|
||||
"--"+utils.CategoryDataFN, category)
|
||||
cli.BuildCommandTree(cmd)
|
||||
cmd.SetOut(recorder)
|
||||
|
||||
return cmd, print.SetRootCmd(ctx, cmd)
|
||||
}
|
||||
|
||||
53
src/cli/backup/help_e2e_test.go
Normal file
53
src/cli/backup/help_e2e_test.go
Normal file
@ -0,0 +1,53 @@
|
||||
package backup_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/alcionai/clues"
|
||||
"github.com/spf13/viper"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/alcionai/corso/src/cli/config"
|
||||
"github.com/alcionai/corso/src/internal/tester"
|
||||
"github.com/alcionai/corso/src/pkg/account"
|
||||
"github.com/alcionai/corso/src/pkg/control"
|
||||
"github.com/alcionai/corso/src/pkg/repository"
|
||||
"github.com/alcionai/corso/src/pkg/storage"
|
||||
)
|
||||
|
||||
func prepM365Test(
|
||||
t *testing.T,
|
||||
ctx context.Context, //revive:disable-line:context-as-argument
|
||||
) (
|
||||
account.Account,
|
||||
storage.Storage,
|
||||
repository.Repository,
|
||||
*viper.Viper,
|
||||
strings.Builder,
|
||||
string,
|
||||
) {
|
||||
var (
|
||||
acct = tester.NewM365Account(t)
|
||||
st = tester.NewPrefixedS3Storage(t)
|
||||
recorder = strings.Builder{}
|
||||
)
|
||||
|
||||
cfg, err := st.S3Config()
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
force := map[string]string{
|
||||
tester.TestCfgAccountProvider: "M365",
|
||||
tester.TestCfgStorageProvider: "S3",
|
||||
tester.TestCfgPrefix: cfg.Prefix,
|
||||
}
|
||||
|
||||
vpr, cfgFP := tester.MakeTempTestConfigClone(t, force)
|
||||
ctx = config.SetViper(ctx, vpr)
|
||||
|
||||
repo, err := repository.Initialize(ctx, acct, st, control.Options{})
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
return acct, st, repo, vpr, recorder, cfgFP
|
||||
}
|
||||
@ -20,7 +20,6 @@ import (
|
||||
"github.com/alcionai/corso/src/internal/operations"
|
||||
"github.com/alcionai/corso/src/internal/tester"
|
||||
"github.com/alcionai/corso/src/pkg/account"
|
||||
"github.com/alcionai/corso/src/pkg/control"
|
||||
"github.com/alcionai/corso/src/pkg/repository"
|
||||
"github.com/alcionai/corso/src/pkg/selectors"
|
||||
"github.com/alcionai/corso/src/pkg/storage"
|
||||
@ -52,38 +51,19 @@ func TestNoBackupOneDriveE2ESuite(t *testing.T) {
|
||||
}
|
||||
|
||||
func (suite *NoBackupOneDriveE2ESuite) SetupSuite() {
|
||||
t := suite.T()
|
||||
ctx, flush := tester.NewContext()
|
||||
|
||||
defer flush()
|
||||
|
||||
// prepare common details
|
||||
suite.acct = tester.NewM365Account(t)
|
||||
suite.st = tester.NewPrefixedS3Storage(t)
|
||||
t := suite.T()
|
||||
acct, st, repo, vpr, recorder, cfgFilePath := prepM365Test(t, ctx)
|
||||
|
||||
cfg, err := suite.st.S3Config()
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
force := map[string]string{
|
||||
tester.TestCfgAccountProvider: "M365",
|
||||
tester.TestCfgStorageProvider: "S3",
|
||||
tester.TestCfgPrefix: cfg.Prefix,
|
||||
}
|
||||
|
||||
suite.vpr, suite.cfgFP = tester.MakeTempTestConfigClone(t, force)
|
||||
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
suite.acct = acct
|
||||
suite.st = st
|
||||
suite.repo = repo
|
||||
suite.recorder = recorder
|
||||
suite.vpr = vpr
|
||||
suite.cfgFP = cfgFilePath
|
||||
suite.m365UserID = tester.M365UserID(t)
|
||||
|
||||
// init the repo first
|
||||
suite.repo, err = repository.Initialize(
|
||||
ctx,
|
||||
suite.acct,
|
||||
suite.st,
|
||||
control.Options{
|
||||
ToggleFeatures: control.Toggles{},
|
||||
})
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
}
|
||||
|
||||
func (suite *NoBackupOneDriveE2ESuite) TestOneDriveBackupListCmd_empty() {
|
||||
@ -175,39 +155,21 @@ func TestBackupDeleteOneDriveE2ESuite(t *testing.T) {
|
||||
}
|
||||
|
||||
func (suite *BackupDeleteOneDriveE2ESuite) SetupSuite() {
|
||||
t := suite.T()
|
||||
|
||||
// prepare common details
|
||||
suite.acct = tester.NewM365Account(t)
|
||||
suite.st = tester.NewPrefixedS3Storage(t)
|
||||
|
||||
cfg, err := suite.st.S3Config()
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
force := map[string]string{
|
||||
tester.TestCfgAccountProvider: "M365",
|
||||
tester.TestCfgStorageProvider: "S3",
|
||||
tester.TestCfgPrefix: cfg.Prefix,
|
||||
}
|
||||
suite.vpr, suite.cfgFP = tester.MakeTempTestConfigClone(t, force)
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
|
||||
defer flush()
|
||||
|
||||
// init the repo first
|
||||
suite.repo, err = repository.Initialize(
|
||||
ctx,
|
||||
suite.acct,
|
||||
suite.st,
|
||||
control.Options{
|
||||
ToggleFeatures: control.Toggles{},
|
||||
})
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
t := suite.T()
|
||||
acct, st, repo, vpr, recorder, cfgFilePath := prepM365Test(t, ctx)
|
||||
|
||||
suite.acct = acct
|
||||
suite.st = st
|
||||
suite.repo = repo
|
||||
suite.recorder = recorder
|
||||
suite.vpr = vpr
|
||||
suite.cfgFP = cfgFilePath
|
||||
|
||||
var (
|
||||
m365UserID = strings.ToLower(tester.M365UserID(t))
|
||||
m365UserID = tester.M365UserID(t)
|
||||
users = []string{m365UserID}
|
||||
idToName = map[string]string{m365UserID: m365UserID}
|
||||
nameToID = map[string]string{m365UserID: m365UserID}
|
||||
@ -221,9 +183,11 @@ func (suite *BackupDeleteOneDriveE2ESuite) SetupSuite() {
|
||||
sel := selectors.NewOneDriveBackup(users)
|
||||
sel.Include(sel.Folders(selectors.Any()))
|
||||
|
||||
suite.backupOp, err = suite.repo.NewBackupWithLookup(ctx, sel.Selector, ins)
|
||||
backupOp, err := suite.repo.NewBackupWithLookup(ctx, sel.Selector, ins)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
suite.backupOp = backupOp
|
||||
|
||||
err = suite.backupOp.Run(ctx)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
}
|
||||
|
||||
@ -20,7 +20,6 @@ import (
|
||||
"github.com/alcionai/corso/src/internal/operations"
|
||||
"github.com/alcionai/corso/src/internal/tester"
|
||||
"github.com/alcionai/corso/src/pkg/account"
|
||||
"github.com/alcionai/corso/src/pkg/control"
|
||||
"github.com/alcionai/corso/src/pkg/repository"
|
||||
"github.com/alcionai/corso/src/pkg/selectors"
|
||||
"github.com/alcionai/corso/src/pkg/selectors/testdata"
|
||||
@ -51,32 +50,19 @@ func TestNoBackupSharePointE2ESuite(t *testing.T) {
|
||||
}
|
||||
|
||||
func (suite *NoBackupSharePointE2ESuite) SetupSuite() {
|
||||
t := suite.T()
|
||||
ctx, flush := tester.NewContext()
|
||||
|
||||
defer flush()
|
||||
|
||||
// prepare common details
|
||||
suite.acct = tester.NewM365Account(t)
|
||||
suite.st = tester.NewPrefixedS3Storage(t)
|
||||
t := suite.T()
|
||||
acct, st, repo, vpr, recorder, cfgFilePath := prepM365Test(t, ctx)
|
||||
|
||||
cfg, err := suite.st.S3Config()
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
force := map[string]string{
|
||||
tester.TestCfgAccountProvider: "M365",
|
||||
tester.TestCfgStorageProvider: "S3",
|
||||
tester.TestCfgPrefix: cfg.Prefix,
|
||||
}
|
||||
|
||||
suite.vpr, suite.cfgFP = tester.MakeTempTestConfigClone(t, force)
|
||||
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
suite.acct = acct
|
||||
suite.st = st
|
||||
suite.repo = repo
|
||||
suite.vpr = vpr
|
||||
suite.recorder = recorder
|
||||
suite.cfgFP = cfgFilePath
|
||||
suite.m365SiteID = tester.M365SiteID(t)
|
||||
|
||||
// init the repo first
|
||||
suite.repo, err = repository.Initialize(ctx, suite.acct, suite.st, control.Options{})
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
}
|
||||
|
||||
func (suite *NoBackupSharePointE2ESuite) TestSharePointBackupListCmd_empty() {
|
||||
@ -133,33 +119,21 @@ func TestBackupDeleteSharePointE2ESuite(t *testing.T) {
|
||||
}
|
||||
|
||||
func (suite *BackupDeleteSharePointE2ESuite) SetupSuite() {
|
||||
t := suite.T()
|
||||
|
||||
// prepare common details
|
||||
suite.acct = tester.NewM365Account(t)
|
||||
suite.st = tester.NewPrefixedS3Storage(t)
|
||||
|
||||
cfg, err := suite.st.S3Config()
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
force := map[string]string{
|
||||
tester.TestCfgAccountProvider: "M365",
|
||||
tester.TestCfgStorageProvider: "S3",
|
||||
tester.TestCfgPrefix: cfg.Prefix,
|
||||
}
|
||||
suite.vpr, suite.cfgFP = tester.MakeTempTestConfigClone(t, force)
|
||||
|
||||
ctx, flush := tester.NewContext()
|
||||
ctx = config.SetViper(ctx, suite.vpr)
|
||||
|
||||
defer flush()
|
||||
|
||||
// init the repo first
|
||||
suite.repo, err = repository.Initialize(ctx, suite.acct, suite.st, control.Options{})
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
t := suite.T()
|
||||
acct, st, repo, vpr, recorder, cfgFilePath := prepM365Test(t, ctx)
|
||||
|
||||
suite.acct = acct
|
||||
suite.st = st
|
||||
suite.repo = repo
|
||||
suite.vpr = vpr
|
||||
suite.recorder = recorder
|
||||
suite.cfgFP = cfgFilePath
|
||||
|
||||
var (
|
||||
m365SiteID = strings.ToLower(tester.M365SiteID(t))
|
||||
m365SiteID = tester.M365SiteID(t)
|
||||
sites = []string{m365SiteID}
|
||||
idToName = map[string]string{m365SiteID: m365SiteID}
|
||||
nameToID = map[string]string{m365SiteID: m365SiteID}
|
||||
@ -173,9 +147,11 @@ func (suite *BackupDeleteSharePointE2ESuite) SetupSuite() {
|
||||
sel := selectors.NewSharePointBackup(sites)
|
||||
sel.Include(testdata.SharePointBackupFolderScope(sel))
|
||||
|
||||
suite.backupOp, err = suite.repo.NewBackupWithLookup(ctx, sel.Selector, ins)
|
||||
backupOp, err := suite.repo.NewBackupWithLookup(ctx, sel.Selector, ins)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
|
||||
suite.backupOp = backupOp
|
||||
|
||||
err = suite.backupOp.Run(ctx)
|
||||
require.NoError(t, err, clues.ToCore(err))
|
||||
}
|
||||
|
||||
@ -20,7 +20,7 @@ func M365TenantID(t *testing.T) string {
|
||||
cfg, err := readTestConfig()
|
||||
require.NoError(t, err, "retrieving m365 tenant ID from test configuration", clues.ToCore(err))
|
||||
|
||||
return cfg[TestCfgAzureTenantID]
|
||||
return strings.ToLower(cfg[TestCfgAzureTenantID])
|
||||
}
|
||||
|
||||
// M365TenantID returns a tenantID string representing the azureTenantID described
|
||||
@ -33,7 +33,7 @@ func GetM365TenantID(ctx context.Context) string {
|
||||
logger.Ctx(ctx).Error(err, "retrieving m365 tenant ID from test configuration")
|
||||
}
|
||||
|
||||
return cfg[TestCfgAzureTenantID]
|
||||
return strings.ToLower(cfg[TestCfgAzureTenantID])
|
||||
}
|
||||
|
||||
// M365UserID returns an userID string representing the m365UserID described
|
||||
@ -44,7 +44,7 @@ func M365UserID(t *testing.T) string {
|
||||
cfg, err := readTestConfig()
|
||||
require.NoError(t, err, "retrieving m365 user id from test configuration", clues.ToCore(err))
|
||||
|
||||
return cfg[TestCfgUserID]
|
||||
return strings.ToLower(cfg[TestCfgUserID])
|
||||
}
|
||||
|
||||
// GetM365UserID returns an userID string representing the m365UserID described
|
||||
@ -57,7 +57,7 @@ func GetM365UserID(ctx context.Context) string {
|
||||
logger.Ctx(ctx).Error(err, "retrieving m365 user id from test configuration")
|
||||
}
|
||||
|
||||
return cfg[TestCfgUserID]
|
||||
return strings.ToLower(cfg[TestCfgUserID])
|
||||
}
|
||||
|
||||
// SecondaryM365UserID returns an userID string representing the m365UserID
|
||||
@ -69,7 +69,7 @@ func SecondaryM365UserID(t *testing.T) string {
|
||||
cfg, err := readTestConfig()
|
||||
require.NoError(t, err, "retrieving secondary m365 user id from test configuration", clues.ToCore(err))
|
||||
|
||||
return cfg[TestCfgSecondaryUserID]
|
||||
return strings.ToLower(cfg[TestCfgSecondaryUserID])
|
||||
}
|
||||
|
||||
// LoadTestM365SiteID returns a siteID string representing the m365SiteID
|
||||
@ -81,7 +81,7 @@ func LoadTestM365SiteID(t *testing.T) string {
|
||||
cfg, err := readTestConfig()
|
||||
require.NoError(t, err, "retrieving load test m365 site id from test configuration", clues.ToCore(err))
|
||||
|
||||
return cfg[TestCfgSiteID]
|
||||
return strings.ToLower(cfg[TestCfgSiteID])
|
||||
}
|
||||
|
||||
// LoadTestM365UserID returns an userID string representing the m365UserID
|
||||
@ -93,7 +93,7 @@ func LoadTestM365UserID(t *testing.T) string {
|
||||
cfg, err := readTestConfig()
|
||||
require.NoError(t, err, "retrieving load test m365 user id from test configuration", clues.ToCore(err))
|
||||
|
||||
return cfg[TestCfgLoadTestUserID]
|
||||
return strings.ToLower(cfg[TestCfgLoadTestUserID])
|
||||
}
|
||||
|
||||
// expects cfg value to be a string representing an array such as:
|
||||
@ -113,7 +113,7 @@ func LoadTestM365OrgSites(t *testing.T) []string {
|
||||
|
||||
// return strings.Split(sites, ",")
|
||||
|
||||
return []string{cfg[TestCfgSiteID]}
|
||||
return []string{strings.ToLower(cfg[TestCfgSiteID])}
|
||||
}
|
||||
|
||||
// expects cfg value to be a string representing an array such as:
|
||||
@ -159,7 +159,7 @@ func M365SiteID(t *testing.T) string {
|
||||
cfg, err := readTestConfig()
|
||||
require.NoError(t, err, "retrieving m365 site id from test configuration", clues.ToCore(err))
|
||||
|
||||
return cfg[TestCfgSiteID]
|
||||
return strings.ToLower(cfg[TestCfgSiteID])
|
||||
}
|
||||
|
||||
// M365SiteURL returns a site webURL string representing the m365SiteURL described
|
||||
@ -170,5 +170,5 @@ func M365SiteURL(t *testing.T) string {
|
||||
cfg, err := readTestConfig()
|
||||
require.NoError(t, err, "retrieving m365 site url from test configuration", clues.ToCore(err))
|
||||
|
||||
return cfg[TestCfgSiteURL]
|
||||
return strings.ToLower(cfg[TestCfgSiteURL])
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user