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:
Keepers 2023-01-03 12:18:51 -07:00 committed by GitHub
parent 6457e49882
commit e4e1b4d4d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -19,6 +19,7 @@ import (
"github.com/alcionai/corso/src/internal/connector/exchange"
"github.com/alcionai/corso/src/internal/connector/graph"
"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/events"
evmock "github.com/alcionai/corso/src/internal/events/mock"
@ -304,17 +305,11 @@ func generateContainerOfItems(
items := make([]incrementalItem, 0, howManyItems)
for i := 0; i < howManyItems; i++ {
var (
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
)
id, d := generateItemData(t, cat, userID, dbf)
items = append(items, incrementalItem{
name: id,
data: dbf(id, nowLegacy, subject, body),
data: d,
})
}
@ -340,6 +335,23 @@ func generateContainerOfItems(
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 {
name string
data []byte
@ -654,19 +666,30 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchangeIncrementals() {
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 {
dbf dataBuilderFunc
dests map[string]contDeets
}{
path.EmailCategory: {
dbf: func(id, timeStamp, subject, body string) []byte {
user := suite.user
return mockconnector.GetMockMessageWith(
user, user, user,
subject, body, body,
now, now, now, now)
},
dbf: mailDBF,
dests: map[string]contDeets{
folder1: {},
folder2: {},
@ -674,16 +697,7 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchangeIncrementals() {
},
},
path.ContactsCategory: {
dbf: 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",
)
},
dbf: contactDBF,
dests: map[string]contDeets{
folder1: {},
folder2: {},
@ -744,14 +758,10 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchangeIncrementals() {
// run the initial backup
runAndCheckBackup(t, ctx, &bo, mb)
// incrementals changes to make (all changes apply to both email and contacts)
// [ ] add a new item to an existing folder
// [ ] remove an item from an existing folder
// [x] add a new folder
// [x] rename a folder
// [x] relocate one folder into another
// [x] remove a folder
// Although established as a table, these tests are no isolated from each other.
// Assume that every test's side effects cascade to all following test cases.
// The changes are split across the table so that we can monitor the deltas
// in isolation, rather than debugging one change from the rest of a series.
table := []struct {
name string
// performs the incremental update required for the test.
@ -854,6 +864,64 @@ func (suite *BackupOpIntegrationSuite) TestBackup_Run_exchangeIncrementals() {
itemsRead: 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 {
suite.T().Run(test.name, func(t *testing.T) {