test: Script updates for flaky fixes (#16143)

* Remove mongo coll dataset

* JSEXe spec flaky trial fix

* AbortActions to ts

* js func exe fix

* Abort spec fix

* Appsmith down flaky fix

* SelectWidget bug 12531 comment

* JSfun exec spec flaky fix

* Scrolling spec fix

* mysql crud fix

* mySql crud fix

* CRUD generate page fix

* jsonload flaky fix

* Automcomplete spec update

* jsOnload-1 spec flaky fix

* http patch

* patch install

* patch path correction

* cypress instal force

* removed

* yarn

* adding dev

* applypatch path corrected

* patch fix

* patch update

* patches

* patch file name update

* Adding blureprint patch back

* Cypress install removed

* Removed .only

* Autocomplete + Abort spec fix

* CI run key press fix

* https proxy update path fix

* JS editor parsing delay handle

* Autocmplete js fix

* Abort Query added

* Removed  "dev": "cypress open"

* js func exec spec fix

* js editor type flaky fix

* GetNClick revert

* Saving JS editor aft removal

* JS specs flaky fixes

* JSfun flaky fix

* Auto complete spec fi

* jSonkoad1 spec fix

* JSOnload spec

* Auto complete JS spec fix

* Removing waiting for toasts

* jsfun fix

* EditJSObj Preetify update

* contains index or colection

* SetQueryTimeout update

* DS toasts handle

* POstgresCRUD toast change

* POstgres CRUD toasts fix

* Bug 15372 spec toast fix + Api timeout update

* Added DeleteDSDirectly()

* Arango spec fix

* JSEditor indent spec - 6 fix

* JSeditor indent spec update 7, 1,2

* removed only

* JSEDitor Indent spec fixes

* removed only

* MySQK CRUD fixes

* BUg 14006 spec fix

* Mongo spec toast fix

* Mongo update

* text wrapping spec flaky fix
This commit is contained in:
Aishwarya-U-R 2022-08-24 19:53:41 +05:30 committed by GitHub
parent e9d719103c
commit f2c6e1ed61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
48 changed files with 1153 additions and 1088 deletions

View File

@ -0,0 +1,53 @@
const { getVersionDir } = require("cypress/lib/tasks/state");
const chalk = require("chalk");
const Diff = require("diff");
const fs = require("fs/promises");
const path = require("path");
async function applyPatches() {
const patchesDir = path.join("cypress", "patches");
const patchesAbsDir = path.join(process.cwd(), patchesDir);
const patches = await fs.readdir(patchesAbsDir);
const installDir = getVersionDir();
console.log(`\n> Applying patches on to ${chalk.cyan(installDir)}\n`);
for (const filename of patches) {
if (!filename.endsWith(".patch")) {
continue;
}
const fullpath = path.join(patchesAbsDir, filename);
const enc = "utf8";
const patch = await fs.readFile(fullpath, enc);
const relativeFilename = path.join(patchesDir, filename);
console.log(`>> Applying patch ${chalk.cyan(relativeFilename)}`);
await Diff.applyPatches(patch, {
loadFile: (index, callback) => {
console.debug(`>>> Loading old file: ${chalk.red(index.oldFileName)}`);
fs.readFile(path.join(installDir, index.oldFileName), enc)
.then((contents) => {
callback(null, contents);
})
.catch(callback);
},
patched: (index, content, callback) => {
console.debug(
`>>> Patched new file: ${chalk.green(index.newFileName)}`,
);
fs.writeFile(path.join(installDir, index.newFileName), content, enc)
.then(callback)
.catch(callback);
},
complete: () => {
console.log(
`>> Successfully applied patch ${chalk.cyan(relativeFilename)}`,
);
},
});
}
}
applyPatches().catch((e) => {
console.error(e);
process.exit(42);
});

View File

@ -1,240 +1,272 @@
{
"dsl": {
"widgetName": "MainContainer",
"backgroundColor": "none",
"rightColumn": 453,
"snapColumns": 64,
"detachFromLayout": true,
"widgetId": "0",
"topRow": 0,
"bottomRow": 1320,
"containerStyle": "none",
"snapRows": 125,
"parentRowSpace": 1,
"type": "CANVAS_WIDGET",
"canExtend": true,
"version": 54,
"minHeight": 1292,
"parentColumnSpace": 1,
"dynamicBindingPathList": [
],
"leftColumn": 0,
"children": [
{
"widgetName": "Select1",
"isFilterable": true,
"displayName": "Select",
"iconSVG": "/static/media/icon.bd99caba.svg",
"labelText": "",
"topRow": 16,
"bottomRow": 20,
"parentRowSpace": 10,
"type": "SELECT_WIDGET",
"serverSideFiltering": false,
"hideCard": false,
"defaultOptionValue": "{\n \"label\": \"{{Table1.selectedRow.step}}\",\n \"value\": \"{{Table1.selectedRow.step}}\"\n }",
"animateLoading": true,
"parentColumnSpace": 21.203125,
"dynamicTriggerPathList": [
],
"leftColumn": 39,
"dynamicBindingPathList": [
{
"key": "defaultOptionValue"
}
],
"options": "[\n {\n \"label\": \"#1\",\n \"value\": \"#1\"\n },\n {\n \"label\": \"#2\",\n \"value\": \"#2\"\n }\n]",
"placeholderText": "Select option",
"isDisabled": false,
"key": "2zzcijdy0f",
"isRequired": false,
"rightColumn": 59,
"widgetId": "uiu9bz9s1b",
"isVisible": true,
"version": 1,
"parentId": "0",
"renderMode": "CANVAS",
"isLoading": false
},
{
"isVisible": true,
"animateLoading": true,
"defaultSelectedRow": "0",
"label": "Data",
"widgetName": "Table1",
"searchKey": "",
"textSize": "PARAGRAPH",
"horizontalAlignment": "LEFT",
"verticalAlignment": "CENTER",
"totalRecordsCount": 0,
"defaultPageSize": 0,
"dynamicBindingPathList": [
{
"key": "primaryColumns.step.computedValue"
},
{
"key": "primaryColumns.task.computedValue"
},
{
"key": "primaryColumns.status.computedValue"
},
{
"key": "primaryColumns.action.computedValue"
}
],
"primaryColumns": {
"step": {
"index": 0,
"width": 150,
"id": "step",
"horizontalAlignment": "LEFT",
"verticalAlignment": "CENTER",
"columnType": "text",
"textSize": "PARAGRAPH",
"enableFilter": true,
"enableSort": true,
"isVisible": true,
"isDisabled": false,
"isCellVisible": true,
"isDerived": false,
"label": "step",
"computedValue": "{{Table1.sanitizedTableData.map((currentRow) => ( currentRow.step))}}"
},
"task": {
"index": 1,
"width": 150,
"id": "task",
"horizontalAlignment": "LEFT",
"verticalAlignment": "CENTER",
"columnType": "text",
"textSize": "PARAGRAPH",
"enableFilter": true,
"enableSort": true,
"isVisible": true,
"isDisabled": false,
"isCellVisible": true,
"isDerived": false,
"label": "task",
"computedValue": "{{Table1.sanitizedTableData.map((currentRow) => ( currentRow.task))}}"
},
"status": {
"index": 2,
"width": 150,
"id": "status",
"horizontalAlignment": "LEFT",
"verticalAlignment": "CENTER",
"columnType": "text",
"textSize": "PARAGRAPH",
"enableFilter": true,
"enableSort": true,
"isVisible": true,
"isDisabled": false,
"isCellVisible": true,
"isDerived": false,
"label": "status",
"computedValue": "{{Table1.sanitizedTableData.map((currentRow) => ( currentRow.status))}}"
},
"action": {
"index": 3,
"width": 150,
"id": "action",
"horizontalAlignment": "LEFT",
"verticalAlignment": "CENTER",
"columnType": "text",
"textSize": "PARAGRAPH",
"enableFilter": true,
"enableSort": true,
"isVisible": true,
"isDisabled": false,
"isCellVisible": true,
"isDerived": false,
"label": "action",
"computedValue": "{{Table1.sanitizedTableData.map((currentRow) => ( currentRow.action))}}"
}
},
"derivedColumns": {
},
"tableData": "[\n {\n \"step\": \"#1\",\n \"task\": \"Drop a table\",\n \"status\": \"✅\",\n \"action\": \"\"\n },\n {\n \"step\": \"#2\",\n \"task\": \"Create a query fetch_users with the Mock DB\",\n \"status\": \"--\",\n \"action\": \"\"\n },\n {\n \"step\": \"#3\",\n \"task\": \"Bind the query using => fetch_users.data\",\n \"status\": \"--\",\n \"action\": \"\"\n }\n]",
"columnSizeMap": {
"task": 245,
"step": 62,
"status": 75
},
"columnOrder": [
"step",
"task",
"status",
"action"
],
"enableClientSideSearch": true,
"isVisibleSearch": true,
"isVisibleFilters": true,
"isVisibleDownload": true,
"isVisiblePagination": true,
"isSortable": true,
"delimiter": ",",
"version": 3,
"type": "TABLE_WIDGET",
"hideCard": false,
"displayName": "Table",
"key": "t22odw8rfj",
"iconSVG": "/static/media/icon.db8a9cbd.svg",
"widgetId": "f427h0lu92",
"renderMode": "CANVAS",
"isLoading": false,
"parentColumnSpace": 16.703125,
"parentRowSpace": 10,
"leftColumn": 6,
"rightColumn": 34,
"topRow": 9,
"bottomRow": 37,
"parentId": "0",
"dynamicTriggerPathList": [
],
"dynamicPropertyPathList": [
]
},
{
"isVisible": true,
"text": "{{Select1.selectedOptionValue}}",
"fontSize": "PARAGRAPH",
"fontStyle": "BOLD",
"textAlign": "LEFT",
"textColor": "#231F20",
"truncateButtonColor": "#FFC13D",
"widgetName": "Text1",
"shouldTruncate": false,
"overflow": "NONE",
"version": 1,
"animateLoading": true,
"type": "TEXT_WIDGET",
"hideCard": false,
"displayName": "Text",
"key": "cdb5qeydze",
"iconSVG": "/static/media/icon.97c59b52.svg",
"widgetId": "5qb4nik2gy",
"renderMode": "CANVAS",
"isLoading": false,
"parentColumnSpace": 16.703125,
"parentRowSpace": 10,
"leftColumn": 39,
"rightColumn": 59,
"topRow": 33,
"bottomRow": 37,
"parentId": "0",
"dynamicBindingPathList": [
{
"key": "text"
}
],
"dynamicTriggerPathList": [
]
}
]
}
}
"dsl": {
"widgetName": "MainContainer",
"backgroundColor": "none",
"rightColumn": 453,
"snapColumns": 64,
"detachFromLayout": true,
"widgetId": "0",
"topRow": 0,
"bottomRow": 920,
"containerStyle": "none",
"snapRows": 125,
"parentRowSpace": 1,
"type": "CANVAS_WIDGET",
"canExtend": true,
"version": 60,
"minHeight": 1292,
"parentColumnSpace": 1,
"dynamicBindingPathList": [],
"leftColumn": 0,
"children": [
{
"boxShadow": "none",
"widgetName": "Select1",
"isFilterable": true,
"displayName": "Select",
"iconSVG": "/static/media/icon.bd99caba.svg",
"labelText": "",
"topRow": 16,
"bottomRow": 20,
"parentRowSpace": 10,
"type": "SELECT_WIDGET",
"serverSideFiltering": false,
"hideCard": false,
"defaultOptionValue": "{{ ((options, serverSideFiltering) => ( Table1.selectedRow.step))(Select1.options, Select1.serverSideFiltering) }}",
"animateLoading": true,
"parentColumnSpace": 21.203125,
"dynamicTriggerPathList": [],
"leftColumn": 39,
"dynamicBindingPathList": [
{
"key": "defaultOptionValue"
},
{
"key": "accentColor"
}
],
"options": "[\n {\n \"label\": \"#1\",\n \"value\": \"#1\"\n },\n {\n \"label\": \"#2\",\n \"value\": \"#2\"\n }\n]",
"placeholderText": "Select option",
"isDisabled": false,
"key": "2zzcijdy0f",
"labelTextSize": "0.875rem",
"isRequired": false,
"rightColumn": 59,
"widgetId": "uiu9bz9s1b",
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"isVisible": true,
"version": 1,
"parentId": "0",
"renderMode": "CANVAS",
"isLoading": false,
"borderRadius": "0px"
},
{
"boxShadow": "none",
"widgetName": "Table1",
"defaultPageSize": 0,
"columnOrder": [
"step",
"task",
"status",
"action"
],
"isVisibleDownload": true,
"dynamicPropertyPathList": [],
"displayName": "Table",
"iconSVG": "/static/media/icon.db8a9cbd.svg",
"topRow": 9,
"bottomRow": 37,
"isSortable": true,
"parentRowSpace": 10,
"type": "TABLE_WIDGET",
"defaultSelectedRow": "0",
"hideCard": false,
"animateLoading": true,
"parentColumnSpace": 16.703125,
"dynamicTriggerPathList": [],
"dynamicBindingPathList": [
{
"key": "primaryColumns.step.computedValue"
},
{
"key": "primaryColumns.task.computedValue"
},
{
"key": "primaryColumns.status.computedValue"
},
{
"key": "primaryColumns.action.computedValue"
},
{
"key": "accentColor"
}
],
"leftColumn": 6,
"primaryColumns": {
"step": {
"index": 0,
"width": 150,
"id": "step",
"horizontalAlignment": "LEFT",
"verticalAlignment": "CENTER",
"columnType": "text",
"textSize": "0.875rem",
"enableFilter": true,
"enableSort": true,
"isVisible": true,
"isDisabled": false,
"isCellVisible": true,
"isDerived": false,
"label": "step",
"computedValue": "{{Table1.sanitizedTableData.map((currentRow) => ( currentRow.step))}}",
"borderRadius": "0px",
"boxShadow": "none"
},
"task": {
"index": 1,
"width": 150,
"id": "task",
"horizontalAlignment": "LEFT",
"verticalAlignment": "CENTER",
"columnType": "text",
"textSize": "0.875rem",
"enableFilter": true,
"enableSort": true,
"isVisible": true,
"isDisabled": false,
"isCellVisible": true,
"isDerived": false,
"label": "task",
"computedValue": "{{Table1.sanitizedTableData.map((currentRow) => ( currentRow.task))}}",
"borderRadius": "0px",
"boxShadow": "none"
},
"status": {
"index": 2,
"width": 150,
"id": "status",
"horizontalAlignment": "LEFT",
"verticalAlignment": "CENTER",
"columnType": "text",
"textSize": "0.875rem",
"enableFilter": true,
"enableSort": true,
"isVisible": true,
"isDisabled": false,
"isCellVisible": true,
"isDerived": false,
"label": "status",
"computedValue": "{{Table1.sanitizedTableData.map((currentRow) => ( currentRow.status))}}",
"borderRadius": "0px",
"boxShadow": "none"
},
"action": {
"index": 3,
"width": 150,
"id": "action",
"horizontalAlignment": "LEFT",
"verticalAlignment": "CENTER",
"columnType": "text",
"textSize": "0.875rem",
"enableFilter": true,
"enableSort": true,
"isVisible": true,
"isDisabled": false,
"isCellVisible": true,
"isDerived": false,
"label": "action",
"computedValue": "{{Table1.sanitizedTableData.map((currentRow) => ( currentRow.action))}}",
"borderRadius": "0px",
"boxShadow": "none"
}
},
"delimiter": ",",
"key": "t22odw8rfj",
"derivedColumns": {},
"labelTextSize": "0.875rem",
"rightColumn": 34,
"textSize": "0.875rem",
"widgetId": "f427h0lu92",
"accentColor": "{{appsmith.theme.colors.primaryColor}}",
"isVisibleFilters": true,
"tableData": "[\n {\n \"step\": \"#1\",\n \"task\": \"Drop a table\",\n \"status\": \"✅\",\n \"action\": \"\"\n },\n {\n \"step\": \"#2\",\n \"task\": \"Create a query fetch_users with the Mock DB\",\n \"status\": \"--\",\n \"action\": \"\"\n },\n {\n \"step\": \"#3\",\n \"task\": \"Bind the query using => fetch_users.data\",\n \"status\": \"--\",\n \"action\": \"\"\n }\n]",
"isVisible": true,
"label": "Data",
"searchKey": "",
"enableClientSideSearch": true,
"version": 3,
"totalRecordsCount": 0,
"parentId": "0",
"renderMode": "CANVAS",
"isLoading": false,
"horizontalAlignment": "LEFT",
"isVisibleSearch": true,
"childStylesheet": {
"button": {
"buttonColor": "{{appsmith.theme.colors.primaryColor}}",
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"boxShadow": "none"
},
"menuButton": {
"menuColor": "{{appsmith.theme.colors.primaryColor}}",
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"boxShadow": "none"
},
"iconButton": {
"menuColor": "{{appsmith.theme.colors.primaryColor}}",
"borderRadius": "{{appsmith.theme.borderRadius.appBorderRadius}}",
"boxShadow": "none"
}
},
"borderRadius": "0px",
"isVisiblePagination": true,
"verticalAlignment": "CENTER",
"columnSizeMap": {
"task": 245,
"step": 62,
"status": 75
}
},
{
"boxShadow": "none",
"widgetName": "Text1",
"displayName": "Text",
"iconSVG": "/static/media/icon.97c59b52.svg",
"topRow": 33,
"bottomRow": 37,
"parentRowSpace": 10,
"type": "TEXT_WIDGET",
"hideCard": false,
"animateLoading": true,
"overflow": "NONE",
"parentColumnSpace": 16.703125,
"dynamicTriggerPathList": [],
"fontFamily": "System Default",
"leftColumn": 39,
"dynamicBindingPathList": [
{
"key": "text"
}
],
"shouldTruncate": false,
"truncateButtonColor": "#FFC13D",
"text": "{{Select1.selectedOptionValue}}",
"key": "cdb5qeydze",
"labelTextSize": "0.875rem",
"rightColumn": 59,
"textAlign": "LEFT",
"widgetId": "5qb4nik2gy",
"isVisible": true,
"fontStyle": "BOLD",
"textColor": "#231F20",
"version": 1,
"parentId": "0",
"renderMode": "CANVAS",
"isLoading": false,
"borderRadius": "0px",
"fontSize": "0.875rem"
}
]
}
}

