add item mutation tests (#1982)
## Does this PR need a docs update or release note? - [x] ⛔ No ## Type of change - [x] 🤖 Test ## Issue(s) * #1966 ## Test Plan - [x] 💚 E2E
This commit is contained in:
parent
6457e49882
commit
e4e1b4d4d8
@ -19,6 +19,7 @@ import (
|
|||||||
"github.com/alcionai/corso/src/internal/connector/exchange"
|
"github.com/alcionai/corso/src/internal/connector/exchange"
|
||||||
"github.com/alcionai/corso/src/internal/connector/graph"
|
"github.com/alcionai/corso/src/internal/connector/graph"
|
||||||
"github.com/alcionai/corso/src/internal/connector/mockconnector"
|
"github.com/alcionai/corso/src/internal/connector/mockconnector"
|
||||||
|
"github.com/alcionai/corso/src/internal/connector/support"
|
||||||
"github.com/alcionai/corso/src/internal/data"
|
"github.com/alcionai/corso/src/internal/data"
|
||||||
"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"
|
||||||
@ -304,17 +305,11 @@ func generateContainerOfItems(
|
|||||||
items := make([]incrementalItem, 0, howManyItems)
|
items := make([]incrementalItem, 0, howManyItems)
|
||||||
|
|
||||||
for i := 0; i < howManyItems; i++ {
|
for i := 0; i < howManyItems; i++ {
|
||||||
var (
|
id, d := generateItemData(t, cat, userID, dbf)
|
||||||
now = common.Now()
|
|
||||||
nowLegacy = common.FormatLegacyTime(time.Now())
|
|
||||||
id = uuid.NewString()
|
|
||||||
subject = "incr_test " + now[:16] + " - " + id[:8]
|
|
||||||
body = "incr_test " + cat.String() + " generation for " + userID + " at " + now + " - " + id
|
|
||||||
)
|
|
||||||
|
|
||||||
items = append(items, incrementalItem{
|
items = append(items, incrementalItem{
|
||||||
name: id,
|
name: id,
|
||||||
data: dbf(id, nowLegacy, subject, body),
|
data: d,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -340,6 +335,23 @@ func generateContainerOfItems(
|
|||||||
return deets
|
return deets
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func generateItemData(
|
||||||
|
t *testing.T,
|
||||||
|
category path.CategoryType,
|
||||||
|
resourceOwner string,
|
||||||
|
dbf dataBuilderFunc,
|
||||||
|
) (string, []byte) {
|
||||||
|
var (
|
||||||
|
now = common.Now()
|
||||||
|
nowLegacy = common.FormatLegacyTime(time.Now())
|
||||||
|
id = uuid.NewString()
|
||||||
|
subject = "incr_test " + now[:16] + " - " + id[:8]
|
||||||
|
body = "incr_test " + category.String() + " generation for " + resourceOwner + " at " + now + " - " + id
|
||||||
|
)
|
||||||
|
|
||||||
|
return id, dbf(id, nowLegacy, subject, body)
|
||||||
|
}
|
||||||
|
|
||||||
type incrementalItem struct {
|
type incrementalItem struct {
|
||||||
name string
|
name string
|
||||||
data []byte
|
data []byte
|
||||||
@ -654,19 +666,30 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchangeIncrementals() {
|
|||||||
deets *details.Details
|
deets *details.Details
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mailDBF := func(id, timeStamp, subject, body string) []byte {
|
||||||
|
return mockconnector.GetMockMessageWith(
|
||||||
|
suite.user, suite.user, suite.user,
|
||||||
|
subject, body, body,
|
||||||
|
now, now, now, now)
|
||||||
|
}
|
||||||
|
|
||||||
|
contactDBF := func(id, timeStamp, subject, body string) []byte {
|
||||||
|
given, mid, sur := id[:8], id[9:13], id[len(id)-12:]
|
||||||
|
|
||||||
|
return mockconnector.GetMockContactBytesWith(
|
||||||
|
given+" "+sur,
|
||||||
|
sur+", "+given,
|
||||||
|
given, mid, sur,
|
||||||
|
"123-456-7890",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
dataset := map[path.CategoryType]struct {
|
dataset := map[path.CategoryType]struct {
|
||||||
dbf dataBuilderFunc
|
dbf dataBuilderFunc
|
||||||
dests map[string]contDeets
|
dests map[string]contDeets
|
||||||
}{
|
}{
|
||||||
path.EmailCategory: {
|
path.EmailCategory: {
|
||||||
dbf: func(id, timeStamp, subject, body string) []byte {
|
dbf: mailDBF,
|
||||||
user := suite.user
|
|
||||||
|
|
||||||
return mockconnector.GetMockMessageWith(
|
|
||||||
user, user, user,
|
|
||||||
subject, body, body,
|
|
||||||
now, now, now, now)
|
|
||||||
},
|
|
||||||
dests: map[string]contDeets{
|
dests: map[string]contDeets{
|
||||||
folder1: {},
|
folder1: {},
|
||||||
folder2: {},
|
folder2: {},
|
||||||
@ -674,16 +697,7 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchangeIncrementals() {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
path.ContactsCategory: {
|
path.ContactsCategory: {
|
||||||
dbf: func(id, timeStamp, subject, body string) []byte {
|
dbf: contactDBF,
|
||||||
given, mid, sur := id[:8], id[9:13], id[len(id)-12:]
|
|
||||||
|
|
||||||
return mockconnector.GetMockContactBytesWith(
|
|
||||||
given+" "+sur,
|
|
||||||
sur+", "+given,
|
|
||||||
given, mid, sur,
|
|
||||||
"123-456-7890",
|
|
||||||
)
|
|
||||||
},
|
|
||||||
dests: map[string]contDeets{
|
dests: map[string]contDeets{
|
||||||
folder1: {},
|
folder1: {},
|
||||||
folder2: {},
|
folder2: {},
|
||||||
@ -744,14 +758,10 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchangeIncrementals() {
|
|||||||
// run the initial backup
|
// run the initial backup
|
||||||
runAndCheckBackup(t, ctx, &bo, mb)
|
runAndCheckBackup(t, ctx, &bo, mb)
|
||||||
|
|
||||||
// incrementals changes to make (all changes apply to both email and contacts)
|
// Although established as a table, these tests are no isolated from each other.
|
||||||
// [ ] add a new item to an existing folder
|
// Assume that every test's side effects cascade to all following test cases.
|
||||||
// [ ] remove an item from an existing folder
|
// The changes are split across the table so that we can monitor the deltas
|
||||||
// [x] add a new folder
|
// in isolation, rather than debugging one change from the rest of a series.
|
||||||
// [x] rename a folder
|
|
||||||
// [x] relocate one folder into another
|
|
||||||
// [x] remove a folder
|
|
||||||
|
|
||||||
table := []struct {
|
table := []struct {
|
||||||
name string
|
name string
|
||||||
// performs the incremental update required for the test.
|
// performs the incremental update required for the test.
|
||||||
@ -854,6 +864,64 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchangeIncrementals() {
|
|||||||
itemsRead: 0,
|
itemsRead: 0,
|
||||||
itemsWritten: 0,
|
itemsWritten: 0,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "add a new item",
|
||||||
|
updateUserData: func(t *testing.T) {
|
||||||
|
for category, d := range dataset {
|
||||||
|
folderID := d.dests[folder1].containerID
|
||||||
|
cli := gc.Service.Client().UsersById(suite.user)
|
||||||
|
|
||||||
|
switch category {
|
||||||
|
case path.EmailCategory:
|
||||||
|
_, itemData := generateItemData(t, category, suite.user, mailDBF)
|
||||||
|
body, err := support.CreateMessageFromBytes(itemData)
|
||||||
|
require.NoError(t, err, "transforming mail bytes to messageable")
|
||||||
|
|
||||||
|
_, err = cli.MailFoldersById(folderID).Messages().Post(ctx, body, nil)
|
||||||
|
require.NoError(t, err, "posting email item")
|
||||||
|
|
||||||
|
case path.ContactsCategory:
|
||||||
|
_, itemData := generateItemData(t, category, suite.user, contactDBF)
|
||||||
|
body, err := support.CreateContactFromBytes(itemData)
|
||||||
|
require.NoError(t, err, "transforming contact bytes to contactable")
|
||||||
|
|
||||||
|
_, err = cli.ContactFoldersById(folderID).Contacts().Post(ctx, body, nil)
|
||||||
|
require.NoError(t, err, "posting contact item")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
itemsRead: 2,
|
||||||
|
itemsWritten: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "delete an existing item",
|
||||||
|
updateUserData: func(t *testing.T) {
|
||||||
|
for category, d := range dataset {
|
||||||
|
folderID := d.dests[folder1].containerID
|
||||||
|
cli := gc.Service.Client().UsersById(suite.user)
|
||||||
|
|
||||||
|
switch category {
|
||||||
|
case path.EmailCategory:
|
||||||
|
ids, _, _, err := exchange.FetchMessageIDsFromDirectory(ctx, gc.Service, suite.user, folderID, "")
|
||||||
|
require.NoError(t, err, "getting message ids")
|
||||||
|
require.NotEmpty(t, ids, "message ids in folder")
|
||||||
|
|
||||||
|
err = cli.MessagesById(ids[0]).Delete(ctx, nil)
|
||||||
|
require.NoError(t, err, "deleting email item: %s", support.ConnectorStackErrorTrace(err))
|
||||||
|
|
||||||
|
case path.ContactsCategory:
|
||||||
|
ids, _, _, err := exchange.FetchContactIDsFromDirectory(ctx, gc.Service, suite.user, folderID, "")
|
||||||
|
require.NoError(t, err, "getting contact ids")
|
||||||
|
require.NotEmpty(t, ids, "contact ids in folder")
|
||||||
|
|
||||||
|
err = cli.ContactsById(ids[0]).Delete(ctx, nil)
|
||||||
|
require.NoError(t, err, "deleting contact item: %s", support.ConnectorStackErrorTrace(err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
itemsRead: 2,
|
||||||
|
itemsWritten: 0, // deletes are not counted as "writes"
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, test := range table {
|
for _, test := range table {
|
||||||
suite.T().Run(test.name, func(t *testing.T) {
|
suite.T().Run(test.name, func(t *testing.T) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user