diff --git a/lerna.json b/lerna.json index 2c7d20bb53..21ea8e3df8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.0.192-alpha.1", + "version": "1.0.192-alpha.6", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 884fe9b53c..72d47ca33e 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/backend-core", - "version": "1.0.192-alpha.1", + "version": "1.0.192-alpha.6", "description": "Budibase backend core libraries used in server and worker", "main": "src/index.js", "author": "Budibase", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 11a29766b1..c1acdac1b6 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "1.0.192-alpha.1", + "version": "1.0.192-alpha.6", "license": "MPL-2.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", @@ -38,7 +38,7 @@ ], "dependencies": { "@adobe/spectrum-css-workflow-icons": "^1.2.1", - "@budibase/string-templates": "^1.0.192-alpha.1", + "@budibase/string-templates": "^1.0.192-alpha.6", "@spectrum-css/actionbutton": "^1.0.1", "@spectrum-css/actiongroup": "^1.0.1", "@spectrum-css/avatar": "^3.0.2", diff --git a/packages/builder/cypress/integration/appOverview.spec.js b/packages/builder/cypress/integration/appOverview.spec.js index db093344b4..090e4e369b 100644 --- a/packages/builder/cypress/integration/appOverview.spec.js +++ b/packages/builder/cypress/integration/appOverview.spec.js @@ -132,22 +132,36 @@ filterTests(['all'], () => { }) }) - it("Should allow the editing of the application icon", () => { + it("Should allow the editing of the application icon and colour", () => { cy.visit(`${Cypress.config().baseUrl}/builder`) - - cy.get(".appTable .name").eq(0).click() - - cy.get(".app-logo .edit-hover").should("exist").invoke("show").click() - - cy.customiseAppIcon() - - cy.get(".app-logo") - .within(() => { - cy.get('[aria-label]').eq(0).children() - .should('have.attr', 'xlink:href').and('not.contain', '#spectrum-icon-18-Apps') - cy.get(".app-icon") - .should('have.attr', 'style').and('contains', 'color') + cy.get(".appTable", { timeout: 2000}) + .within(() => { + cy.get(".app-row-actions-icon").eq(0).click() + }) + cy.get(".spectrum-Menu").contains("Edit icon").click() + // Select random icon + cy.get(".grid").within(() => { + cy.get(".icon-item").eq(Math.floor(Math.random() * 23) + 1).click() }) + // Select random colour + cy.get(".fill").click() + cy.get(".colors").within(() => { + cy.get(".color").eq(Math.floor(Math.random() * 33) + 1).click() + }) + cy.intercept('**/applications/**').as('iconChange') + cy.get(".spectrum-Button").contains("Save").click({ force: true }) + cy.wait("@iconChange") + cy.get("@iconChange").its('response.statusCode') + .should('eq', 200) + // Confirm icon has changed from default + // Confirm colour has been applied + cy.get(".appTable", { timeout: 2000}) + .within(() => { + cy.get('[aria-label]').eq(0).children() + .should('have.attr', 'xlink:href').and('not.contain', '#spectrum-icon-18-Apps') + cy.get(".title").children().children() + .should('have.attr', 'style').and('contains', 'color') + }) }) it("Should reflect the last time the application was edited", () => { @@ -259,6 +273,7 @@ filterTests(['all'], () => { }); cy.visit(`${Cypress.config().baseUrl}/builder`) + cy.wait(1000) cy.get(".appTable .name").eq(0).click() cy.get(".spectrum-Tabs-item").contains("Settings").click() cy.get(".spectrum-Tabs-item.is-selected").contains("Settings") @@ -269,7 +284,7 @@ filterTests(['all'], () => { }) - it("Should allow copying of the published application Id", () => { + xit("Should allow copying of the published application Id", () => { cy.visit(`${Cypress.config().baseUrl}/builder`) cy.get(".appTable .app-row-actions").eq(0) .within(() => { diff --git a/packages/builder/cypress/integration/appPublishWorkflow.spec.js b/packages/builder/cypress/integration/appPublishWorkflow.spec.js index d05a97f691..f0a7dd791a 100644 --- a/packages/builder/cypress/integration/appPublishWorkflow.spec.js +++ b/packages/builder/cypress/integration/appPublishWorkflow.spec.js @@ -1,4 +1,5 @@ import filterTests from "../support/filterTests" +import { APP_TABLE_APP_NAME, DEPLOY_SUCCESS_MODAL } from "../support/interact"; const interact = require('../support/interact') filterTests(['all'], () => { @@ -20,10 +21,9 @@ filterTests(['all'], () => { cy.get(interact.APP_TABLE_ROW_ACTION).eq(0) .within(() => { - cy.get(interact.SPECTRUM_BUTTON_TEMPLATE).contains("Preview") cy.get(interact.SPECTRUM_BUTTON_TEMPLATE).contains("Edit").click({ force: true }) }) - + cy.get(interact.DEPLOYMENT_TOP_NAV_GLOBESTRIKE).should("exist") cy.get(interact.DEPLOYMENT_TOP_GLOBE).should("not.exist") }) @@ -39,7 +39,7 @@ filterTests(['all'], () => { }); //Verify that the app url is presented correctly to the user - cy.get(interact.DEPLOY_APP_MODAL) + cy.get(interact.DEPLOY_SUCCESS_MODAL) .should("be.visible") .within(() => { let appUrl = Cypress.config().baseUrl + '/app/cypress-tests' @@ -63,7 +63,7 @@ filterTests(['all'], () => { }) cy.get(interact.DEPLOYMENT_TOP_GLOBE).should("exist").click({ force: true }) - + cy.get(interact.PUBLISH_POPOVER_MENU).should("be.visible") .within(() => { cy.get(interact.PUBLISH_POPOVER_ACTION).should("exist") @@ -72,9 +72,9 @@ filterTests(['all'], () => { }) }) - it("Should unpublish an application from the top navigation and reflect the status change", () => { + it("Should unpublish an application using the link and reflect the status change", () => { //Assuming the previous test app exists and is published - + cy.visit(`${Cypress.config().baseUrl}/builder`) cy.get(interact.APP_TABLE_STATUS).eq(0) @@ -85,17 +85,11 @@ filterTests(['all'], () => { cy.get(interact.APP_TABLE_ROW_ACTION).eq(0) .within(() => { - cy.get(interact.SPECTRUM_BUTTON).contains("View app") - cy.get(interact.SPECTRUM_BUTTON).contains("Edit").click({ force: true }) + cy.get(interact.SPECTRUM_BUTTON).contains("View") + cy.get(interact.APP_TABLE_APP_NAME).click({ force: true }) }) - //The published status - cy.get(interact.DEPLOYMENT_TOP_GLOBE).should("exist") - .click({ force: true }) - - cy.get(interact.PUBLISH_POPOVER_MENU).should("be.visible") - cy.get("[data-cy='publish-popover-menu'] [data-cy='publish-popover-action']") - .click({ force : true }) + cy.get(interact.SPECTRUM_LINK).contains('Unpublish').click(); cy.get(interact.UNPUBLISH_MODAL).should("be.visible") .within(() => { diff --git a/packages/builder/cypress/integration/changeAppIconAndColour.spec.js b/packages/builder/cypress/integration/changeAppIconAndColour.spec.js deleted file mode 100644 index 0f623ddb04..0000000000 --- a/packages/builder/cypress/integration/changeAppIconAndColour.spec.js +++ /dev/null @@ -1,44 +0,0 @@ -import filterTests from "../support/filterTests" - -filterTests(['all'], () => { - context("Change Application Icon and Colour", () => { - before(() => { - cy.login() - }) - - it("should change the icon and colour for an application", () => { - // Search for test application - cy.applicationInAppTable("Cypress Tests") - cy.get(".appTable") - .within(() => { - cy.get(".app-row-actions-icon").eq(0).click() - }) - cy.get(".spectrum-Menu").contains("Edit icon").click() - // Select random icon - cy.get(".grid").within(() => { - cy.get(".icon-item").eq(Math.floor(Math.random() * 23) + 1).click() - }) - // Select random colour - cy.get(".fill").click() - cy.get(".colors").within(() => { - cy.get(".color").eq(Math.floor(Math.random() * 33) + 1).click() - }) - cy.intercept('**/applications/**').as('iconChange') - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - cy.wait("@iconChange") - cy.get("@iconChange").its('response.statusCode') - .should('eq', 200) - cy.wait(1000) - // Confirm icon has changed from default - // Confirm colour has been applied - There is no default colour - cy.get(".appTable") - .within(() => { - cy.get('[aria-label]').eq(0).children() - .should('have.attr', 'xlink:href').and('not.contain', '#spectrum-icon-18-Apps') - cy.get(".title").children().children() - .should('have.attr', 'style').and('contains', 'color') - }) - cy.deleteAllApps() - }) - }) -}) diff --git a/packages/builder/cypress/integration/createAutomation.spec.js b/packages/builder/cypress/integration/createAutomation.spec.js index 69ef3f98a3..6a4b70f8dc 100644 --- a/packages/builder/cypress/integration/createAutomation.spec.js +++ b/packages/builder/cypress/integration/createAutomation.spec.js @@ -1,4 +1,5 @@ import filterTests from "../support/filterTests" +const interact = require('../support/interact') filterTests(['smoke', 'all'], () => { context("Create a automation", () => { @@ -11,51 +12,51 @@ filterTests(['smoke', 'all'], () => { cy.createTestTableWithData() cy.wait(2000) cy.contains("Automate").click() - cy.get(".add-button .spectrum-Icon").click() - cy.get(".modal-inner-wrapper").within(() => { + cy.get(interact.ADD_BUTTON_SPECTRUM).click() + cy.get(interact.MODAL_INNER_WRAPPER).within(() => { cy.get("input").type("Add Row") cy.contains("Row Created").click({ force: true }) cy.wait(500) - cy.get(".spectrum-Button--cta").click() + cy.get(interact.SPECTRUM_BUTTON_CTA).click() }) // Setup trigger - cy.get(".spectrum-Picker-label").click() + cy.get(interact.SPECTRUM_PICKER_LABEL).click() cy.wait(500) cy.contains("dog").click() cy.wait(2000) // Create action cy.get('[aria-label="AddCircle"]').eq(1).click() - cy.get(".modal-inner-wrapper").within(() => { + cy.get(interact.MODAL_INNER_WRAPPER).within(() => { cy.wait(1000) cy.contains("Create Row").trigger('mouseover').click().click() - cy.get(".spectrum-Button--cta").click() + cy.get(interact.SPECTRUM_BUTTON_CTA).click() }) - cy.get(".spectrum-Picker-label").eq(1).click() + cy.get(interact.SPECTRUM_PICKER_LABEL).eq(1).click() cy.contains("dog").click() - cy.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .first() .type("{{ trigger.row.name }}", { parseSpecialCharSequences: false }) - cy.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .eq(1) .type("11") cy.contains("Finish and test automation").click() - cy.get(".modal-inner-wrapper").within(() => { + cy.get(interact.MODAL_INNER_WRAPPER).within(() => { cy.wait(1000) - cy.get(".spectrum-Picker-label").click() + cy.get(interact.SPECTRUM_PICKER_LABEL).click() cy.contains("dog").click() cy.wait(1000) - cy.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .first() .type("automationGoodboy") - cy.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .eq(1) .type("11") - cy.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .eq(2) .type("123456") - cy.get(".spectrum-Textfield-input") + cy.get(interact.SPECTRUM_TEXTFIELD_INPUT) .eq(3) .type("123456") cy.contains("Test").click() diff --git a/packages/builder/cypress/integration/createTable.spec.js b/packages/builder/cypress/integration/createTable.spec.js index 4600807cbc..7d55a1f03c 100644 --- a/packages/builder/cypress/integration/createTable.spec.js +++ b/packages/builder/cypress/integration/createTable.spec.js @@ -1,4 +1,5 @@ import filterTests from "../support/filterTests" +const interact = require('../support/interact') filterTests(["smoke", "all"], () => { context("Create a Table", () => { @@ -11,7 +12,7 @@ filterTests(["smoke", "all"], () => { cy.createTable("dog") cy.wait(1000) // Check if Table exists - cy.get(".table-title h1").should("have.text", "dog") + cy.get(interact.TABLE_TITLE_H1).should("have.text", "dog") }) it("adds a new column to the table", () => { @@ -25,13 +26,13 @@ filterTests(["smoke", "all"], () => { }) it("updates a column on the table", () => { - cy.get(".title").click() - cy.get(".spectrum-Table-editIcon > use").click() - cy.get(".modal-inner-wrapper").within(() => { + cy.get(interact.TABLE_TITLE).click() + cy.get(interact.SPECTRUM_TABLE_EDIT).click() + cy.get(interact.MODAL_INNER_WRAPPER).within(() => { cy.get("input").eq(0).type("updated", { force: true }) // Unset table display column - cy.get(".spectrum-Switch-input").eq(1).click() + cy.get(interact.SPECTRUM_SWITCH_INPUT).eq(1).click() cy.contains("Save Column").click() }) cy.contains("nameupdated ").should("contain", "nameupdated") @@ -40,16 +41,16 @@ filterTests(["smoke", "all"], () => { it("edits a row", () => { cy.contains("button", "Edit").click({ force: true }) cy.wait(1000) - cy.get(".spectrum-Modal input").clear() - cy.get(".spectrum-Modal input").type("Updated") + cy.get(interact.SPECTRUM_MODAL_INPUT).clear() + cy.get(interact.SPECTRUM_MODAL_INPUT).type("Updated") cy.contains("Save").click() cy.contains("Updated").should("have.text", "Updated") }) it("deletes a row", () => { - cy.get(".spectrum-Checkbox-input").check({ force: true }) + cy.get(interact.SPECTRUM_CHECKBOX_INPUT).check({ force: true }) cy.contains("Delete 1 row(s)").click() - cy.get(".spectrum-Modal").contains("Delete").click() + cy.get(interact.SPECTRUM_MODAL).contains("Delete").click() cy.contains("RoverUpdated").should("not.exist") }) @@ -63,50 +64,50 @@ filterTests(["smoke", "all"], () => { } cy.reload() cy.wait(2000) - cy.get(".spectrum-Pagination").within(() => { - cy.get(".spectrum-ActionButton").eq(1).click() + cy.get(interact.SPECTRUM_PAGINATION).within(() => { + cy.get(interact.SPECTRUM_ACTION_BUTTON).eq(1).click() }) - cy.get(".spectrum-Pagination").within(() => { - cy.get(".spectrum-Body--secondary").contains("Page 2") + cy.get(interact.SPECTRUM_PAGINATION).within(() => { + cy.get(interact.SPECTRUM_BODY_SECOND).contains("Page 2") }) }) xit("Deletes rows and checks pagination", () => { // Delete rows, removing second page from table - cy.get(".spectrum-Checkbox-input").check({ force: true }) - cy.get(".popovers").within(() => { - cy.get(".spectrum-Button").click({ force: true }) + cy.get(interact.SPECTRUM_CHECKBOX_INPUT).check({ force: true }) + cy.get(interact.POPOVERS).within(() => { + cy.get(interact.SPECTRUM_BUTTON).click({ force: true }) }) - cy.get(".spectrum-Dialog-grid").contains("Delete").click({ force: true }) + cy.get(interact.SPECTRUM_DIALOG_GRID).contains("Delete").click({ force: true }) cy.wait(1000) // Confirm table only has one page - cy.get(".spectrum-Pagination").within(() => { - cy.get(".spectrum-ActionButton").eq(1).should("not.be.enabled") + cy.get(interact.SPECTRUM_PAGINATION).within(() => { + cy.get(interact.SPECTRUM_ACTION_BUTTON).eq(1).should("not.be.enabled") }) }) } it("deletes a column", () => { const columnName = "nameupdated" - cy.get(".title").click() - cy.get(".spectrum-Table-editIcon > use").click() + cy.get(interact.TABLE_TITLE).click() + cy.get(interact.SPECTRUM_TABLE_EDIT).click() cy.contains("Delete").click() - cy.get('[data-cy="delete-column-confirm"]').type(columnName) + cy.get(interact.DELETE_COLUMN_CONFIRM).type(columnName) cy.contains("Delete Column").click() cy.contains("nameupdated").should("not.exist") }) it("deletes a table", () => { - cy.get(".nav-item") + cy.get(interact.NAV_ITEM) .contains("dog") - .parents(".nav-item") + .parents(interact.NAV_ITEM) .first() .within(() => { - cy.get(".actions .spectrum-Icon").click({ force: true }) + cy.get(interact.ACTION_SPECTRUM_ICON).click({ force: true }) }) - cy.get(".spectrum-Menu > :nth-child(2)").click() - cy.get('[data-cy="delete-table-confirm"]').type("dog") + cy.get(interact.SPECTRUM_MENU_CHILD2).click() + cy.get(interact.DELETE_TABLE_CONFIRM).type("dog") cy.contains("Delete Table").click() cy.contains("dog").should("not.exist") }) diff --git a/packages/builder/cypress/integration/createUserAndRoles.spec.js b/packages/builder/cypress/integration/createUserAndRoles.spec.js index ac7ec1b5fd..d47a96ed8d 100644 --- a/packages/builder/cypress/integration/createUserAndRoles.spec.js +++ b/packages/builder/cypress/integration/createUserAndRoles.spec.js @@ -1,4 +1,5 @@ import filterTests from "../support/filterTests" +const interact = require('../support/interact') filterTests(["smoke", "all"], () => { context("Create a User and Assign Roles", () => { @@ -12,7 +13,7 @@ filterTests(["smoke", "all"], () => { cy.visit(`${Cypress.config().baseUrl}/builder`) cy.wait(1000) cy.createUser("bbuser@test.com") - cy.get(".spectrum-Table").should("contain", "bbuser") + cy.get(interact.SPECTRUM_TABLE).should("contain", "bbuser") }) it("should confirm there is No Access for a New User", () => { @@ -20,9 +21,9 @@ filterTests(["smoke", "all"], () => { cy.contains("bbuser").click() cy.wait(500) // Get No Access table - Confirm it has apps in it - cy.get(".spectrum-Table").eq(1).should("not.contain", "No rows found") + cy.get(interact.SPECTRUM_TABLE).eq(1).should("not.contain", "No rows found") // Get Configure Roles table - Confirm it has no apps - cy.get(".spectrum-Table").eq(0).contains("No rows found") + cy.get(interact.SPECTRUM_TABLE).eq(0).contains("No rows found") }) if (Cypress.env("TEST_ENV")) { @@ -40,7 +41,7 @@ filterTests(["smoke", "all"], () => { } else { cy.visit(`${Cypress.config().baseUrl}/builder`) cy.wait(500) - cy.get(`[data-cy="create-app-btn"]`).click({ force: true }) + cy.get(interact.CREATE_APP_BUTTON).click({ force: true }) cy.createAppFromScratch(name) } } @@ -49,35 +50,35 @@ filterTests(["smoke", "all"], () => { // Navigate back to the user cy.visit(`${Cypress.config().baseUrl}/builder`) cy.wait(500) - cy.get(".spectrum-SideNav").contains("Users").click() + cy.get(interact.SPECTRUM_SIDENAV).contains("Users").click() cy.wait(500) - cy.get(".spectrum-Table").contains("bbuser").click() + cy.get(interact.SPECTRUM_TABLE).contains("bbuser").click() cy.wait(1000) for (let i = 0; i < 3; i++) { - cy.get(".spectrum-Table", { timeout: 3000}) + cy.get(interact.SPECTRUM_TABLE, { timeout: 3000}) .eq(1) - .find(".spectrum-Table-row") + .find(interact.SPECTRUM_TABLE_ROW) .eq(0) - .find(".spectrum-Table-cell") + .find(interact.SPECTRUM_TABLE_CELL) .eq(0) .click() cy.wait(500) - cy.get(".spectrum-Dialog-grid") + cy.get(interact.SPECTRUM_DIALOG_GRID) .contains("Choose an option") .click() .then(() => { cy.wait(1000) if (i == 0) { - cy.get(".spectrum-Menu").contains("Admin").click({ force: true }) + cy.get(interact.SPECTRUM_MENU).contains("Admin").click({ force: true }) } else if (i == 1) { - cy.get(".spectrum-Menu").contains("Power").click({ force: true }) + cy.get(interact.SPECTRUM_MENU).contains("Power").click({ force: true }) } else if (i == 2) { - cy.get(".spectrum-Menu").contains("Basic").click({ force: true }) + cy.get(interact.SPECTRUM_MENU).contains("Basic").click({ force: true }) } cy.wait(1000) - cy.get(".spectrum-Button") + cy.get(interact.SPECTRUM_BUTTON) .contains("Update role") .click({ force: true }) }) @@ -85,7 +86,7 @@ filterTests(["smoke", "all"], () => { } // Confirm roles exist within Configure roles table cy.wait(2000) - cy.get(".spectrum-Table") + cy.get(interact.SPECTRUM_TABLE) .eq(0) .within(assginedRoles => { expect(assginedRoles).to.contain("Admin") @@ -96,60 +97,60 @@ filterTests(["smoke", "all"], () => { it("should unassign role types", () => { // Set each app within Configure roles table to 'No Access' - cy.get(".spectrum-Table") + cy.get(interact.SPECTRUM_TABLE) .eq(0) - .find(".spectrum-Table-row") + .find(interact.SPECTRUM_TABLE_ROW) .its("length") .then(len => { for (let i = 0; i < len; i++) { - cy.get(".spectrum-Table") + cy.get(interact.SPECTRUM_TABLE) .eq(0) - .find(".spectrum-Table-row") + .find(interact.SPECTRUM_TABLE_ROW) .eq(0) - .find(".spectrum-Table-cell") + .find(interact.SPECTRUM_TABLE_CELL) .eq(0) .click() .then(() => { - cy.get(".spectrum-Picker").eq(1).click({ force: true }) + cy.get(interact.SPECTRUM_PICKER).eq(1).click({ force: true }) cy.wait(500) - cy.get(".spectrum-Popover").contains("No Access").click() + cy.get(interact.SPECTRUM_POPOVER).contains("No Access").click() }) - cy.get(".spectrum-Button") + cy.get(interact.SPECTRUM_BUTTON) .contains("Update role") .click({ force: true }) cy.wait(1000) } }) // Confirm Configure roles table no longer has any apps in it - cy.get(".spectrum-Table").eq(0).contains("No rows found") + cy.get(interact.SPECTRUM_TABLE).eq(0).contains("No rows found") }) } it("should enable Developer access", () => { // Enable Developer access - cy.get(".field") + cy.get(interact.FIELD) .eq(4) .within(() => { - cy.get(".spectrum-Switch-input").click({ force: true }) + cy.get(interact.SPECTRUM_SWITCH_INPUT).click({ force: true }) }) // No Access table should now be empty - cy.get(".container") + cy.get(interact.CONTAINER) .contains("No Access") .parent() .within(() => { - cy.get(".spectrum-Table").contains("No rows found") + cy.get(interact.SPECTRUM_TABLE).contains("No rows found") }) // Each app within Configure roles should have Admin access - cy.get(".spectrum-Table") + cy.get(interact.SPECTRUM_TABLE) .eq(0) - .find(".spectrum-Table-row") + .find(interact.SPECTRUM_TABLE_ROW) .its("length") .then(len => { for (let i = 0; i < len; i++) { - cy.get(".spectrum-Table") + cy.get(interact.SPECTRUM_TABLE) .eq(0) - .find(".spectrum-Table-row") + .find(interact.SPECTRUM_TABLE_ROW) .eq(i) .contains("Admin") cy.wait(500) @@ -169,26 +170,26 @@ filterTests(["smoke", "all"], () => { .contains("Configure roles") .parent() .within(() => { - cy.get(".spectrum-Table").contains("No rows found") + cy.get(interact.SPECTRUM_TABLE).contains("No rows found") }) }) it("should delete a user", () => { // Click Delete user button - cy.get(".spectrum-Button") + cy.get(interact.SPECTRUM_BUTTON) .contains("Delete user") .click({ force: true }) .then(() => { // Confirm deletion within modal cy.wait(500) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button") + cy.get(interact.SPECTRUM_DIALOG_GRID).within(() => { + cy.get(interact.SPECTRUM_BUTTON) .contains("Delete user") .click({ force: true }) cy.wait(4000) }) }) - cy.get(".spectrum-Table").should("not.have.text", "bbuser") + cy.get(interact.SPECTRUM_TABLE).should("not.have.text", "bbuser") }) }) }) diff --git a/packages/builder/cypress/integration/templates/HR/hrTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/HR/hrTemplateDetails.spec.js deleted file mode 100644 index fbac463bfe..0000000000 --- a/packages/builder/cypress/integration/templates/HR/hrTemplateDetails.spec.js +++ /dev/null @@ -1,56 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify HR Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter HR Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="HR"]').click() - }) - }) - - it("should verify the details option for HR templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - - if (templateNameText == "Job Application Tracker") { - // Template name should include 'applicant-tracking-system' - cy.get('a') - .should('have.attr', 'href').and('contain', 'applicant-tracking-system') - } - else if (templateNameText == "Job Portal App") { - // Template name should include 'job-portal' - const templateNameSplit = templateNameParsed.split('-app')[0] - cy.get('a') - .should('have.attr', 'href').and('contain', templateNameSplit) - } - else { - cy.get('a') - .should('have.attr', 'href').and('contain', templateNameParsed) - } - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/HR/jobApplicationTracker.spec.js b/packages/builder/cypress/integration/templates/HR/jobApplicationTracker.spec.js deleted file mode 100644 index 045a85d8f6..0000000000 --- a/packages/builder/cypress/integration/templates/HR/jobApplicationTracker.spec.js +++ /dev/null @@ -1,222 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Job Application Tracker Template Functionality", () => { - const templateName = "Job Application Tracker" - const templateNameParsed = templateName.toLowerCase().replace(/\s+/g, '-') - - before(() => { - cy.login() - cy.deleteApp(templateName) - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`, { - onBeforeLoad(win) { - cy.stub(win, 'open') - } - }) - cy.wait(2000) - }) - - it("should create and publish app with Job Application Tracker template", () => { - // Select Job Application Tracker template - cy.get(".template-thumbnail-text") - .contains(templateName).parentsUntil(".template-grid").within(() => { - cy.get(".spectrum-Button").contains("Use template").click({ force: true }) - }) - - // Confirm URL matches template name - const appUrl = cy.get(".app-server") - appUrl.invoke('text').then(appUrlText => { - expect(appUrlText).to.equal(`${Cypress.config().baseUrl}/app/` + templateNameParsed) - }) - - // Create App - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button").contains("Create app").click({ force: true }) - }) - - // Publish App & Verify it opened - cy.wait(2000) // Wait for app to generate - cy.publishApp(true) - cy.window().its('open').should('be.calledOnce') - }) - - it("should add active/inactive vacancies", () => { - // Visit published app - cy.visit(`${Cypress.config().baseUrl}/app/` + templateNameParsed) - - // loop for active/inactive vacancies - for (let i = 0; i < 2; i++) { - // Vacancies section - cy.get(".links").contains("Vacancies").click({ force: true }) - cy.get(".spectrum-Button").contains("Create New").click() - - // Add inactive vacancy - // Title - cy.get('[data-name="Title"]').within(() => { - cy.get(".spectrum-Textfield").type("Tester") - }) - - // Closing Date - cy.get('[data-name="Closing date"]').within(() => { - cy.get('[aria-label=Calendar]').click({ force: true }) - }) - cy.get("[aria-current=date]").click() - - // Department - cy.get('[data-name="Department"]').within(() => { - cy.get(".spectrum-Picker-label").click() - }) - cy.get(".spectrum-Menu").find('li').its('length').then(len => { - cy.get(".spectrum-Menu-item").eq(Math.floor(Math.random() * len)).click() - }) - - // Employment Type - cy.get('[data-name="Employment type"]').within(() => { - cy.get(".spectrum-Picker-label").click() - }) - cy.get(".spectrum-Menu").find('li').its('length').then(len => { - cy.get(".spectrum-Menu-item").eq(Math.floor(Math.random() * len)).click() - }) - - // Salary - cy.get('[data-name="Salary ($)"]').within(() => { - cy.get(".spectrum-Textfield").type(40000) - }) - - // Description - cy.get('[data-name="Description"]').within(() => { - cy.get(".spectrum-Textfield").type("description") - }) - - // Responsibilities - cy.get('[data-name="Responsibilities"]').within(() => { - cy.get(".spectrum-Textfield").type("Responsibilities") - }) - - // Requirements - cy.get('[data-name="Requirements"]').within(() => { - cy.get(".spectrum-Textfield").type("Requirements") - }) - - // Hiring manager - cy.get('[data-name="Hiring manager"]').within(() => { - cy.get(".spectrum-Picker-label").click() - }) - cy.get(".spectrum-Menu").find('li').its('length').then(len => { - cy.get(".spectrum-Menu-item").eq(Math.floor(Math.random() * len)).click() - }) - - // Active - if (i == 0) { - cy.get('[data-name="Active"]').within(() => { - cy.get(".spectrum-Checkbox-box").click({ force: true }) - }) - } - - // Location - cy.get('[data-name="Location"]').within(() => { - cy.get(".spectrum-Picker-label").click() - }) - cy.get(".spectrum-Menu").find('li').its('length').then(len => { - cy.get(".spectrum-Menu-item").eq(Math.floor(Math.random() * len)).click() - }) - - // Save vacancy - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - cy.wait(1000) - - // Check table was updated - cy.get('[data-name="Vacancies Table"]').eq(i).should('contain', 'Tester') - } - }) - - xit("should filter applications by stage", () => { - // Visit published app - cy.visit(`${Cypress.config().baseUrl}/app/` + templateNameParsed) - cy.wait(1000) - - // Applications section - cy.get(".links").contains("Applications").click({ force: true }) - cy.wait(1000) - - // Filter by stage - Confirm table updates - cy.get(".spectrum-Picker").contains("Filter by stage").click({ force: true }) - cy.get(".spectrum-Menu").find('li').its('length').then(len => { - for (let i = 1; i < len; i++) { - cy.get(".spectrum-Menu-item").eq(i).click() - const stage = cy.get(".spectrum-Picker-label") - stage.invoke('text').then(stageText => { - if (stageText == "1st interview") { - cy.get(".placeholder").should('contain', 'No rows found') - } - else { - cy.get(".spectrum-Table-row").should('contain', stageText) - } - cy.get(".spectrum-Picker").contains(stageText).click({ force: true }) - }) - } - }) - }) - - xit("should edit an application", () => { - // Switch application from not hired to hired - // Visit published app - cy.visit(`${Cypress.config().baseUrl}/app/` + templateNameParsed) - cy.wait(1000) - - // Not Hired section - cy.get(".links").contains("Not hired").click({ force: true }) - cy.wait(500) - - // View application - cy.get(".spectrum-Table").within(() => { - cy.get(".spectrum-Button").contains("View").click({ force: true }) - cy.wait(500) - }) - - // Update value for 'Staged' - cy.get('[data-name="Stage"]').within(() => { - cy.get(".spectrum-Picker-label").click() - }) - cy.get(".spectrum-Menu").within(() => { - cy.get(".spectrum-Menu-item").contains("Hired").click() - }) - - // Save application - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - cy.wait(500) - - // Hired section - cy.get(".links").contains("Hired").click({ force: true }) - cy.wait(500) - - // Verify Table size - Total rows = 2 - cy.get(".spectrum-Table").find(".spectrum-Table-row").its('length').then((len => { - expect(len).to.eq(2) - })) - }) - - xit("should delete an application", () => { - // Visit published app - cy.visit(`${Cypress.config().baseUrl}/app/` + templateNameParsed) - cy.wait(1000) - - // Hired section - cy.get(".links").contains("Hired").click({ force: true }) - cy.wait(500) - - // View first application - cy.get(".spectrum-Table-row").eq(0).within(() => { - cy.get(".spectrum-Button").contains("View").click({ force: true }) - cy.wait(500) - }) - - // Delete application - cy.get(".spectrum-Button").contains("Delete").click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button").contains("Confirm").click() - }) - }) - }) -}) diff --git a/packages/builder/cypress/integration/templates/IT/ITTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/IT/ITTemplateDetails.spec.js deleted file mode 100644 index 84cbc5707e..0000000000 --- a/packages/builder/cypress/integration/templates/IT/ITTemplateDetails.spec.js +++ /dev/null @@ -1,60 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify IT Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter IT Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="IT"]').click() - }) - }) - - it("should verify the details option for IT templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - - if (templateNameText == "Hashicorp Scorecard Template") { - const templateNameSplit = templateNameParsed.split('-template')[0] - cy.get('a') - .should('have.attr', 'href').and('contain', templateNameSplit) - } - else if (templateNameText == "IT Ticketing System") { - const templateNameSplit = templateNameParsed.split('it-')[1] - cy.get('a') - .should('have.attr', 'href').and('contain', templateNameSplit) - } - else if (templateNameText == "IT Incident Report Form") { - const templateNameSplit = templateNameParsed.split('-form')[0] - cy.get('a') - .should('have.attr', 'href').and('contain', templateNameSplit) - } - else { - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - } - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/IT/ITTicketingSystem.spec.js b/packages/builder/cypress/integration/templates/IT/ITTicketingSystem.spec.js deleted file mode 100644 index 15628ab131..0000000000 --- a/packages/builder/cypress/integration/templates/IT/ITTicketingSystem.spec.js +++ /dev/null @@ -1,72 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("IT Ticketing System Template Functionality", () => { - const templateName = "IT Ticketing System" - const templateNameParsed = templateName.toLowerCase().replace(/\s+/g, '-') - - before(() => { - cy.login() - cy.deleteApp(templateName) - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`, { - onBeforeLoad(win) { - cy.stub(win, 'open') - } - }) - cy.wait(2000) - }) - - it("should create and publish app with IT Ticketing System template", () => { - // Select IT Ticketing System template - cy.get(".template-thumbnail-text") - .contains(templateName).parentsUntil(".template-grid").within(() => { - cy.get(".spectrum-Button").contains("Use template").click({ force: true }) - }) - - // Confirm URL matches template name - const appUrl = cy.get(".app-server") - appUrl.invoke('text').then(appUrlText => { - expect(appUrlText).to.equal(`${Cypress.config().baseUrl}/app/` + templateNameParsed) - }) - - // Create App - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button").contains("Create app").click({ force: true }) - }) - - // Publish App & Verify it opened - cy.wait(2000) // Wait for app to generate - cy.publishApp(true) - cy.window().its('open').should('be.calledOnce') - }) - - xit("should filter tickets by status", () => { - // Visit published app - cy.visit(`${Cypress.config().baseUrl}/app/` + templateNameParsed) - cy.wait(1000) - - // Tickets section - cy.get(".links").contains("Tickets").click({ force: true }) - cy.wait(1000) - - // Filter by stage - Confirm table updates - cy.get(".spectrum-Picker").contains("Filter by status").click({ force: true }) - cy.get(".spectrum-Menu").find('li').its('length').then(len => { - for (let i = 1; i < len; i++) { - cy.get(".spectrum-Menu-item").eq(i).click() - const stage = cy.get(".spectrum-Picker-label") - stage.invoke('text').then(stageText => { - if (stageText == "In progress" || stageText == "On hold" || stageText == "Triaged") { - cy.get(".placeholder").should('contain', 'No rows found') - } - else { - cy.get(".spectrum-Table-row").should('contain', stageText) - } - cy.get(".spectrum-Picker").contains(stageText).click({ force: true }) - }) - } - }) - }) - }) -}) diff --git a/packages/builder/cypress/integration/templates/adminPanels/adminPanelsTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/adminPanels/adminPanelsTemplateDetails.spec.js deleted file mode 100644 index 2fa57b2c89..0000000000 --- a/packages/builder/cypress/integration/templates/adminPanels/adminPanelsTemplateDetails.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Admin Panel Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Admin Panels Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Admin Panels"]').click() - }) - }) - - it("should verify the details option for Admin Panels templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/approvalApps/approvalAppsTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/approvalApps/approvalAppsTemplateDetails.spec.js deleted file mode 100644 index 322a17f6c2..0000000000 --- a/packages/builder/cypress/integration/templates/approvalApps/approvalAppsTemplateDetails.spec.js +++ /dev/null @@ -1,51 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Aproval Apps Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Approval Apps Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Approval Apps"]').click() - }) - }) - - it("should verify the details option for Approval Apps templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - - if (templateNameText == "Content Approval System") { - // Template name should include 'content-approval' - const templateNameSplit = templateNameParsed.split('-system')[0] - cy.get('a') - .should('have.attr', 'href').and('contain', templateNameSplit) - } - else { - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - } - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/businessApps/businessAppsTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/businessApps/businessAppsTemplateDetails.spec.js deleted file mode 100644 index 734fb9a968..0000000000 --- a/packages/builder/cypress/integration/templates/businessApps/businessAppsTemplateDetails.spec.js +++ /dev/null @@ -1,51 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Business Apps Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Business Apps Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Business Apps"]').click() - }) - }) - - it("should verify the details option for Business Apps templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - - if (templateNameText == "Employee Check-in/Check-Out Template") { - // Remove / from template name - const templateNameReplace = templateNameParsed.replace(/\//g, "-") - cy.get('a') - .should('have.attr', 'href').and('contain', templateNameReplace) - } - else { - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - } - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/directories/directoriesTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/directories/directoriesTemplateDetails.spec.js deleted file mode 100644 index dc874fcbaf..0000000000 --- a/packages/builder/cypress/integration/templates/directories/directoriesTemplateDetails.spec.js +++ /dev/null @@ -1,44 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Directories Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Directories Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Directories"]').click() - }) - }) - - it("should verify the details option for Directories templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - const templateNameSplit = templateNameParsed.split('-template')[0] - cy.get('a') - .should('have.attr', 'href').and('contain', templateNameSplit) - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/forms/formsTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/forms/formsTemplateDetails.spec.js deleted file mode 100644 index 3206a71f6e..0000000000 --- a/packages/builder/cypress/integration/templates/forms/formsTemplateDetails.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Forms Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Forms Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Forms"]').click() - }) - }) - - it("should verify the details option for Forms templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/healthcare/healthcareTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/healthcare/healthcareTemplateDetails.spec.js deleted file mode 100644 index b46bb46274..0000000000 --- a/packages/builder/cypress/integration/templates/healthcare/healthcareTemplateDetails.spec.js +++ /dev/null @@ -1,43 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Healthcare Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Healthcare Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Healthcare"]').click() - }) - }) - - it("should verify the details option for Healthcare templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/legal/legalTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/legal/legalTemplateDetails.spec.js deleted file mode 100644 index 57485aee40..0000000000 --- a/packages/builder/cypress/integration/templates/legal/legalTemplateDetails.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Legal Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Legal Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Legal"]').click() - }) - }) - - it("should verify the details option for Legal templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/logistics/logisticsTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/logistics/logisticsTemplateDetails.spec.js deleted file mode 100644 index e5d5745e4e..0000000000 --- a/packages/builder/cypress/integration/templates/logistics/logisticsTemplateDetails.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Logistics Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Logistics Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Logistics"]').click() - }) - }) - - it("should verify the details option for Logistics templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/manufacturing/manufacturingTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/manufacturing/manufacturingTemplateDetails.spec.js deleted file mode 100644 index 30019c87fd..0000000000 --- a/packages/builder/cypress/integration/templates/manufacturing/manufacturingTemplateDetails.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Manufacturing Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Manufacturing Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Manufacturing"]').click() - }) - }) - - it("should verify the details option for Manufacturing templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/marketing/leadGenerationForm.spec.js b/packages/builder/cypress/integration/templates/marketing/leadGenerationForm.spec.js deleted file mode 100644 index 9f08b36d56..0000000000 --- a/packages/builder/cypress/integration/templates/marketing/leadGenerationForm.spec.js +++ /dev/null @@ -1,44 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Lead Generation Form Template Functionality", () => { - const templateName = "Lead Generation Form" - const templateNameParsed = templateName.toLowerCase().replace(/\s+/g, '-') - - before(() => { - cy.login() - cy.deleteApp(templateName) - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`, { - onBeforeLoad(win) { - cy.stub(win, 'open') - } - }) - cy.wait(2000) - }) - - it("should create and publish app with Lead Generation Form template", () => { - // Select Lead Generation Form template - cy.get(".template-thumbnail-text") - .contains(templateName).parentsUntil(".template-grid").within(() => { - cy.get(".spectrum-Button").contains("Use template").click({ force: true }) - }) - - // Confirm URL matches template name - const appUrl = cy.get(".app-server") - appUrl.invoke('text').then(appUrlText => { - expect(appUrlText).to.equal(`${Cypress.config().baseUrl}/app/` + templateNameParsed) - }) - - // Create App - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button").contains("Create app").click({ force: true }) - }) - - // Publish App & Verify it opened - cy.wait(2000) // Wait for app to generate - cy.publishApp(true) - cy.window().its('open').should('be.calledOnce') - }) - }) -}) diff --git a/packages/builder/cypress/integration/templates/marketing/marketingTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/marketing/marketingTemplateDetails.spec.js deleted file mode 100644 index 66875e6939..0000000000 --- a/packages/builder/cypress/integration/templates/marketing/marketingTemplateDetails.spec.js +++ /dev/null @@ -1,51 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Marketing Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Marketing Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Marketing"]').click() - }) - }) - - it("should verify the details option for Marketing templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - - if (templateNameText == "Lead Generation Form") { - // Multi-step lead form - // Template name includes 'multi-step-lead-form' - cy.get('a') - .should('have.attr', 'href').and('contain', 'multi-step-lead-form') - } - else { - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - } - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/operations/operationsTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/operations/operationsTemplateDetails.spec.js deleted file mode 100644 index 1a2ee1703a..0000000000 --- a/packages/builder/cypress/integration/templates/operations/operationsTemplateDetails.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Operations Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Operations Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Operations"]').click() - }) - }) - - it("should verify the details option for Operations templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/portals/portalsTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/portals/portalsTemplateDetails.spec.js deleted file mode 100644 index e81e12318d..0000000000 --- a/packages/builder/cypress/integration/templates/portals/portalsTemplateDetails.spec.js +++ /dev/null @@ -1,71 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Portals Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Portal Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Portal"]').click() - }) - }) - - it("should verify the details option for Portal templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - cy.get('a') - .should('have.attr', 'href').and('contain', templateNameParsed) - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) - - it("should verify the details option for Portals templates", () => { - // Filter Portals Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Portals"]').click() - }) - - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - cy.get('a') - .should('have.attr', 'href').and('contain', templateNameParsed) - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/integration/templates/professionalServices/professionalServicesTemplateDetails.spec.js b/packages/builder/cypress/integration/templates/professionalServices/professionalServicesTemplateDetails.spec.js deleted file mode 100644 index 1267d8bd5c..0000000000 --- a/packages/builder/cypress/integration/templates/professionalServices/professionalServicesTemplateDetails.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -import filterTests from "../../../support/filterTests" - -filterTests(["all"], () => { - context("Verify Professional Services Template Details", () => { - - before(() => { - cy.login() - - // Template navigation - cy.visit(`${Cypress.config().baseUrl}/builder/portal/apps/templates`) - - // Filter Professional Services Templates - cy.get(".template-category-filters").within(() => { - cy.get('[data-cy="Professional Services"]').click() - }) - }) - - it("should verify the details option for Professional Services templates", () => { - cy.get(".template-grid").find(".template-card").its('length') - .then(len => { - // Verify template name is within details link - for (let i = 0; i < len; i++) { - cy.get(".template-card").eq(i).within(() => { - const templateName = cy.get(".template-thumbnail-text") - templateName.invoke('text') - .then(templateNameText => { - const templateNameParsed = templateNameText.toLowerCase().replace(/\s+/g, '-') - cy.get('a').should('have.attr', 'href').and('contain', templateNameParsed) - }) - // Verify correct status from Details link - 200 - cy.get('a') - .then(link => { - cy.request(link.prop('href')) - .its('status') - .should('eq', 200) - }) - }) - } - }) - }) -}) -}) diff --git a/packages/builder/cypress/support/commands.js b/packages/builder/cypress/support/commands.js index 889d6890e7..ba820526f0 100644 --- a/packages/builder/cypress/support/commands.js +++ b/packages/builder/cypress/support/commands.js @@ -1,14 +1,8 @@ -// *********************************************** -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// - Cypress.on("uncaught:exception", () => { return false }) +// ACCOUNTS & USERS Cypress.Commands.add("login", () => { cy.visit(`${Cypress.config().baseUrl}/builder`) cy.wait(2000) @@ -41,43 +35,20 @@ Cypress.Commands.add("logOut", () => { cy.wait(2000) }) -Cypress.Commands.add("closeModal", () => { - cy.get(".spectrum-Modal").within(() => { - cy.get(".close-icon").click() - cy.wait(1000) // Wait for modal to close - }) -}) +Cypress.Commands.add("createUser", email => { + // quick hacky recorded way to create a user + cy.contains("Users").click() + cy.get(`[data-cy="add-user"]`).click() + cy.get(".spectrum-Picker-label").click() + cy.get(".spectrum-Menu-item:nth-child(2) > .spectrum-Menu-itemLabel").click() -Cypress.Commands.add("importApp", (exportFilePath, name) => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - - cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`) - .its("body") - .then(val => { - if (val.length > 0) { - cy.get(`[data-cy="create-app-btn"]`).click({ force: true }) - cy.wait(500) - } - cy.get(`[data-cy="import-app-btn"]`).click({ force: true }) - }) - - cy.get(".spectrum-Modal").within(() => { - cy.get("input").eq(1).should("have.focus") - - cy.get(".spectrum-Dropzone").selectFile(exportFilePath, { - action: "drag-drop", - }) - - cy.get(".gallery .filename").contains("exported-app.txt") - - if (name && name != "") { - cy.get("input").eq(0).type(name).should("have.value", name).blur() - } - cy.get(".confirm-wrap button") - .should("not.be.disabled") - .click({ force: true }) - cy.wait(5000) - }) + //Onboarding type selector + cy.get( + ":nth-child(2) > .spectrum-Form-itemField > .spectrum-Textfield > .spectrum-Textfield-input" + ) + .first() + .type(email, { force: true }) + cy.get(".spectrum-Button--cta").click({ force: true }) }) Cypress.Commands.add("updateUserInformation", (firstName, lastName) => { @@ -113,6 +84,13 @@ Cypress.Commands.add("updateUserInformation", (firstName, lastName) => { }) }) +// APPLICATIONS +Cypress.Commands.add("createTestApp", () => { + const appName = "Cypress Tests" + cy.deleteApp(appName) + cy.createApp(appName, "This app is used for Cypress testing.") +}) + Cypress.Commands.add("createApp", (name, addDefaultTable) => { const shouldCreateDefaultTable = typeof addDefaultTable != "boolean" ? true : addDefaultTable @@ -218,57 +196,6 @@ Cypress.Commands.add("deleteAllApps", () => { }) }) -Cypress.Commands.add("customiseAppIcon", () => { - // Select random icon - cy.get(".grid").within(() => { - cy.get(".icon-item") - .eq(Math.floor(Math.random() * 23) + 1) - .click() - }) - // Select random colour - cy.get(".fill").click() - cy.get(".colors").within(() => { - cy.get(".color") - .eq(Math.floor(Math.random() * 33) + 1) - .click() - }) - cy.intercept("**/applications/**").as("iconChange") - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - cy.wait("@iconChange") - cy.get("@iconChange").its("response.statusCode").should("eq", 200) - cy.wait(1000) -}) - -Cypress.Commands.add("alterAppVersion", (appId, version) => { - return cy - .request("put", `${Cypress.config().baseUrl}/api/applications/${appId}`, { - version: version || "0.0.1-alpha.0", - }) - .then(resp => { - expect(resp.status).to.eq(200) - }) -}) - -Cypress.Commands.add("updateAppName", (changedName, noName) => { - cy.get(".spectrum-Modal").within(() => { - if (noName == true) { - cy.get("input").clear() - cy.get(".spectrum-Dialog-grid") - .click() - .contains("App name must be letters, numbers and spaces only") - return cy - } - cy.get("input").clear() - cy.get("input") - .eq(0) - .type(changedName) - .should("have.value", changedName) - .blur() - cy.get(".spectrum-ButtonGroup").contains("Save").click({ force: true }) - cy.wait(500) - }) -}) - Cypress.Commands.add("unlockApp", unlock_config => { let config = { ...unlock_config } @@ -298,6 +225,26 @@ Cypress.Commands.add("unlockApp", unlock_config => { }) }) +Cypress.Commands.add("updateAppName", (changedName, noName) => { + cy.get(".spectrum-Modal").within(() => { + if (noName == true) { + cy.get("input").clear() + cy.get(".spectrum-Dialog-grid") + .click() + .contains("App name must be letters, numbers and spaces only") + return cy + } + cy.get("input").clear() + cy.get("input") + .eq(0) + .type(changedName) + .should("have.value", changedName) + .blur() + cy.get(".spectrum-ButtonGroup").contains("Save").click({ force: true }) + cy.wait(500) + }) +}) + Cypress.Commands.add("publishApp", resolvedAppPath => { //Assumes you have navigated to an application first cy.get(".toprightnav button.spectrum-Button") @@ -321,34 +268,96 @@ Cypress.Commands.add("publishApp", resolvedAppPath => { }) }) -Cypress.Commands.add("createTestApp", () => { - const appName = "Cypress Tests" - cy.deleteApp(appName) - cy.createApp(appName, "This app is used for Cypress testing.") - //cy.createScreen("home") +Cypress.Commands.add("alterAppVersion", (appId, version) => { + return cy + .request("put", `${Cypress.config().baseUrl}/api/applications/${appId}`, { + version: version || "0.0.1-alpha.0", + }) + .then(resp => { + expect(resp.status).to.eq(200) + }) }) -Cypress.Commands.add("createTestTableWithData", () => { - cy.createTable("dog") - cy.addColumn("dog", "name", "Text") - cy.addColumn("dog", "age", "Number") -}) +Cypress.Commands.add("importApp", (exportFilePath, name) => { + cy.visit(`${Cypress.config().baseUrl}/builder`) -Cypress.Commands.add("publishApp", (viewApp = false) => { - cy.get(".toprightnav").contains("Publish").click({ force: true }) - cy.get(".spectrum-Dialog-grid").within(() => { - cy.get(".spectrum-Button").contains("Publish").click({ force: true }) - }) - cy.wait(2000) // Wait for App to publish and modal to appear - cy.get(".spectrum-Dialog-grid").within(() => { - if (viewApp) { - cy.get(".spectrum-Button").contains("View App").click({ force: true }) - } else { - cy.get(".spectrum-Button").contains("Done").click({ force: true }) + cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`) + .its("body") + .then(val => { + if (val.length > 0) { + cy.get(`[data-cy="create-app-btn"]`).click({ force: true }) + cy.wait(500) + } + cy.get(`[data-cy="import-app-btn"]`).click({ force: true }) + }) + + cy.get(".spectrum-Modal").within(() => { + cy.get("input").eq(1).should("have.focus") + + cy.get(".spectrum-Dropzone").selectFile(exportFilePath, { + action: "drag-drop", + }) + + cy.get(".gallery .filename").contains("exported-app.txt") + + if (name && name != "") { + cy.get("input").eq(0).type(name).should("have.value", name).blur() } + cy.get(".confirm-wrap button") + .should("not.be.disabled") + .click({ force: true }) + cy.wait(5000) }) }) +// Filters visible with 1 or more +Cypress.Commands.add("searchForApplication", appName => { + cy.visit(`${Cypress.config().baseUrl}/builder`) + cy.wait(2000) + + // No app filter functionality if only 1 app exists + cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`) + .its("body") + .then(val => { + if (val.length < 2) { + return + } else { + // Searches for the app + cy.get(".filter").then(() => { + cy.get(".spectrum-Textfield").within(() => { + cy.get("input").eq(0).clear() + cy.get("input").eq(0).type(appName) + }) + }) + } + }) +}) + +// Assumes there are no others +Cypress.Commands.add("applicationInAppTable", appName => { + cy.get(".appTable").within(() => { + cy.get(".title").contains(appName).should("exist") + }) +}) + +Cypress.Commands.add("createAppFromScratch", appName => { + cy.get(`[data-cy="create-app-btn"]`) + .contains("Start from scratch") + .click({ force: true }) + cy.get(".spectrum-Modal").within(() => { + cy.get("input") + .eq(0) + .clear() + .type(appName) + .should("have.value", appName) + .blur() + cy.get(".spectrum-ButtonGroup").contains("Create app").click() + cy.wait(10000) + }) + cy.createTable("Cypress Tests", true) +}) + +// TABLES Cypress.Commands.add("createTable", (tableName, initialTable) => { if (!initialTable) { cy.navigateToDataSection() @@ -369,6 +378,12 @@ Cypress.Commands.add("createTable", (tableName, initialTable) => { cy.contains(tableName).should("be.visible") }) +Cypress.Commands.add("createTestTableWithData", () => { + cy.createTable("dog") + cy.addColumn("dog", "name", "Text") + cy.addColumn("dog", "age", "Number") +}) + Cypress.Commands.add( "addColumn", (tableName, columnName, type, multiOptions = null) => { @@ -423,40 +438,33 @@ Cypress.Commands.add("addRowMultiValue", values => { }) }) -Cypress.Commands.add("addRowAttachment", (values, name, path) => { - cy.contains("Create row").click() - cy.get(".spectrum-Modal").within(() => { - for (let i = 0; i < values.length; i++) { - cy.get("input").eq(i).type(values[i]).blur() - } +Cypress.Commands.add("selectTable", tableName => { + cy.expandBudibaseConnection() + cy.contains(".nav-item", tableName).click() +}) - cy.get(".spectrum-Dropzone").selectFile(path, { - action: "drag-drop", +Cypress.Commands.add("addCustomSourceOptions", totalOptions => { + cy.get(".spectrum-ActionButton") + .contains("Define Options") + .click() + .then(() => { + for (let i = 0; i < totalOptions; i++) { + // Add radio button options + cy.get(".spectrum-Button") + .contains("Add Option") + .click({ force: true }) + .then(() => { + cy.wait(500) + cy.get("[placeholder='Label']").eq(i).type(i) + cy.get("[placeholder='Value']").eq(i).type(i) + }) + } + // Save options + cy.get(".spectrum-Button").contains("Save").click({ force: true }) }) - - cy.get(".gallery .filename").contains(name) - cy.get(".confirm-wrap .spectrum-Button") - .contains("Create Row") - .click({ force: true }) - }) -}) - -Cypress.Commands.add("createUser", email => { - // quick hacky recorded way to create a user - cy.contains("Users").click() - cy.get(`[data-cy="add-user"]`).click() - cy.get(".spectrum-Picker-label").click() - cy.get(".spectrum-Menu-item:nth-child(2) > .spectrum-Menu-itemLabel").click() - - //Onboarding type selector - cy.get( - ":nth-child(2) > .spectrum-Form-itemField > .spectrum-Textfield > .spectrum-Textfield-input" - ) - .first() - .type(email, { force: true }) - cy.get(".spectrum-Button--cta").click({ force: true }) }) +// DESIGN AREA Cypress.Commands.add("addComponent", (category, component) => { if (category) { cy.get(`[data-cy="category-${category}"]`).click({ force: true }) @@ -484,22 +492,8 @@ Cypress.Commands.add("getComponent", componentId => { .find(`[data-id='${componentId}']`) }) -Cypress.Commands.add("navigateToFrontend", () => { - // Clicks on Design tab and then the Home nav item - cy.wait(1000) - cy.contains("Design").click() - cy.get(".spectrum-Search").type("/") - cy.get(".nav-item").contains("home").click() -}) - -Cypress.Commands.add("navigateToDataSection", () => { - // Clicks on the Data tab - cy.wait(500) - cy.contains("Data").click() -}) - -//Blank Cypress.Commands.add("createScreen", (route, accessLevelLabel) => { + // Blank Screen cy.contains("Design").click() cy.get("[aria-label=AddCircle]").click() cy.get(".spectrum-Modal").within(() => { @@ -559,17 +553,6 @@ Cypress.Commands.add( } ) -Cypress.Commands.add("navigateToAutogeneratedModal", () => { - // Screen name must already exist within data source - cy.contains("Design").click() - cy.get("[aria-label=AddCircle]").click() - cy.get(".spectrum-Modal").within(() => { - cy.get(".item").contains("Autogenerated screens").click() - cy.get(".spectrum-Button").contains("Continue").click({ force: true }) - cy.wait(500) - }) -}) - Cypress.Commands.add( "createAutogeneratedScreens", (screenNames, accessLevelLabel) => { @@ -591,96 +574,33 @@ Cypress.Commands.add( } ) -Cypress.Commands.add("addRow", values => { - cy.contains("Create row").click() +// NAVIGATION +Cypress.Commands.add("navigateToFrontend", () => { + // Clicks on Design tab and then the Home nav item + cy.wait(1000) + cy.contains("Design").click() + cy.get(".spectrum-Search").type("/") + cy.get(".nav-item").contains("home").click() +}) + +Cypress.Commands.add("navigateToDataSection", () => { + // Clicks on the Data tab + cy.wait(500) + cy.contains("Data").click() +}) + +Cypress.Commands.add("navigateToAutogeneratedModal", () => { + // Screen name must already exist within data source + cy.contains("Design").click() + cy.get("[aria-label=AddCircle]").click() cy.get(".spectrum-Modal").within(() => { - for (let i = 0; i < values.length; i++) { - cy.get("input").eq(i).type(values[i]).blur() - } - cy.get(".spectrum-ButtonGroup").contains("Create").click() + cy.get(".item").contains("Autogenerated screens").click() + cy.get(".spectrum-Button").contains("Continue").click({ force: true }) + cy.wait(500) }) }) -Cypress.Commands.add("expandBudibaseConnection", () => { - if (Cypress.$(".nav-item > .content > .opened").length === 0) { - // expand the Budibase DB connection string - cy.get(".icon.arrow").eq(0).click() - } -}) - -Cypress.Commands.add("selectTable", tableName => { - cy.expandBudibaseConnection() - cy.contains(".nav-item", tableName).click() -}) - -Cypress.Commands.add("addCustomSourceOptions", totalOptions => { - cy.get(".spectrum-ActionButton") - .contains("Define Options") - .click() - .then(() => { - for (let i = 0; i < totalOptions; i++) { - // Add radio button options - cy.get(".spectrum-Button") - .contains("Add Option") - .click({ force: true }) - .then(() => { - cy.wait(500) - cy.get("[placeholder='Label']").eq(i).type(i) - cy.get("[placeholder='Value']").eq(i).type(i) - }) - } - // Save options - cy.get(".spectrum-Button").contains("Save").click({ force: true }) - }) -}) - -//Filters visible with 1 or more -Cypress.Commands.add("searchForApplication", appName => { - cy.visit(`${Cypress.config().baseUrl}/builder`) - cy.wait(2000) - - // No app filter functionality if only 1 app exists - cy.request(`${Cypress.config().baseUrl}/api/applications?status=all`) - .its("body") - .then(val => { - if (val.length < 2) { - return - } else { - // Searches for the app - cy.get(".filter").then(() => { - cy.get(".spectrum-Textfield").within(() => { - cy.get("input").eq(0).clear() - cy.get("input").eq(0).type(appName) - }) - }) - } - }) -}) - -//Assumes there are no others -Cypress.Commands.add("applicationInAppTable", appName => { - cy.get(".appTable").within(() => { - cy.get(".title").contains(appName).should("exist") - }) -}) - -Cypress.Commands.add("createAppFromScratch", appName => { - cy.get(`[data-cy="create-app-btn"]`) - .contains("Start from scratch") - .click({ force: true }) - cy.get(".spectrum-Modal").within(() => { - cy.get("input") - .eq(0) - .clear() - .type(appName) - .should("have.value", appName) - .blur() - cy.get(".spectrum-ButtonGroup").contains("Create app").click() - cy.wait(10000) - }) - cy.createTable("Cypress Tests", true) -}) - +// DATASOURCES Cypress.Commands.add("selectExternalDatasource", datasourceName => { // Navigates to Data Section cy.navigateToDataSection() @@ -816,3 +736,18 @@ Cypress.Commands.add("createRestQuery", (method, restUrl, queryPrettyName) => { .should("contain", method) .and("contain", queryPrettyName) }) + +// MISC +Cypress.Commands.add("closeModal", () => { + cy.get(".spectrum-Modal").within(() => { + cy.get(".close-icon").click() + cy.wait(1000) // Wait for modal to close + }) +}) + +Cypress.Commands.add("expandBudibaseConnection", () => { + if (Cypress.$(".nav-item > .content > .opened").length === 0) { + // expand the Budibase DB connection string + cy.get(".icon.arrow").eq(0).click() + } +}) diff --git a/packages/builder/cypress/support/interact.js b/packages/builder/cypress/support/interact.js index 22ab13a48b..4a70b2fa8c 100644 --- a/packages/builder/cypress/support/interact.js +++ b/packages/builder/cypress/support/interact.js @@ -26,6 +26,7 @@ export const SPECTRUM_POPOVER = ".spectrum-Popover" export const OPTION_SOURCE_PROP_CONROL = '[data-cy="optionsSource-prop-control' export const APP_TABLE_STATUS = ".appTable .app-status" export const APP_TABLE_ROW_ACTION = ".appTable .app-row-actions" +export const APP_TABLE_APP_NAME = '[data-cy="app-name-link"]' export const DEPLOYMENT_TOP_NAV_GLOBESTRIKE = ".deployment-top-nav svg[aria-label=GlobeStrike]" export const DEPLOYMENT_TOP_GLOBE = ".deployment-top-nav svg[aria-label=Globe]" @@ -33,13 +34,14 @@ export const PUBLISH_POPOVER_MENU = '[data-cy="publish-popover-menu"]' export const PUBLISH_POPOVER_ACTION = '[data-cy="publish-popover-action"]' export const PUBLISH_POPOVER_MESSAGE = ".publish-popover-message" export const SPECTRUM_BUTTON = ".spectrum-Button" +export const SPECTRUM_LINK = ".spectrum-Link" export const TOPRIGHTNAV_BUTTON_SPECTRUM = ".toprightnav button.spectrum-Button" //createComponents export const SETTINGS = "[data-cy=Settings]" export const SETTINGS_INPUT = "[data-cy=setting-text] input" export const DESIGN = "[data-cy=Design]" -export const FONT_SIZE_PROP_CONTRO = "[data-cy=font-size-prop-control]" +export const FONT_SIZE_PROP_CONTROL = "[data-cy=font-size-prop-control]" export const DATA_CY_DATASOURCE = "[data-cy=setting-dataSource]" export const DROPDOWN_CONTAINER = ".dropdown-container" export const SPECTRUM_PICKER = ".spectrum-Picker" @@ -53,8 +55,52 @@ export const NAV_ITEMS_CONTAINER = ".nav-items-container" //publishWorkFlow export const DEPLOY_APP_MODAL = ".spectrum-Modal [data-cy=deploy-app-modal]" +export const DEPLOY_SUCCESS_MODAL = + ".spectrum-Modal [data-cy=deploy-app-success-modal]" export const DEPLOY_APP_URL_INPUT = "[data-cy=deployed-app-url] input" export const GLOBESTRIKE = "svg[aria-label=GlobeStrike]" export const GLOBE = "svg[aria-label=Globe]" export const UNPUBLISH_MODAL = "[data-cy=unpublish-modal]" export const CONFIRM_WRAP_BUTTON = ".confirm-wrap button" + +//changeAppiconAndColour +export const APP_ROW_ACTION = ".app-row-actions-icon" +export const SPECTRUM_MENU = ".spectrum-Menu" +export const ICON_ITEM = ".icon-item" +export const FILL = ".fill" +export const COLOURSS = ".colors" +export const AREA_LABEL = "[aria-label]" +export const TITLE = ".title" +export const GRID = ".grid" +export const COLOUR = ".color" + +//createAutomation +export const ADD_BUTTON_SPECTRUM = ".add-button .spectrum-Icon" +export const MODAL_INNER_WRAPPER = ".modal-inner-wrapper" +export const SPECTRUM_BUTTON_CTA = ".spectrum-Button--cta" +export const SPECTRUM_TEXTFIELD_INPUT = ".spectrum-Textfield-input" + +//createTable +export const TABLE_TITLE_H1 = ".table-title h1" +export const TABLE_TITLE = ".title" +export const SPECTRUM_TABLE_EDIT = ".spectrum-Table-editIcon > use" +export const SPECTRUM_SWITCH_INPUT = ".spectrum-Switch-input" +export const SPECTRUM_CHECKBOX_INPUT = ".spectrum-Checkbox-input" +export const SPECTRUM_PAGINATION = ".spectrum-Pagination" +export const SPECTRUM_ACTION_BUTTON = ".spectrum-ActionButton" +export const SPECTRUM_BODY_SECOND = ".spectrum-Body--secondary" +export const POPOVERS = ".popovers" +export const SPECTRUM_DIALOG_GRID = ".spectrum-Dialog-grid" +export const DELETE_COLUMN_CONFIRM = '[data-cy="delete-column-confirm"]' +export const NAV_ITEM = ".nav-item" +export const ACTION_SPECTRUM_ICON = ".actions .spectrum-Icon" +export const SPECTRUM_MENU_CHILD2 = ".spectrum-Menu > :nth-child(2)" +export const DELETE_TABLE_CONFIRM = '[data-cy="delete-table-confirm"]' + +//createUSerAndRoles +export const SPECTRUM_TABLE = ".spectrum-Table" +export const SPECTRUM_SIDENAV = ".spectrum-SideNav" +export const SPECTRUM_TABLE_ROW = ".spectrum-Table-row" +export const SPECTRUM_TABLE_CELL = ".spectrum-Table-cell" +export const FIELD = ".field" +export const CONTAINER = ".container" diff --git a/packages/builder/package.json b/packages/builder/package.json index 9a4ca2ee72..3bb279dce1 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "1.0.192-alpha.1", + "version": "1.0.192-alpha.6", "license": "GPL-3.0", "private": true, "scripts": { @@ -69,10 +69,10 @@ } }, "dependencies": { - "@budibase/bbui": "^1.0.192-alpha.1", - "@budibase/client": "^1.0.192-alpha.1", - "@budibase/frontend-core": "^1.0.192-alpha.1", - "@budibase/string-templates": "^1.0.192-alpha.1", + "@budibase/bbui": "^1.0.192-alpha.6", + "@budibase/client": "^1.0.192-alpha.6", + "@budibase/frontend-core": "^1.0.192-alpha.6", + "@budibase/string-templates": "^1.0.192-alpha.6", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/builder/src/components/backend/DatasourceNavigator/icons/Snowflake.svelte b/packages/builder/src/components/backend/DatasourceNavigator/icons/Snowflake.svelte new file mode 100644 index 0000000000..fed9025126 --- /dev/null +++ b/packages/builder/src/components/backend/DatasourceNavigator/icons/Snowflake.svelte @@ -0,0 +1,50 @@ + + + diff --git a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js index 1a8df2507e..8003317212 100644 --- a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js +++ b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js @@ -14,6 +14,7 @@ import Oracle from "./Oracle.svelte" import GoogleSheets from "./GoogleSheets.svelte" import Firebase from "./Firebase.svelte" import Redis from "./Redis.svelte" +import Snowflake from "./Snowflake.svelte" export default { BUDIBASE: Budibase, @@ -32,4 +33,5 @@ export default { GOOGLE_SHEETS: GoogleSheets, FIREBASE: Firebase, REDIS: Redis, + SNOWFLAKE: Snowflake, } diff --git a/packages/builder/src/components/deploy/DeployModal.svelte b/packages/builder/src/components/deploy/DeployModal.svelte index 0d9bfb7539..ed2687579e 100644 --- a/packages/builder/src/components/deploy/DeployModal.svelte +++ b/packages/builder/src/components/deploy/DeployModal.svelte @@ -101,7 +101,7 @@ confirmText="Done" cancelText="View App" onCancel={viewApp} - dataCy={"deploy-app-success-modal"} + dataCy="deploy-app-success-modal" >