View File

@ -1,47 +0,0 @@
const commonlocators = require("../../../../locators/commonlocators.json");
const queryLocators = require("../../../../locators/QueryEditor.json");
const datasource = require("../../../../locators/DatasourcesEditor.json");
const formControls = require("../../../../locators/FormControl.json");
const testApiUrl = "https://jsonplaceholder.typicode.com/photos";
const ERROR_ACTION_EXECUTE_FAIL = (actionName) =>
`${actionName} action returned an error response`;
describe("Abort Action Execution", function() {
it("Cancel Request button should abort API action execution", function() {
cy.createAndFillApi(testApiUrl, "");
cy.RunAPIWithoutWaitingForResolution();
cy.get(commonlocators.cancelActionExecution).click();
cy.VerifyErrorMsgPresence(ERROR_ACTION_EXECUTE_FAIL("Api1"));
});
// Queries were resolving quicker than we could cancel them
// Commenting this out till we can find a query that resolves slow enough for us to cancel its execution.
// it("Cancel Request button should abort Query action execution", function() {
// cy.NavigateToDatasourceEditor();
// cy.get(datasource.MongoDB).click();
// cy.fillMongoDatasourceForm();
// cy.testSaveDatasource();
// cy.get("@createDatasource").then(
// (httpResponse) => httpResponse.response.body.data.name,
// );
// cy.NavigateToQueryEditor();
// cy.NavigateToActiveTab();
// cy.get(queryLocators.createQuery)
// .last()
// .click();
// cy.get(queryLocators.queryNameField).type("AbortQuery");
// cy.ValidateAndSelectDropdownOption(
// formControls.commandDropdown,
// "Find Document(s)",
// );
// cy.typeValueNValidate("friends", formControls.mongoCollection);
// cy.typeValueNValidate("300", formControls.mongoFindLimit);
// cy.RunQueryWithoutWaitingForResolution();
// cy.get(commonlocators.cancelActionExecution).click();
// cy.VerifyErrorMsgPresence(ERROR_ACTION_EXECUTE_FAIL("AbortQuery"));
// });
});

View File

@ -1,236 +0,0 @@
import { WIDGET } from "../../../../locators/WidgetLocators";
import { ObjectsRegistry } from "../../../../support/Objects/Registry";
const explorer = require("../../../../locators/explorerlocators.json");
const {
AggregateHelper: agHelper,
ApiPage,
CommonLocators,
EntityExplorer,
JSEditor: jsEditor,
} = ObjectsRegistry;
const jsObjectBody = `export default {
myVar1: [],
myVar2: {},
myFun1(){
},
myFun2: async () => {
//use async-await or promises
}
}`;
describe("Autocomplete tests", () => {
it("1. Verify widgets autocomplete: ButtonGroup & Document viewer widget", () => {
cy.get(explorer.addWidget).click();
EntityExplorer.DragDropWidgetNVerify(WIDGET.BUTTON_GROUP, 200, 200);
EntityExplorer.DragDropWidgetNVerify(WIDGET.DOCUMENT_VIEWER, 200, 500);
// create js object
jsEditor.CreateJSObject(jsObjectBody, {
paste: true,
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
});
// focus on 5th line
cy.get(`:nth-child(5) > .CodeMirror-line`).click();
// 1. Button group widget autocomplete verification
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
.type(`ButtonGroup1.`);
agHelper.AssertElementText(CommonLocators._hints, "groupButtons");
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
.type(`groupButtons.`);
agHelper.AssertElementText(CommonLocators._hints, "groupButton1");
// 2. Document view widget autocomplete verification
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
.type("{backspace}".repeat("ButtonGroup1.groupButtons.".length)) // remove "ButtonGroup1.groupButtons."
.wait(20)
.type(`DocumentViewer1.`);
agHelper.AssertElementText(CommonLocators._hints, "docUrl");
});
it("2. Verify browser JavaScript APIs in autocomplete ", () => {
// create js object
jsEditor.CreateJSObject(jsObjectBody, {
paste: true,
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
});
// focus on 5th line
cy.get(`:nth-child(5) > .CodeMirror-line`).click();
const JSAPIsToTest = [
// console API verification
{
type: "console",
expected: "console",
shouldBePresent: true,
},
// crypto API verification
{
type: "crypto",
expected: "crypto",
shouldBePresent: true,
},
// eval function verification
{
type: "eval",
expected: "eval()",
shouldBePresent: false,
},
{
type: "Blob",
expected: "Blob()",
shouldBePresent: true,
},
{
type: "FormData",
expected: "FormData()",
shouldBePresent: true,
},
{
type: "FileReader",
expected: "FileReader()",
shouldBePresent: true,
},
];
JSAPIsToTest.forEach((test, index) => {
const deleteCharCount = (JSAPIsToTest[index - 1]?.type || " ").length;
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
// remove previously typed code
.type(deleteCharCount ? "{backspace}".repeat(deleteCharCount) : " ")
.wait(20)
.type(test.type);
cy.get(CommonLocators._hints)
.eq(0)
.should(
test.shouldBePresent ? "have.text" : "not.have.text",
test.expected,
);
});
});
it("3. JSObject this. autocomplete", () => {
// create js object
jsEditor.CreateJSObject(jsObjectBody, {
paste: true,
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
});
// focus on 5th line
cy.get(`:nth-child(5) > .CodeMirror-line`).click();
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
.type("this.");
["myFun2()", "myVar1", "myVar2"].forEach((element, index) => {
cy.get(`.CodeMirror-hints > :nth-child(${index + 1})`).contains(element);
});
});
it("4. Local variables & complex data autocompletion test", () => {
// create js object
jsEditor.CreateJSObject(jsObjectBody, {
paste: true,
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
});
const lineNumber = 5;
const users = [
{ label: "a", value: "b" },
{ label: "a", value: "b" },
];
const codeToType = `
const users = ${JSON.stringify(users)};
const data = { userCollection: [{ users }, { users }] };
users.map(callBack)
`;
// component re-render cause DOM element of cy.get to lost
// added wait to finish re-render before cy.get
cy.wait(100);
cy.get(`:nth-child(${lineNumber}) > .CodeMirror-line`).click();
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
.type(`${codeToType}`, { parseSpecialCharSequences: false })
.type(`{upArrow}{upArrow}`)
.type(`const callBack = (user) => user.l`);
agHelper.AssertElementText(CommonLocators._hints, "label");
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
.type(`abel;`);
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
.type(`data.`);
agHelper.AssertElementText(CommonLocators._hints, "userCollection");
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
.type(`userCollection[0].`);
agHelper.AssertElementText(CommonLocators._hints, "users");
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
.type(`users[0].`);
agHelper.AssertElementText(CommonLocators._hints, "label");
});
it("5. Api data with array of object autocompletion test", () => {
ApiPage.CreateAndFillApi("https://mock-api.appsmith.com/users");
ApiPage.RunAPI();
// create js object
jsEditor.CreateJSObject(jsObjectBody, {
paste: true,
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
});
cy.get(`:nth-child(${5}) > .CodeMirror-line`).click();
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
.type("Api1.data.u");
agHelper.AssertElementText(CommonLocators._hints, "users");
cy.get(CommonLocators._codeMirrorTextArea)
.focus()
.type("sers[0].e");
agHelper.AssertElementText(CommonLocators._hints, "email");
});
});

View File

