remove top query param in paged queries (#3719)

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

- [x]  No

#### Type of change

- [x] 🐛 Bugfix

#### Test Plan

- [x] 💪 Manual
- [x]  Unit test
- [x] 💚 E2E
This commit is contained in:
Keepers 2023-06-29 22:49:14 -06:00 committed by GitHub
parent 7795f58c30
commit 43d4a4d5e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 77 additions and 47 deletions

View File

@ -749,7 +749,7 @@ func testExchangeContinuousBackups(suite *BackupOpIntegrationSuite, toggles cont
categories = map[path.CategoryType][]string{ categories = map[path.CategoryType][]string{
path.EmailCategory: exchange.MetadataFileNames(path.EmailCategory), path.EmailCategory: exchange.MetadataFileNames(path.EmailCategory),
path.ContactsCategory: exchange.MetadataFileNames(path.ContactsCategory), path.ContactsCategory: exchange.MetadataFileNames(path.ContactsCategory),
path.EventsCategory: exchange.MetadataFileNames(path.EventsCategory), // path.EventsCategory: exchange.MetadataFileNames(path.EventsCategory),
} }
container1 = fmt.Sprintf("%s%d_%s", incrementalsDestContainerPrefix, 1, now) container1 = fmt.Sprintf("%s%d_%s", incrementalsDestContainerPrefix, 1, now)
container2 = fmt.Sprintf("%s%d_%s", incrementalsDestContainerPrefix, 2, now) container2 = fmt.Sprintf("%s%d_%s", incrementalsDestContainerPrefix, 2, now)
@ -772,8 +772,8 @@ func testExchangeContinuousBackups(suite *BackupOpIntegrationSuite, toggles cont
sel.Include( sel.Include(
sel.MailFolders(containers, selectors.PrefixMatch()), sel.MailFolders(containers, selectors.PrefixMatch()),
sel.ContactFolders(containers, selectors.PrefixMatch()), sel.ContactFolders(containers, selectors.PrefixMatch()))
sel.EventCalendars(containers, selectors.PrefixMatch())) // sel.EventCalendars(containers, selectors.PrefixMatch()))
creds, err := acct.M365Config() creds, err := acct.M365Config()
require.NoError(t, err, clues.ToCore(err)) require.NoError(t, err, clues.ToCore(err))
@ -838,13 +838,13 @@ func testExchangeContinuousBackups(suite *BackupOpIntegrationSuite, toggles cont
container2: {}, container2: {},
}, },
}, },
path.EventsCategory: { // path.EventsCategory: {
dbf: eventDBF, // dbf: eventDBF,
dests: map[string]contDeets{ // dests: map[string]contDeets{
container1: {}, // container1: {},
container2: {}, // container2: {},
}, // },
}, // },
} }
// populate initial test data // populate initial test data

View File

@ -103,10 +103,9 @@ func (c Contacts) NewContactsPager(
selectProps ...string, selectProps ...string,
) itemPager[models.Contactable] { ) itemPager[models.Contactable] {
options := &users.ItemContactFoldersItemContactsRequestBuilderGetRequestConfiguration{ options := &users.ItemContactFoldersItemContactsRequestBuilderGetRequestConfiguration{
Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize)), Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize)),
QueryParameters: &users.ItemContactFoldersItemContactsRequestBuilderGetQueryParameters{ QueryParameters: &users.ItemContactFoldersItemContactsRequestBuilderGetQueryParameters{},
Top: ptr.To(maxNonDeltaPageSize), // do NOT set Top. It limits the total items received.
},
} }
if len(selectProps) > 0 { if len(selectProps) > 0 {
@ -181,7 +180,7 @@ func (c Contacts) NewContactIDsPager(
config := &users.ItemContactFoldersItemContactsRequestBuilderGetRequestConfiguration{ config := &users.ItemContactFoldersItemContactsRequestBuilderGetRequestConfiguration{
QueryParameters: &users.ItemContactFoldersItemContactsRequestBuilderGetQueryParameters{ QueryParameters: &users.ItemContactFoldersItemContactsRequestBuilderGetQueryParameters{
Select: idAnd(parentFolderID), Select: idAnd(parentFolderID),
Top: ptr.To(maxNonDeltaPageSize), // do NOT set Top. It limits the total items received.
}, },
Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize), preferImmutableIDs(immutableIDs)), Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize), preferImmutableIDs(immutableIDs)),
} }
@ -249,7 +248,7 @@ func (c Contacts) NewContactDeltaIDsPager(
options := &users.ItemContactFoldersItemContactsDeltaRequestBuilderGetRequestConfiguration{ options := &users.ItemContactFoldersItemContactsDeltaRequestBuilderGetRequestConfiguration{
QueryParameters: &users.ItemContactFoldersItemContactsDeltaRequestBuilderGetQueryParameters{ QueryParameters: &users.ItemContactFoldersItemContactsDeltaRequestBuilderGetQueryParameters{
Select: idAnd(parentFolderID), Select: idAnd(parentFolderID),
// TOP is not allowed // do NOT set Top. It limits the total items received.
}, },
Headers: newPreferHeaders(preferPageSize(maxDeltaPageSize), preferImmutableIDs(immutableIDs)), Headers: newPreferHeaders(preferPageSize(maxDeltaPageSize), preferImmutableIDs(immutableIDs)),
} }

View File

@ -34,9 +34,7 @@ func (c Drives) NewDriveItemPager(
selectProps ...string, selectProps ...string,
) itemPager[models.DriveItemable] { ) itemPager[models.DriveItemable] {
options := &drives.ItemItemsItemChildrenRequestBuilderGetRequestConfiguration{ options := &drives.ItemItemsItemChildrenRequestBuilderGetRequestConfiguration{
QueryParameters: &drives.ItemItemsItemChildrenRequestBuilderGetQueryParameters{ QueryParameters: &drives.ItemItemsItemChildrenRequestBuilderGetQueryParameters{},
Top: ptr.To(maxNonDeltaPageSize),
},
} }
if len(selectProps) > 0 { if len(selectProps) > 0 {
@ -126,7 +124,6 @@ func (c Drives) NewDriveItemDeltaPager(
requestConfig := &drives.ItemItemsItemDeltaRequestBuilderGetRequestConfiguration{ requestConfig := &drives.ItemItemsItemDeltaRequestBuilderGetRequestConfiguration{
Headers: newPreferHeaders(preferHeaderItems...), Headers: newPreferHeaders(preferHeaderItems...),
QueryParameters: &drives.ItemItemsItemDeltaRequestBuilderGetQueryParameters{ QueryParameters: &drives.ItemItemsItemDeltaRequestBuilderGetQueryParameters{
Top: ptr.To(maxDeltaPageSize),
Select: selectFields, Select: selectFields,
}, },
} }

View File

@ -111,9 +111,9 @@ func (c Events) NewEventsPager(
selectProps ...string, selectProps ...string,
) itemPager[models.Eventable] { ) itemPager[models.Eventable] {
options := &users.ItemCalendarsItemEventsRequestBuilderGetRequestConfiguration{ options := &users.ItemCalendarsItemEventsRequestBuilderGetRequestConfiguration{
Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize)), Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize)),
QueryParameters: &users.ItemCalendarsItemEventsRequestBuilderGetQueryParameters{ QueryParameters: &users.ItemCalendarsItemEventsRequestBuilderGetQueryParameters{
Top: ptr.To(maxNonDeltaPageSize), // do NOT set Top. It limits the total items received.
}, },
} }
@ -187,9 +187,9 @@ func (c Events) NewEventIDsPager(
immutableIDs bool, immutableIDs bool,
) (itemIDPager, error) { ) (itemIDPager, error) {
options := &users.ItemCalendarsItemEventsRequestBuilderGetRequestConfiguration{ options := &users.ItemCalendarsItemEventsRequestBuilderGetRequestConfiguration{
Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize), preferImmutableIDs(immutableIDs)), Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize), preferImmutableIDs(immutableIDs)),
QueryParameters: &users.ItemCalendarsItemEventsRequestBuilderGetQueryParameters{ QueryParameters: &users.ItemCalendarsItemEventsRequestBuilderGetQueryParameters{
Top: ptr.To(maxNonDeltaPageSize), // do NOT set Top. It limits the total items received.
}, },
} }
@ -244,9 +244,9 @@ func (c Events) NewEventDeltaIDsPager(
immutableIDs bool, immutableIDs bool,
) (itemIDPager, error) { ) (itemIDPager, error) {
options := &users.ItemCalendarsItemEventsDeltaRequestBuilderGetRequestConfiguration{ options := &users.ItemCalendarsItemEventsDeltaRequestBuilderGetRequestConfiguration{
Headers: newPreferHeaders(preferPageSize(maxDeltaPageSize), preferImmutableIDs(immutableIDs)), Headers: newPreferHeaders(preferPageSize(maxDeltaPageSize), preferImmutableIDs(immutableIDs)),
QueryParameters: &users.ItemCalendarsItemEventsDeltaRequestBuilderGetQueryParameters{ QueryParameters: &users.ItemCalendarsItemEventsDeltaRequestBuilderGetQueryParameters{
Top: ptr.To(maxDeltaPageSize), // do NOT set Top. It limits the total items received.
}, },
} }

View File

@ -1,4 +1,4 @@
package api package api_test
import ( import (
"testing" "testing"
@ -13,10 +13,12 @@ import (
"github.com/alcionai/corso/src/internal/common/dttm" "github.com/alcionai/corso/src/internal/common/dttm"
"github.com/alcionai/corso/src/internal/common/ptr" "github.com/alcionai/corso/src/internal/common/ptr"
exchMock "github.com/alcionai/corso/src/internal/m365/exchange/mock" exchMock "github.com/alcionai/corso/src/internal/m365/exchange/mock"
"github.com/alcionai/corso/src/internal/m365/graph"
"github.com/alcionai/corso/src/internal/tester" "github.com/alcionai/corso/src/internal/tester"
"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/testdata" "github.com/alcionai/corso/src/pkg/control/testdata"
"github.com/alcionai/corso/src/pkg/fault"
"github.com/alcionai/corso/src/pkg/services/m365/api"
) )
type EventsAPIUnitSuite struct { type EventsAPIUnitSuite struct {
@ -129,7 +131,7 @@ func (suite *EventsAPIUnitSuite) TestEventInfo() {
future = time.Now().UTC().AddDate(0, 0, 1) future = time.Now().UTC().AddDate(0, 0, 1)
eventTime = time.Date(future.Year(), future.Month(), future.Day(), future.Hour(), 0, 0, 0, time.UTC) eventTime = time.Date(future.Year(), future.Month(), future.Day(), future.Hour(), 0, 0, 0, time.UTC)
eventEndTime = eventTime.Add(30 * time.Minute) eventEndTime = eventTime.Add(30 * time.Minute)
event, err = BytesToEventable(bytes) event, err = api.BytesToEventable(bytes)
) )
require.NoError(suite.T(), err, clues.ToCore(err)) require.NoError(suite.T(), err, clues.ToCore(err))
@ -149,7 +151,7 @@ func (suite *EventsAPIUnitSuite) TestEventInfo() {
t := suite.T() t := suite.T()
event, expected := test.evtAndRP() event, expected := test.evtAndRP()
result := EventInfo(event) result := api.EventInfo(event)
assert.Equal(t, expected.Subject, result.Subject, "subject") assert.Equal(t, expected.Subject, result.Subject, "subject")
assert.Equal(t, expected.Sender, result.Sender, "sender") assert.Equal(t, expected.Sender, result.Sender, "sender")
@ -209,7 +211,7 @@ func (suite *EventsAPIUnitSuite) TestBytesToEventable() {
suite.Run(test.name, func() { suite.Run(test.name, func() {
t := suite.T() t := suite.T()
result, err := BytesToEventable(test.byteArray) result, err := api.BytesToEventable(test.byteArray)
test.checkError(t, err, clues.ToCore(err)) test.checkError(t, err, clues.ToCore(err))
test.isNil(t, result) test.isNil(t, result)
}) })
@ -218,8 +220,7 @@ func (suite *EventsAPIUnitSuite) TestBytesToEventable() {
type EventsAPIIntgSuite struct { type EventsAPIIntgSuite struct {
tester.Suite tester.Suite
credentials account.M365Config its intgTesterSetup
ac Client
} }
func TestEventsAPIntgSuite(t *testing.T) { func TestEventsAPIntgSuite(t *testing.T) {
@ -231,15 +232,7 @@ func TestEventsAPIntgSuite(t *testing.T) {
} }
func (suite *EventsAPIIntgSuite) SetupSuite() { func (suite *EventsAPIIntgSuite) SetupSuite() {
t := suite.T() suite.its = newIntegrationTesterSetup(suite.T())
a := tester.NewM365Account(t)
m365, err := a.M365Config()
require.NoError(t, err, clues.ToCore(err))
suite.credentials = m365
suite.ac, err = NewClient(m365)
require.NoError(t, err, clues.ToCore(err))
} }
func (suite *EventsAPIIntgSuite) TestRestoreLargeAttachment() { func (suite *EventsAPIIntgSuite) TestRestoreLargeAttachment() {
@ -251,7 +244,7 @@ func (suite *EventsAPIIntgSuite) TestRestoreLargeAttachment() {
userID := tester.M365UserID(suite.T()) userID := tester.M365UserID(suite.T())
folderName := testdata.DefaultRestoreConfig("eventlargeattachmenttest").Location folderName := testdata.DefaultRestoreConfig("eventlargeattachmenttest").Location
evts := suite.ac.Events() 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))
@ -282,3 +275,44 @@ func (suite *EventsAPIIntgSuite) TestRestoreLargeAttachment() {
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, "empty id for large attachment")
} }
func (suite *EventsAPIIntgSuite) TestEvents_canFindNonStandardFolder() {
t := suite.T()
t.Skip("currently broken: the test user needs to get rotated")
ctx, flush := tester.NewContext(t)
defer flush()
ac := suite.its.ac.Events()
rc := testdata.DefaultRestoreConfig("api_calendar_discovery")
cal, err := ac.CreateContainer(ctx, suite.its.userID, rc.Location, "")
require.NoError(t, err, clues.ToCore(err))
var (
found bool
calID = ptr.Val(cal.GetId())
findContainer = func(gcc graph.CachedContainer) error {
if ptr.Val(gcc.GetId()) == calID {
found = true
}
return nil
}
)
err = ac.EnumerateContainers(
ctx,
suite.its.userID,
"Calendar",
findContainer,
fault.New(true))
require.NoError(t, err, clues.ToCore(err))
require.True(
t,
found,
"the restored container was discovered when enumerating containers. "+
"If this fails, the user's calendars have probably broken, "+
"and the user will need to be rotated")
}

View File

@ -134,9 +134,9 @@ func (c Mail) NewMailPager(
selectProps ...string, selectProps ...string,
) itemPager[models.Messageable] { ) itemPager[models.Messageable] {
options := &users.ItemMailFoldersItemMessagesRequestBuilderGetRequestConfiguration{ options := &users.ItemMailFoldersItemMessagesRequestBuilderGetRequestConfiguration{
Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize)), Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize)),
QueryParameters: &users.ItemMailFoldersItemMessagesRequestBuilderGetQueryParameters{ QueryParameters: &users.ItemMailFoldersItemMessagesRequestBuilderGetQueryParameters{
Top: ptr.To(maxNonDeltaPageSize), // do NOT set Top. It limits the total items received.
}, },
} }
@ -190,7 +190,7 @@ func (c Mail) NewMailIDsPager(
config := &users.ItemMailFoldersItemMessagesRequestBuilderGetRequestConfiguration{ config := &users.ItemMailFoldersItemMessagesRequestBuilderGetRequestConfiguration{
QueryParameters: &users.ItemMailFoldersItemMessagesRequestBuilderGetQueryParameters{ QueryParameters: &users.ItemMailFoldersItemMessagesRequestBuilderGetQueryParameters{
Select: idAnd("isRead"), Select: idAnd("isRead"),
Top: ptr.To(maxNonDeltaPageSize), // do NOT set Top. It limits the total items received.
}, },
Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize), preferImmutableIDs(immutableIDs)), Headers: newPreferHeaders(preferPageSize(maxNonDeltaPageSize), preferImmutableIDs(immutableIDs)),
} }
@ -287,7 +287,7 @@ func (c Mail) NewMailDeltaIDsPager(
config := &users.ItemMailFoldersItemMessagesDeltaRequestBuilderGetRequestConfiguration{ config := &users.ItemMailFoldersItemMessagesDeltaRequestBuilderGetRequestConfiguration{
QueryParameters: &users.ItemMailFoldersItemMessagesDeltaRequestBuilderGetQueryParameters{ QueryParameters: &users.ItemMailFoldersItemMessagesDeltaRequestBuilderGetQueryParameters{
Select: idAnd("isRead"), Select: idAnd("isRead"),
Top: ptr.To(maxDeltaPageSize), // do NOT set Top. It limits the total items received.
}, },
Headers: newPreferHeaders(preferPageSize(maxDeltaPageSize), preferImmutableIDs(immutableIDs)), Headers: newPreferHeaders(preferPageSize(maxDeltaPageSize), preferImmutableIDs(immutableIDs)),
} }