Add regression tests for drive pagers (#4620)

<!-- PR description-->


Adds regression tests for query params & headers used for delta/non delta requests.  Closes https://github.com/alcionai/corso/issues/4614


---

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

- [ ]  Yes, it's included
- [ ] 🕐 Yes, but in a later PR
- [x]  No

#### Type of change

<!--- Please check the type of change your PR introduces: --->
- [ ] 🌻 Feature
- [ ] 🐛 Bugfix
- [ ] 🗺️ Documentation
- [x] 🤖 Supportability/Tests
- [ ] 💻 CI/Deployment
- [ ] 🧹 Tech Debt/Cleanup

#### Issue(s)

<!-- Can reference multiple issues. Use one of the following "magic words" - "closes, fixes" to auto-close the Github issue. -->
* https://github.com/alcionai/corso/issues/4614

#### Test Plan

<!-- How will this be tested prior to merging.-->
- [ ] 💪 Manual
- [x]  Unit test
- [ ] 💚 E2E
This commit is contained in:
Abhishek Pandey 2023-11-27 15:14:13 -08:00 committed by GitHub
parent c48329f844
commit b4b24edca9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,9 +1,13 @@
package api package api
import ( import (
"strconv"
"strings"
"testing" "testing"
"github.com/alcionai/clues" "github.com/alcionai/clues"
"github.com/h2non/gock"
msDrive "github.com/microsoftgraph/msgraph-sdk-go/drives"
"github.com/microsoftgraph/msgraph-sdk-go/models" "github.com/microsoftgraph/msgraph-sdk-go/models"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -12,6 +16,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/tconfig" "github.com/alcionai/corso/src/internal/tester/tconfig"
graphTD "github.com/alcionai/corso/src/pkg/services/m365/api/graph/testdata"
) )
type DrivePagerIntgSuite struct { type DrivePagerIntgSuite struct {
@ -210,3 +215,217 @@ func (suite *DrivePagerIntgSuite) TestEnumerateDriveItems() {
require.NotEmpty(t, items, "should find items in user's drive") require.NotEmpty(t, items, "should find items in user's drive")
assert.NotEmpty(t, du.URL, "should have a delta link") assert.NotEmpty(t, du.URL, "should have a delta link")
} }
// TestDriveDeltaPagerQueryParams is a regression test to check if
// the delta pager is setting query params and prefer headers as
// expected.
func (suite *DrivePagerIntgSuite) TestDriveDeltaPagerQueryParams() {
tests := []struct {
name string
setupf func()
forURLCache bool
expect assert.ErrorAssertionFunc
}{
// Separate out tests for $select and $prefer because otherwise
// it's hard to tell which gock check is failing.
{
name: "check $top",
setupf: func() {
delta := msDrive.NewItemItemsItemDeltaResponse()
delta.SetValue([]models.DriveItemable{
models.NewDriveItem(),
})
str := "deltaLink"
delta.SetOdataDeltaLink(&str)
interceptV1Path("drives", "drive", "items", "root", "delta()").
MatchParam("$top", strconv.Itoa(int(maxDeltaPageSize))).
Reply(200).
JSON(graphTD.ParseableToMap(suite.T(), delta))
},
expect: assert.NoError,
},
{
name: "check $select",
setupf: func() {
delta := msDrive.NewItemItemsItemDeltaResponse()
delta.SetValue([]models.DriveItemable{
models.NewDriveItem(),
})
str := "deltaLink"
delta.SetOdataDeltaLink(&str)
// This is a copy of DefaultDriveItemProps. This list should be
// adjusted while changing DefaultDriveItemProps. This however
// doesn't protect against adding new params to DefaultDriveItemProps
// since gock doesn't allow asserting for presence of unexpected
// params.
params := idAnd(
"content.downloadUrl",
"createdBy",
"createdDateTime",
"file",
"folder",
"lastModifiedDateTime",
"name",
"package",
"parentReference",
"root",
"sharepointIds",
"size",
"deleted",
"malware",
"shared")
selectParams := strings.Join(params, ",")
interceptV1Path("drives", "drive", "items", "root", "delta()").
MatchParam("$select", selectParams).
Reply(200).
JSON(graphTD.ParseableToMap(suite.T(), delta))
},
expect: assert.NoError,
},
{
name: "prefer headers",
setupf: func() {
delta := msDrive.NewItemItemsItemDeltaResponse()
delta.SetValue([]models.DriveItemable{
models.NewDriveItem(),
})
str := "deltaLink"
delta.SetOdataDeltaLink(&str)
preferHeaderItems := []string{
"deltashowremovedasdeleted",
"deltatraversepermissiongaps",
"deltashowsharingchanges",
"hierarchicalsharing",
}
preferParams := strings.Join(preferHeaderItems, ",")
interceptV1Path("drives", "drive", "items", "root", "delta()").
MatchHeaders(map[string]string{
"Prefer": preferParams,
}).
Reply(200).
JSON(graphTD.ParseableToMap(suite.T(), delta))
},
expect: assert.NoError,
},
{
name: "check url cache $select",
setupf: func() {
delta := msDrive.NewItemItemsItemDeltaResponse()
delta.SetValue([]models.DriveItemable{
models.NewDriveItem(),
})
str := "deltaLink"
delta.SetOdataDeltaLink(&str)
// This is a copy of URLCacheDriveItemProps. This list should be
// adjusted while changing URLCacheDriveItemProps.
params := idAnd(
"content.downloadUrl",
"deleted",
"file",
"folder")
selectParams := strings.Join(params, ",")
interceptV1Path("drives", "drive", "items", "root", "delta()").
MatchParam("$select", selectParams).
Reply(200).
JSON(graphTD.ParseableToMap(suite.T(), delta))
},
forURLCache: true,
expect: assert.NoError,
},
}
for _, test := range tests {
suite.Run(test.name, func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
defer gock.Off()
test.setupf()
cfg := CallConfig{
Select: DefaultDriveItemProps(),
}
if test.forURLCache {
cfg = CallConfig{
Select: URLCacheDriveItemProps(),
}
}
pager := suite.
its.
gockAC.
Drives().
EnumerateDriveItemsDelta(
ctx,
"drive",
"",
cfg)
for _, reset, done := pager.NextPage(); !done; _, reset, done = pager.NextPage() {
assert.False(t, reset, "should not reset")
}
_, err := pager.Results()
require.NoError(t, err, clues.ToCore(err))
})
}
}
// Non delta pager equivalent of above test.
func (suite *DrivePagerIntgSuite) TestDriveNonDeltaPagerQueryParams() {
tests := []struct {
name string
setupf func()
forURLCache bool
expect assert.ErrorAssertionFunc
}{
{
name: "check $top",
setupf: func() {
resp := models.NewDriveItemCollectionResponse()
resp.SetValue([]models.DriveItemable{
models.NewDriveItem(),
})
interceptV1Path("drives", "drive", "items", "root", "children").
MatchParam("$top", strconv.Itoa(int(maxNonDeltaPageSize))).
Reply(200).
JSON(graphTD.ParseableToMap(suite.T(), resp))
},
expect: assert.NoError,
},
}
for _, test := range tests {
suite.Run(test.name, func() {
t := suite.T()
ctx, flush := tester.NewContext(t)
defer flush()
defer gock.Off()
test.setupf()
_, err := suite.its.gockAC.
Drives().
GetItemIDsInContainer(ctx, "drive", "root")
require.NoError(t, err, clues.ToCore(err))
})
}
}