@ -52,10 +52,10 @@ describe("Validate basic Promises", () => {
cy.fixture("promisesBtnDsl").then((val: any) => {
agHelper.AddDsl(val, locator._spanButton("Submit"));
});
apiPage.CreateAndFillApi("https://randomuser.me/api/", "RandomUser");
apiPage.CreateAndFillApi("https://randomuser.me/api/", "RandomUser", 30000);
apiPage.CreateAndFillApi(
"https://api.genderize.io?name={{this.params.country}}",
"Genderize",
"Genderize", 30000
);
apiPage.ValidateQueryParams({
key: "name",
@ -92,7 +92,7 @@ describe("Validate basic Promises", () => {
});
apiPage.CreateAndFillApi(
"https://source.unsplash.com/collection/8439505",
"Christmas",
"Christmas", 30000
);
ee.SelectEntityByName("Button1", "WIDGETS");
jsEditor.EnterJSContext(
@ -122,7 +122,7 @@ describe("Validate basic Promises", () => {
cy.fixture("promisesBtnDsl").then((val: any) => {
agHelper.AddDsl(val, locator._spanButton("Submit"));
});
apiPage.CreateAndFillApi("https://favqs.com/api/qotd", "InspiringQuotes");
apiPage.CreateAndFillApi("https://favqs.com/api/qotd", "InspiringQuotes", 30000);
jsEditor.CreateJSObject(`const user = 'You';
return InspiringQuotes.run().then((res) => { showAlert("Today's quote for " + user + " is " + JSON.stringify(res.quote.body), 'success') }).catch(() => showAlert("Unable to fetch quote for " + user, 'warning'))`);
ee.SelectEntityByName("Button1", "WIDGETS");
@ -144,7 +144,7 @@ return InspiringQuotes.run().then((res) => { showAlert("Today's quote for " + us
});
apiPage.CreateAndFillApi(
"https://api.agify.io?name={{this.params.person}}",
"Agify",
"Agify", 30000
);
apiPage.ValidateQueryParams({
key: "name",
@ -169,7 +169,7 @@ return InspiringQuotes.run().then((res) => { showAlert("Today's quote for " + us
});
apiPage.CreateAndFillApi(
"https://api.jikan.moe/v3/search/anime?q={{this.params.name}}",
"GetAnime",
"GetAnime", 30000
);
ee.SelectEntityByName("List1", "WIDGETS");
propPane.UpdatePropertyFieldValue(

View File

@ -33,12 +33,7 @@ describe("Validate basic binding of Input widget to Input widget", () => {
expect($selectedValue).to.eq("Select option");
});
//Change select value now - if below is #2 - it will fail
agHelper.SelectDropDown("#1");
agHelper.ReadSelectedDropDownValue().then(($selectedValue) => {
expect($selectedValue).to.eq("#1");
});
//Change select value now:
agHelper.SelectDropDown("#2");
agHelper.ReadSelectedDropDownValue().then(($selectedValue) => {
expect($selectedValue).to.eq("#2");
@ -50,12 +45,23 @@ describe("Validate basic binding of Input widget to Input widget", () => {
});
});
it("2. Validation of default displayed in Select widget based on row selected + Bug 12531", function() {
//Till bug fixed
it.skip("2. Validation of default displayed in Select widget based on row selected + Bug 12531", function() {
table.SelectTableRow(1);
agHelper.ReadSelectedDropDownValue().then(($selectedValue) => {
expect($selectedValue).to.eq("#2");
});
table.SelectTableRow(0);
agHelper.ReadSelectedDropDownValue().then(($selectedValue) => {
expect($selectedValue).to.eq("#1");
});
table.SelectTableRow(2);
agHelper.ReadSelectedDropDownValue().then(($selectedValue) => {
expect($selectedValue).to.eq("Select option");
});
//Change select value now - failing here!
agHelper.SelectDropDown("#1");
agHelper.ReadSelectedDropDownValue().then(($selectedValue) => {

View File

@ -0,0 +1,205 @@
import { EEXIST } from "constants";
import { WIDGET } from "../../../../locators/WidgetLocators";
import { ObjectsRegistry } from "../../../../support/Objects/Registry";
const {
AggregateHelper: agHelper,
ApiPage,
CommonLocators,
EntityExplorer,
JSEditor: jsEditor,
} = ObjectsRegistry;
const jsObjectBody = `export default {
myVar1: [],
myVar2: {},
myFun1(){
},
myFun2: async () => {
//use async-await or promises
}
}`;
describe("Autocomplete tests", () => {
it("1. Bug #13613 Verify widgets autocomplete: ButtonGroup & Document viewer widget", () => {
EntityExplorer.DragDropWidgetNVerify(WIDGET.BUTTON_GROUP, 200, 200);
EntityExplorer.DragDropWidgetNVerify(WIDGET.DOCUMENT_VIEWER, 200, 500);
// create js object
jsEditor.CreateJSObject(jsObjectBody, {
paste: true,
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
});
// focus on 5th line
agHelper.GetNClick(jsEditor._lineinJsEditor(5));
// 1. Button group widget autocomplete verification
agHelper.TypeText(CommonLocators._codeMirrorTextArea, "ButtonGroup1.");
agHelper.GetNAssertElementText(CommonLocators._hints, "groupButtons");
agHelper.Sleep();
agHelper.GetNClickByContains(CommonLocators._hints, "groupButtons");
agHelper.TypeText(CommonLocators._codeMirrorTextArea, ".");
agHelper.GetNAssertElementText(CommonLocators._hints, "groupButton1");
agHelper.Sleep();
agHelper.GetNClickByContains(CommonLocators._hints, "groupButton1");
// 2. Document view widget autocomplete verification
agHelper.SelectNRemoveLineText(CommonLocators._codeMirrorTextArea);
agHelper.TypeText(CommonLocators._codeMirrorTextArea, "DocumentViewer1.");
agHelper.GetNAssertElementText(CommonLocators._hints, "docUrl");
agHelper.Sleep();
agHelper.GetNClickByContains(CommonLocators._hints, "docUrl");
});
it("2. Bug #15568 Verify browser JavaScript APIs in autocomplete ", () => {
// Using same js object
agHelper.SelectNRemoveLineText(CommonLocators._codeMirrorTextArea);
// focus on 5th line
agHelper.GetNClick(jsEditor._lineinJsEditor(5));
const JSAPIsToTest = [
// console API verification
{
type: "console",
expected: "console",
haveOrNotHave: true,
},
// crypto API verification
{
type: "crypto",
expected: "crypto",
haveOrNotHave: true,
},
// eval function verification
{
type: "eval",
expected: "eval()",
haveOrNotHave: false,
},
{
type: "Blob",
expected: "Blob()",
haveOrNotHave: true,
},
{
type: "FormData",
expected: "FormData()",
haveOrNotHave: true,
},
{
type: "FileReader",
expected: "FileReader()",
haveOrNotHave: true,
},
];
JSAPIsToTest.forEach((test, index) => {
agHelper.TypeText(CommonLocators._codeMirrorTextArea, test.type);
agHelper.GetNAssertElementText(
CommonLocators._hints,
test.expected,
test.haveOrNotHave ? "have.text" : "not.have.text",
);
agHelper.SelectNRemoveLineText(CommonLocators._codeMirrorTextArea);
//const deleteCharCount = (JSAPIsToTest[index - 1]?.type || " ").length;
// cy.get(CommonLocators._codeMirrorTextArea)
// .focus()
// // remove previously typed code
// .type(deleteCharCount ? "{backspace}".repeat(deleteCharCount) : " ")
// .wait(20)
// .type(test.type);
});
//EntityExplorer.ActionContextMenuByEntityName("JSObject1", "Delete", "Are you sure?", true);
});
it("3. JSObject this. autocomplete", () => {
// Using same js object
//agHelper.SelectNRemoveLineText(CommonLocators._codeMirrorTextArea);
// focus on 5th line
agHelper.GetNClick(jsEditor._lineinJsEditor(5));
agHelper.TypeText(CommonLocators._codeMirrorTextArea, "this.");
["myFun2()", "myVar1", "myVar2"].forEach((element, index) => {
agHelper.AssertContains(element);
//cy.get(`.CodeMirror-hints > :nth-child(${index + 1})`).contains(element);
});
});
it("4. Api data with array of object autocompletion test", () => {
ApiPage.CreateAndFillApi("https://mock-api.appsmith.com/users");
ApiPage.RunAPI();
// Using same js object
EntityExplorer.SelectEntityByName("JSObject1", "QUERIES/JS");
agHelper.GetNClick(jsEditor._lineinJsEditor(5));
agHelper.SelectNRemoveLineText(CommonLocators._codeMirrorTextArea);
//agHelper.GetNClick(jsEditor._lineinJsEditor(5));
agHelper.TypeText(CommonLocators._codeMirrorTextArea, "Api1.data.u");
agHelper.GetNAssertElementText(CommonLocators._hints, "users");
agHelper.Sleep();
agHelper.TypeText(CommonLocators._codeMirrorTextArea, "sers[0].e");
agHelper.GetNAssertElementText(CommonLocators._hints, "email");
agHelper.Sleep();
agHelper.TypeText(CommonLocators._codeMirrorTextArea, "mail");
});
it("5. Local variables & complex data autocompletion test", () => {
// Using same js object
agHelper.SelectNRemoveLineText(CommonLocators._codeMirrorTextArea);
const users = [
{ label: "a", value: "b" },
{ label: "a", value: "b" },
];
const codeToType = `const users = ${JSON.stringify(users)};
const data = { userCollection: [{ users }, { users }] };
users.map(callBack);`;
// component re-render cause DOM element of cy.get to lost
// added wait to finish re-render before cy.get
agHelper.Sleep();
agHelper.GetNClick(jsEditor._lineinJsEditor(5));
agHelper.TypeText(CommonLocators._codeMirrorTextArea, codeToType);
agHelper.GetNClick(jsEditor._lineinJsEditor(7));
agHelper.TypeText(
CommonLocators._codeMirrorTextArea,
"const callBack = (user) => user.l",
);
agHelper.GetNAssertElementText(CommonLocators._hints, "label");
agHelper.TypeText(CommonLocators._codeMirrorTextArea, "abel;");
agHelper.TypeText(CommonLocators._codeMirrorTextArea, "data.");
agHelper.GetNAssertElementText(CommonLocators._hints, "userCollection");
agHelper.Sleep();
agHelper.GetNClickByContains(CommonLocators._hints, "userCollection");
agHelper.TypeText(CommonLocators._codeMirrorTextArea, "[0].");
agHelper.GetNAssertElementText(CommonLocators._hints, "users");
agHelper.Sleep();
agHelper.GetNClickByContains(CommonLocators._hints, "users");
agHelper.TypeText(CommonLocators._codeMirrorTextArea, "[0].");
agHelper.GetNAssertElementText(CommonLocators._hints, "label");
agHelper.GetNAssertElementText(
CommonLocators._hints,
"value",
"have.text",
1,
);
EntityExplorer.ActionContextMenuByEntityName(
"JSObject1",
"Delete",
"Are you sure?",
true,
);
EntityExplorer.ActionContextMenuByEntityName(
"Api1",
"Delete",
"Are you sure?",
);
});
});

View File

@ -14,8 +14,8 @@ describe("Autocomplete bug fixes", function() {
ee.SelectEntityByName("Text1");
propPane.TypeTextIntoField("Text", "{{Table1.");
agHelper.AssertElementExist(locator._hints);
agHelper.AssertElementText(locator._hints, "Best Match");
agHelper.AssertElementText(locator._hints, "selectedRow", 1);
agHelper.GetNAssertElementText(locator._hints, "Best Match");
agHelper.GetNAssertElementText(locator._hints, "selectedRow", "have.text", 1);
});
it("2. Bug #14990 Checks if copied widget show up on autocomplete suggestions", function() {
@ -24,8 +24,8 @@ describe("Autocomplete bug fixes", function() {
propPane.UpdatePropertyFieldValue("Text", "");
propPane.TypeTextIntoField("Text", "{{Te");
agHelper.AssertElementExist(locator._hints);
agHelper.AssertElementText(locator._hints, "Best Match");
agHelper.AssertElementText(locator._hints, "Text1Copy.text", 1);
agHelper.GetNAssertElementText(locator._hints, "Best Match");
agHelper.GetNAssertElementText(locator._hints, "Text1Copy.text", "have.text", 1);
});
it("3. Bug #14100 Custom columns name label change should reflect in autocomplete", function() {
@ -45,6 +45,6 @@ describe("Autocomplete bug fixes", function() {
// type {{Table1.selectedRow. and check for autocompletion suggestion having edited column name
propPane.TypeTextIntoField("Text", "{{Table1.selectedRow.");
agHelper.AssertElementText(locator._hints, "columnAlias", 1);
agHelper.GetNAssertElementText(locator._hints, "columnAlias", "have.text", 1);
});
});

View File

@ -0,0 +1,45 @@
import { ObjectsRegistry } from "../../../../support/Objects/Registry";
let agHelper = ObjectsRegistry.AggregateHelper,
locator = ObjectsRegistry.CommonLocators,
apiPage = ObjectsRegistry.ApiPage,
dataSources = ObjectsRegistry.DataSources;
let dsName: any;
const largeResponseApiUrl = "https://api.publicapis.org/entries";
//"https://jsonplaceholder.typicode.com/photos";//Commenting since this is faster sometimes & case is failing
const ERROR_ACTION_EXECUTE_FAIL = (actionName: any) =>
`${actionName} action returned an error response`;
describe("Abort Action Execution", function() {
it("1. Bug #14006 - Cancel Request button should abort API action execution", function() {
apiPage.CreateAndFillApi(largeResponseApiUrl, "AbortApi", 0);
apiPage.RunAPI(false, 0);
agHelper.GetNClick(locator._cancelActionExecution, 0, true);
agHelper.AssertContains(ERROR_ACTION_EXECUTE_FAIL("AbortApi"));
agHelper.ActionContextMenuWithInPane("Delete", "Are you sure?")
});
// Queries were resolving quicker than we could cancel them
// Commenting this out till we can find a query that resolves slow enough for us to cancel its execution.
it("2. Bug #14006 Cancel Request button should abort Query action execution", function() {
dataSources.CreateDataSource("MySql");
cy.get("@dsName").then(($dsName) => {
dsName = $dsName;
dataSources.CreateNewQueryInDS(
dsName,
"SELECT * FROM worldCountryInfo wc join countryFlags cf on wc.Name = cf.Country",
"AbortQuery",
);
dataSources.SetQueryTimeout(0);
dataSources.RunQuery(false, false, 0);
agHelper.GetNClick(locator._cancelActionExecution, 0, true);
agHelper.AssertContains(ERROR_ACTION_EXECUTE_FAIL("AbortQuery"));
agHelper.ActionContextMenuWithInPane("Delete", "Are you sure?")
dataSources.DeleteDatasouceFromWinthinDS(dsName);
});
});
});

View File

@ -4,13 +4,12 @@ const {
AggregateHelper: agHelper,
ApiPage: apiPage,
JSEditor: jsEditor,
EntityExplorer : ee
} = ObjectsRegistry;
describe("[Bug]: Catch block was not triggering in Safari/firefox", () => {
it("1. Triggers the catch block when the API hits a 404", () => {
apiPage.CreateAndFillApi("https://swapi.dev/api/people/18261826", "Api1");
cy.wait(3000);
apiPage.CreateAndFillApi("https://swapi.dev/api/people/18261826");
jsEditor.CreateJSObject(
`export default {
fun: async () => {
@ -24,6 +23,9 @@ describe("[Bug]: Catch block was not triggering in Safari/firefox", () => {
shouldCreateNewJSObj: true,
},
);
agHelper.WaitUntilToastDisappear("404 hit : Api1 failed to execute");
agHelper.AssertContains("404 hit : Api1 failed to execute");
agHelper.ActionContextMenuWithInPane("Delete", "Are you sure?", true);
ee.SelectEntityByName("Api1", "QUERIES/JS");
ee.ActionContextMenuByEntityName("Api1", "Delete");
});
});

View File

@ -29,7 +29,7 @@ describe("Entity explorer context menu should hide on scrolling", function() {
//clean up
ee.ActionContextMenuByEntityName("Query1", "Delete", "Are you sure?");
ee.ActionContextMenuByEntityName("Query2", "Delete", "Are you sure?");
ee.ActionContextMenuByEntityName("Movies", "Delete", "Are you sure?");
ee.ActionContextMenuByEntityName("Users", "Delete", "Are you sure?");
dataSources.DeleteDatasouceFromActiveTab("Movies");//Since sometimes after Queries are deleted, ds is no more visible in EE tree
dataSources.DeleteDatasouceFromActiveTab("Users");
});
});

View File

@ -76,9 +76,7 @@ describe("Linting", () => {
// create Api1
apiPage.CreateAndFillApi(
"https://jsonplaceholder.typicode.com/",
"",
"GET",
"https://jsonplaceholder.typicode.com/"
);
clickButtonAndAssertLintError(false);
@ -91,9 +89,7 @@ describe("Linting", () => {
// Re-create Api1
apiPage.CreateAndFillApi(
"https://jsonplaceholder.typicode.com/",
"",
"GET",
"https://jsonplaceholder.typicode.com/"
);
clickButtonAndAssertLintError(false);
@ -277,9 +273,7 @@ describe("Linting", () => {
},
);
apiPage.CreateAndFillApi(
"https://jsonplaceholder.typicode.com/",
"Api1",
"GET",
"https://jsonplaceholder.typicode.com/"
);
createMySQLDatasourceQuery();

View File

@ -1,10 +1,10 @@
import { ObjectsRegistry } from "../../../../support/Objects/Registry";
import homePage from "../../../../locators/HomePage";
let jsEditor = ObjectsRegistry.JSEditor,
agHelper = ObjectsRegistry.AggregateHelper,
ee = ObjectsRegistry.EntityExplorer;
const pages = require("../../../../locators/Pages.json");
ee = ObjectsRegistry.EntityExplorer,
homePage = ObjectsRegistry.HomePage,
locator = ObjectsRegistry.CommonLocators;
describe("JSEditor Indendation - Visual tests", () => {
// for any changes in UI, update the screenshot in snapshot folder, to do so:
@ -49,48 +49,26 @@ myFun2: async () => {
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
},
);
cy.get("[name='expand-more']")
.eq(1)
.click({ force: true });
agHelper.GetNClick("[name='expand-more']", 1, true, 100);
agHelper.WaitUntilEleDisappear(locator._toastMsg);
cy.get("div.CodeMirror").matchImageSnapshot("jsObjBeforePrettify6");
cy.get(".t--more-action-menu")
.first()
.click();
cy.contains("Prettify Code")
.trigger("click")
.wait(3000); //allowing time to prettify!
agHelper.ActionContextMenuWithInPane("Prettify Code");
agHelper.Sleep(2000); //allowing time to prettify!
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify6");
// taking a snap after clicking inside the editor to make sure prettify has not reverted
cy.get("div.CodeMirror").click();
agHelper.GetNClick(jsEditor._lineinJsEditor(26));
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify6");
cy.wait(2000);
cy.NavigateToHome();
cy.wait(2000);
cy.get(homePage.searchInput).type(appname);
// eslint-disable-next-line cypress/no-unnecessary-waiting
cy.wait(2000);
cy.get(homePage.applicationCard)
.first()
.trigger("mouseover");
cy.get(homePage.appMoreIcon)
.first()
.click({ force: true });
cy.get(homePage.duplicateApp).click({ force: true });
cy.CheckAndUnfoldEntityItem("QUERIES/JS");
cy.SearchEntityandOpen("JSObject1");
cy.wait(3000);
cy.get("[name='expand-more']")
.eq(1)
.click({ force: true });
homePage.NavigateToHome();
homePage.DuplicateApplication(appname);
agHelper.WaitUntilEleDisappear(locator._toastMsg);
ee.SelectEntityByName("JSObject1", "QUERIES/JS");
agHelper.GetNClick("[name='expand-more']", 1, true, 100);
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify6");
});
@ -130,35 +108,25 @@ myFun2: async () => {
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
},
);
cy.get("[name='expand-more']")
.eq(1)
.click({ force: true });
agHelper.GetNClick("[name='expand-more']", 1, true, 100);
cy.get("div.CodeMirror").matchImageSnapshot("jsObjBeforePrettify7");
cy.get(".t--more-action-menu")
.first()
.click();
cy.contains("Prettify Code")
.trigger("click")
.wait(3000); //allowing time to prettify!
agHelper.ActionContextMenuWithInPane("Prettify Code");
agHelper.Sleep(); //allowing time to prettify!
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify7");
// taking a snap after clicking inside the editor to make sure prettify has not reverted
cy.get("div.CodeMirror").click();
agHelper.GetNClick(jsEditor._lineinJsEditor(26));
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify7");
ee.ClonePage("Page1");
ee.SelectEntityByName("JSObject1", "QUERIES/JS");
cy.wait(3000);
cy.get("[name='expand-more']")
.eq(1)
.click({ force: true });
agHelper.Sleep(3000);
agHelper.GetNClick("[name='expand-more']", 1, true, 100);
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify7");
});
@ -183,25 +151,19 @@ return Promise.all(allFuncs).then(() => showAlert("Wonderful! all apis executed"
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
},
);
cy.get("[name='expand-more']")
.eq(1)
.click({ force: true });
agHelper.GetNClick("[name='expand-more']", 1, true, 100);
cy.get("div.CodeMirror").matchImageSnapshot("jsObjBeforePrettify1");
cy.get(".t--more-action-menu")
.first()
.click();
cy.contains("Prettify Code")
.trigger("click")
.wait(3000); //allowing time to prettify!
agHelper.ActionContextMenuWithInPane("Prettify Code");
agHelper.Sleep(2000); //allowing time to prettify!
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify1");
// taking a snap after clicking inside the editor to make sure prettify has not reverted
cy.get("div.CodeMirror").click();
agHelper.GetNClick("div.CodeMirror");
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify1");
});
@ -241,41 +203,31 @@ myFun2: async () => {
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
},
);
cy.get("[name='expand-more']")
.eq(1)
.click({ force: true });
agHelper.GetNClick("[name='expand-more']", 1, true, 100);
cy.get("div.CodeMirror").matchImageSnapshot("jsObjBeforePrettify2");
cy.get(".t--more-action-menu")
.first()
.click();
cy.contains("Prettify Code")
.trigger("click")
.wait(3000); //allowing time to prettify!
agHelper.ActionContextMenuWithInPane("Prettify Code");
agHelper.Sleep(2000); //allowing time to prettify!
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify2");
// taking a snap after clicking inside the editor to make sure prettify has not reverted
cy.get("div.CodeMirror").click();
agHelper.GetNClick(jsEditor._lineinJsEditor(26));
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify2");
// click run button and take a snap to make sure prettify did not revert
cy.contains("Run")
.click({ force: true })
.wait(3000); // allow time to run
agHelper.GetNClick(jsEditor._runButton);
agHelper.Sleep(); // allow time to run
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify2");
// click dropdown to change function and make sure prettify has not reverted
cy.get("[name='expand-more']")
.eq(0)
.click({ force: true });
cy.contains("myFun2").trigger("click");
agHelper.GetNClick("[name='expand-more']", 0, true, 100);
agHelper.ContainsNClick("myFun2");
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify2");
agHelper.WaitUntilToastDisappear("ran successfully");
agHelper.AssertContains("ran successfully");
});
it("3. TC 1863 : JSEditor validation for Prettify Code with lint errors, triggered by keyboard shortcut", () => {
@ -302,26 +254,24 @@ myFun2: async () => {
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
},
);
cy.get("[name='expand-more']")
.eq(1)
.click({ force: true });
agHelper.GetNClick("[name='expand-more']", 1, true, 100);
cy.get("div.CodeMirror")
.wait(1000)
.matchImageSnapshot("jsObjBeforePrettify3");
cy.get("div.CodeMirror").type("{shift+cmd+p}");
agHelper.WaitUntilEleDisappear(locator._toastMsg);
cy.get("div.CodeMirror").type("{shift+cmd+p}");
cy.get("div.CodeMirror")
.wait(1000)
.matchImageSnapshot("jsObjAfterPrettify3");
// taking a snap after clicking inside the editor to make sure prettify has not reverted
cy.get("div.CodeMirror")
.click()
.wait(1000);
agHelper.GetNClick("div.CodeMirror");
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify3");
});
@ -363,42 +313,34 @@ myFun2: async () => {
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
},
);
cy.get("[name='expand-more']")
.eq(1)
.click({ force: true });
agHelper.GetNClick("[name='expand-more']", 1, true, 100);
agHelper.WaitUntilEleDisappear(locator._toastMsg);
cy.get("div.CodeMirror").matchImageSnapshot("jsObjBeforePrettify4");
cy.get("div.CodeMirror")
.type("{shift+cmd+p}")
.wait(1000);
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify4");
// taking a snap after clicking inside the editor to make sure prettify has not reverted
cy.get("div.CodeMirror")
.click()
.wait(1000);
agHelper.GetNClick(jsEditor._lineinJsEditor(26));
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify4_1");
// click run button and take a snap to make sure prettify did not revert
cy.contains("Run")
.click({ force: true })
.wait(3000); // allow time to run
agHelper.GetNClick(jsEditor._runButton);
agHelper.Sleep(); // allow time to run
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify4_1");
// click dropdown to change function and make sure prettify has not reverted
// click dropdown to change function and make sure prettify has not reverted
cy.get("[name='expand-more']")
.eq(0)
.click({ force: true });
cy.contains("myFun2")
.trigger("click")
.wait(1000);
agHelper.GetNClick("[name='expand-more']", 0, true, 100);
agHelper.ContainsNClick("myFun2");
cy.get("div.CodeMirror").matchImageSnapshot("jsObjAfterPrettify4_1");
agHelper.WaitUntilToastDisappear("ran successfully");
agHelper.AssertContains("ran successfully");
});
it("5. TC 1862 - JSEditor validation for goLineStartSmart with no errors, triggered by keyboard shortcut", () => {
@ -409,10 +351,7 @@ myFun2: async () => {
shouldCreateNewJSObj: true,
});
cy.get("[name='expand-more']")
.eq(1)
.click({ force: true });
agHelper.GetNClick("[name='expand-more']", 1, true, 100);
cy.get("div.CodeMirror").matchImageSnapshot("jsObjBeforeGoLineStartSmart5");
cy.get("div.CodeMirror").type("{cmd+leftArrow}");

View File

@ -16,8 +16,8 @@ describe("Table Widget text wrapping functionality", function() {
cy.editColumn("image");
cy.get(".t--property-control-cellwrapping .bp3-control-indicator")
.first()
.click();
.click({ force: true });
cy.wait(1000);
cy.getTableCellHeight(1, 0).then((height) => {
expect(height).to.not.equal("28px");
});
@ -36,9 +36,10 @@ describe("Table Widget text wrapping functionality", function() {
cy.openPropertyPane("tablewidgetv2");
cy.wait(2000);
cy.editColumn("email");
cy.get(".t--property-control-cellwrapping .bp3-control-indicator")
.first()
.click();
cy.get(".t--property-control-cellwrapping .bp3-control-indicator").click({
force: true,
});
cy.wait(1000);
cy.getTableCellHeight(2, 0).then((height) => {
expect(height).to.not.equal("28px");
});

View File

@ -93,7 +93,7 @@ describe("Validate API request body panel", () => {
apiPage.CreateAndFillApi(
"https://api.cloudinary.com/v1_1/appsmithautomationcloud/image/upload?upload_preset=fbbhg4xu",
"CloudinaryUploadApi",
"POST",
30000, "POST"
);
apiPage.EnterBodyFormData(
"MULTIPART_FORM_DATA",

View File

@ -1,7 +1,11 @@
const datasource = require("../../../../locators/DatasourcesEditor.json");
const queryEditor = require("../../../../locators/QueryEditor.json");
const datasourceEditor = require("../../../../locators/DatasourcesEditor.json");
import { ObjectsRegistry } from "../../../../support/Objects/Registry";
let agHelper = ObjectsRegistry.AggregateHelper,
dataSources = ObjectsRegistry.DataSources;
let datasourceName;
describe("Arango datasource test cases", function() {
@ -13,13 +17,8 @@ describe("Arango datasource test cases", function() {
cy.NavigateToDatasourceEditor();
cy.get(datasource.ArangoDB).click();
cy.getPluginFormsAndCreateDatasource();
cy.renameDatasource("ArangoWithnoTrailing");
cy.fillArangoDBDatasourceForm();
cy.generateUUID().then((UUID) => {
datasourceName = `Arango MOCKDS ${UUID}`;
cy.renameDatasource(datasourceName);
});
cy.get("@createDatasource").then((httpResponse) => {
datasourceName = httpResponse.response.body.data.name;
});
@ -27,20 +26,20 @@ describe("Arango datasource test cases", function() {
fixture: "testAction.json",
}).as("testDatasource");
cy.testSaveDatasource(false);
dataSources.DeleteDatasouceFromActiveTab("ArangoWithnoTrailing");
});
it("2. Create with trailing white spaces in host address and database name, test, save then delete a Arango datasource", function() {
cy.NavigateToDatasourceEditor();
cy.get(datasource.ArangoDB).click();
cy.getPluginFormsAndCreateDatasource();
cy.renameDatasource("ArangoWithTrailing");
cy.fillArangoDBDatasourceForm(true);
cy.get("@createDatasource").then((httpResponse) => {
datasourceName = httpResponse.response.body.data.name;
});
cy.intercept("POST", "/api/v1/datasources/test", {
fixture: "testAction.json",
}).as("testDatasource");
cy.testSaveDatasource(false);
//dataSources.DeleteDatasouceFromActiveTab("ArangoWithTrailing");
});
it("3. Create a new query from the datasource editor", function() {
@ -53,9 +52,16 @@ describe("Arango datasource test cases", function() {
"response.body.responseMeta.status",
201,
);
cy.deleteQueryUsingContext();
cy.deleteDatasource("ArangoWithTrailing");
});
cy.deleteDatasource(datasourceName);
it("4. Arango Default name change", () => {
dataSources.NavigateToDSCreateNew();
dataSources.CreatePlugIn("ArangoDB");
agHelper
.GetText(dataSources._databaseName, "val")
.then(($dbName) => expect($dbName).to.eq("default"));
dataSources.DeleteDSDirectly();
});
});

View File

@ -12,9 +12,7 @@ describe("Google Sheets datasource test cases", function() {
"Read, Edit and Create Files",
"Read, Edit, Create and Delete Files",
]);
agHelper.ClickButton("Delete");
agHelper.ClickButton("Are you sure?");
agHelper.ValidateToastMessage("deleted successfully");
dataSources.DeleteDSDirectly();
});
function VerifyFunctionDropdown(scopeOptions: string[]) {

View File

@ -1,6 +1,6 @@
import { ObjectsRegistry } from "../../../../support/Objects/Registry";
let guid: any, dsName: any;
let dsName: any;
let agHelper = ObjectsRegistry.AggregateHelper,
ee = ObjectsRegistry.EntityExplorer,
@ -91,7 +91,7 @@ describe("Validate Mongo CRUD with JSON Form", () => {
) {
agHelper.GetNClick(dataSources._generatePageBtn);
agHelper.ValidateNetworkStatus("@replaceLayoutWithCRUDPage", 201);
//agHelper.ValidateToastMessage("Successfully generated a page");// Commenting this since FindQuery failure appears sometimes
agHelper.AssertContains("Successfully generated a page");// Commenting this since FindQuery failure appears sometimes
agHelper.ValidateNetworkStatus("@getActions", 200);
agHelper.ValidateNetworkStatus("@postExecute", 200);
agHelper.ValidateNetworkStatus("@updateLayout", 200);

View File

@ -157,7 +157,7 @@ describe("Validate MySQL Generate CRUD with JSON Form", () => {
agHelper.GetNClick(dataSources._selectTableDropdown);
agHelper.GetNClickByContains(dataSources._dropdownOption, "productlines");
agHelper.GetNClick(dataSources._generatePageBtn);
agHelper.ValidateToastMessage("Successfully generated a page");
agHelper.AssertContains("Successfully generated a page");
agHelper.ValidateNetworkStatus("@replaceLayoutWithCRUDPage", 201);
agHelper.ValidateNetworkStatus("@getActions", 200);
agHelper.ValidateNetworkStatus("@postExecute", 200);
@ -452,8 +452,10 @@ describe("Validate MySQL Generate CRUD with JSON Form", () => {
//agHelper.AssertElementVisible(locator._jsonFormWidget, 1); //Insert Modal at index 1
agHelper.AssertElementVisible(locator._visibleTextDiv("Insert Row"));
agHelper.ClickButton("Submit");
agHelper.ValidateToastMessage("Column 'store_id' cannot be null");
agHelper.AssertContains("Column 'store_id' cannot be null");
agHelper.AssertContains("error response");
agHelper.WaitUntilEleDisappear(locator._toastMsg);
deployMode.EnterJSONInputValue("Store Id", "2106");
deployMode.EnterJSONInputValue("Name", "Keokuk Spirits", 1);
cy.xpath(deployMode._jsonFormRadioFieldByName("Store Status"))
@ -470,7 +472,7 @@ describe("Validate MySQL Generate CRUD with JSON Form", () => {
.should("eq", "password");
agHelper.ClickButton("Submit");
agHelper.ValidateToastMessage("Duplicate entry '2106' for key 'PRIMARY'");
agHelper.AssertContains("Duplicate entry '2106' for key 'PRIMARY'");
cy.xpath(deployMode._jsonFormFieldByName("Store Id", true))
.clear()
@ -594,8 +596,8 @@ describe("Validate MySQL Generate CRUD with JSON Form", () => {
) {
agHelper.GetNClick(dataSources._generatePageBtn);
agHelper.ValidateNetworkStatus("@replaceLayoutWithCRUDPage", 201);
agHelper.ValidateToastMessage("Successfully generated a page");
agHelper.ValidateNetworkStatus("@getActions", 200);
agHelper.AssertContains("Successfully generated a page");
//agHelper.ValidateNetworkStatus("@getActions", 200);//Since failing sometimes
agHelper.ValidateNetworkStatus("@postExecute", 200);
agHelper.ValidateNetworkStatus("@updateLayout", 200);

View File

@ -391,17 +391,18 @@ describe("Validate Postgres Generate CRUD with JSON Form", () => {
deployMode.ClearJSONFieldValue("Current Port");
agHelper.ClickButton("Update");
agHelper.WaitUntilToastDisappear(
agHelper.AssertContains(
`null value in column "vessel_type" violates not-null constraint`,
);
deployMode.SelectJsonFormDropDown("Passenger");
deployMode.ClearJSONFieldValue("Distance To Go");
agHelper.ClickButton("Update");
agHelper.WaitUntilToastDisappear(
agHelper.AssertContains(
`null value in column "distance_to_go" violates not-null constraint`,
);
deployMode.EnterJSONInputValue("Distance To Go", "7.4");
agHelper.WaitUntilEleDisappear(locator._toastMsg); //for previous case toasts for next Update to be Success!!
updateNVerify(8, 3, "");
});
@ -599,7 +600,7 @@ describe("Validate Postgres Generate CRUD with JSON Form", () => {
deployMode.EnterJSONInputValue("Shipname", "MALTESE FALCON", 1);
agHelper.ClickButton("Submit");
agHelper.WaitUntilToastDisappear(
agHelper.AssertContains(
`duplicate key value violates unique constraint "vessels_pkey"`,
);
@ -706,8 +707,8 @@ describe("Validate Postgres Generate CRUD with JSON Form", () => {
) {
agHelper.GetNClick(dataSources._generatePageBtn);
agHelper.ValidateNetworkStatus("@replaceLayoutWithCRUDPage", 201);
agHelper.ValidateToastMessage("Successfully generated a page");
agHelper.ValidateNetworkStatus("@getActions", 200);
agHelper.AssertContains("Successfully generated a page");
//agHelper.ValidateNetworkStatus("@getActions", 200);//Since failing sometimes
agHelper.ValidateNetworkStatus("@postExecute", 200);
agHelper.ValidateNetworkStatus("@updateLayout", 200);

View File

@ -84,6 +84,7 @@ describe("JS Function Execution", function() {
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
},
);
@ -103,6 +104,7 @@ describe("JS Function Execution", function() {
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
},
);
@ -129,6 +131,7 @@ describe("JS Function Execution", function() {
completeReplace: true,
toRun: true,
shouldCreateNewJSObj: true,
prettify: false,
});
// Assert presence of function execution parse error callout
@ -140,6 +143,7 @@ describe("JS Function Execution", function() {
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: false,
prettify: false,
});
agHelper.Sleep(2000); // Giving more time for parsing to reduce flakiness!
@ -152,7 +156,7 @@ describe("JS Function Execution", function() {
it("4. Shows lint error and toast modal when JS Object doesn't start with 'export default'", () => {
const invalidJSObjectStartToastMessage = "Start object with export default";
const jsComment = "// This is a comment";
const jsObjectStartLine = "export default{";
const jsObjectStartLine = `export default{`;
const jsObjectStartLineWithSpace = `export  default{`;
const jsObjectStartingWithAComment = `${jsComment}
${jsObjectStartLine}
@ -163,7 +167,7 @@ describe("JS Function Execution", function() {
}`;
const jsObjectStartingWithANewLine = `
${jsObjectStartLine}
${jsObjectStartLine}
fun1:()=>true
}`;
@ -178,16 +182,21 @@ describe("JS Function Execution", function() {
toRun: false,
shouldCreateNewJSObj: true,
});
agHelper.WaitUntilToastDisappear("created successfully"); //to not hinder with other toast msgs in this case!
// Assert presence of toast message
agHelper.WaitUntilToastDisappear(invalidJSObjectStartToastMessage);
// Assert presence of lint error at the start line
cy.get(locator._lintErrorElement)
.should("exist")
.should("contain.text", highlightedLintText);
agHelper.GetNAssertElementText(
locator._lintErrorElement,
highlightedLintText,
"contain.text", -1
);
agHelper.ActionContextMenuWithInPane("Delete", "", true);
agHelper.WaitUntilToastDisappear("deleted successfully");
};
agHelper.WaitUntilEleDisappear(locator._toastMsg); //for previous case toasts!!
assertInvalidJSObjectStart(jsObjectStartingWithAComment, jsComment);
assertInvalidJSObjectStart(jsObjectStartingWithANewLine, jsObjectStartLine);
assertInvalidJSObjectStart(
@ -201,16 +210,12 @@ describe("JS Function Execution", function() {
myVar1: [],
myVar2: {},
myFun1: () => {
//write code here
return Table1.unknown.name
}
}`;
return Table1.unknown.name`;
const JS_OBJECT_WITHOUT_PARSE_ERROR = `export default {
myVar1: [],
myVar2: {},
myFun1: () => {
//write code here
return Table1.unknown
}
}`;
@ -222,10 +227,11 @@ describe("JS Function Execution", function() {
// Create js object
jsEditor.CreateJSObject(JS_OBJECT_WITH_PARSE_ERROR, {
paste: true,
paste: false,
completeReplace: true,
toRun: true,
shouldCreateNewJSObj: true,
prettify: false,
});
// Assert that there is a function execution parse error
@ -233,37 +239,41 @@ describe("JS Function Execution", function() {
// click the debug icon
agHelper.GetNClick(jsEditor._debugCTA);
// Assert that errors tab is not empty
cy.contains("No signs of trouble here!").should("not.exist");
agHelper.AssertContains("No signs of trouble here!", "not.exist");
// Assert presence of typeError
cy.contains(
agHelper.AssertContains(
"TypeError: Cannot read properties of undefined (reading 'name')",
).should("exist");
"exist",
);
// Fix parse error and assert that debugger error is removed
jsEditor.EditJSObj(JS_OBJECT_WITHOUT_PARSE_ERROR);
jsEditor.EditJSObj(JS_OBJECT_WITHOUT_PARSE_ERROR, false);
agHelper.GetNClick(jsEditor._runButton);
agHelper.WaitUntilToastDisappear("ran successfully"); //to not hinder with next toast msg in next case!
agHelper.AssertContains("ran successfully"); //to not hinder with next toast msg in next case!
jsEditor.AssertParseError(false, true);
agHelper.GetNClick(locator._errorTab);
cy.contains(
agHelper.AssertContains(
"TypeError: Cannot read properties of undefined (reading 'name')",
).should("not.exist");
"not.exist",
);
// Switch back to response tab
agHelper.GetNClick(locator._responseTab);
// Re-introduce parse errors
jsEditor.EditJSObj(JS_OBJECT_WITH_PARSE_ERROR);
jsEditor.EditJSObj(JS_OBJECT_WITH_PARSE_ERROR + "}}", false);
agHelper.GetNClick(jsEditor._runButton);
// Assert that there is a function execution parse error
jsEditor.AssertParseError(true, true);
// Delete function
jsEditor.EditJSObj(JS_OBJECT_WITH_DELETED_FUNCTION);
jsEditor.EditJSObj(JS_OBJECT_WITH_DELETED_FUNCTION, false);
// Assert that parse error is removed from debugger when function is deleted
agHelper.GetNClick(locator._errorTab);
cy.contains(
agHelper.AssertContains(
"TypeError: Cannot read properties of undefined (reading 'name')",
).should("not.exist");
"not.exist",
);
agHelper.ActionContextMenuWithInPane("Delete", "", true);
});
it("6. Supports the use of large JSON data (doesn't crash)", () => {
@ -281,8 +291,8 @@ describe("JS Function Execution", function() {
});
// wait for 3 secs and assert that App doesn't crash
cy.wait(3000);
cy.contains(crashMessage).should("not.exist");
agHelper.Sleep(3000);
agHelper.AssertContains(crashMessage, "not.exist");
// Edit JSObject and run
jsEditor.CreateJSObject(" ", {
@ -307,6 +317,12 @@ describe("JS Function Execution", function() {
expect($cellData).to.eq("1"); //validating id column value - row 0
deployMode.NavigateBacktoEditor();
});
ee.ActionContextMenuByEntityName(
"JSObject1",
"Delete",
"Are you sure?",
true,
);
});
it("7. Doesn't cause cyclic dependency when function name is edited", () => {
@ -347,29 +363,31 @@ describe("JS Function Execution", function() {
}`;
jsEditor.CreateJSObject(syncJSCode, {
paste: true,
paste: false,
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
});
// change sync function name and test that cyclic dependency is not created
jsEditor.EditJSObj(syncJSCodeWithRenamedFunction1);
agHelper.AssertElementAbsence(locator._toastMsg);
jsEditor.EditJSObj(syncJSCodeWithRenamedFunction2);
agHelper.AssertElementAbsence(locator._toastMsg);
jsEditor.EditJSObj(syncJSCodeWithRenamedFunction1, false);
agHelper.AssertContains("Cyclic dependency", "not.exist");
jsEditor.EditJSObj(syncJSCodeWithRenamedFunction2, false);
agHelper.AssertContains("Cyclic dependency", "not.exist");
jsEditor.CreateJSObject(asyncJSCode, {
paste: true,
paste: false,
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
});
// change async function name and test that cyclic dependency is not created
jsEditor.EditJSObj(asyncJSCodeWithRenamedFunction1);
agHelper.AssertElementAbsence(locator._toastMsg);
jsEditor.EditJSObj(asyncJSCodeWithRenamedFunction2);
agHelper.AssertElementAbsence(locator._toastMsg);
jsEditor.EditJSObj(asyncJSCodeWithRenamedFunction1, false);
agHelper.AssertContains("Cyclic dependency", "not.exist");
jsEditor.EditJSObj(asyncJSCodeWithRenamedFunction2, false);
agHelper.AssertContains("Cyclic dependency", "not.exist");
});
it("8. Maintains order of async functions in settings tab alphabetically at all times", function() {
@ -403,6 +421,7 @@ describe("JS Function Execution", function() {
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
});
cy.get("@jsObjName").then((jsObjName: any) => {
@ -476,13 +495,12 @@ describe("JS Function Execution", function() {
}
ee.SelectEntityByName(jsObj, "QUERIES/JS");
agHelper.GetNClick(jsEditor._settingsTab);
assertAsyncFunctionsOrder(FUNCTIONS_SETTINGS_DEFAULT_DATA);
// rename functions and assert order
agHelper.GetNClick(jsEditor._codeTab);
jsEditor.EditJSObj(getJSObject(FUNCTIONS_SETTINGS_RENAMED_DATA));
jsEditor.EditJSObj(getJSObject(FUNCTIONS_SETTINGS_RENAMED_DATA), false);
agHelper.Sleep(3000);
agHelper.GetNClick(jsEditor._settingsTab);
assertAsyncFunctionsOrder(FUNCTIONS_SETTINGS_RENAMED_DATA);
@ -490,31 +508,30 @@ describe("JS Function Execution", function() {
it("10. Bug 13197: Verify converting async functions to sync resets all settings", () => {
const asyncJSCode = `export default {
myFun1 : async ()=>{
return "yes"
}
}`;
asyncToSync : async ()=>{
return "yes";`;
const syncJSCode = `export default {
myFun1 : ()=>{
return "yes"
asyncToSync : ()=>{
return "yes";
}
}`;
jsEditor.CreateJSObject(asyncJSCode, {
paste: true,
paste: false,
completeReplace: true,
toRun: false,
shouldCreateNewJSObj: true,
prettify: false,
});
// Switch to settings tab
agHelper.GetNClick(jsEditor._settingsTab);
// Enable all settings
jsEditor.EnableDisableAsyncFuncSettings("myFun1", true, true);
jsEditor.EnableDisableAsyncFuncSettings("asyncToSync", true, true);
// Modify js object
jsEditor.EditJSObj(syncJSCode);
jsEditor.EditJSObj(syncJSCode, false);
agHelper.RefreshPage();
cy.wait("@jsCollections").then(({ response }) => {

View File

@ -30,8 +30,8 @@ describe("JSObjects OnLoad Actions tests", function() {
it("2. Tc 54, 55 - Verify User enables only 'Before Function calling' & OnPage Load is Automatically enable after mapping done on JSOBject", function() {
jsEditor.CreateJSObject(
`export default {
getId: async () => {
return 8;
getEmployee: async () => {
return 2;
}
}`,
{
@ -41,34 +41,35 @@ describe("JSObjects OnLoad Actions tests", function() {
shouldCreateNewJSObj: true,
},
);
jsEditor.EnableDisableAsyncFuncSettings("getId", false, true); //Only before calling confirmation is enabled by User here
jsEditor.EnableDisableAsyncFuncSettings("getEmployee", false, true); //Only before calling confirmation is enabled by User here
dataSources.NavigateFromActiveDS(dsName, true);
agHelper.GetNClick(dataSources._templateMenu);
agHelper.RenameWithInPane("GetUser");
agHelper.RenameWithInPane("GetEmployee");
cy.get("@jsObjName").then((jsObjName) => {
jsName = jsObjName;
dataSources.EnterQuery(
"SELECT * FROM public.users where id = {{" +
"SELECT * FROM public.employees where employee_id = {{" +
jsObjName +
".getId.data}}",
".getEmployee.data}}",
);
ee.SelectEntityByName("Table1", "WIDGETS");
propPane.UpdatePropertyFieldValue("Table Data", "{{GetUser.data}}");
propPane.UpdatePropertyFieldValue("Table Data", "{{GetEmployee.data}}");
agHelper.ValidateToastMessage(
(("[" + jsName) as string) +
".getId, GetUser] will be executed automatically on page load",
"[GetEmployee, " +
(jsName as string) +
".getEmployee] will be executed automatically on page load",
);
deployMode.DeployApp();
agHelper.AssertElementVisible(jsEditor._dialog("Confirmation Dialog"));
agHelper.AssertElementVisible(
jsEditor._dialogBody((jsName as string) + ".getId"),
jsEditor._dialogBody((jsName as string) + ".getEmployee"),
);
agHelper.ClickButton("Yes");
agHelper.Sleep(1000);
});
agHelper.ValidateNetworkExecutionSuccess("@postExecute");
table.ReadTableRowColumnData(0, 0).then((cellData) => {
expect(cellData).to.be.equal("8");
expect(cellData).to.be.equal("2");
});
deployMode.NavigateBacktoEditor();
});
@ -76,37 +77,43 @@ describe("JSObjects OnLoad Actions tests", function() {
it("3. Tc 54, 55 - Verify OnPage Load - auto enabled from above case for JSOBject", function() {
agHelper.AssertElementVisible(jsEditor._dialog("Confirmation Dialog"));
agHelper.AssertElementVisible(
jsEditor._dialogBody((jsName as string) + ".getId"),
jsEditor._dialogBody((jsName as string) + ".getEmployee"),
);
agHelper.ClickButton("Yes");
//agHelper.Sleep(1000);
agHelper.ValidateToastMessage("getId ran successfully"); //Verify this toast comes in EDIT page only
agHelper.ValidateToastMessage("getEmployee ran successfully"); //Verify this toast comes in EDIT page only
ee.SelectEntityByName(jsName as string, "QUERIES/JS");
jsEditor.VerifyAsyncFuncSettings("getId", true, true);
jsEditor.VerifyAsyncFuncSettings("getEmployee", true, true);
});
it("4. Verify Error for OnPage Load - disable & Before Function calling enabled for JSOBject", function() {
ee.SelectEntityByName(jsName as string, "QUERIES/JS");
jsEditor.EnableDisableAsyncFuncSettings("getId", false, true);
jsEditor.EnableDisableAsyncFuncSettings("getEmployee", false, true);
deployMode.DeployApp(locator._widgetInDeployed("tablewidget"), false);
agHelper.WaitUntilToastDisappear('The action "GetUser" has failed');
agHelper.WaitUntilToastDisappear('The action "GetEmployee" has failed');
deployMode.NavigateBacktoEditor();
agHelper.WaitUntilToastDisappear('The action "GetUser" has failed');
agHelper.WaitUntilToastDisappear('The action "GetEmployee" has failed');
});
it("5. Tc 53 - Verify OnPage Load - Enabling back & Before Function calling disabled for JSOBject", function() {
ee.SelectEntityByName(jsName as string, "QUERIES/JS");
jsEditor.EnableDisableAsyncFuncSettings("getId", true, false);
jsEditor.EnableDisableAsyncFuncSettings("getEmployee", true, false);
agHelper.Sleep(2000); //to allow for changes to take effect!
agHelper.RefreshPage(); //For bug #
cy.wait("@jsCollections").then(({ response }) => {
expect(response?.body.data.actions[0].executeOnLoad).to.eq(true);
expect(response?.body.data.actions[0].confirmBeforeExecute).to.eq(false);
});
deployMode.DeployApp();
agHelper.AssertElementAbsence(jsEditor._dialog("Confirmation Dialog"));
agHelper.AssertElementAbsence(
jsEditor._dialogBody((jsName as string) + ".getId"),
jsEditor._dialogBody((jsName as string) + ".getEmployee"),
);
// assert that on view mode, we don't get "successful run" toast message for onpageload actions
agHelper.AssertElementAbsence(locator._toastMsg);
agHelper.ValidateNetworkExecutionSuccess("@postExecute");
table.ReadTableRowColumnData(0, 0).then((cellData) => {
expect(cellData).to.be.equal("8");
expect(cellData).to.be.equal("2");
});
deployMode.NavigateBacktoEditor();
});
@ -114,32 +121,32 @@ describe("JSObjects OnLoad Actions tests", function() {
it("6. Tc 55 - Verify OnPage Load - Enabling & Before Function calling Enabling for JSOBject", function() {
ee.ExpandCollapseEntity("QUERIES/JS");
ee.SelectEntityByName(jsName as string);
jsEditor.EnableDisableAsyncFuncSettings("getId", true, true);
jsEditor.EnableDisableAsyncFuncSettings("getEmployee", true, true);
deployMode.DeployApp();
agHelper.AssertElementVisible(jsEditor._dialog("Confirmation Dialog"));
agHelper.AssertElementVisible(
jsEditor._dialogBody((jsName as string) + ".getId"),
jsEditor._dialogBody((jsName as string) + ".getEmployee"),
);
agHelper.ClickButton("Yes");
agHelper.AssertElementAbsence(locator._toastMsg);
table.ReadTableRowColumnData(0, 0, 2000).then((cellData) => {
expect(cellData).to.be.equal("8");
expect(cellData).to.be.equal("2");
});
//agHelper.ValidateNetworkExecutionSuccess("@postExecute");
deployMode.NavigateBacktoEditor();
agHelper.AssertElementVisible(jsEditor._dialog("Confirmation Dialog"));
agHelper.AssertElementVisible(
jsEditor._dialogBody((jsName as string) + ".getId"),
jsEditor._dialogBody((jsName as string) + ".getEmployee"),
);
agHelper.ClickButton("Yes");
agHelper.ValidateToastMessage("getId ran successfully"); //Verify this toast comes in EDIT page only
agHelper.ValidateToastMessage("getEmployee ran successfully"); //Verify this toast comes in EDIT page only
});
it("7. Tc 56 - Verify OnPage Load - Enabled & Before Function calling Enabled for JSOBject & User clicks No in Confirmation dialog", function() {
deployMode.DeployApp();
agHelper.AssertElementVisible(jsEditor._dialog("Confirmation Dialog"));
agHelper.AssertElementVisible(
jsEditor._dialogBody((jsName as string) + ".getId"),
jsEditor._dialogBody((jsName as string) + ".getEmployee"),
);
agHelper.ClickButton("No");
agHelper.ValidateToastMessage("Failed to execute actions during page load"); //When Confirmation is NO
@ -147,21 +154,21 @@ describe("JSObjects OnLoad Actions tests", function() {
agHelper.RefreshPage();
agHelper.AssertElementVisible(jsEditor._dialog("Confirmation Dialog"));
agHelper.AssertElementVisible(
jsEditor._dialogBody((jsName as string) + ".getId"),
jsEditor._dialogBody((jsName as string) + ".getEmployee"),
);
agHelper.ClickButton("Yes");
agHelper.AssertElementAbsence(locator._toastMsg);
agHelper.ValidateNetworkExecutionSuccess("@postExecute");
table.ReadTableRowColumnData(0, 0).then((cellData) => {
expect(cellData).to.be.equal("8");
expect(cellData).to.be.equal("2");
});
deployMode.NavigateBacktoEditor();
agHelper.AssertElementVisible(jsEditor._dialog("Confirmation Dialog"));
agHelper.AssertElementVisible(
jsEditor._dialogBody((jsName as string) + ".getId"),
jsEditor._dialogBody((jsName as string) + ".getEmployee"),
);
agHelper.ClickButton("Yes");
agHelper.ValidateToastMessage("getId ran successfully"); //Verify this toast comes in EDIT page only
agHelper.ValidateToastMessage("getEmployee ran successfully"); //Verify this toast comes in EDIT page only
ee.SelectEntityByName(jsName as string, "QUERIES/JS");
ee.ActionContextMenuByEntityName(
@ -171,7 +178,7 @@ describe("JSObjects OnLoad Actions tests", function() {
true,
);
ee.ActionContextMenuByEntityName("GetUser", "Delete", "Are you sure?");
ee.ActionContextMenuByEntityName("GetEmployee", "Delete", "Are you sure?");
});
it("8. Tc 51, 52 Verify that JS editor function has a settings button available for functions marked async", () => {
@ -234,12 +241,14 @@ describe("JSObjects OnLoad Actions tests", function() {
apiPage.CreateAndFillApi(
"https://api.forismatic.com/api/1.0/?method=getQuote&lang=en&format=json",
"Quotes",
30000,
);
apiPage.ToggleConfirmBeforeRunningApi(true);
apiPage.CreateAndFillApi(
"https://api.whatdoestrumpthink.com/api/v1/quotes/random",
"WhatTrumpThinks",
30000,
);
apiPage.ToggleConfirmBeforeRunningApi(true);
@ -368,7 +377,7 @@ describe("JSObjects OnLoad Actions tests", function() {
agHelper.ValidateToastMessage("Failed to execute actions during page load");
ee.ExpandCollapseEntity("QUERIES/JS");
apiPage.CreateAndFillApi("https://catfact.ninja/fact", "CatFacts");
apiPage.CreateAndFillApi("https://catfact.ninja/fact", "CatFacts", 30000);
apiPage.ToggleOnPageLoadRun(true);
apiPage.ToggleConfirmBeforeRunningApi(true);
@ -410,6 +419,7 @@ describe("JSObjects OnLoad Actions tests", function() {
apiPage.CreateAndFillApi(
"https://anapioficeandfire.com/api/books/{{this.params.id}}",
"getBooks",
30000,
);
//apiPage.OnPageLoadRun(true); //OnPageLoad made true after mapping to JSONForm
apiPage.ToggleConfirmBeforeRunningApi(true);

View File

@ -39,24 +39,30 @@ describe("Layout OnLoad Actions tests", function() {
apiPage.CreateAndFillApi(
"https://source.unsplash.com/collection/1599413",
"RandomFlora",
30000,
);
//apiPage.RunAPI();
apiPage.CreateAndFillApi("https://randomuser.me/api/", "RandomUser");
apiPage.CreateAndFillApi("https://randomuser.me/api/", "RandomUser", 30000);
//apiPage.RunAPI();
apiPage.CreateAndFillApi("https://favqs.com/api/qotd", "InspiringQuotes");
apiPage.CreateAndFillApi(
"https://favqs.com/api/qotd",
"InspiringQuotes",
30000,
);
apiPage.EnterHeader("dependency", "{{RandomUser.data}}"); //via Params tab
//apiPage.RunAPI();
apiPage.CreateAndFillApi(
"https://www.boredapi.com/api/activity",
"Suggestions",
30000,
);
apiPage.EnterHeader("dependency", "{{InspiringQuotes.data}}");
//apiPage.RunAPI();
apiPage.CreateAndFillApi("https://api.genderize.io", "Genderize");
apiPage.CreateAndFillApi("https://api.genderize.io", "Genderize", 30000);
apiPage.EnterParams("name", "{{RandomUser.data.results[0].name.first}}"); //via Params tab
//apiPage.RunAPI();
@ -168,7 +174,7 @@ describe("Layout OnLoad Actions tests", function() {
apiPage.CreateAndFillApi(
"https://api.genderize.io?name={{RandomUser.data.results[0].name.first}}",
"Genderize",
"Genderize", 30000
);
apiPage.ValidateQueryParams({
key: "name",

View File

@ -684,7 +684,7 @@ describe("Validate Mongo Query Pane Validations", () => {
},
"birth": ISODate("1927-09-04T04:00:00Z"),
"death": ISODate("2011-12-24T05:00:00Z"),
"issue": 13285
"issue": 13286
},
{
"name": {
@ -694,7 +694,7 @@ describe("Validate Mongo Query Pane Validations", () => {
"title": "Rear Admiral",
"birth": ISODate("1906-12-09T05:00:00Z"),
"death": ISODate("1992-01-01T05:00:00Z"),
"issue": 13285
"issue": 13287
},
{
"name": {
@ -703,7 +703,7 @@ describe("Validate Mongo Query Pane Validations", () => {
},
"birth": ISODate("1926-08-27T04:00:00Z"),
"death": ISODate("2002-08-10T04:00:00Z"),
"issue": 13285
"issue": 13288
}
]`;
@ -760,6 +760,11 @@ describe("Validate Mongo Query Pane Validations", () => {
dataSources.EnterQuery(dropCollection);
agHelper.FocusElement(locator._codeMirrorTextArea);
dataSources.RunQuery();
ee.ExpandCollapseEntity("DATASOURCES");
ee.ExpandCollapseEntity(dsName);
ee.ActionContextMenuByEntityName(dsName, "Refresh");
agHelper.AssertElementAbsence(ee._entityNameInExplorer("BirthNDeath"));
});
it("20. Verify Deletion of the datasource", () => {
@ -780,7 +785,7 @@ describe("Validate Mongo Query Pane Validations", () => {
) {
agHelper.GetNClick(dataSources._generatePageBtn);
agHelper.ValidateNetworkStatus("@replaceLayoutWithCRUDPage", 201);
agHelper.ValidateToastMessage("Successfully generated a page");
agHelper.AssertContains("Successfully generated a page");
agHelper.ValidateNetworkStatus("@getActions", 200);
agHelper.ValidateNetworkStatus("@postExecute", 200);
agHelper.ValidateNetworkStatus("@updateLayout", 200);

View File

@ -0,0 +1,11 @@
--- Cypress/resources/app/node_modules/http-proxy/lib/http-proxy/passes/ws-incoming.js
+++ Cypress/resources/app/node_modules/http-proxy/lib/http-proxy/passes/ws-incoming.js
@@ -111,7 +111,7 @@ module.exports = {
proxyReq.on('error', onOutgoingError);
proxyReq.on('response', function (res) {
// if upgrade event isn't going to happen, close the socket
- if (!res.upgrade && !socket.destroyed) {
+ if (!res.upgrade && socket.readyState === socket.OPEN && !socket.destroyed) {
socket.write(createHttpHeader('HTTP/' + res.httpVersion + ' ' + res.statusCode + ' ' + res.statusMessage, res.headers));
res.pipe(socket);
}

View File

@ -1,17 +0,0 @@
{
"indexes": [
{
"v": {
"$numberInt": "2"
},
"key": {
"_id": {
"$numberInt": "1"
}
},
"name": "_id_"
}
],
"uuid": "8474766f7d1d4e548747ccf36a197261",
"collectionName": "listingAndReviews"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View File

@ -83,4 +83,6 @@ export class CommonLocators {
_jsonToggle = (fieldName: string) => `//p[text()='${fieldName}']/parent::div//following-sibling::div//input[@type='checkbox']`
_deployedPage = `.t--page-switch-tab`
_hints = "ul.CodeMirror-hints li"
_cancelActionExecution = ".t--cancel-action-button"
}

View File

@ -17,6 +17,13 @@ const DEFAULT_ENTERVALUE_OPTIONS = {
export class AggregateHelper {
private locator = ObjectsRegistry.CommonLocators;
private isMac = Cypress.platform === "darwin";
private selectLine = `${
this.isMac
? "{cmd}{shift}{leftArrow}{backspace}"
: "{shift}{home}{backspace}"
}`;
public SaveLocalStorageCache() {
Object.keys(localStorage).forEach((key) => {
LOCAL_STORAGE_MEMORY[key] = localStorage[key];
@ -110,11 +117,17 @@ export class AggregateHelper {
});
}
public AssertElementText(selector: string, text: string, index = 0) {
public GetNAssertElementText(
selector: string,
text: string,
textPresence: "have.text" | "contain.text" | "not.have.text" = "have.text",
index = 0,
) {
const locator = selector.startsWith("//")
? cy.xpath(selector)
: cy.get(selector);
locator.eq(index).should("have.text", text);
if (index >= 0) locator.eq(index).should(textPresence, text);
else locator.should(textPresence, text);
}
public ValidateToastMessage(text: string, index = 0, length = 1) {
@ -166,18 +179,18 @@ export class AggregateHelper {
public WaitUntilEleDisappear(
selector: string,
msgToCheckforDisappearance: string | "",
msgToCheckforDisappearance: string | "" = "",
) {
cy.waitUntil(
() => (selector.includes("//") ? cy.xpath(selector) : cy.get(selector)),
{
errorMsg: msgToCheckforDisappearance + " did not disappear",
timeout: 5000,
//errorMsg: msgToCheckforDisappearance + " did not disappear",
timeout: 10000,
interval: 1000,
},
).then(($ele) => {
cy.wrap($ele)
.contains(msgToCheckforDisappearance)
//.contains(msgToCheckforDisappearance)
.should("have.length", 0);
this.Sleep();
});
@ -404,6 +417,27 @@ export class AggregateHelper {
.wait(waitTimeInterval);
}
public SelectNRemoveLineText(selector: string) {
const locator = selector.startsWith("//")
? cy.xpath(selector)
: cy.get(selector);
return locator.type(this.selectLine);
}
public TypeText(selector: string, value: string, index = 0, force = false) {
const locator = selector.startsWith("//")
? cy.xpath(selector)
: cy.get(selector);
return locator
.eq(index)
.focus()
.type(value, {
parseSpecialCharSequences: false,
delay: 1,
force: true,
});
}
public ContainsNClick(
text: string,
index = 0,
@ -529,13 +563,16 @@ export class AggregateHelper {
subAction = "Are you sure?";
}
if (subAction) {
cy.xpath(this.locator._contextMenuSubItemDiv(subAction)).click({ force: true });
cy.xpath(this.locator._contextMenuSubItemDiv(subAction)).click({
force: true,
});
this.Sleep(500);
}
if (action == "Delete") {
!jsDelete && this.ValidateNetworkStatus("@deleteAction");
jsDelete && this.ValidateNetworkStatus("@deleteJSCollection");
jsDelete && this.WaitUntilToastDisappear("deleted successfully");
jsDelete && this.AssertContains("deleted successfully");
//jsDelete && this.WaitUntilToastDisappear("deleted successfully");
}
}
@ -739,7 +776,7 @@ export class AggregateHelper {
const locator = selector.startsWith("//")
? cy.xpath(selector)
: cy.get(selector);
locator
return locator
.eq(index)
.scrollIntoView()
.should("be.visible");

View File

@ -68,15 +68,15 @@ export class ApiPage {
CreateAndFillApi(
url: string,
apiName = "",
queryTimeout = 10000,
apiVerb: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" = "GET",
queryTimeout = 30000,
) {
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");
this.SetAPITimeout(queryTimeout);
if (queryTimeout != 10000) this.SetAPITimeout(queryTimeout);
}
EnterURL(url: string) {
@ -157,9 +157,10 @@ export class ApiPage {
this.agHelper.AssertAutoSave();
}
RunAPI() {
cy.get(this._apiRunBtn).click({ force: true });
this.agHelper.ValidateNetworkExecutionSuccess("@postExecute");
RunAPI(toValidateResponse = true, waitTimeInterval = 20) {
this.agHelper.GetNClick(this._apiRunBtn, 0, true, waitTimeInterval);
toValidateResponse &&
this.agHelper.ValidateNetworkExecutionSuccess("@postExecute");
}
SetAPITimeout(timeout: number) {
@ -204,10 +205,7 @@ export class ApiPage {
| "Authentication"
| "Settings",
) {
cy.xpath(this._visibleTextSpan(tabName))
.should("be.visible")
.eq(0)
.click();
this.agHelper.GetNClick(this._visibleTextSpan(tabName));
}
SelectSubTab(
@ -218,10 +216,7 @@ export class ApiPage {
| "MULTIPART_FORM_DATA"
| "RAW",
) {
cy.get(this._bodySubTab(subTabName))
.eq(0)
.should("be.visible")
.click();
this.agHelper.GetNClick(this._bodySubTab(subTabName));
}
ValidateQueryParams(param: { key: string; value: string }) {

View File

@ -19,7 +19,7 @@ export class DataSources {
".t--plugin-name:contains('" + pluginName + "')";
private _host = "input[name='datasourceConfiguration.endpoints[0].host']";
private _port = "input[name='datasourceConfiguration.endpoints[0].port']";
private _databaseName =
_databaseName =
"input[name='datasourceConfiguration.authentication.databaseName']";
private _username =
"input[name='datasourceConfiguration.authentication.username']";
@ -86,6 +86,8 @@ export class DataSources {
_gsScopeDropdown =
"[data-cy='datasourceConfiguration.authentication.scopeString']";
_gsScopeOptions = ".ads-dropdown-options-wrapper div > span div span";
private _queryTimeout =
"//input[@name='actionConfiguration.timeoutInMillisecond']";
public StartDataSourceRoutes() {
cy.intercept("PUT", "/api/v1/datasources/*").as("saveDatasource");
@ -173,11 +175,13 @@ export class DataSources {
}).as("testDatasource");
}
public CreatePlugIn(pluginName: string) {
public CreatePlugIn(pluginName: string, waitForToastDisappear = false) {
cy.get(this._createNewPlgin(pluginName))
.parent("div")
.trigger("click", { force: true });
this.agHelper.WaitUntilToastDisappear("datasource created");
if (waitForToastDisappear)
this.agHelper.WaitUntilToastDisappear("datasource created");
else this.agHelper.AssertContains("datasource created");
}
public NavigateToDSCreateNew() {
@ -264,15 +268,15 @@ export class DataSources {
}
public TestDatasource(expectedRes = true) {
cy.get(this._testDs).click();
this.agHelper.GetNClick(this._testDs, 0, false, 0);
this.agHelper.ValidateNetworkDataSuccess("@testDatasource", expectedRes);
this.agHelper.WaitUntilToastDisappear("datasource is valid");
this.agHelper.AssertContains("datasource is valid");
}
public SaveDatasource() {
cy.get(this._saveDs).click();
this.agHelper.ValidateNetworkStatus("@saveDatasource", 200);
this.agHelper.WaitUntilToastDisappear("datasource updated successfully");
this.agHelper.AssertContains("datasource updated successfully");
// cy.wait("@saveDatasource")
// .then((xhr) => {
@ -296,11 +300,14 @@ export class DataSources {
this.agHelper.GetNClick(this._contextMenuDelete);
this.agHelper.GetNClick(this._visibleTextSpan("Are you sure?"));
this.agHelper.ValidateNetworkStatus("@deleteDatasource", expectedRes);
if (expectedRes == 200)
this.agHelper.AssertContains("datasource deleted successfully");
else this.agHelper.AssertContains("action(s) using it.");
}
public DeleteDatasouceFromWinthinDS(
datasourceName: string,
expectedStatus = 200,
expectedRes = 200,
) {
this.NavigateToActiveTab();
cy.get(this._datasourceCard)
@ -311,7 +318,16 @@ export class DataSources {
this.agHelper.Sleep(2000); //for the Datasource page to open
this.agHelper.ClickButton("Delete");
this.agHelper.ClickButton("Are you sure?");
this.agHelper.ValidateNetworkStatus("@deleteDatasource", expectedStatus);
this.agHelper.ValidateNetworkStatus("@deleteDatasource", expectedRes);
if (expectedRes == 200)
this.agHelper.AssertContains("datasource deleted successfully");
else this.agHelper.AssertContains("action(s) using it.");
}
public DeleteDSDirectly() {
this.agHelper.ClickButton("Delete");
this.agHelper.ClickButton("Are you sure?");
this.agHelper.AssertContains("deleted successfully");
}
public NavigateToActiveTab() {
@ -382,13 +398,19 @@ export class DataSources {
cy.get(this._saveDs).click();
}
RunQuery(expectedStatus = true) {
cy.get(this._runQueryBtn).click({ force: true });
this.agHelper.Sleep(2000);
this.agHelper.ValidateNetworkExecutionSuccess(
"@postExecute",
expectedStatus,
);
RunQuery(
expectedStatus = true,
toValidateResponse = true,
waitTimeInterval = 500,
) {
this.agHelper.GetNClick(this._runQueryBtn, 0, true, waitTimeInterval);
if (toValidateResponse) {
this.agHelper.Sleep(1500);
this.agHelper.ValidateNetworkExecutionSuccess(
"@postExecute",
expectedStatus,
);
}
}
public ReadQueryTableResponse(index: number, timeout = 100) {
@ -490,4 +512,13 @@ export class DataSources {
this.agHelper.GetNClick(this._templateMenu);
this.EnterQuery(query);
}
public SetQueryTimeout(queryTimeout = 20000) {
this.agHelper.GetNClick(this._queryResponse("SETTINGS"));
cy.xpath(this._queryTimeout)
.clear()
.type(queryTimeout.toString(), { delay: 0 }); //Delay 0 to work like paste!
this.agHelper.AssertAutoSave();
this.agHelper.GetNClick(this._queryResponse("QUERY"));
}
}

View File

@ -93,11 +93,13 @@ export class EntityExplorer {
.invoke("attr", "name")
.then((arrow) => {
if (expand && arrow == "arrow-right")
cy.xpath(this._expandCollapseArrow(entityName)).eq(index)
cy.xpath(this._expandCollapseArrow(entityName))
.eq(index)
.trigger("click", { multiple: true })
.wait(1000);
else if (!expand && arrow == "arrow-down")
cy.xpath(this._expandCollapseArrow(entityName)).eq(index)
cy.xpath(this._expandCollapseArrow(entityName))
.eq(index)
.trigger("click", { multiple: true })
.wait(1000);
else this.agHelper.Sleep(500);
@ -115,10 +117,13 @@ export class EntityExplorer {
.last()
.click({ force: true });
cy.xpath(this._contextMenuItem(action)).click({ force: true });
this.agHelper.Sleep(500);
this.agHelper.Sleep(300);
if (action == "Delete") {
subAction = "Are you sure?";
}
if (subAction) {
cy.xpath(this._contextMenuItem(subAction)).click({ force: true });
this.agHelper.Sleep(500);
this.agHelper.Sleep(300);
}
if (action == "Delete") {
jsDelete && this.agHelper.ValidateNetworkStatus("@deleteJSCollection");

View File

@ -29,7 +29,7 @@ export class HomePage {
private _userRole = (role: string, workspaceName: string) =>
"//div[contains(@class, 'label-container')]//span[1][text()='" +
role + ' - ' + workspaceName + "']";
private _manageUsers = ".manageUsers";
private _appHome = "//a[@href='/applications']";
_applicationCard = ".t--application-card";
@ -158,11 +158,10 @@ export class HomePage {
public NavigateToHome() {
cy.get(this._homeIcon).click({ force: true });
this.agHelper.Sleep(3000);
this.agHelper.Sleep(2000);
//cy.wait("@applications"); this randomly fails & introduces flakyness hence commenting!
cy.get(this._homePageAppCreateBtn)
.should("be.visible")
.should("be.enabled");
this.agHelper.AssertElementVisible(this._homePageAppCreateBtn).then($ele=>
expect($ele).be.enabled);
}
public CreateNewApplication() {
@ -291,13 +290,13 @@ export class HomePage {
cy.xpath(this._visibleTextSpan("Members"))
.last()
.click({ force: true });
.click({ force: true });
cy.wait("@getMembers").should(
"have.nested.property",
"response.body.responseMeta.status",
200,
);
this.agHelper.Sleep(2500);
this.agHelper.Sleep(2500);
//wait for members page to load!
}
@ -312,13 +311,13 @@ export class HomePage {
cy.xpath(this._userRoleDropDown(currentRole, workspaceName))
.first()
.click({force:true})
//cy.xpath(this._userRoleDropDown(email)).first().click({force: true});
cy.xpath(this._visibleTextSpan(`${newRole} - ${workspaceName}`))
.last()
.click({ force: true });
this.agHelper.Sleep();
this.NavigateToHome();
this.NavigateToHome();
}
public ImportApp(fixtureJson: string, intoWorkspaceName = "") {
@ -362,7 +361,7 @@ export class HomePage {
);
this.agHelper.GetNClick(this._wsAction("Delete Workspace")); //Are you sure?
this.agHelper.GetNClick(this._wsAction("Are you sure?")); //
this.agHelper.ValidateToastMessage("Workspace deleted successfully");
this.agHelper.AssertContains("Workspace deleted successfully");
}
public AssertNCloseImport() {
@ -386,7 +385,7 @@ export class HomePage {
public DuplicateApplication(appliName: string) {
this.agHelper.GetNClick(this._applicationContextMenu(appliName));
this.agHelper.GetNClick(this._duplicateApp);
this.agHelper.WaitUntilToastDisappear("Duplicating application...");
this.agHelper.AssertContains("Duplicating application...");
}
public DeleteApplication(appliName: string) {

View File

@ -86,6 +86,8 @@ export class JSEditor {
`${JSFunctionName}-settings`;
_asyncJSFunctionSettings = `.t--async-js-function-settings`;
_debugCTA = `button.js-editor-debug-cta`;
_lineinJsEditor = (lineNumber: number) =>
":nth-child(" + lineNumber + ") > .CodeMirror-line";
//#endregion
//#region constants
@ -113,7 +115,8 @@ export class JSEditor {
cy.get(this._jsObjTxt).should("not.exist");
//cy.waitUntil(() => cy.get(this.locator._toastMsg).should('not.be.visible')) // fails sometimes
this.agHelper.WaitUntilToastDisappear("created successfully"); //to not hinder with other toast msgs!
//this.agHelper.WaitUntilToastDisappear("created successfully"); //to not hinder with other toast msgs!
this.agHelper.AssertContains("created successfully");
this.agHelper.Sleep();
}
@ -143,6 +146,8 @@ export class JSEditor {
.focus()
.type(this.selectAllJSObjectContentShortcut)
.type("{backspace}", { force: true });
this.agHelper.AssertContains("Start object with export default");
this.agHelper.AssertAutoSave();
}
cy.get(this.locator._codeMirrorTextArea)
@ -154,7 +159,7 @@ export class JSEditor {
} else {
cy.get(el).type(JSCode, {
parseSpecialCharSequences: false,
delay: 100,
delay: 50,
force: true,
});
}
@ -179,7 +184,7 @@ export class JSEditor {
}
//Edit the name of a JSObject's property (variable or function)
public EditJSObj(newContent: string) {
public EditJSObj(newContent: string, toPrettify = true) {
cy.get(this.locator._codeMirrorTextArea)
.first()
.focus()
@ -187,8 +192,8 @@ export class JSEditor {
.then((el: JQuery<HTMLElement>) => {
this.agHelper.Paste(el, newContent);
});
this.agHelper.Sleep(2000);//Settling time for edited js code
this.agHelper.ActionContextMenuWithInPane("Prettify Code");
this.agHelper.Sleep(2000); //Settling time for edited js code
toPrettify && this.agHelper.ActionContextMenuWithInPane("Prettify Code");
this.agHelper.AssertAutoSave();
}

View File

@ -76,7 +76,7 @@ export class PropertyPane {
public ChangeTheme(newTheme: string) {
this.agHelper.GetNClick(this._changeThemeBtn, 0, true);
this.agHelper.GetNClick(this._themeCard(newTheme));
this.agHelper.WaitUntilToastDisappear("Theme " + newTheme + " Applied");
this.agHelper.AssertContains("Theme " + newTheme + " Applied");
}
public ChangeColor(

View File

@ -298,6 +298,7 @@ Cypress.Commands.add("CreateAppInFirstListedWorkspace", (appname) => {
cy.get("#loading").should("not.exist");
// eslint-disable-next-line cypress/no-unnecessary-waiting
cy.wait(2000);
//cy.reload();
cy.AppSetupForRename();
cy.get(homePage.applicationName).type(appname + "{enter}");
cy.wait("@updateApplication").should(

View File

@ -179,7 +179,8 @@
"generate:widget": "plop --plopfile generators/index.js",
"postbuild": "rm build/mockServiceWorker.js",
"postinstall": "patch-package && CURRENT_SCOPE=client node ../shared/install-dependencies.js",
"preinstall": "CURRENT_SCOPE=client node ../shared/build-shared-dep.js"
"preinstall": "CURRENT_SCOPE=client node ../shared/build-shared-dep.js",
"install": "node cypress/apply-patches.js"
},
"browserslist": [
">0.2%",
@ -243,6 +244,9 @@
"cra-bundle-analyzer": "^0.1.0",
"cy-verify-downloads": "^0.0.5",
"cypress": "9.7.0",
"chalk": "^4.1.1",
"diff": "^5.0.0",
"semver": "^7.3.5",
"cypress-file-upload": "^4.1.1",
"cypress-image-snapshot": "^4.0.1",
"cypress-multi-reporters": "^1.2.4",
@ -262,8 +266,8 @@
"factory.ts": "^0.5.1",
"jest-canvas-mock": "^2.3.1",
"jest-styled-components": "^7.0.8",
"mocha": "^7.1.0",
"mocha-junit-reporter": "^1.23.3",
"mocha": "^9.0.2",
"mocha-junit-reporter": "^2.0.0",
"mochawesome": "^7.1.2",
"mochawesome-report-generator": "^6.1.1",
"msw": "^0.28.0",

View File

@ -3615,6 +3615,11 @@
"@typescript-eslint/types" "5.25.0"
eslint-visitor-keys "^3.3.0"
"@ungap/promise-all-settled@1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
"@uppy/companion-client@^1.8.1":
version "1.8.1"
resolved "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-1.8.1.tgz"
@ -4107,11 +4112,7 @@ algoliasearch@^4.2.0:
"@algolia/requester-node-http" "4.5.1"
"@algolia/transporter" "4.5.1"
ansi-colors@3.2.3:
version "3.2.3"
resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz"
ansi-colors@^4.1.1:
ansi-colors@4.1.1, ansi-colors@^4.1.1:
version "4.1.1"
resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz"
@ -4134,24 +4135,22 @@ ansi-html-community@^0.0.8:
ansi-regex@^2.0.0:
version "2.1.1"
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz"
ansi-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
ansi-regex@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz"
version "4.1.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
ansi-regex@^5.0.0, ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-regex@^6.0.1:
version "6.0.1"
resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
ansi-styles@^2.2.1:
@ -4919,7 +4918,7 @@ camelcase@^5.0.0, camelcase@^5.3.1:
version "5.3.1"
resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
camelcase@^6.2.0, camelcase@^6.2.1:
camelcase@^6.0.0, camelcase@^6.2.0, camelcase@^6.2.1:
version "6.3.0"
resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz"
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
@ -5084,7 +5083,7 @@ check-types@^8.0.3:
version "8.0.3"
resolved "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz"
chokidar@3.3.0, chokidar@3.5.3, chokidar@^3.4.2, chokidar@^3.5.3:
chokidar@3.5.3, chokidar@^3.4.2, chokidar@^3.5.3:
version "3.5.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@ -6015,12 +6014,6 @@ debug@2.6.9, debug@^2.2.0, debug@^2.6.0, debug@^2.6.9:
dependencies:
ms "2.0.0"
debug@3.2.6, debug@^3.1.0:
version "3.2.6"
resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz"
dependencies:
ms "^2.1.1"
debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.0, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2:
version "4.3.4"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
@ -6028,6 +6021,19 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.0, debug@^4.3.2, debug@^4.3.4, d
dependencies:
ms "2.1.2"
debug@4.3.3:
version "4.3.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
dependencies:
ms "2.1.2"
debug@^3.1.0:
version "3.2.6"
resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz"
dependencies:
ms "^2.1.1"
debug@^3.2.7:
version "3.2.7"
resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
@ -6038,6 +6044,11 @@ decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
decamelize@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
decimal.js@^10.2.1:
version "10.3.1"
resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz"
@ -6093,7 +6104,7 @@ define-lazy-prop@^2.0.0:
resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz"
integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4:
define-properties@^1.1.3, define-properties@^1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz"
integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
@ -6205,20 +6216,16 @@ diff-sequences@^27.5.1:
resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz"
integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
diff@3.5.0:
version "3.5.0"
resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz"
diff@5.0.0, diff@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz"
integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
diff@^4.0.1:
version "4.0.2"
resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz"
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
diff@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz"
integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==
dingbat-to-unicode@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz"
@ -6650,7 +6657,12 @@ escape-html@^1.0.3, escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
@ -6660,11 +6672,6 @@ escape-string-regexp@^2.0.0:
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz"
integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
escodegen@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz"
@ -7473,12 +7480,13 @@ find-root@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
find-up@3.0.0, find-up@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"
integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
find-up@5.0.0, find-up@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
dependencies:
locate-path "^3.0.0"
locate-path "^6.0.0"
path-exists "^4.0.0"
find-up@^2.1.0:
version "2.1.0"
@ -7486,6 +7494,13 @@ find-up@^2.1.0:
dependencies:
locate-path "^2.0.0"
find-up@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"
integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
dependencies:
locate-path "^3.0.0"
find-up@^4.0.0, find-up@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
@ -7493,14 +7508,6 @@ find-up@^4.0.0, find-up@^4.1.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
find-up@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
dependencies:
locate-path "^6.0.0"
path-exists "^4.0.0"
find-yarn-workspace-root@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz"
@ -7541,11 +7548,10 @@ flat-cache@^3.0.4:
flatted "^3.1.0"
rimraf "^3.0.2"
flat@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz"
dependencies:
is-buffer "~2.0.3"
flat@^5.0.2:
version "5.0.2"
resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
flatted@^3.1.0:
version "3.2.5"
@ -7916,9 +7922,10 @@ glob-to-regexp@^0.4.1:
resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
glob@7.1.3:
version "7.1.3"
resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz"
glob@7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
@ -8108,7 +8115,7 @@ has-property-descriptors@^1.0.0:
dependencies:
get-intrinsic "^1.1.1"
has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3:
has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
@ -8677,10 +8684,6 @@ is-buffer@~1.1.6:
resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-buffer@~2.0.3:
version "2.0.4"
resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz"
is-callable@^1.1.4, is-callable@^1.2.4:
version "1.2.4"
resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz"
@ -8829,6 +8832,11 @@ is-path-inside@^3.0.2:
version "3.0.3"
resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
is-plain-obj@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
is-plain-obj@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz"
@ -9589,12 +9597,12 @@ js-sha256@^0.9.0:
version "4.0.0"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
js-yaml@3.13.1:
version "3.13.1"
resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz"
js-yaml@4.1.0, js-yaml@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
argparse "^1.0.7"
esprima "^4.0.0"
argparse "^2.0.1"
js-yaml@^3.13.1:
version "3.14.0"
@ -9603,13 +9611,6 @@ js-yaml@^3.13.1:
argparse "^1.0.7"
esprima "^4.0.0"
js-yaml@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
argparse "^2.0.1"
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz"
@ -10122,19 +10123,7 @@ lodash@4.x, lodash@^4, lodash@^4.16.2, lodash@^4.17.11, lodash@^4.17.14, lodash@
version "4.17.21"
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
log-symbols@3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz"
dependencies:
chalk "^2.4.2"
log-symbols@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz"
dependencies:
chalk "^4.0.0"
log-symbols@^4.1.0:
log-symbols@4.1.0, log-symbols@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
@ -10142,6 +10131,12 @@ log-symbols@^4.1.0:
chalk "^4.1.0"
is-unicode-supported "^0.1.0"
log-symbols@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz"
dependencies:
chalk "^4.0.0"
log-symbols@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-5.1.0.tgz#a20e3b9a5f53fac6aeb8e2bb22c07cf2c8f16d93"
@ -10459,6 +10454,13 @@ minimatch@3.0.4, minimatch@^3.0.3, minimatch@~3.0.2:
dependencies:
brace-expansion "^1.1.7"
minimatch@4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4"
integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==
dependencies:
brace-expansion "^1.1.7"
minimatch@^3.0.4, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
@ -10482,16 +10484,16 @@ mkdirp@0.3.0:
version "0.3.0"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz"
mkdirp@0.5.5, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1:
mkdirp@1.x, mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1:
version "0.5.5"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz"
dependencies:
minimist "^1.2.5"
mkdirp@1.x, mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
mkdirp@^0.5.5:
version "0.5.6"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
@ -10499,44 +10501,46 @@ mkdirp@^0.5.5:
dependencies:
minimist "^1.2.6"
mocha-junit-reporter@^1.23.3:
version "1.23.3"
resolved "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz"
mocha-junit-reporter@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz#d521689b651dc52f52044739f8ffb368be415731"
integrity sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==
dependencies:
debug "^2.2.0"
md5 "^2.1.0"
mkdirp "~0.5.1"
strip-ansi "^4.0.0"
strip-ansi "^6.0.1"
xml "^1.0.0"
mocha@^7.1.0:
version "7.2.0"
resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz"
mocha@^9.0.2:
version "9.2.2"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9"
integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==
dependencies:
ansi-colors "3.2.3"
"@ungap/promise-all-settled" "1.1.2"
ansi-colors "4.1.1"
browser-stdout "1.3.1"
chokidar "3.3.0"
debug "3.2.6"
diff "3.5.0"
escape-string-regexp "1.0.5"
find-up "3.0.0"
glob "7.1.3"
chokidar "3.5.3"
debug "4.3.3"
diff "5.0.0"
escape-string-regexp "4.0.0"
find-up "5.0.0"
glob "7.2.0"
growl "1.10.5"
he "1.2.0"
js-yaml "3.13.1"
log-symbols "3.0.0"
minimatch "3.0.4"
mkdirp "0.5.5"
ms "2.1.1"
node-environment-flags "1.0.6"
object.assign "4.1.0"
strip-json-comments "2.0.1"
supports-color "6.0.0"
which "1.3.1"
wide-align "1.1.3"
yargs "13.3.2"
yargs-parser "13.1.2"
yargs-unparser "1.6.0"
js-yaml "4.1.0"
log-symbols "4.1.0"
minimatch "4.2.1"
ms "2.1.3"
nanoid "3.3.1"
serialize-javascript "6.0.0"
strip-json-comments "3.1.1"
supports-color "8.1.1"
which "2.0.2"
workerpool "6.2.0"
yargs "16.2.0"
yargs-parser "20.2.4"
yargs-unparser "2.0.0"
mochawesome-report-generator@^6.1.1:
version "6.1.1"
@ -10657,6 +10661,11 @@ namespace-emitter@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz"
nanoid@3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35"
integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==
nanoid@^2.0.4:
version "2.1.11"
resolved "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz"
@ -10699,13 +10708,6 @@ no-case@^3.0.4:
lower-case "^2.0.2"
tslib "^2.0.3"
node-environment-flags@1.0.6:
version "1.0.6"
resolved "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz"
dependencies:
object.getownpropertydescriptors "^2.0.3"
semver "^5.7.0"
node-fetch@2.6.7, node-fetch@^1.0.1, node-fetch@^2.6.1, node-fetch@^2.6.7:
version "2.6.7"
resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz"
@ -10867,19 +10869,10 @@ object-is@^1.0.1:
define-properties "^1.1.3"
es-abstract "^1.18.0-next.1"
object-keys@^1.0.11, object-keys@^1.1.1:
object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
object.assign@4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz"
dependencies:
define-properties "^1.1.2"
function-bind "^1.1.1"
has-symbols "^1.0.0"
object-keys "^1.0.11"
object.assign@^4.1.0, object.assign@^4.1.1, object.assign@^4.1.2:
version "4.1.2"
resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz"
@ -10917,7 +10910,7 @@ object.fromentries@^2.0.5:
define-properties "^1.1.3"
es-abstract "^1.19.1"
object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
object.getownpropertydescriptors@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz"
dependencies:
@ -13693,7 +13686,7 @@ semver-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz"
"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0:
version "5.7.1"
resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz"
@ -13770,19 +13763,19 @@ sentence-case@^3.0.4:
tslib "^2.0.3"
upper-case-first "^2.0.2"
serialize-javascript@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz"
dependencies:
randombytes "^2.1.0"
serialize-javascript@^6.0.0:
serialize-javascript@6.0.0, serialize-javascript@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz"
integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
dependencies:
randombytes "^2.1.0"
serialize-javascript@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz"
dependencies:
randombytes "^2.1.0"
serve-index@^1.9.1:
version "1.9.1"
resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz"
@ -14186,13 +14179,6 @@ string-width@^1.0.1:
is-fullwidth-code-point "^1.0.0"
strip-ansi "^3.0.0"
"string-width@^1.0.2 || 2":
version "2.1.1"
resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz"
dependencies:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"
@ -14294,12 +14280,6 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1:
dependencies:
ansi-regex "^2.0.0"
strip-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz"
dependencies:
ansi-regex "^3.0.0"
strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
version "5.2.0"
resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz"
@ -14356,12 +14336,7 @@ strip-json-comments@1.0.x:
version "1.0.4"
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz"
strip-json-comments@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
@ -14400,11 +14375,11 @@ substyle@^9.1.0:
"@babel/runtime" "^7.3.4"
invariant "^2.2.4"
supports-color@6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz"
supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1:
version "8.1.1"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz"
dependencies:
has-flag "^3.0.0"
has-flag "^4.0.0"
supports-color@^2.0.0:
version "2.0.0"
@ -14423,12 +14398,6 @@ supports-color@^7.0.0, supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
supports-color@^8.0.0, supports-color@^8.1.1:
version "8.1.1"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz"
dependencies:
has-flag "^4.0.0"
supports-hyperlinks@^2.0.0:
version "2.1.0"
resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz"
@ -15504,24 +15473,18 @@ which-module@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz"
which@1.3.1, which@^1.2.14, which@^1.2.9, which@^1.3.1:
version "1.3.1"
resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
dependencies:
isexe "^2.0.0"
which@^2.0.1, which@^2.0.2:
which@2.0.2, which@^2.0.1, which@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
wide-align@1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz"
which@^1.2.14, which@^1.2.9, which@^1.3.1:
version "1.3.1"
resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
dependencies:
string-width "^1.0.2 || 2"
isexe "^2.0.0"
wide-align@^1.1.0:
version "1.1.5"
@ -15723,6 +15686,11 @@ worker-loader@^3.0.2:
loader-utils "^2.0.0"
schema-utils "^3.0.0"
workerpool@6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b"
integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==
wrap-ansi@^5.1.0:
version "5.1.0"
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz"
@ -15841,12 +15809,10 @@ yaml@^2.1.1:
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.1.tgz#1e06fb4ca46e60d9da07e4f786ea370ed3c3cfec"
integrity sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==
yargs-parser@13.1.2, yargs-parser@^13.1.2:
version "13.1.2"
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz"
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@20.2.4:
version "20.2.4"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"
integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
yargs-parser@20.x:
version "20.2.9"
@ -15868,28 +15834,27 @@ yargs-parser@^21.0.0:
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz"
integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==
yargs-unparser@1.6.0:
version "1.6.0"
resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz"
yargs-unparser@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb"
integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
dependencies:
flat "^4.1.0"
lodash "^4.17.15"
yargs "^13.3.0"
camelcase "^6.0.0"
decamelize "^4.0.0"
flat "^5.0.2"
is-plain-obj "^2.1.0"
yargs@13.3.2, yargs@^13.3.0:
version "13.3.2"
resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz"
yargs@16.2.0, yargs@^16.2.0:
version "16.2.0"
resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz"
dependencies:
cliui "^5.0.0"
find-up "^3.0.0"
get-caller-file "^2.0.1"
cliui "^7.0.2"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
require-main-filename "^2.0.0"
set-blocking "^2.0.0"
string-width "^3.0.0"
which-module "^2.0.0"
y18n "^4.0.0"
yargs-parser "^13.1.2"
string-width "^4.2.0"
y18n "^5.0.5"
yargs-parser "^20.2.2"
yargs@^14.2:
version "14.2.3"
@ -15907,18 +15872,6 @@ yargs@^14.2:
y18n "^4.0.0"
yargs-parser "^15.0.1"
yargs@^16.2.0:
version "16.2.0"
resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz"
dependencies:
cliui "^7.0.2"
escalade "^3.1.1"
get-caller-file "^2.0.5"
require-directory "^2.1.1"
string-width "^4.2.0"
y18n "^5.0.5"
yargs-parser "^20.2.2"
yargs@^17.2.1:
version "17.3.1"
resolved "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz"