Add tests for REST pagination
This commit is contained in:
parent
25219d03a2
commit
c0d36d2a1a
|
@ -218,13 +218,13 @@ module RestModule {
|
|||
}
|
||||
|
||||
addBody(bodyType: string, body: string | any, input: any, pagination: PaginationConfig | null, paginationValues: PaginationValues | null) {
|
||||
if (bodyType === BodyTypes.NONE) {
|
||||
return input
|
||||
}
|
||||
if (!input.headers) {
|
||||
input.headers = {}
|
||||
}
|
||||
let error, object = {}, string = ""
|
||||
if (bodyType === BodyTypes.NONE) {
|
||||
return input
|
||||
}
|
||||
let error, object: any = {}, string = ""
|
||||
try {
|
||||
if (body) {
|
||||
string = typeof body !== "string" ? JSON.stringify(body) : body
|
||||
|
@ -278,19 +278,15 @@ module RestModule {
|
|||
input.body = string
|
||||
input.headers["Content-Type"] = "application/xml"
|
||||
break
|
||||
default:
|
||||
case BodyTypes.JSON:
|
||||
// if JSON error, throw it
|
||||
if (error) {
|
||||
throw "Invalid JSON for request body"
|
||||
}
|
||||
if (!body) {
|
||||
body = {}
|
||||
}
|
||||
addPaginationToBody((key: string, value: any) => {
|
||||
body[key] = value
|
||||
object[key] = value
|
||||
})
|
||||
input.body = JSON.stringify(body)
|
||||
input.body = JSON.stringify(object)
|
||||
input.headers["Content-Type"] = "application/json"
|
||||
break
|
||||
}
|
||||
|
|
|
@ -4,19 +4,23 @@ jest.mock("node-fetch", () =>
|
|||
raw: () => {
|
||||
return { "content-type": ["application/json"] }
|
||||
},
|
||||
get: () => ["application/json"]
|
||||
get: () => ["application/json"],
|
||||
},
|
||||
json: jest.fn(),
|
||||
text: jest.fn()
|
||||
json: jest.fn(() => ({
|
||||
my_next_cursor: 123,
|
||||
})),
|
||||
text: jest.fn(),
|
||||
}))
|
||||
)
|
||||
const fetch = require("node-fetch")
|
||||
const RestIntegration = require("../rest")
|
||||
const { AuthType } = require("../rest")
|
||||
const FormData = require("form-data")
|
||||
const { URLSearchParams } = require("url")
|
||||
|
||||
const HEADERS = {
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json"
|
||||
Accept: "application/json",
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
|
||||
class TestConfiguration {
|
||||
|
@ -165,7 +169,10 @@ describe("REST Integration", () => {
|
|||
status: 200,
|
||||
json: json ? async () => json : undefined,
|
||||
text: text ? async () => text : undefined,
|
||||
headers: { get: key => key === "content-length" ? 100 : header, raw: () => ({ "content-type": header }) }
|
||||
headers: {
|
||||
get: key => (key === "content-length" ? 100 : header),
|
||||
raw: () => ({ "content-type": header }),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -205,8 +212,8 @@ describe("REST Integration", () => {
|
|||
type: AuthType.BASIC,
|
||||
config: {
|
||||
username: "user",
|
||||
password: "password"
|
||||
}
|
||||
password: "password",
|
||||
},
|
||||
}
|
||||
|
||||
const bearerAuth = {
|
||||
|
@ -214,41 +221,297 @@ describe("REST Integration", () => {
|
|||
name: "bearer-1",
|
||||
type: AuthType.BEARER,
|
||||
config: {
|
||||
"token": "mytoken"
|
||||
}
|
||||
token: "mytoken",
|
||||
},
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
config = new TestConfiguration({
|
||||
url: BASE_URL,
|
||||
authConfigs : [basicAuth, bearerAuth]
|
||||
authConfigs: [basicAuth, bearerAuth],
|
||||
})
|
||||
})
|
||||
|
||||
it("adds basic auth", async () => {
|
||||
const query = {
|
||||
authConfigId: "c59c14bd1898a43baa08da68959b24686"
|
||||
authConfigId: "c59c14bd1898a43baa08da68959b24686",
|
||||
}
|
||||
await config.integration.read(query)
|
||||
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/?`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Authorization: "Basic dXNlcjpwYXNzd29yZA=="
|
||||
Authorization: "Basic dXNlcjpwYXNzd29yZA==",
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
it("adds bearer auth", async () => {
|
||||
const query = {
|
||||
authConfigId: "0d91d732f34e4befabeff50b392a8ff3"
|
||||
authConfigId: "0d91d732f34e4befabeff50b392a8ff3",
|
||||
}
|
||||
await config.integration.read(query)
|
||||
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/?`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
Authorization: "Bearer mytoken"
|
||||
Authorization: "Bearer mytoken",
|
||||
},
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe("page based pagination", () => {
|
||||
it("can paginate using query params", async () => {
|
||||
const pageParam = "my_page_param"
|
||||
const sizeParam = "my_size_param"
|
||||
const pageValue = 3
|
||||
const sizeValue = 10
|
||||
const query = {
|
||||
path: "api",
|
||||
pagination: {
|
||||
type: "page",
|
||||
location: "query",
|
||||
pageParam,
|
||||
sizeParam,
|
||||
},
|
||||
paginationValues: {
|
||||
page: pageValue,
|
||||
limit: sizeValue,
|
||||
},
|
||||
}
|
||||
await config.integration.read(query)
|
||||
expect(fetch).toHaveBeenCalledWith(
|
||||
`${BASE_URL}/api?${pageParam}=${pageValue}&${sizeParam}=${sizeValue}&`,
|
||||
{
|
||||
headers: {},
|
||||
method: "GET",
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
it("can paginate using JSON request body", async () => {
|
||||
const pageParam = "my_page_param"
|
||||
const sizeParam = "my_size_param"
|
||||
const pageValue = 3
|
||||
const sizeValue = 10
|
||||
const query = {
|
||||
bodyType: "json",
|
||||
path: "api",
|
||||
pagination: {
|
||||
type: "page",
|
||||
location: "body",
|
||||
pageParam,
|
||||
sizeParam,
|
||||
},
|
||||
paginationValues: {
|
||||
page: pageValue,
|
||||
limit: sizeValue,
|
||||
},
|
||||
}
|
||||
await config.integration.create(query)
|
||||
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
||||
body: JSON.stringify({
|
||||
[pageParam]: pageValue,
|
||||
[sizeParam]: sizeValue,
|
||||
}),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
method: "POST",
|
||||
})
|
||||
})
|
||||
|
||||
it("can paginate using form-data request body", async () => {
|
||||
const pageParam = "my_page_param"
|
||||
const sizeParam = "my_size_param"
|
||||
const pageValue = 3
|
||||
const sizeValue = 10
|
||||
const query = {
|
||||
bodyType: "form",
|
||||
path: "api",
|
||||
pagination: {
|
||||
type: "page",
|
||||
location: "body",
|
||||
pageParam,
|
||||
sizeParam,
|
||||
},
|
||||
paginationValues: {
|
||||
page: pageValue,
|
||||
limit: sizeValue,
|
||||
},
|
||||
}
|
||||
await config.integration.create(query)
|
||||
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
||||
body: expect.any(FormData),
|
||||
headers: {},
|
||||
method: "POST",
|
||||
})
|
||||
const sentData = JSON.stringify(fetch.mock.calls[0][1].body)
|
||||
expect(sentData).toContain(pageParam)
|
||||
expect(sentData).toContain(sizeParam)
|
||||
})
|
||||
|
||||
it("can paginate using form-encoded request body", async () => {
|
||||
const pageParam = "my_page_param"
|
||||
const sizeParam = "my_size_param"
|
||||
const pageValue = 3
|
||||
const sizeValue = 10
|
||||
const query = {
|
||||
bodyType: "encoded",
|
||||
path: "api",
|
||||
pagination: {
|
||||
type: "page",
|
||||
location: "body",
|
||||
pageParam,
|
||||
sizeParam,
|
||||
},
|
||||
paginationValues: {
|
||||
page: pageValue,
|
||||
limit: sizeValue,
|
||||
},
|
||||
}
|
||||
await config.integration.create(query)
|
||||
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
||||
body: expect.any(URLSearchParams),
|
||||
headers: {},
|
||||
method: "POST",
|
||||
})
|
||||
const sentData = fetch.mock.calls[0][1].body
|
||||
expect(sentData.has(pageParam))
|
||||
expect(sentData.get(pageParam)).toEqual(pageValue.toString())
|
||||
expect(sentData.has(sizeParam))
|
||||
expect(sentData.get(sizeParam)).toEqual(sizeValue.toString())
|
||||
})
|
||||
})
|
||||
|
||||
describe("cursor based pagination", () => {
|
||||
it("can paginate using query params", async () => {
|
||||
const pageParam = "my_page_param"
|
||||
const sizeParam = "my_size_param"
|
||||
const pageValue = 3
|
||||
const sizeValue = 10
|
||||
const query = {
|
||||
path: "api",
|
||||
pagination: {
|
||||
type: "cursor",
|
||||
location: "query",
|
||||
pageParam,
|
||||
sizeParam,
|
||||
responseParam: "my_next_cursor",
|
||||
},
|
||||
paginationValues: {
|
||||
page: pageValue,
|
||||
limit: sizeValue,
|
||||
},
|
||||
}
|
||||
const res = await config.integration.read(query)
|
||||
expect(fetch).toHaveBeenCalledWith(
|
||||
`${BASE_URL}/api?${pageParam}=${pageValue}&${sizeParam}=${sizeValue}&`,
|
||||
{
|
||||
headers: {},
|
||||
method: "GET",
|
||||
}
|
||||
)
|
||||
expect(res.pagination.cursor).toEqual(123)
|
||||
})
|
||||
|
||||
it("can paginate using JSON request body", async () => {
|
||||
const pageParam = "my_page_param"
|
||||
const sizeParam = "my_size_param"
|
||||
const pageValue = 3
|
||||
const sizeValue = 10
|
||||
const query = {
|
||||
bodyType: "json",
|
||||
path: "api",
|
||||
pagination: {
|
||||
type: "page",
|
||||
location: "body",
|
||||
pageParam,
|
||||
sizeParam,
|
||||
responseParam: "my_next_cursor",
|
||||
},
|
||||
paginationValues: {
|
||||
page: pageValue,
|
||||
limit: sizeValue,
|
||||
},
|
||||
}
|
||||
const res = await config.integration.create(query)
|
||||
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
||||
body: JSON.stringify({
|
||||
[pageParam]: pageValue,
|
||||
[sizeParam]: sizeValue,
|
||||
}),
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
method: "POST",
|
||||
})
|
||||
expect(res.pagination.cursor).toEqual(123)
|
||||
})
|
||||
|
||||
it("can paginate using form-data request body", async () => {
|
||||
const pageParam = "my_page_param"
|
||||
const sizeParam = "my_size_param"
|
||||
const pageValue = 3
|
||||
const sizeValue = 10
|
||||
const query = {
|
||||
bodyType: "form",
|
||||
path: "api",
|
||||
pagination: {
|
||||
type: "page",
|
||||
location: "body",
|
||||
pageParam,
|
||||
sizeParam,
|
||||
responseParam: "my_next_cursor",
|
||||
},
|
||||
paginationValues: {
|
||||
page: pageValue,
|
||||
limit: sizeValue,
|
||||
},
|
||||
}
|
||||
const res = await config.integration.create(query)
|
||||
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
||||
body: expect.any(FormData),
|
||||
headers: {},
|
||||
method: "POST",
|
||||
})
|
||||
const sentData = JSON.stringify(fetch.mock.calls[0][1].body)
|
||||
expect(sentData).toContain(pageParam)
|
||||
expect(sentData).toContain(sizeParam)
|
||||
expect(res.pagination.cursor).toEqual(123)
|
||||
})
|
||||
|
||||
it("can paginate using form-encoded request body", async () => {
|
||||
const pageParam = "my_page_param"
|
||||
const sizeParam = "my_size_param"
|
||||
const pageValue = 3
|
||||
const sizeValue = 10
|
||||
const query = {
|
||||
bodyType: "encoded",
|
||||
path: "api",
|
||||
pagination: {
|
||||
type: "page",
|
||||
location: "body",
|
||||
pageParam,
|
||||
sizeParam,
|
||||
responseParam: "my_next_cursor",
|
||||
},
|
||||
paginationValues: {
|
||||
page: pageValue,
|
||||
limit: sizeValue,
|
||||
},
|
||||
}
|
||||
const res = await config.integration.create(query)
|
||||
expect(fetch).toHaveBeenCalledWith(`${BASE_URL}/api?`, {
|
||||
body: expect.any(URLSearchParams),
|
||||
headers: {},
|
||||
method: "POST",
|
||||
})
|
||||
const sentData = fetch.mock.calls[0][1].body
|
||||
expect(sentData.has(pageParam))
|
||||
expect(sentData.get(pageParam)).toEqual(pageValue.toString())
|
||||
expect(sentData.has(sizeParam))
|
||||
expect(sentData.get(sizeParam)).toEqual(sizeValue.toString())
|
||||
expect(res.pagination.cursor).toEqual(123)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue