310 lines
9.7 KiB
TypeScript
310 lines
9.7 KiB
TypeScript
import { ObjectsRegistry } from "../Objects/Registry";
|
|
export class ApiPage {
|
|
public agHelper = ObjectsRegistry.AggregateHelper;
|
|
public locator = ObjectsRegistry.CommonLocators;
|
|
|
|
private _createapi = ".t--createBlankApiCard";
|
|
private _resourceUrl = ".t--dataSourceField";
|
|
private _headerKey = (index: number) =>
|
|
".t--actionConfiguration\\.headers\\[0\\]\\.key\\." + index + "";
|
|
private _headerValue = (index: number) =>
|
|
".t--actionConfiguration\\.headers\\[0\\]\\.value\\." + index + "";
|
|
private _paramKey = (index: number) =>
|
|
".t--actionConfiguration\\.queryParameters\\[0\\]\\.key\\." + index + "";
|
|
private _paramValue = (index: number) =>
|
|
".t--actionConfiguration\\.queryParameters\\[0\\]\\.value\\." + index + "";
|
|
_bodyKey = (index: number) =>
|
|
".t--actionConfiguration\\.bodyFormData\\[0\\]\\.key\\." + index + "";
|
|
_bodyValue = (index: number) =>
|
|
".t--actionConfiguration\\.bodyFormData\\[0\\]\\.value\\." + index + "";
|
|
_bodyTypeDropdown =
|
|
"//span[text()='Type'][@class='bp3-button-text']/parent::button";
|
|
private _apiRunBtn = ".t--apiFormRunBtn";
|
|
private _queryTimeout =
|
|
"//input[@name='actionConfiguration.timeoutInMillisecond']";
|
|
_responseBody = ".CodeMirror-code span.cm-string.cm-property";
|
|
private _blankAPI = "span:contains('New Blank API')";
|
|
private _apiVerbDropdown = ".t--apiFormHttpMethod";
|
|
private _verbToSelect = (verb: string) =>
|
|
"//div[contains(@class, 't--dropdown-option')]//span[contains(text(),'" +
|
|
verb +
|
|
"')]";
|
|
private _bodySubTab = (subTab: string) => `[data-cy='tab--${subTab}']`;
|
|
_visibleTextSpan = (spanText: string) => "//span[text()='" + spanText + "']";
|
|
_visibleTextDiv = (divText: string) => "//div[text()='" + divText + "']";
|
|
_noBodyMessageDiv = "#NoBodyMessageDiv";
|
|
_noBodyMessage = "This request does not have a body";
|
|
_imageSrc = "//img/parent::div";
|
|
private _trashDelete = "span[name='delete']";
|
|
private _onPageLoad = "input[name='executeOnLoad'][type='checkbox']";
|
|
private _confirmBeforeRunningAPI =
|
|
"input[name='confirmBeforeExecute'][type='checkbox']";
|
|
private _paginationTypeLabels = ".t--apiFormPaginationType label";
|
|
_saveAsDS = ".t--store-as-datasource";
|
|
_responseStatus = ".t--response-status-code";
|
|
private _blankGraphqlAPI = "span:contains('New Blank GraphQL API')";
|
|
|
|
CreateApi(
|
|
apiName = "",
|
|
apiVerb: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" = "GET",
|
|
) {
|
|
cy.get(this.locator._createNew).click({ force: true });
|
|
cy.get(this._blankAPI).click({ force: true });
|
|
this.agHelper.ValidateNetworkStatus("@createNewApi", 201);
|
|
|
|
// cy.get("@createNewApi").then((response: any) => {
|
|
// expect(response.response.body.responseMeta.success).to.eq(true);
|
|
// cy.get(this.agHelper._actionName)
|
|
// .click()
|
|
// .invoke("text")
|
|
// .then((text) => {
|
|
// const someText = text;
|
|
// expect(someText).to.equal(response.response.body.data.name);
|
|
// });
|
|
// }); // to check if Api1 = Api1 when Create Api invoked
|
|
|
|
if (apiName) this.agHelper.RenameWithInPane(apiName);
|
|
cy.get(this._resourceUrl).should("be.visible");
|
|
if (apiVerb != "GET") this.SelectAPIVerb(apiVerb);
|
|
}
|
|
|
|
CreateAndFillApi(
|
|
url: string,
|
|
apiName = "",
|
|
queryTimeout = 10000,
|
|
apiVerb: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" = "GET",
|
|
) {
|
|
this.CreateApi(apiName, apiVerb);
|
|
this.EnterURL(url);
|
|
this.agHelper.AssertAutoSave();
|
|
//this.agHelper.Sleep(2000);// Added because api name edit takes some time to reflect in api sidebar after the call passes.
|
|
cy.get(this._apiRunBtn).should("not.be.disabled");
|
|
if (queryTimeout != 10000) this.SetAPITimeout(queryTimeout);
|
|
}
|
|
|
|
EnterURL(url: string) {
|
|
this.agHelper.EnterValue(url, {
|
|
propFieldName: this._resourceUrl,
|
|
directInput: true,
|
|
inputFieldName: "",
|
|
});
|
|
this.agHelper.AssertAutoSave();
|
|
}
|
|
|
|
EnterHeader(hKey: string, hValue: string) {
|
|
this.SelectPaneTab("Headers");
|
|
this.agHelper.EnterValue(hKey, {
|
|
propFieldName: this._headerKey(0),
|
|
directInput: true,
|
|
inputFieldName: "",
|
|
});
|
|
this.agHelper.PressEscape();
|
|
this.agHelper.EnterValue(hValue, {
|
|
propFieldName: this._headerValue(0),
|
|
directInput: true,
|
|
inputFieldName: "",
|
|
});
|
|
this.agHelper.PressEscape();
|
|
this.agHelper.AssertAutoSave();
|
|
}
|
|
|
|
EnterParams(pKey: string, pValue: string) {
|
|
this.SelectPaneTab("Params");
|
|
this.agHelper.EnterValue(pKey, {
|
|
propFieldName: this._paramKey(0),
|
|
directInput: true,
|
|
inputFieldName: "",
|
|
});
|
|
this.agHelper.PressEscape();
|
|
this.agHelper.EnterValue(pValue, {
|
|
propFieldName: this._paramValue(0),
|
|
directInput: true,
|
|
inputFieldName: "",
|
|
});
|
|
this.agHelper.PressEscape();
|
|
this.agHelper.AssertAutoSave();
|
|
}
|
|
|
|
EnterBodyFormData(
|
|
subTab: "FORM_URLENCODED" | "MULTIPART_FORM_DATA",
|
|
bKey: string,
|
|
bValue: string,
|
|
type = "",
|
|
toTrash = false,
|
|
) {
|
|
this.SelectPaneTab("Body");
|
|
this.SelectSubTab(subTab);
|
|
if (toTrash) {
|
|
cy.get(this._trashDelete).click();
|
|
cy.xpath(this._visibleTextSpan("Add more")).click();
|
|
}
|
|
this.agHelper.EnterValue(bKey, {
|
|
propFieldName: this._bodyKey(0),
|
|
directInput: true,
|
|
inputFieldName: "",
|
|
});
|
|
this.agHelper.PressEscape();
|
|
|
|
if (type) {
|
|
cy.xpath(this._bodyTypeDropdown)
|
|
.eq(0)
|
|
.click();
|
|
cy.xpath(this._visibleTextDiv(type)).click();
|
|
}
|
|
this.agHelper.EnterValue(bValue, {
|
|
propFieldName: this._bodyValue(0),
|
|
directInput: true,
|
|
inputFieldName: "",
|
|
});
|
|
this.agHelper.PressEscape();
|
|
this.agHelper.AssertAutoSave();
|
|
}
|
|
|
|
RunAPI(
|
|
toValidateResponse = true,
|
|
waitTimeInterval = 20,
|
|
validateNetworkAssertOptions?: { expectedPath: string; expectedRes: any },
|
|
) {
|
|
this.agHelper.GetNClick(this._apiRunBtn, 0, true, waitTimeInterval);
|
|
toValidateResponse &&
|
|
this.agHelper.ValidateNetworkExecutionSuccess("@postExecute");
|
|
|
|
// Asserting Network result
|
|
validateNetworkAssertOptions?.expectedPath &&
|
|
validateNetworkAssertOptions?.expectedRes &&
|
|
this.agHelper.ValidateNetworkDataAssert(
|
|
"@postExecute",
|
|
validateNetworkAssertOptions.expectedPath,
|
|
validateNetworkAssertOptions.expectedRes,
|
|
);
|
|
}
|
|
|
|
SetAPITimeout(timeout: number) {
|
|
this.SelectPaneTab("Settings");
|
|
cy.xpath(this._queryTimeout)
|
|
.clear()
|
|
.type(timeout.toString(), { delay: 0 }); //Delay 0 to work like paste!
|
|
this.agHelper.AssertAutoSave();
|
|
this.SelectPaneTab("Headers");
|
|
}
|
|
|
|
ToggleOnPageLoadRun(enable = true || false) {
|
|
this.SelectPaneTab("Settings");
|
|
if (enable)
|
|
cy.get(this._onPageLoad).check({
|
|
force: true,
|
|
});
|
|
else
|
|
cy.get(this._onPageLoad).uncheck({
|
|
force: true,
|
|
});
|
|
}
|
|
|
|
ToggleConfirmBeforeRunningApi(enable = true || false) {
|
|
this.SelectPaneTab("Settings");
|
|
if (enable)
|
|
cy.get(this._confirmBeforeRunningAPI).check({
|
|
force: true,
|
|
});
|
|
else
|
|
cy.get(this._confirmBeforeRunningAPI).uncheck({
|
|
force: true,
|
|
});
|
|
}
|
|
|
|
SelectPaneTab(
|
|
tabName:
|
|
| "Headers"
|
|
| "Params"
|
|
| "Body"
|
|
| "Pagination"
|
|
| "Authentication"
|
|
| "Settings"
|
|
| "Response"
|
|
| "Errors"
|
|
| "Logs"
|
|
| "Inspect entity",
|
|
) {
|
|
this.agHelper.PressEscape();
|
|
this.agHelper.GetNClick(this._visibleTextSpan(tabName), 0, true);
|
|
}
|
|
|
|
SelectSubTab(
|
|
subTabName:
|
|
| "NONE"
|
|
| "JSON"
|
|
| "FORM_URLENCODED"
|
|
| "MULTIPART_FORM_DATA"
|
|
| "RAW",
|
|
) {
|
|
this.agHelper.GetNClick(this._bodySubTab(subTabName));
|
|
}
|
|
|
|
ValidateQueryParams(param: { key: string; value: string }) {
|
|
this.SelectPaneTab("Params");
|
|
this.agHelper.ValidateCodeEditorContent(this._paramKey(0), param.key);
|
|
this.agHelper.ValidateCodeEditorContent(this._paramValue(0), param.value);
|
|
}
|
|
|
|
ValidateHeaderParams(header: { key: string; value: string }) {
|
|
this.SelectPaneTab("Headers");
|
|
this.agHelper.ValidateCodeEditorContent(this._headerKey(0), header.key);
|
|
this.agHelper.ValidateCodeEditorContent(this._headerValue(0), header.value);
|
|
}
|
|
|
|
ReadApiResponsebyKey(key: string) {
|
|
let apiResp = "";
|
|
cy.get(this._responseBody)
|
|
.contains(key)
|
|
.siblings("span")
|
|
.invoke("text")
|
|
.then((text) => {
|
|
apiResp = `${text
|
|
.match(/"(.*)"/)![0]
|
|
.split('"')
|
|
.join("")} `;
|
|
cy.log("Key value in api response is :" + apiResp);
|
|
cy.wrap(apiResp).as("apiResp");
|
|
});
|
|
}
|
|
|
|
public SelectAPIVerb(verb: "GET" | "POST" | "PUT" | "DELETE" | "PATCH") {
|
|
cy.get(this._apiVerbDropdown).click();
|
|
cy.xpath(this._verbToSelect(verb))
|
|
.should("be.visible")
|
|
.click();
|
|
}
|
|
|
|
ResponseStatusCheck(statusCode: string) {
|
|
this.agHelper.AssertElementVisible(this._responseStatus);
|
|
cy.get(this._responseStatus).contains(statusCode);
|
|
}
|
|
public SelectPaginationTypeViaIndex(index: number) {
|
|
cy.get(this._paginationTypeLabels)
|
|
.eq(index)
|
|
.click({ force: true });
|
|
}
|
|
|
|
CreateAndFillGraphqlApi(
|
|
url: string,
|
|
apiName = "",
|
|
queryTimeout = 10000
|
|
) {
|
|
this.CreateGraphqlApi(apiName);
|
|
this.EnterURL(url);
|
|
this.agHelper.AssertAutoSave();
|
|
//this.agHelper.Sleep(2000);// Added because api name edit takes some time to reflect in api sidebar after the call passes.
|
|
cy.get(this._apiRunBtn).should("not.be.disabled");
|
|
if (queryTimeout != 10000) this.SetAPITimeout(queryTimeout);
|
|
}
|
|
|
|
CreateGraphqlApi(apiName = "") {
|
|
cy.get(this.locator._createNew).click({ force: true });
|
|
cy.get(this._blankGraphqlAPI).click({ force: true });
|
|
this.agHelper.ValidateNetworkStatus("@createNewApi", 201);
|
|
|
|
if (apiName) this.agHelper.RenameWithInPane(apiName);
|
|
cy.get(this._resourceUrl).should("be.visible");
|
|
}
|
|
}
|