diff --git a/cypress/integration/all/app/dashboard.spec.ts b/cypress/integration/all/app/dashboard.spec.ts index 5e7ec80cbd..0f1a1b52b5 100644 --- a/cypress/integration/all/app/dashboard.spec.ts +++ b/cypress/integration/all/app/dashboard.spec.ts @@ -1,4 +1,4 @@ -import AppSettingsPage from "../../../pages/appSettingsPage"; +import dashboardPage from "../../pages/dashboardPage"; describe("Dashboard", () => { before(() => { @@ -15,23 +15,19 @@ describe("Dashboard", () => { describe("Operating systems card", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/dashboard"); + dashboardPage.visitsDashboardPage(); }); it("displays operating systems card if macOS platform is selected", () => { - cy.getAttached(".homepage__platform_dropdown").click(); - cy.getAttached(".Select-menu-outer").within(() => { - cy.findAllByText("macOS").click(); - }); - cy.getAttached(".operating-systems").should("exist"); + dashboardPage.switchesPlatform("macOS"); }); it("displays operating systems card if Windows platform is selected", () => { - cy.getAttached(".homepage__platform_dropdown").click(); - cy.getAttached(".Select-menu-outer").within(() => { - cy.findAllByText("Windows").click(); - }); - cy.getAttached(".operating-systems").should("exist"); + dashboardPage.switchesPlatform("Windows"); + }); + + it("displays operating systems card if Linux platform is selected", () => { + dashboardPage.switchesPlatform("Linux"); }); }); }); diff --git a/cypress/integration/all/app/hosts.spec.ts b/cypress/integration/all/app/hosts.spec.ts index f0ae1a5633..f7139b50e1 100644 --- a/cypress/integration/all/app/hosts.spec.ts +++ b/cypress/integration/all/app/hosts.spec.ts @@ -1,5 +1,7 @@ import * as path from "path"; import { format } from "date-fns"; +import manageHostsPage from "../../pages/manageHostsPage"; +import hostDetailsPage from "../../pages/hostDetailsPage"; let hostname = ""; @@ -22,12 +24,10 @@ describe("Hosts flow", () => { describe("Manage hosts page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/hosts/manage"); + manageHostsPage.visitsManageHostsPage(); }); it("adds a new host and downloads installation files", () => { // Download add hosts files - cy.visit("/hosts/manage"); - cy.getAttached(".manage-hosts").within(() => { cy.contains("button", /add hosts/i).click(); }); @@ -71,7 +71,6 @@ describe("Hosts flow", () => { } }); it(`exports hosts to CSV`, () => { - cy.visit("/hosts/manage"); cy.getAttached(".manage-hosts").within(() => { cy.getAttached(".manage-hosts__export-btn").click(); }); @@ -85,7 +84,6 @@ describe("Hosts flow", () => { } }); it(`hides and shows "Used by" column`, () => { - cy.visit("/hosts/manage"); cy.getAttached("thead").within(() => cy.findByText(/used by/i).should("not.exist") ); @@ -104,7 +102,7 @@ describe("Hosts flow", () => { describe("Manage policies page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/hosts/manage"); + manageHostsPage.visitsManageHostsPage(); }); it( "runs policy on an existing host", @@ -158,7 +156,7 @@ describe("Hosts flow", () => { describe("Host details page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/hosts/manage"); + manageHostsPage.visitsManageHostsPage(); cy.getAttached("tbody").within(() => { cy.getAttached(".button--text-link").first().click(); }); @@ -269,23 +267,8 @@ describe("Hosts flow", () => { } ); it("deletes an existing host", () => { - cy.getAttached(".host-details__action-button-container") - .within(() => { - cy.findByText(/delete/i).click(); - }) - .then(() => { - cy.getAttached(".modal__modal_container") - .within(() => { - cy.findByText(/delete host/i).should("exist"); - cy.findByRole("button", { name: /delete/i }).click(); - }) - .then(() => { - cy.findByText(/add your devices to fleet/i).should("exist"); - cy.findByText(/add hosts/i).should("exist"); - cy.findByText(/about this host/i).should("not.exist"); - cy.findByText(hostname).should("not.exist"); - }); - }); + hostDetailsPage.allowsDeleteHost(); + hostDetailsPage.verifiesDeletedHost(hostname); }); }); }); diff --git a/cypress/integration/all/app/labelflow.spec.ts b/cypress/integration/all/app/labelflow.spec.ts index b12ff0f235..48be5366f9 100644 --- a/cypress/integration/all/app/labelflow.spec.ts +++ b/cypress/integration/all/app/labelflow.spec.ts @@ -1,3 +1,5 @@ +import manageHostsPage from "../../pages/manageHostsPage"; + describe("Labels flow", () => { before(() => { Cypress.session.clearAllSavedSessions(); @@ -14,7 +16,7 @@ describe("Labels flow", () => { describe("Manage hosts page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/hosts/manage"); + manageHostsPage.visitsManageHostsPage(); }); it("creates a custom label", () => { cy.getAttached(".label-filter-select__control").click(); diff --git a/cypress/integration/all/app/packflow.spec.ts b/cypress/integration/all/app/packflow.spec.ts index d7a538cdc6..20d58bdff9 100644 --- a/cypress/integration/all/app/packflow.spec.ts +++ b/cypress/integration/all/app/packflow.spec.ts @@ -1,3 +1,5 @@ +import managePacksPage from "../../pages/managePacksPage"; + describe("Pack flow (empty)", () => { before(() => { Cypress.session.clearAllSavedSessions(); @@ -12,15 +14,11 @@ describe("Pack flow (empty)", () => { describe("Manage packs page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/packs/manage"); + managePacksPage.visitsManagePacksPage(); }); it("creates a new pack", () => { - cy.findByRole("button", { name: /create new pack/i }).click(); - cy.findByLabelText(/name/i).click().type("Errors and crashes"); - cy.findByLabelText(/description/i) - .click() - .type("See all user errors and window crashes."); - cy.findByRole("button", { name: /save query pack/i }).click(); + managePacksPage.allowsCreatePack(); + managePacksPage.verifiesCreatedPack(); }); }); }); @@ -40,7 +38,7 @@ describe("Pack flow (seeded)", () => { describe("Pack details page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/packs/manage"); + managePacksPage.visitsManagePacksPage(); cy.getAttached(".name__cell > .button--text-link").first().click(); }); it("adds a query to an existing pack", () => { @@ -74,35 +72,18 @@ describe("Pack flow (seeded)", () => { .click(); }); it("edits an existing pack", () => { - cy.findByLabelText(/name/i).clear().type("Server errors"); - cy.findByLabelText(/description/i) - .clear() - .type("See all server errors."); - cy.findByRole("button", { name: /save/i }).click(); + managePacksPage.allowsEditPack(); + managePacksPage.verifiesEditedPack(); }); }); describe("Manage packs page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/packs/manage"); + managePacksPage.visitsManagePacksPage(); }); it("deletes an existing pack", () => { - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ force: true }); - }); - }); - cy.findByRole("button", { name: /delete/i }).click(); - cy.getAttached(".remove-pack-modal .modal-cta-wrap > .button--alert") - .contains("button", /delete/i) - .click({ force: true }); - cy.findByText(/successfully deleted/i).should("be.visible"); - cy.visit("/packs/manage"); - cy.getAttached(".table-container").within(() => { - cy.findByText(/windows starter pack/i).should("not.exist"); - }); + managePacksPage.allowsDeletePack(); + managePacksPage.verifiesDeletedPack(); }); }); }); diff --git a/cypress/integration/all/app/policiesflow.spec.ts b/cypress/integration/all/app/policiesflow.spec.ts index 71f320e426..61751162cc 100644 --- a/cypress/integration/all/app/policiesflow.spec.ts +++ b/cypress/integration/all/app/policiesflow.spec.ts @@ -1,4 +1,5 @@ import CONSTANTS from "../../../support/constants"; +import managePoliciesPage from "../../pages/managePoliciesPage"; const { CONFIG_INTEGRATIONS_AUTOMATIONS, @@ -139,7 +140,7 @@ describe("Policies flow (empty)", () => { describe("Manage policies page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); }); it("creates a custom policy", () => { cy.getAttached(".policies-table__action-button-container").within(() => { @@ -166,20 +167,15 @@ describe("Policies flow (empty)", () => { }); it("creates a default policy", () => { - cy.getAttached(".manage-policies-page__header-wrap").within(() => { - cy.findByText(/add a policy/i).click(); - }); - cy.findByText(/gatekeeper enabled/i).click(); - cy.findByRole("button", { name: /save/i }).click(); - cy.findByRole("button", { name: /save policy/i }).click(); - cy.findByText(/policy created/i).should("exist"); + managePoliciesPage.allowsAddDefaultPolicy(); + managePoliciesPage.verifiesAddedDefaultPolicy(); }); }); describe("Platform compatibility", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); }); const platforms = ["macOS", "Windows", "Linux"]; @@ -209,7 +205,6 @@ describe("Policies flow (empty)", () => { }; it("checks sql statement for platform compatibility", () => { - cy.visit("/policies/manage"); cy.getAttached(".manage-policies-page__header-wrap").within(() => { cy.findByText(/add a policy/i).click(); }); @@ -375,7 +370,7 @@ describe("Policies flow (empty)", () => { cy.findByText(/policy created/i).should("exist"); // confirm that new policy was saved with user-selected platforms - cy.visit("policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); cy.getAttached("tbody").within(() => { cy.getAttached(".name__cell .button--text-link") .contains("Automatic login disabled (macOS)") @@ -401,7 +396,7 @@ describe("Policies flow (empty)", () => { cy.findByText(/policy created/i).should("exist"); // edit platform selections for policy - cy.visit("policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); cy.getAttached("tbody").within(() => { cy.getAttached(".name__cell .button--text-link") .contains("Antivirus healthy (macOS)") @@ -429,7 +424,7 @@ describe("Policies flow (empty)", () => { cy.findByText(/policy updated/i).should("exist"); // confirm that policy was saved with new selection - cy.visit("policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); cy.getAttached("tbody").within(() => { cy.getAttached(".name__cell .button--text-link") .contains("Antivirus healthy (macOS)") @@ -459,7 +454,7 @@ describe("Policies flow (seeded)", () => { describe("Manage policies page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); }); it("links to manage host page filtered by policy", () => { // Move internal clock forward 2 hours so that policies report host results @@ -495,20 +490,8 @@ describe("Policies flow (seeded)", () => { }); it("deletes an existing policy", () => { - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ force: true }); - }); - }); - cy.findByRole("button", { name: /delete/i }).click(); - cy.getAttached(".delete-policy-modal").within(() => { - cy.findByRole("button", { name: /cancel/i }).should("exist"); - cy.findByRole("button", { name: /delete/i }).click(); - }); - cy.findByText(/deleted policy/i).should("exist"); - cy.findByText(/backup/i).should("not.exist"); + managePoliciesPage.allowsDeletePolicy(); + managePoliciesPage.verifiesDeletedPolicy(); }); it("creates a failing policies webhook", () => { cy.getAttached(".button-wrap").within(() => { @@ -563,7 +546,7 @@ describe("Policies flow (seeded)", () => { "/api/latest/fleet/config", CONFIG_INTEGRATIONS_AUTOMATIONS ).as("getIntegrations"); - cy.visit("/policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); cy.wait("@getIntegrations").then((configStub) => { console.log(JSON.stringify(configStub)); }); @@ -602,7 +585,7 @@ describe("Policies flow (seeded)", () => { "/api/latest/fleet/config", enableJiraPoliciesIntegration ).as("getIntegrations"); - cy.visit("/policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); cy.wait("@getIntegrations").then((configStub) => { console.log(JSON.stringify(configStub)); }); @@ -650,7 +633,7 @@ describe("Policies flow (seeded)", () => { "/api/latest/fleet/config", enableZendeskPoliciesIntegration ).as("getIntegrations"); - cy.visit("/policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); cy.wait("@getIntegrations").then((configStub) => { console.log(JSON.stringify(configStub)); }); diff --git a/cypress/integration/all/app/queryflow.spec.ts b/cypress/integration/all/app/queryflow.spec.ts index 073b07459a..06eb83aa26 100644 --- a/cypress/integration/all/app/queryflow.spec.ts +++ b/cypress/integration/all/app/queryflow.spec.ts @@ -1,5 +1,5 @@ -import * as path from "path"; -import { format } from "date-fns"; +import manageQueriesPage from "../../pages/manageQueriesPage"; +import manageSchedulePage from "../../pages/manageSchedulePage"; describe("Query flow (empty)", () => { before(() => { @@ -14,25 +14,11 @@ describe("Query flow (empty)", () => { describe("Manage queries page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/queries/manage"); + manageQueriesPage.visitManageQueriesPage(); }); it("creates a new query", () => { - cy.getAttached(".queries-table__create-button").click(); - cy.getAttached(".ace_scroller") - .click({ force: true }) - .type("{selectall}SELECT * FROM windows_crashes;"); - cy.findByRole("button", { name: /save/i }).click(); - cy.getAttached(".query-form__query-save-modal-name") - .click() - .type("Query all window crashes"); - cy.getAttached(".query-form__query-save-modal-description") - .click() - .type("See all window crashes"); - cy.findByRole("button", { name: /save query/i }).click(); - cy.findByText(/query created/i).should("exist"); - cy.getAttached(".query-form__query-name").within(() => { - cy.findByText(/query all window crashes/i).should("exist"); - }); + manageQueriesPage.allowsCreateNewQuery(); + manageQueriesPage.verifiesCreatedNewQuery(); }); }); }); @@ -51,112 +37,37 @@ describe("Query flow (seeded)", () => { describe("Manage queries page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/queries/manage"); + manageQueriesPage.visitManageQueriesPage(); }); - it("runs a live query", () => { + it("runs a live query and allows exporting results", () => { cy.addDockerHost(); - cy.getAttached(".name__cell .button--text-link").first().click(); - cy.findByText(/run query/i).click(); - cy.findByText(/all hosts/i).click(); - cy.findByText(/host targeted/i).should("exist"); - cy.findByText(/run/i).click(); - // Ensures live query runs - cy.wait(10000); // eslint-disable-line cypress/no-unnecessary-waiting - cy.getAttached(".table-container").within(() => { - cy.findByText(/show query/i).click(); - }); - cy.getAttached(".show-query-modal").within(() => { - cy.findByText(/done/i).click(); - }); - cy.getAttached(".table-container").within(() => { - const formattedTime = format(new Date(), "MM-dd-yy hh-mm-ss"); - cy.findByText(/export results/i).click(); - const filename = `Query Results (${formattedTime}).csv`; - cy.readFile(path.join(Cypress.config("downloadsFolder"), filename), { - timeout: 5000, - }); - }); + manageQueriesPage.allowsRunQuery(); + manageQueriesPage.verifiesRanQuery(); + manageQueriesPage.allowsViewRanQuery(); + manageQueriesPage.allowsExportQueryResults(); cy.stopDockerHost(); }); it("edits an existing query", () => { - cy.getAttached(".name__cell .button--text-link").first().click(); - cy.findByText(/run query/i).should("exist"); - cy.getAttached(".ace_scroller") - .click() - .type("{selectall}SELECT datetime, username FROM windows_crashes;"); - cy.findByRole("button", { name: "Save" }).click(); - cy.findByText(/query updated/i).should("be.visible"); + manageQueriesPage.allowsEditExistingQuery(); + manageQueriesPage.verifiesEditedExistingQuery(); }); it("saves an existing query as new query", () => { - cy.getAttached(".name__cell .button--text-link") - .eq(1) - .within(() => { - cy.findByText(/get authorized/i).click(); - }); - cy.findByText(/run query/i).should("exist"); - cy.getAttached(".ace_scroller") - .click() - .type("{selectall}SELECT datetime, username FROM windows_crashes;"); - cy.findByRole("button", { name: /save as new/i }).click(); - cy.findByText(/copy of/i).should("be.visible"); + manageQueriesPage.allowsSaveAsNewQuery(); + manageQueriesPage.verifiesSavedAsNewQuery(); }); it("deletes an existing query", () => { - cy.findByText(/detect presence of authorized ssh keys/i) - .parent() - .parent() - .parent() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ - force: true, - }); - }); - cy.findByRole("button", { name: /delete/i }).click(); - cy.getAttached(".delete-query-modal .modal-cta-wrap").within(() => { - cy.findByRole("button", { name: /delete/i }).click(); - }); - cy.findByText(/successfully deleted query/i).should("be.visible"); - cy.findByText(/detect presence of authorized ssh keys/i).should( - "not.exist" - ); + manageQueriesPage.allowsDeleteExistingQuery(); + manageQueriesPage.verifiesDeletedExistingQuery(); }); }); describe("Manage schedules page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/schedule/manage"); + manageSchedulePage.visitManageSchedulePage(); }); it("creates a new scheduled query", () => { - cy.getAttached(".no-schedule__schedule-button").click(); - cy.getAttached(".schedule-editor-modal__form").within(() => { - cy.findByText(/select query/i).click(); - cy.findByText(/get local/i).click(); - cy.findByText(/every day/i).click(); - cy.findByText(/every 6 hours/i).click(); - cy.findByText(/show advanced options/i).click(); - cy.findByText(/snapshot/i).click(); - cy.findByText(/ignore removals/i).click(); - cy.getAttached(".schedule-editor-modal__form-field--platform").within( - () => { - cy.findByText(/all/i).click(); - cy.findByText(/linux/i).click(); - } - ); - cy.getAttached( - ".schedule-editor-modal__form-field--osquer-vers" - ).within(() => { - cy.findByText(/all/i).click(); - cy.findByText(/4.6.0/i).click(); - }); - cy.getAttached(".schedule-editor-modal__form-field--shard").within( - () => { - cy.getAttached(".input-field").click().type("50"); - } - ); - cy.getAttached(".modal-cta-wrap").within(() => { - cy.findByRole("button", { name: /schedule/i }).click(); - }); - }); - cy.findByText(/successfully added/i).should("be.visible"); + manageSchedulePage.allowsAddSchedule(); + manageSchedulePage.verifiesAddedSchedule(); }); it("shows sql of a scheduled query successfully", () => { @@ -168,44 +79,20 @@ describe("Query flow (seeded)", () => { }); cy.getAttached(".show-query-modal").within(() => { cy.getAttached(".ace_content").within(() => { - cy.findByText(/select/i).should("exist"); - cy.findByText(/datetime/i).should("exist"); + cy.contains(/select/i).should("exist"); + cy.contains(/cypress/i).should("exist"); }); }); }); it("edit a scheduled query successfully", () => { - cy.getAttached("tbody>tr") - .should("have.length", 1) - .within(() => { - cy.findByText(/action/i).click(); - cy.findByText(/edit/i).click(); - }); - cy.getAttached(".schedule-editor-modal__form").within(() => { - cy.findByText(/every 6 hours/i).click(); - cy.findByText(/every day/i).click(); - - cy.getAttached(".modal-cta-wrap").within(() => { - cy.findByRole("button", { name: /schedule/i }).click(); - }); - }); - cy.findByText(/successfully updated/i).should("be.visible"); + manageSchedulePage.allowsEditSchedule(); + manageSchedulePage.verifiesEditedSchedule(); }); it("remove a scheduled query successfully", () => { - cy.getAttached("tbody>tr") - .should("have.length", 1) - .within(() => { - cy.findByText(/1 day/i).should("exist"); - cy.findByText(/action/i).click(); - cy.findByText(/remove/i).click(); - }); - cy.getAttached(".remove-scheduled-query-modal .modal-cta-wrap").within( - () => { - cy.findByRole("button", { name: /remove/i }).click(); - } - ); - cy.findByText(/successfully removed/i).should("be.visible"); + manageSchedulePage.allowsRemoveSchedule(); + manageSchedulePage.verifiesRemovedSchedule(); }); }); }); diff --git a/cypress/integration/all/app/software.spec.ts b/cypress/integration/all/app/software.spec.ts index 875b3744c2..4a98c39c8c 100644 --- a/cypress/integration/all/app/software.spec.ts +++ b/cypress/integration/all/app/software.spec.ts @@ -1,4 +1,5 @@ import CONSTANTS from "../../../support/constants"; +import manageSoftwarePage from "../../pages/manageSoftwarePage"; const { CONFIG_INTEGRATIONS_AUTOMATIONS, @@ -196,12 +197,11 @@ describe("Software", () => { cy.logout(); }); - // TODO: Software list and details test coverage (Issue #3954) // describe("Manage software page", () => { // beforeEach(() => { // cy.loginWithCySession(); // cy.viewport(1600, 900); - // cy.visit("/software/manage"); + // manageSoftwarePage.visitManageSoftwarePage(); // }); // it("renders and searches the host's software, links to filter hosts by software", () => { // // cy.getAttached(".manage-software-page__count").within(() => { @@ -245,7 +245,7 @@ describe("Software", () => { "/api/latest/fleet/config", CONFIG_INTEGRATIONS_AUTOMATIONS ).as("getIntegrations"); - cy.visit("/software/manage"); + manageSoftwarePage.visitManageSoftwarePage(); cy.wait("@getIntegrations").then((configStub) => { console.log(JSON.stringify(configStub)); }); @@ -319,7 +319,7 @@ describe("Software", () => { "/api/latest/fleet/config", enableJiraSoftwareIntegration ).as("getIntegrations"); - cy.visit("/software/manage"); + manageSoftwarePage.visitManageSoftwarePage(); cy.wait("@getIntegrations").then((configStub) => { console.log(JSON.stringify(configStub)); }); @@ -367,7 +367,7 @@ describe("Software", () => { "/api/latest/fleet/config", enableZendeskSoftwareIntegration ).as("getIntegrations"); - cy.visit("/software/manage"); + manageSoftwarePage.visitManageSoftwarePage(); cy.wait("@getIntegrations").then((configStub) => { console.log(JSON.stringify(configStub)); }); diff --git a/cypress/integration/all/sessions/sessions.spec.ts b/cypress/integration/all/sessions/sessions.spec.ts index 6de3a9e613..de7ded7b83 100644 --- a/cypress/integration/all/sessions/sessions.spec.ts +++ b/cypress/integration/all/sessions/sessions.spec.ts @@ -1,4 +1,5 @@ import CONSTANTS from "../../../support/constants"; +import manageHostsPage from "../../pages/manageHostsPage"; const { GOOD_PASSWORD } = CONSTANTS; @@ -31,7 +32,7 @@ describe("Sessions", () => { cy.contains("Authentication failed"); }); it("fails to access authenticated resource", () => { - cy.visit("/hosts/manage"); + manageHostsPage.visitsManageHostsPage(); cy.url().should("match", /\/login$/); }); }); diff --git a/cypress/integration/free/admin.spec.ts b/cypress/integration/free/admin.spec.ts index 2b176223be..55bff53f97 100644 --- a/cypress/integration/free/admin.spec.ts +++ b/cypress/integration/free/admin.spec.ts @@ -1,4 +1,11 @@ import CONSTANTS from "../../support/constants"; +import dashboardPage from "../pages/dashboardPage"; +import hostDetailsPage from "../pages/hostDetailsPage"; +import managePoliciesPage from "../pages/managePoliciesPage"; +import manageHostsPage from "../pages/manageHostsPage"; +import manageQueriesPage from "../pages/manageQueriesPage"; +import manageSoftwarePage from "../pages/manageSoftwarePage"; +import userProfilePage from "../pages/userProfilePage"; const { GOOD_PASSWORD } = CONSTANTS; @@ -25,7 +32,7 @@ describe( describe("Navigation", () => { beforeEach(() => { cy.loginWithCySession("anna@organization.com", GOOD_PASSWORD); - cy.visit("/dashboard"); + dashboardPage.visitsDashboardPage(); }); it("displays intended admin top navigation", () => { cy.getAttached(".site-nav-container").within(() => { @@ -52,144 +59,62 @@ describe( describe("Dashboard", () => { beforeEach(() => { cy.loginWithCySession("anna@organization.com", GOOD_PASSWORD); - cy.visit("/dashboard"); + dashboardPage.visitsDashboardPage(); }); - it("displays cards for all platforms", () => { - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-software").should("exist"); - cy.getAttached(".activity-feed").should("exist"); - }); + it("displays cards for all platforms and does not filter host platform", () => { + dashboardPage.displaysCards("All"); + dashboardPage.verifiesFilteredHostByPlatform("none"); }); - it("displays cards for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for windows only and filters hosts by Windows platform", () => { + dashboardPage.switchesPlatform("Windows"); + dashboardPage.displaysCards("Windows"); + dashboardPage.verifiesFilteredHostByPlatform("Windows"); }); - it("displays cards for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for linux only and filters hosts by Linux platform", () => { + dashboardPage.switchesPlatform("Linux"); + dashboardPage.displaysCards("Linux"); + dashboardPage.verifiesFilteredHostByPlatform("Linux"); }); - it("displays cards for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-mdm").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); - }); - it("views all hosts for all platforms", () => { - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by/i }).should( - "not.exist" - ); - }); - it("views all hosts for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by Windows/i }).should( - "exist" - ); - }); - it("views all hosts for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by Linux/i }).should( - "exist" - ); - }); - it("views all hosts for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by macOS/i }).should( - "exist" - ); + it("displays cards for macOS only and filters hosts by macOS platform", () => { + dashboardPage.switchesPlatform("macOS"); + dashboardPage.displaysCards("macOS"); + dashboardPage.verifiesFilteredHostByPlatform("macOS"); }); }); describe("Manage hosts page", () => { beforeEach(() => { cy.loginWithCySession("anna@organization.com", GOOD_PASSWORD); - cy.visit("/hosts/manage"); + manageHostsPage.visitsManageHostsPage(); }); - it("verifies teams is disabled on Manage Host page", () => { - cy.contains(/team/i).should("not.exist"); + it("verifies teams is disabled on Manage hosts page", () => { + manageHostsPage.verifiesTeamsIsDisabled(); }); - it("allows admin to see and click the 'Add hosts' button", () => { - cy.findByRole("button", { name: /add hosts/i }).click(); - cy.contains("button", /done/i).click(); - }); - it("allows admin to manage and add enroll secret", () => { - cy.contains("button", /manage enroll secret/i).click(); - cy.contains("button", /add secret/i).click(); - cy.contains("button", /save/i).click(); - cy.contains("button", /done/i).click(); + it("allows admin to see and click CTA buttons", () => { + manageHostsPage.allowsAddLabelForm(); + manageHostsPage.allowsAddHosts(); + manageHostsPage.allowsManageAndAddSecrets(); }); }); - describe("Host details tests", () => { + describe("Host details page", () => { beforeEach(() => { cy.loginWithCySession("anna@organization.com", GOOD_PASSWORD); - cy.visit("/hosts/1"); + hostDetailsPage.visitsHostDetailsPage(1); }); it("verifies teams is disabled on Host Details page", () => { - cy.findByText(/team/i).should("not.exist"); - cy.contains("button", /transfer/i).should("not.exist"); + hostDetailsPage.verifiesTeamsisDisabled(); + hostDetailsPage.hidesButton("Transfer"); }); - it("allows admin to delete a query", () => { - cy.findByRole("button", { name: /delete/i }).click(); - cy.findByText(/delete host/i).should("exist"); - cy.findByRole("button", { name: /cancel/i }).click(); + it("allows admin to delete the host", () => { + hostDetailsPage.allowsDeleteHost(); }); - it("allows admin to create a new query", () => { - cy.findByRole("button", { name: /query/i }).click(); - cy.findByRole("button", { name: /create custom query/i }).should( - "exist" - ); - cy.getAttached(".modal__ex").within(() => { - cy.findByRole("button").click(); - }); + it("allows admin to custom query the host", () => { + hostDetailsPage.allowsCustomQueryHost(); }); }); describe("Manage software page", () => { beforeEach(() => { cy.loginWithCySession("anna@organization.com", GOOD_PASSWORD); - cy.visit("/software/manage"); + manageSoftwarePage.visitManageSoftwarePage(); }); // it(`displays "Vulnerabilities" column`, () => { // cy.getAttached("thead").within(() => { @@ -198,99 +123,45 @@ describe( // }); // }); it("allows admin to click 'Manage automations' button", () => { - cy.findByRole("button", { name: /manage automations/i }).click(); - cy.findByRole("button", { name: /cancel/i }).click(); + manageSoftwarePage.allowsManageAutomations(); }); }); describe("Query pages", () => { beforeEach(() => { cy.loginWithCySession("anna@organization.com", GOOD_PASSWORD); - cy.visit("/queries/manage"); + manageQueriesPage.visitManageQueriesPage(); }); it("allows admin add a new query", () => { - cy.findByRole("button", { name: /new query/i }).click(); - cy.getAttached(".ace_text-input") - .click({ force: true }) - .clear({ force: true }) - .type("SELECT * FROM cypress;", { - force: true, - }); - cy.findByRole("button", { name: /save/i }).click(); - cy.getAttached(".modal__background").within(() => { - cy.getAttached(".modal__modal_container").within(() => { - cy.getAttached(".modal__content").within(() => { - cy.getAttached("form").within(() => { - cy.findByLabelText(/name/i).click().type("Cypress test query"); - cy.findByLabelText(/description/i) - .click() - .type("Cypress test of create new query flow."); - cy.findByLabelText(/observers can run/i).click({ force: true }); - cy.findByRole("button", { name: /save query/i }).click(); - }); - }); - }); - }); - cy.findByText(/query created/i).should("exist"); + manageQueriesPage.allowsCreateNewQuery(); + manageQueriesPage.verifiesCreatedNewQuery(); }); it("allows admin to edit a query", () => { - cy.findByText(/cypress test query/i).click({ force: true }); - cy.getAttached(".ace_text-input") - .click({ force: true }) - .clear({ force: true }) - .type("SELECT 1 FROM cypress;", { - force: true, - }); - cy.findByText("Save").click(); // we have 'save as new' also - cy.findByText(/query updated/i).should("exist"); + manageQueriesPage.allowsEditExistingQuery(); + manageQueriesPage.verifiesEditedExistingQuery(); }); it("allows admin to run a query", () => { - cy.findByText(/cypress test query/i).click({ force: true }); - cy.findByText(/run query/i).click({ force: true }); - cy.findByText(/select targets/i).should("exist"); - cy.findByText(/all hosts/i).click(); - cy.findByText(/host targeted/i).should("exist"); // target count - cy.findByText(/run/i).click(); - cy.findByText(/querying selected host/i).should("exist"); // target count + manageQueriesPage.allowsRunQuery(); + manageQueriesPage.verifiesRanQuery(); }); }); describe("Manage policies page", () => { beforeEach(() => { cy.loginWithCySession("anna@organization.com", GOOD_PASSWORD); - cy.visit("/policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); }); it("allows admin to click 'Manage automations' button", () => { - cy.findByRole("button", { name: /manage automations/i }).click(); - cy.findByRole("button", { name: /cancel/i }).click(); + managePoliciesPage.allowsAutomatePolicy(); + managePoliciesPage.verifiesAutomatedPolicy(); }); it("allows admin to add a new policy", () => { - cy.findByRole("button", { name: /add a policy/i }).click(); - cy.getAttached(".modal__ex").within(() => { - cy.findByRole("button").click(); - }); + managePoliciesPage.allowsAddDefaultPolicy(); + managePoliciesPage.verifiesAddedDefaultPolicy(); }); it("allows admin to delete a policy", () => { - // select checkmark on table - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ force: true }); - }); - }); - cy.findByRole("button", { name: /delete/i }).click(); - cy.getAttached(".delete-policy-modal").within(() => { - cy.findByRole("button", { name: /delete/i }).should("exist"); - cy.findByRole("button", { name: /cancel/i }).click(); - }); + managePoliciesPage.allowsDeletePolicy(); }); it("allows admin to select a policy and see CTAs to run and save", () => { - cy.getAttached(".data-table__table").within(() => { - cy.findByRole("button", { name: /filevault enabled/i }).click(); - }); - cy.getAttached(".policy-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).should("exist"); - cy.findByRole("button", { name: /save/i }).should("exist"); - }); + managePoliciesPage.allowsSelectRunSavePolicy(); }); }); describe("Admin settings page", () => { @@ -355,17 +226,10 @@ describe( describe("User profile page", () => { beforeEach(() => { cy.loginWithCySession("anna@organization.com", GOOD_PASSWORD); - cy.visit("/profile"); + userProfilePage.visitUserProfilePage(); }); - it("verifies teams is disabled for the Profile page", () => { - cy.getAttached(".user-side-panel").within(() => { - cy.findByText(/teams/i).should("not.exist"); - }); - }); - it("renders elements according to role-based access controls", () => { - cy.getAttached(".user-side-panel").within(() => { - cy.findByText("Role").next().contains(/admin/i); - }); + it("verifies admin role and team", () => { + userProfilePage.showRole("Admin"); }); }); } diff --git a/cypress/integration/free/maintainer.spec.ts b/cypress/integration/free/maintainer.spec.ts index 9d2cbb3d73..bc32fa74ff 100644 --- a/cypress/integration/free/maintainer.spec.ts +++ b/cypress/integration/free/maintainer.spec.ts @@ -1,4 +1,12 @@ import CONSTANTS from "../../support/constants"; +import dashboardPage from "../pages/dashboardPage"; +import hostDetailsPage from "../pages/hostDetailsPage"; +import manageHostsPage from "../pages/manageHostsPage"; +import manageQueriesPage from "../pages/manageQueriesPage"; +import managePacksPage from "../pages/managePacksPage"; +import managePoliciesPage from "../pages/managePoliciesPage"; +import manageSoftwarePage from "../pages/manageSoftwarePage"; +import userProfilePage from "../pages/userProfilePage"; const { GOOD_PASSWORD } = CONSTANTS; @@ -26,7 +34,7 @@ describe( describe("Navigation", () => { beforeEach(() => { cy.loginWithCySession("mary@organization.com", GOOD_PASSWORD); - cy.visit("/dashboard"); + dashboardPage.visitsDashboardPage(); }); it("displays intended global maintainer top navigation", () => { cy.getAttached(".site-nav-container").within(() => { @@ -44,324 +52,144 @@ describe( describe("Dashboard", () => { beforeEach(() => { cy.loginWithCySession("mary@organization.com", GOOD_PASSWORD); - cy.visit("/dashboard"); + dashboardPage.visitsDashboardPage(); }); - it("displays cards for all platforms", () => { - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-software").should("exist"); - cy.getAttached(".activity-feed").should("exist"); - }); + it("displays cards for all platforms and does not filter host platform", () => { + dashboardPage.displaysCards("All"); + dashboardPage.verifiesFilteredHostByPlatform("none"); }); - it("displays cards for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for windows only and filters hosts by Windows platform", () => { + dashboardPage.switchesPlatform("Windows"); + dashboardPage.displaysCards("Windows"); + dashboardPage.verifiesFilteredHostByPlatform("Windows"); }); - it("displays cards for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for linux only and filters hosts by Linux platform", () => { + dashboardPage.switchesPlatform("Linux"); + dashboardPage.displaysCards("Linux"); + dashboardPage.verifiesFilteredHostByPlatform("Linux"); }); - it("displays cards for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-mdm").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); - }); - it("views all hosts for all platforms", () => { - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by/i }).should( - "not.exist" - ); - }); - it("views all hosts for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by Windows/i }).should( - "exist" - ); - }); - it("views all hosts for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by Linux/i }).should( - "exist" - ); - }); - it("views all hosts for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by macOS/i }).should( - "exist" - ); + it("displays cards for macOS only and filters hosts by macOS platform", () => { + dashboardPage.switchesPlatform("macOS"); + dashboardPage.displaysCards("macOS"); + dashboardPage.verifiesFilteredHostByPlatform("macOS"); }); }); describe("Manage hosts page", () => { beforeEach(() => { cy.loginWithCySession("mary@organization.com", GOOD_PASSWORD); - cy.visit("/hosts/manage"); - }); - it("verifies maintainer is on the Manage Hosts page", () => { - cy.getAttached(".manage-hosts").within(() => { - cy.findByText(/edit columns/i).should("exist"); - }); + manageHostsPage.visitsManageHostsPage(); }); it("verifies teams is disabled", () => { - cy.contains(/team/i).should("not.exist"); + manageHostsPage.verifiesTeamsIsDisabled(); }); - it("allows maintainer to see and click the 'Add hosts' button", () => { - cy.findByRole("button", { name: /add hosts/i }).click(); - cy.contains("button", /done/i).click(); - }); - it("allows maintainer to manage the enroll secret", () => { - cy.contains("button", /manage enroll secret/i).click(); - cy.contains("button", /done/i).click(); - }); - it("allows maintainer to open the 'Add label' form", () => { - cy.getAttached(".label-filter-select__control").click(); - cy.findByRole("button", { name: /add label/i }).click(); - cy.findByText(/New Label/i).should("exist"); + it("allows maintainer to see and click 'Add label', 'Add hosts', and 'Manage enroll secrets' buttons", () => { + manageHostsPage.allowsAddHosts(); + manageHostsPage.allowsManageAndAddSecrets(); + manageHostsPage.allowsAddHosts(); }); }); - describe("Host details tests", () => { + describe("Host details page", () => { beforeEach(() => { cy.loginWithCySession("mary@organization.com", GOOD_PASSWORD); - cy.visit("/hosts/1"); + hostDetailsPage.visitsHostDetailsPage(1); }); it("verifies teams is disabled", () => { - cy.findByText(/team/i).should("not.exist"); - cy.contains("button", /transfer/i).should("not.exist"); + hostDetailsPage.verifiesTeamsisDisabled(); + hostDetailsPage.hidesButton("Transfer"); }); - it("allows maintainer to delete a host", () => { - cy.findByRole("button", { name: /delete/i }).click(); - cy.findByText(/delete host/i).should("exist"); - cy.findByRole("button", { name: /cancel/i }).click(); + it("allows maintainer to create an operating system policy", () => { + hostDetailsPage.allowsCreateOsPolicy(); }); - it("allows maintainer to create a new query on a host", () => { - cy.findByRole("button", { name: /query/i }).click(); - cy.findByRole("button", { name: /create custom query/i }).should( - "exist" - ); - cy.getAttached(".modal__ex").within(() => { - cy.findByRole("button").click(); - }); + it("allows maintainer to custom query the host", () => { + hostDetailsPage.allowsCustomQueryHost(); + }); + it("allows maintainer to delete the host", () => { + hostDetailsPage.allowsDeleteHost(); }); }); describe("Manage software page", () => { - beforeEach(() => cy.visit("/software/manage")); - it("should restrict global maintainer from 'Manage automations' button", () => { - cy.findByText(/manage automations/).should("not.exist"); + beforeEach(() => manageSoftwarePage.visitManageSoftwarePage()); + it("hides 'Manage automations' button from global maintainer", () => { + manageSoftwarePage.hidesButton("Manage automations"); }); }); describe("Query pages", () => { beforeEach(() => { cy.loginWithCySession("mary@organization.com", GOOD_PASSWORD); - cy.visit("/queries/manage"); + manageQueriesPage.visitManageQueriesPage(); }); it("allows maintainer to add a new query", () => { - cy.findByRole("button", { name: /new query/i }).click(); - cy.getAttached(".ace_text-input") - .click({ force: true }) - .clear({ force: true }) - .type("SELECT * FROM cypress;", { - force: true, - }); - cy.findByRole("button", { name: /save/i }).click(); - cy.getAttached(".modal__background").within(() => { - cy.getAttached(".modal__modal_container").within(() => { - cy.getAttached(".modal__content").within(() => { - cy.getAttached("form").within(() => { - cy.findByLabelText(/name/i).click().type("Cypress test query"); - cy.findByLabelText(/description/i) - .click() - .type("Cypress test of create new query flow."); - cy.findByLabelText(/observers can run/i).click({ - force: true, - }); - cy.findByRole("button", { name: /save query/i }).click(); - }); - }); - }); - }); - cy.findByText(/query created/i).should("exist"); + manageQueriesPage.allowsCreateNewQuery(); + manageQueriesPage.verifiesCreatedNewQuery(); }); it("allows maintainer to edit a query", () => { - cy.findByText(/cypress test query/i).click({ force: true }); - cy.getAttached(".ace_text-input") - .click({ force: true }) - .clear({ force: true }) - .type("SELECT * FROM cypress;", { - force: true, - }); - cy.findByText("Save").click(); // we have 'save as new' also - cy.findByText(/query updated/i).should("exist"); + manageQueriesPage.allowsEditExistingQuery(); + manageQueriesPage.verifiesEditedExistingQuery(); }); it("allows maintainer to run a query", () => { - cy.findByText(/cypress test query/i).click({ force: true }); - cy.findByText(/run query/i).click({ force: true }); - cy.findByText(/select targets/i).should("exist"); - cy.findByText(/all hosts/i).click(); - cy.findByText(/host targeted/i).should("exist"); // target count - cy.findByText(/run/i).click(); - cy.findByText(/querying selected host/i).should("exist"); // target count + manageQueriesPage.allowsRunQuery(); + manageQueriesPage.verifiesRanQuery(); }); }); describe("Manage policies page", () => { beforeEach(() => { cy.loginWithCySession("mary@organization.com", GOOD_PASSWORD); - cy.visit("/policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); }); it("hides manage automations from maintainer", () => { - cy.getAttached(".button-wrap").within(() => { - cy.findByRole("button", { name: /add a policy/i }).should("exist"); - cy.findByRole("button", { name: /manage automations/i }).should( - "not.exist" - ); - }); + managePoliciesPage.hidesButton("Manage automations"); }); it("allows maintainer to add a policy", () => { - cy.findByRole("button", { name: /add a policy/i }).click(); - cy.getAttached(".modal__ex").within(() => { - cy.findByRole("button").click(); - }); + managePoliciesPage.allowsAddDefaultPolicy(); + managePoliciesPage.verifiesAddedDefaultPolicy(); }); it("allows maintainer to delete a policy", () => { - // select checkmark on table - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ force: true }); - }); - }); - cy.findByRole("button", { name: /delete/i }).click(); - cy.getAttached(".delete-policy-modal").within(() => { - cy.findByRole("button", { name: /delete/i }).should("exist"); - cy.findByRole("button", { name: /cancel/i }).click(); - }); + managePoliciesPage.allowsDeletePolicy(); }); it("allows maintainer to select a policy and see CTAs to run and save", () => { - cy.getAttached(".data-table__table").within(() => { - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.findByRole("button", { - name: /filevault enabled/i, - }).click(); - }); - }); - }); - cy.getAttached(".policy-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).should("exist"); - cy.findByRole("button", { name: /save/i }).should("exist"); - }); + managePoliciesPage.allowsRunSavePolicy(); }); }); describe("Manage packs page", () => { beforeEach(() => { cy.loginWithCySession("mary@organization.com", GOOD_PASSWORD); - cy.visit("/packs/manage"); + managePacksPage.visitsManagePacksPage(); }); it("allows maintainer to create a pack", () => { - cy.findByRole("button", { name: /create new pack/i }).click(); - cy.findByLabelText(/name/i).click().type("Errors and crashes"); - cy.findByLabelText(/description/i) - .click() - .type("See all user errors and window crashes."); - cy.findByRole("button", { name: /save query pack/i }).click(); + managePacksPage.allowsCreatePack(); + managePacksPage.verifiesCreatedPack(); }); it("allows maintainer to delete a pack", () => { - // select checkmark on table - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ force: true }); - }); + managePacksPage.allowsDeletePack(); + managePacksPage.verifiesDeletedPack(); + }); + describe("User profile page", () => { + beforeEach(() => { + cy.loginWithCySession("mary@organization.com", GOOD_PASSWORD); + userProfilePage.visitUserProfilePage(); }); - cy.findByRole("button", { name: /delete/i }).click(); - cy.get(".remove-pack-modal .modal-cta-wrap") - .contains("button", /delete/i) - .click(); - cy.findByText(/successfully deleted/i).should("be.visible"); - cy.findByText(/server errors/i).should("not.exist"); - }); - }); - describe("User profile page", () => { - beforeEach(() => { - cy.loginWithCySession("mary@organization.com", GOOD_PASSWORD); - cy.visit("/profile"); - }); - it("verifies teams is disabled for the Profile page", () => { - cy.getAttached(".user-side-panel").within(() => { - cy.findByText(/teams/i).should("not.exist"); + it("verifies maintainer role and teams is disabled", () => { + userProfilePage.showRole("Maintainer"); }); }); - it("renders elements according to role-based access controls", () => { - cy.getAttached(".user-side-panel").within(() => { - cy.findByText("Role") - .next() - .contains(/maintainer/i); - }); - }); - }); - // nav restrictions are at the end because we expect to see a - // 403 error overlay which will hide the nav and make the test fail - describe("Nav restrictions", () => { - // cypress tends to fail on uncaught exceptions. since we have - // our own error handling, it's suggested to use this block to - // suppress so the tests will keep running - Cypress.on("uncaught:exception", () => { - return false; - }); - beforeEach(() => { - cy.loginWithCySession("mary@organization.com", GOOD_PASSWORD); - }); - it("verifies maintainer does not have access to settings", () => { - cy.findByText(/settings/i).should("not.exist"); - cy.visit("/settings/organization"); - cy.findByText(/you do not have permissions/i).should("exist"); + // nav restrictions are at the end because we expect to see a + // 403 error overlay which will hide the nav and make the test fail + describe("Nav restrictions", () => { + // cypress tends to fail on uncaught exceptions. since we have + // our own error handling, it's suggested to use this block to + // suppress so the tests will keep running + Cypress.on("uncaught:exception", () => { + return false; + }); + beforeEach(() => { + cy.loginWithCySession("mary@organization.com", GOOD_PASSWORD); + }); + it("verifies maintainer does not have access to settings", () => { + cy.findByText(/settings/i).should("not.exist"); + cy.visit("/settings/organization"); + cy.findByText(/you do not have permissions/i).should("exist"); + }); }); }); } diff --git a/cypress/integration/free/observer.spec.ts b/cypress/integration/free/observer.spec.ts index e1e8afa676..7341593967 100644 --- a/cypress/integration/free/observer.spec.ts +++ b/cypress/integration/free/observer.spec.ts @@ -1,4 +1,13 @@ import CONSTANTS from "../../support/constants"; +import dashboardPage from "../pages/dashboardPage"; +import hostDetailsPage from "../pages/hostDetailsPage"; +import manageHostsPage from "../pages/manageHostsPage"; +import managePacksPage from "../pages/managePacksPage"; +import managePoliciesPage from "../pages/managePoliciesPage"; +import manageQueriesPage from "../pages/manageQueriesPage"; +import manageSchedulePage from "../pages/manageSchedulePage"; +import manageSoftwarePage from "../pages/manageSoftwarePage"; +import userProfilePage from "../pages/userProfilePage"; const { GOOD_PASSWORD } = CONSTANTS; @@ -21,7 +30,7 @@ describe("Free tier - Observer user", () => { describe("Navigation", () => { beforeEach(() => { cy.loginWithCySession("oliver@organization.com", GOOD_PASSWORD); - cy.visit("/dashboard"); + dashboardPage.visitsDashboardPage(); }); it("displays intended global observer top navigation", () => { cy.getAttached(".site-nav-container").within(() => { @@ -39,155 +48,73 @@ describe("Free tier - Observer user", () => { describe("Dashboard", () => { beforeEach(() => { cy.loginWithCySession("oliver@organization.com", GOOD_PASSWORD); - cy.visit("/dashboard"); + dashboardPage.visitsDashboardPage(); }); - it("displays cards for all platforms", () => { - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-software").should("exist"); - cy.getAttached(".activity-feed").should("exist"); - }); + it("displays cards for all platforms and does not filter host platform", () => { + dashboardPage.displaysCards("All"); + dashboardPage.verifiesFilteredHostByPlatform("none"); }); - it("displays cards for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for windows only and filters hosts by Windows platform", () => { + dashboardPage.switchesPlatform("Windows"); + dashboardPage.displaysCards("Windows"); + dashboardPage.verifiesFilteredHostByPlatform("Windows"); }); - it("displays cards for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for linux only and filters hosts by Linux platform", () => { + dashboardPage.switchesPlatform("Linux"); + dashboardPage.displaysCards("Linux"); + dashboardPage.verifiesFilteredHostByPlatform("Linux"); }); - it("displays cards for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/fleet test/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-mdm").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); - }); - it("views all hosts for all platforms", () => { - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by/i }).should( - "not.exist" - ); - }); - it("views all hosts for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by Windows/i }).should( - "exist" - ); - }); - it("views all hosts for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by linux/i }).should( - "exist" - ); - }); - it("views all hosts for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by macOS/i }).should( - "exist" - ); + it("displays cards for macOS only and filters hosts by macOS platform", () => { + dashboardPage.switchesPlatform("macOS"); + dashboardPage.displaysCards("macOS"); + dashboardPage.verifiesFilteredHostByPlatform("macOS"); }); }); describe("Manage hosts page", () => { beforeEach(() => { cy.loginWithCySession("oliver@organization.com", GOOD_PASSWORD); - cy.visit("/hosts/manage"); + manageHostsPage.visitsManageHostsPage(); }); - it("verifies teams is disabled on Manage Host page", () => { - cy.findByText(/teams/i).should("not.exist"); + it("verifies teams is disabled", () => { + manageHostsPage.verifiesTeamsIsDisabled(); }); - it("hides 'Add hosts' button", () => { - cy.contains("button", /add hosts/i).should("not.exist"); - }); - it("hides add a label button", () => { - cy.contains("button", /add label/i).should("not.exist"); - }); - it("hides manage enroll secrets button", () => { - cy.contains("button", /manage enroll secret/i).should("not.exist"); + it("hides 'Add hosts', 'Add label', and 'Manage enroll secrets' buttons", () => { + manageHostsPage.hidesButton("Add label"); + manageHostsPage.hidesButton("Add hosts"); + manageHostsPage.hidesButton("Manage enroll secret"); }); }); describe("Host details page", () => { beforeEach(() => { cy.loginWithCySession("oliver@organization.com", GOOD_PASSWORD); - cy.visit("/hosts/1"); + hostDetailsPage.visitsHostDetailsPage(1); }); it("verifies teams is disabled on Host Details page", () => { - cy.findByText(/team/i).should("not.exist"); + hostDetailsPage.verifiesTeamsisDisabled(); }); - it("hides transfer host button", () => { - cy.contains("button", /transfer/i).should("not.exist"); - }); - it("hides delete host button", () => { - cy.contains("button", /delete/i).should("not.exist"); - }); - it("hides query host button", () => { - cy.contains("button", /query/i).click(); + it("hides all cta buttons", () => { + hostDetailsPage.hidesButton("Transfer"); + hostDetailsPage.hidesButton("Query"); + hostDetailsPage.hidesButton("Delete"); + hostDetailsPage.hidesCreateOSPolicy(); }); }); describe("Manage software page", () => { beforeEach(() => { cy.loginWithCySession("oliver@organization.com", GOOD_PASSWORD); - cy.visit("/software/manage"); + manageSoftwarePage.visitManageSoftwarePage(); }); it("hides manage automations button", () => { - cy.getAttached(".manage-software-page__header-wrap").within(() => { - cy.findByRole("button", { name: /manage automations/i }).should( - "not.exist" - ); - }); + manageSoftwarePage.hidesButton("Manage automations"); }); }); describe("Query page", () => { beforeEach(() => { cy.loginWithCySession("oliver@organization.com", GOOD_PASSWORD); - cy.visit("/queries/manage"); + manageQueriesPage.visitManageQueriesPage(); }); - it("hides create a query button", () => { - cy.findByRole("button", { name: /create new query/i }).should( - "not.exist" - ); + it("hides 'Create a query' button", () => { + manageQueriesPage.hidesButton("Create new query"); }); it("verifies observer can select a query and only run it", () => { cy.getAttached(".data-table__table").within(() => { @@ -205,49 +132,25 @@ describe("Free tier - Observer user", () => { describe("Manage policies page", () => { beforeEach(() => { cy.loginWithCySession("oliver@organization.com", GOOD_PASSWORD); - cy.visit("/policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); }); it("hides manage automations button", () => { - cy.findByText(/manage automations/i).should("not.exist"); + managePoliciesPage.hidesButton("Manage automations"); }); - it("hides add a policy button", () => { - cy.findByText(/add a policy/).should("not.exist"); + it("hides 'Add a policy' button", () => { + managePoliciesPage.hidesButton("Add a policy"); }); - it("hides run, edit, or delete a policy", () => { - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.get(".fleet-checkbox__input").should("not.exist"); - }); - }); - cy.getAttached(".data-table__table").within(() => { - cy.findByRole("button", { - name: /filevault enabled/i, - }).click(); - }); - cy.getAttached(".policy-form__wrapper").within(() => { - cy.findByRole("button", { name: /run/i }).should("not.exist"); - cy.findByRole("button", { name: /save/i }).should("not.exist"); - }); + it("hides 'Run', 'Edit', and 'Delete' a policy", () => { + managePoliciesPage.allowsViewPolicyOnly(); }); }); describe("User profile page", () => { beforeEach(() => { cy.loginWithCySession("oliver@organization.com", GOOD_PASSWORD); - cy.visit("/profile"); + userProfilePage.visitUserProfilePage(); }); - it("verifies teams is disabled for the Profile page", () => { - cy.getAttached(".user-side-panel").within(() => { - cy.findByText(/teams/i).should("not.exist"); - }); - }); - it("renders elements according to role-based access controls", () => { - cy.getAttached(".user-side-panel").within(() => { - cy.findByText("Role") - .next() - .contains(/observer/i); - }); + it("verifies user role and teams is disabled", () => { + userProfilePage.showRole("Observer"); }); }); @@ -268,9 +171,9 @@ describe("Free tier - Observer user", () => { cy.findByText(/schedule/i).should("not.exist"); cy.visit("/settings/organization"); cy.findByText(/you do not have permissions/i).should("exist"); - cy.visit("/packs/manage"); + managePacksPage.visitsManagePacksPage(); cy.findByText(/you do not have permissions/i).should("exist"); - cy.visit("/schedule/manage"); + manageSchedulePage.visitManageSchedulePage(); cy.findByText(/you do not have permissions/i).should("exist"); }); }); diff --git a/cypress/integration/pages/dashboardPage.ts b/cypress/integration/pages/dashboardPage.ts new file mode 100644 index 0000000000..a1cc45d808 --- /dev/null +++ b/cypress/integration/pages/dashboardPage.ts @@ -0,0 +1,85 @@ +const dashboardPage = { + visitsDashboardPage: () => { + cy.visit("/dashboard"); + }, + + switchesPlatform: (platform = "") => { + cy.getAttached(".homepage__platform_dropdown").click(); + cy.getAttached(".Select-menu-outer").within(() => { + cy.findAllByText(platform).click(); + }); + }, + + displaysCards: (platform = "") => { + switch (platform) { + case "macOS": + cy.getAttached(".homepage__wrapper").within(() => { + cy.findByText(/platform/i).should("exist"); + cy.getAttached(".hosts-summary").should("exist"); + cy.getAttached(".hosts-status").should("exist"); + cy.getAttached(".home-mdm").should("exist"); + cy.getAttached(".operating-systems").should("exist"); + // "get" because we expect it not to exist + cy.get(".home-software").should("not.exist"); + cy.get(".activity-feed").should("not.exist"); + }); + break; + case "Windows": + cy.getAttached(".homepage__wrapper").within(() => { + cy.findByText(/platform/i).should("exist"); + cy.getAttached(".hosts-summary").should("exist"); + cy.getAttached(".hosts-status").should("exist"); + cy.getAttached(".operating-systems").should("exist"); + // "get" because we expect it not to exist + cy.get(".home-software").should("not.exist"); + cy.get(".activity-feed").should("not.exist"); + }); + break; + case "Linux": + cy.getAttached(".homepage__wrapper").within(() => { + cy.findByText(/platform/i).should("exist"); + cy.getAttached(".hosts-summary").should("exist"); + cy.getAttached(".hosts-status").should("exist"); + // "get" because we expect it not to exist + cy.get(".home-software").should("not.exist"); + cy.get(".activity-feed").should("not.exist"); + }); + break; + case "All": + cy.getAttached(".homepage__wrapper").within(() => { + cy.findByText(/platform/i).should("exist"); + cy.getAttached(".hosts-summary").should("exist"); + cy.getAttached(".hosts-status").should("exist"); + cy.getAttached(".home-software").should("exist"); + cy.getAttached(".activity-feed").should("exist"); + }); + break; + default: + // no activity feed on team page + cy.getAttached(".homepage__wrapper").within(() => { + cy.findByText(/platform/i).should("exist"); + cy.getAttached(".hosts-summary").should("exist"); + cy.getAttached(".hosts-status").should("exist"); + cy.getAttached(".home-software").should("exist"); + cy.get(".activity-feed").should("not.exist"); + }); + break; + } + }, + + verifiesFilteredHostByPlatform: (platform: string) => { + if (platform === "none") { + cy.findByText(/view all hosts/i).click(); + cy.findByRole("status", { name: /hosts filtered by/i }).should( + "not.exist" + ); + } else { + cy.findByText(/view all hosts/i).click(); + cy.findByRole("status", { + name: `hosts filtered by ${platform}`, + }).should("exist"); + } + }, +}; + +export default dashboardPage; diff --git a/cypress/integration/pages/hostDetailsPage.ts b/cypress/integration/pages/hostDetailsPage.ts new file mode 100644 index 0000000000..c271a9b334 --- /dev/null +++ b/cypress/integration/pages/hostDetailsPage.ts @@ -0,0 +1,108 @@ +const hostDetailsPage = { + visitsHostDetailsPage: (hostId: number) => { + cy.visit(`/hosts/${hostId}`); + }, + + verifiesTeamsisDisabled: () => { + cy.findByText(/team/i).should("not.exist"); + }, + + verifiesTeam: (teamName: string) => { + cy.getAttached(".info-flex").within(() => { + // Team is shown for host + cy.findByText(teamName).should("exist"); + }); + }, + + hidesButton: (text: string) => { + cy.contains("button", text).should("not.exist"); + }, + + allowsDeleteHost: () => { + cy.findByRole("button", { name: /delete/i }).click(); + cy.getAttached(".modal__modal_container").within(() => { + cy.findByRole("button", { name: /delete/i }).should("be.enabled"); + }); + }, + + verifiesDeletedHost: (hostname: string) => { + cy.getAttached(".modal__modal_container") + .within(() => { + cy.findByRole("button", { name: /delete/i }).click(); + }) + .then(() => { + cy.findByText(/add your devices to fleet/i).should("exist"); + cy.findByText(/add hosts/i).should("exist"); + cy.findByText(/about this host/i).should("not.exist"); + cy.findByText(hostname).should("not.exist"); + }); + }, + + allowsTransferHost: (create: boolean) => { + cy.findByRole("button", { name: /transfer/i }).click(); + if (create) { + cy.findByText(/create a team/i).should("exist"); + } else { + cy.findByText(/create a team/i).should("not.exist"); + } + cy.getAttached(".Select-control").click(); + cy.getAttached(".Select-menu").within(() => { + cy.findByText(/no team/i).should("exist"); + cy.findByText(/oranges/i).should("exist"); + cy.findByText(/apples/i).click(); + }); + cy.getAttached(".transfer-host-modal .modal-cta-wrap") + .contains("button", /transfer/i) + .should("be.enabled"); + }, + + verifiesTransferredHost: () => { + cy.getAttached(".transfer-host-modal .modal-cta-wrap") + .contains("button", /transfer/i) + .click(); + cy.findByText(/transferred to apples/i).should("exist"); + cy.findByText(/team/i).next().contains("Apples"); + }, + + allowsCustomQueryHost: () => { + cy.findByRole("button", { name: /query/i }).click(); + cy.findByRole("button", { name: /create custom query/i }).should( + "be.enabled" + ); + cy.getAttached(".modal__ex").within(() => { + cy.findByRole("button").click(); + }); + }, + + hidesCustomQueryHost: () => { + cy.findByRole("button", { name: /query/i }).click(); + cy.contains("button", /create custom query/i).should("not.exist"); + cy.getAttached(".modal__ex").click(); + }, + + allowsCreateOsPolicy: () => { + cy.getAttached(".info-flex").within(() => { + cy.findByText(/ubuntu/i).should("exist"); + cy.getAttached(".host-summary__os-policy-button").click(); + }); + cy.getAttached(".modal__content") + .findByRole("button", { name: /create new policy/i }) + .should("be.enabled"); + }, + + hidesCreateOSPolicy: () => { + cy.getAttached(".info-flex").within(() => { + cy.findByText("Operating system") + .next() + .findByText(/ubuntu/i) + .should("exist"); + + cy.findByText("Operating system") + .next() + .findByRole("button") + .should("not.exist"); + }); + }, +}; + +export default hostDetailsPage; diff --git a/cypress/integration/pages/manageHostsPage.ts b/cypress/integration/pages/manageHostsPage.ts new file mode 100644 index 0000000000..f7b0d9b681 --- /dev/null +++ b/cypress/integration/pages/manageHostsPage.ts @@ -0,0 +1,55 @@ +const manageHostsPage = { + visitsManageHostsPage: () => { + cy.visit("/hosts/manage"); + }, + + allowsManageAndAddSecrets: () => { + cy.getAttached(".button-wrap") + .contains("button", /manage enroll secret/i) + .click(); + cy.contains("button", /add secret/i).click(); + cy.contains("button", /save/i).click(); + cy.contains("button", /done/i).click(); + }, + + allowsAddHosts: () => { + cy.getAttached(".button-wrap") + .contains("button", /add hosts/i) + .click(); + cy.getAttached(".modal__content").contains("button", /done/i).click(); + }, + + allowsAddLabelForm: () => { + cy.getAttached(".label-filter-select__control").click(); + cy.findByRole("button", { name: /add label/i }).click(); + cy.findByText(/new label/i).should("exist"); + cy.getAttached(".label-form__button-wrap") + .contains("button", /cancel/i) + .click(); + }, + + hidesButton: (text: string) => { + if (text === "Add label") { + cy.getAttached(".label-filter-select__control").click(); + cy.contains("button", /add label/i).should("not.exist"); + } else { + cy.contains("button", text).should("not.exist"); + } + }, + + includesTeamColumn: () => { + cy.getAttached("thead").within(() => { + cy.findByText(/team/i).should("exist"); + }); + }, + + includesTeamDropdown: (teamName = "All teams") => { + cy.getAttached(".Select-value-label").contains(teamName); + }, + + verifiesTeamsIsDisabled: () => { + cy.findByText(/teams/i).should("not.exist"); + }, +}; + +export default manageHostsPage; diff --git a/cypress/integration/pages/managePacksPage.ts b/cypress/integration/pages/managePacksPage.ts new file mode 100644 index 0000000000..6683f5ae6c --- /dev/null +++ b/cypress/integration/pages/managePacksPage.ts @@ -0,0 +1,61 @@ +const managePacksPage = { + visitsManagePacksPage: () => { + cy.visit("/packs/manage"); + }, + + hidesButton: (text: string) => { + cy.contains("button", text).should("not.exist"); + }, + + allowsCreatePack: () => { + cy.findByRole("button", { name: /create new pack/i }).click(); + cy.findByLabelText(/name/i).click().type("Errors and crashes"); + cy.findByLabelText(/description/i) + .click() + .type("See all user errors and window crashes."); + cy.findByRole("button", { name: /save query pack/i }).should("be.enabled"); + }, + + verifiesCreatedPack: () => { + cy.findByRole("button", { name: /save query pack/i }).click(); + }, + + allowsEditPack: () => { + cy.findByLabelText(/name/i).clear().type("Server errors"); + cy.findByLabelText(/description/i) + .clear() + .type("See all server errors."); + cy.findByRole("button", { name: /save/i }).should("be.enabled"); + }, + + verifiesEditedPack: () => { + cy.findByRole("button", { name: /save/i }).click(); + }, + + allowsDeletePack: () => { + cy.getAttached("tbody").within(() => { + cy.getAttached("tr") + .first() + .within(() => { + cy.getAttached(".fleet-checkbox__input").check({ force: true }); + }); + }); + cy.findByRole("button", { name: /delete/i }).click(); + cy.getAttached(".remove-pack-modal .modal-cta-wrap > .button--alert") + .contains("button", /delete/i) + .should("be.enabled"); + }, + + verifiesDeletedPack: () => { + cy.getAttached(".remove-pack-modal .modal-cta-wrap > .button--alert") + .contains("button", /delete/i) + .click({ force: true }); + cy.findByText(/successfully deleted/i).should("be.visible"); + managePacksPage.visitsManagePacksPage(); + cy.getAttached(".table-container").within(() => { + cy.findByText(/windows starter pack/i).should("not.exist"); + }); + }, +}; + +export default managePacksPage; diff --git a/cypress/integration/pages/managePoliciesPage.ts b/cypress/integration/pages/managePoliciesPage.ts new file mode 100644 index 0000000000..4171d6e40f --- /dev/null +++ b/cypress/integration/pages/managePoliciesPage.ts @@ -0,0 +1,115 @@ +const managePoliciesPage = { + visitManagePoliciesPage: () => { + cy.visit("/policies/manage"); + }, + + hidesButton: (text: string) => { + cy.contains("button", text).should("not.exist"); + }, + + allowsAddDefaultPolicy: () => { + cy.findByRole("button", { name: /add a policy/i }).click(); + // Add a default policy + cy.findByText(/gatekeeper enabled/i).click(); + cy.getAttached(".policy-form__button-wrap").within(() => { + cy.findByRole("button", { name: /run/i }).should("exist"); + cy.findByRole("button", { name: /save/i }).click(); + }); + }, + + verifiesAddedDefaultPolicy: () => { + cy.getAttached(".modal-cta-wrap").within(() => { + cy.findByRole("button", { name: /save policy/i }).click(); + }); + cy.findByText(/policy created/i).should("exist"); + cy.findByText(/gatekeeper enabled/i).should("exist"); + }, + + allowsAutomatePolicy: () => { + cy.getAttached(".button-wrap") + .findByRole("button", { name: /manage automations/i }) + .click(); + + cy.getAttached(".manage-automations-modal").within(() => { + cy.getAttached(".fleet-slider").click(); + cy.getAttached(".fleet-checkbox__input").check({ force: true }); + cy.getAttached("#webhook-url").clear().type("https://example.com/admin"); + }); + }, + + verifiesAutomatedPolicy: () => { + cy.getAttached(".manage-automations-modal").within(() => { + cy.findByRole("button", { name: /save/i }).click(); + }); + cy.findByText(/successfully updated policy automations/i).should("exist"); + }, + + allowsDeletePolicy: () => { + cy.getAttached("tbody").within(() => { + cy.getAttached("tr") + .first() + .within(() => { + cy.getAttached(".fleet-checkbox__input").check({ + force: true, + }); + }); + }); + cy.findByRole("button", { name: /delete/i }).click(); + cy.getAttached(".delete-policy-modal").within(() => { + cy.findByRole("button", { name: /delete/i }).should("be.enabled"); + }); + }, + + verifiesDeletedPolicy: () => { + cy.getAttached(".delete-policy-modal").within(() => { + cy.findByRole("button", { name: /delete/i }).click(); + }); + cy.findByText(/deleted policy/i).should("exist"); + cy.findByText(/backup/i).should("not.exist"); + }, + + allowsSelectRunSavePolicy: (name = "gatekeeper") => { + cy.getAttached(".data-table__table").within(() => { + cy.findByRole("button", { name: RegExp(name, "i") }).click(); + }); + cy.getAttached(".policy-form__button-wrap").within(() => { + cy.findByRole("button", { name: /run/i }).should("exist"); + cy.findByRole("button", { name: /save/i }).should("exist"); + }); + }, + + allowsViewPolicyOnly: () => { + cy.getAttached("tbody").within(() => { + cy.getAttached("tr") + .first() + .within(() => { + cy.contains(".fleet-checkbox__input").should("not.exist"); + cy.findByRole("button", { name: /filevault/i }).click(); + }); + }); + cy.getAttached(".policy-form__wrapper").within(() => { + cy.findByRole("button", { name: /run/i }).should("not.exist"); + cy.findByRole("button", { name: /save/i }).should("not.exist"); + }); + }, + + allowsRunSavePolicy: () => { + cy.getAttached(".data-table__table").within(() => { + cy.getAttached("tbody").within(() => { + cy.getAttached("tr") + .first() + .within(() => { + cy.findByRole("button", { + name: /gatekeeper/i, + }).click(); + }); + }); + }); + cy.getAttached(".policy-form__button-wrap").within(() => { + cy.findByRole("button", { name: /run/i }).should("exist"); + cy.findByRole("button", { name: /save/i }).should("exist"); + }); + }, +}; + +export default managePoliciesPage; diff --git a/cypress/integration/pages/manageQueriesPage.ts b/cypress/integration/pages/manageQueriesPage.ts new file mode 100644 index 0000000000..adcd5a769b --- /dev/null +++ b/cypress/integration/pages/manageQueriesPage.ts @@ -0,0 +1,162 @@ +import * as path from "path"; +import { format } from "date-fns"; + +const manageQueriesPage = { + visitManageQueriesPage: () => { + cy.visit("/queries/manage"); + }, + + hidesButton: (text: string) => { + cy.contains("button", text).should("not.exist"); + }, + + allowsCreateNewQuery: () => { + cy.findByRole("button", { name: /new query/i }).click(); + cy.getAttached(".ace_scroller") + .click({ force: true }) + .type("{selectall}SELECT * FROM windows_crashes;"); + cy.findByRole("button", { name: /save/i }).click(); + cy.getAttached(".modal__background").within(() => { + cy.getAttached(".modal__modal_container").within(() => { + cy.getAttached(".modal__content").within(() => { + cy.getAttached("form").within(() => { + cy.findByLabelText(/name/i).click().type("Cypress test query"); + cy.findByLabelText(/description/i) + .click() + .type("Cypress test of create new query flow."); + cy.findByLabelText(/observers can run/i).click({ force: true }); + }); + }); + }); + }); + }, + + verifiesCreatedNewQuery: () => { + cy.getAttached(".modal__background").within(() => { + cy.getAttached(".modal__modal_container").within(() => { + cy.getAttached(".modal__content").within(() => { + cy.getAttached("form").within(() => { + cy.findByRole("button", { name: /save query/i }).click(); + }); + }); + }); + }); + cy.findByText(/query created/i).should("exist"); + cy.getAttached(".query-form__query-name").within(() => { + cy.findByText(/cypress test query/i).should("exist"); + }); + }, + + allowsEditExistingQuery: () => { + cy.getAttached(".name__cell .button--text-link") + .first() + .click({ force: true }); + cy.getAttached(".ace_text-input") + .click({ force: true }) + .clear({ force: true }) + .type("SELECT 1 FROM cypress;", { + force: true, + }); + }, + + verifiesEditedExistingQuery: () => { + cy.findByRole("button", { name: "Save" }).click(); // we have 'save as new' also + cy.findByText(/query updated/i).should("be.visible"); + }, + + allowsSaveAsNewQuery: () => { + cy.getAttached(".name__cell .button--text-link") + .eq(1) + .within(() => { + cy.findByText(/get authorized/i).click(); + }); + cy.findByRole("button", { name: /run query/i }).should("exist"); + cy.getAttached(".ace_scroller") + .click() + .type("{selectall}SELECT datetime, username FROM windows_crashes;"); + cy.findByRole("button", { name: /save as new/i }).should("be.enabled"); + }, + + verifiesSavedAsNewQuery: () => { + cy.findByRole("button", { name: /save as new/i }).click(); + cy.findByText(/successfully added query/i).should("be.visible"); + cy.findByText(/copy of/i).should("be.visible"); + }, + + allowsDeleteExistingQuery: () => { + cy.findByText(/detect presence of authorized ssh keys/i) + .parent() + .parent() + .parent() + .within(() => { + cy.getAttached(".fleet-checkbox__input").check({ + force: true, + }); + }); + cy.findByRole("button", { name: /delete/i }).click(); + cy.getAttached(".delete-query-modal .modal-cta-wrap").within(() => { + cy.findByRole("button", { name: /delete/i }).should("exist"); + }); + }, + + verifiesDeletedExistingQuery: () => { + cy.getAttached(".delete-query-modal .modal-cta-wrap").within(() => { + cy.findByRole("button", { name: /delete/i }).click(); + }); + cy.findByText(/successfully deleted query/i).should("be.visible"); + cy.findByText(/detect presence of authorized ssh keys/i).should( + "not.exist" + ); + }, + + // TODO: Allows delete of self authored query only (Team Admin, team maintainer) + + allowsSelectTeamTargets: () => { + cy.getAttached("tbody").within(() => { + cy.findAllByText(/detect presence/i).click(); + }); + + cy.getAttached(".query-form__button-wrap").within(() => { + cy.findByRole("button", { name: /run/i }).click(); + }); + cy.contains("h3", /teams/i).should("exist"); + cy.contains(".selector-name", /apples/i).should("exist"); + }, + + allowsRunQuery: () => { + cy.getAttached(".name__cell .button--text-link").first().click(); + cy.findByRole("button", { name: /run query/i }).click(); + cy.findByText(/select targets/i).should("exist"); + cy.findByText(/all hosts/i).click(); + cy.findByText(/host targeted/i).should("exist"); // target count + }, + + verifiesRanQuery: () => { + cy.findByRole("button", { name: /run/i }).click(); + cy.findByText(/querying selected host/i).should("exist"); // target count + }, + + allowsViewRanQuery: () => { + // Ensures live query runs + cy.wait(10000); // eslint-disable-line cypress/no-unnecessary-waiting + cy.getAttached(".table-container").within(() => { + cy.findByRole("button", { name: /show query/i }).click(); + }); + cy.getAttached(".show-query-modal").within(() => { + cy.findByRole("button", { name: /done/i }).click(); + }); + }, + + allowsExportQueryResults: () => { + cy.getAttached(".table-container").within(() => { + cy.findByRole("button", { name: /export results/i }).click(); + const formattedTime = format(new Date(), "MM-dd-yy hh-mm-ss"); + const filename = `Query Results (${formattedTime}).csv`; + cy.readFile(path.join(Cypress.config("downloadsFolder"), filename), { + timeout: 5000, + }); + }); + }, +}; + +export default manageQueriesPage; diff --git a/cypress/integration/pages/manageSchedulePage.ts b/cypress/integration/pages/manageSchedulePage.ts new file mode 100644 index 0000000000..36e85983d7 --- /dev/null +++ b/cypress/integration/pages/manageSchedulePage.ts @@ -0,0 +1,124 @@ +const manageSchedulePage = { + visitManageSchedulePage: () => { + cy.visit("/schedule/manage"); + }, + + hidesButton: (text: string) => { + if (text === "Advanced") { + cy.getAttached(".no-schedule__cta-buttons").within(() => { + cy.contains("button", text).should("not.exist"); + }); + } else cy.contains("button", text).should("not.exist"); + }, + + changesTeam: (team1: string, team2: string) => { + cy.getAttached(".manage-schedule-page__header").within(() => { + cy.contains(team1).click({ force: true }); + cy.contains(team2).click({ force: true }); + }); + }, + + confirmsTeam: (team: string) => { + cy.getAttached(".manage-schedule-page__header-wrap").within(() => { + cy.findByText(team).should("exist"); + }); + }, + + allowsAddSchedule: () => { + cy.getAttached(".no-schedule__cta-buttons").within(() => { + cy.findByRole("button", { name: /schedule a query/i }).click({ + force: true, + }); + }); + cy.getAttached(".schedule-editor-modal__form").within(() => { + cy.findByText(/select query/i).click(); + cy.findByText(/get local/i).click(); + cy.findByText(/every day/i).click(); + cy.findByText(/every 6 hours/i).click(); + cy.findByText(/show advanced options/i).click(); + cy.findByText(/snapshot/i).click(); + cy.findByText(/ignore removals/i).click(); + cy.getAttached(".schedule-editor-modal__form-field--platform").within( + () => { + cy.findByText(/all/i).click(); + cy.findByText(/linux/i).click(); + } + ); + cy.getAttached(".schedule-editor-modal__form-field--osquer-vers").within( + () => { + cy.findByText(/all/i).click(); + cy.findByText(/4.6.0/i).click(); + } + ); + cy.getAttached(".schedule-editor-modal__form-field--shard").within(() => { + cy.getAttached(".input-field").click().type("50"); + }); + cy.getAttached(".modal-cta-wrap").within(() => { + cy.findByRole("button", { name: /schedule/i }).should("be.enabled"); + }); + }); + }, + + verifiesAddedSchedule: () => { + cy.getAttached(".modal-cta-wrap").within(() => { + cy.findByRole("button", { name: /schedule/i }).click(); + }); + cy.findByText(/successfully added/i).should("be.visible"); + cy.getAttached("tbody>tr").should("have.length", 1); + }, + + allowsEditSchedule: () => { + cy.getAttached(".manage-schedule-page"); + cy.getAttached("tbody>tr") + .should("have.length", 1) + .within(() => { + cy.findByText(/action/i).click(); + cy.findByText(/edit/i).click(); + }); + cy.getAttached(".schedule-editor-modal__form").within(() => { + cy.findByText(/every 6 hours/i).click(); + cy.findByText(/every day/i).click(); + + cy.getAttached(".modal-cta-wrap").within(() => { + cy.findByRole("button", { name: /schedule/i }).should("be.enabled"); + }); + }); + }, + + verifiesEditedSchedule: () => { + cy.getAttached(".modal-cta-wrap").within(() => { + cy.findByRole("button", { name: /schedule/i }).click(); + }); + cy.findByText(/successfully updated/i).should("be.visible"); + }, + + allowsRemoveSchedule: () => { + cy.getAttached(".manage-schedule-page"); + cy.getAttached("tbody>tr") + .should("have.length", 1) + .within(() => { + cy.getAttached(".Select-placeholder").within(() => { + cy.findByText(/action/i).click(); + }); + cy.getAttached(".Select-menu").within(() => { + cy.findByText(/remove/i).click(); + }); + }); + cy.getAttached(".remove-scheduled-query-modal .modal-cta-wrap").within( + () => { + cy.findByRole("button", { name: /remove/i }).should("be.enabled"); + } + ); + }, + + verifiesRemovedSchedule: () => { + cy.getAttached(".remove-scheduled-query-modal .modal-cta-wrap").within( + () => { + cy.findByRole("button", { name: /remove/i }).click(); + } + ); + cy.findByText(/successfully removed/i).should("be.visible"); + }, +}; + +export default manageSchedulePage; diff --git a/cypress/integration/pages/manageSoftwarePage.ts b/cypress/integration/pages/manageSoftwarePage.ts new file mode 100644 index 0000000000..cf9c1d1009 --- /dev/null +++ b/cypress/integration/pages/manageSoftwarePage.ts @@ -0,0 +1,16 @@ +const manageSoftwarePage = { + visitManageSoftwarePage: () => { + cy.visit("/software/manage"); + }, + + hidesButton: (text: string) => { + cy.contains("button", text).should("not.exist"); + }, + + allowsManageAutomations: () => { + cy.findByRole("button", { name: /manage automations/i }).click(); + cy.findByRole("button", { name: /cancel/i }).click(); + }, +}; + +export default manageSoftwarePage; diff --git a/cypress/integration/pages/teamsDropdown.ts b/cypress/integration/pages/teamsDropdown.ts new file mode 100644 index 0000000000..985930adf1 --- /dev/null +++ b/cypress/integration/pages/teamsDropdown.ts @@ -0,0 +1,10 @@ +const teamsDropdown = { + switchTeams: (team1: string, team2: string) => { + cy.getAttached(".component__team-dropdown").within(() => { + cy.findByText(team1).click({ force: true }); + }); + cy.getAttached(".Select-menu").contains(team2).click({ force: true }); + }, +}; + +export default teamsDropdown; diff --git a/cypress/integration/pages/userProfilePage.ts b/cypress/integration/pages/userProfilePage.ts new file mode 100644 index 0000000000..b5d805fd2f --- /dev/null +++ b/cypress/integration/pages/userProfilePage.ts @@ -0,0 +1,21 @@ +const userProfilePage = { + visitUserProfilePage: () => { + cy.visit("/profile"); + }, + + showRole: (role: string, team?: string) => { + cy.getAttached(".user-side-panel").within(() => { + if (team) { + cy.getAttached(".user-side-panel__header") + .contains(/team/i) + .next() + .contains(team); + } else { + cy.findByText(/teams/i).should("not.exist"); + } + cy.findByText("Role").next().contains(role); + }); + }, +}; + +export default userProfilePage; diff --git a/cypress/integration/premium/admin.spec.ts b/cypress/integration/premium/admin.spec.ts index 133048c2d8..caeafc3916 100644 --- a/cypress/integration/premium/admin.spec.ts +++ b/cypress/integration/premium/admin.spec.ts @@ -1,4 +1,11 @@ import CONSTANTS from "../../support/constants"; +import hostDetailsPage from "../pages/hostDetailsPage"; +import managePoliciesPage from "../pages/managePoliciesPage"; +import manageHostsPage from "../pages/manageHostsPage"; +import manageQueriesPage from "../pages/manageQueriesPage"; +import manageSoftwarePage from "../pages/manageSoftwarePage"; +import teamsDropdown from "../pages/teamsDropdown"; +import userProfilePage from "../pages/userProfilePage"; const { GOOD_PASSWORD, CONFIG_INTEGRATIONS_AUTOMATIONS } = CONSTANTS; @@ -354,36 +361,35 @@ describe("Premium tier - Global Admin user", () => { // Global Admin dashboard tested in integration/free/admin.spec.ts // Team Admin dashboard tested below in integration/premium/admin.spec.ts describe("Manage hosts page", () => { - beforeEach(() => cy.visit("/hosts/manage")); - it("displays team column in hosts table", () => { - cy.getAttached(".data-table__table th") - .contains("Team") - .should("be.visible"); + beforeEach(() => manageHostsPage.visitsManageHostsPage()); + it("verifies teams is enabled on Manage host page", () => { + manageHostsPage.includesTeamColumn(); }); - it("allows global admin to see and click 'Add hosts'", () => { - cy.getAttached(".button-wrap") - .contains("button", /add hosts/i) - .click(); - cy.getAttached(".modal__content").contains("button", /done/i).click(); + it("allows global admin to see and click all CTA buttons", () => { + manageHostsPage.allowsAddHosts(); + manageHostsPage.allowsManageAndAddSecrets(); + manageHostsPage.allowsAddLabelForm(); }); - it("allows global admin to add new enroll secret", () => { - cy.getAttached(".button-wrap") - .contains("button", /manage enroll secret/i) - .click(); - cy.getAttached(".enroll-secret-modal__add-secret") - .contains("button", /add secret/i) - .click(); - cy.getAttached(".secret-editor-modal .modal-cta-wrap") - .contains("button", /save/i) - .click(); - cy.getAttached(".enroll-secret-modal .modal-cta-wrap") - .contains("button", /done/i) - .click(); + }); + describe("Host details page", () => { + beforeEach(() => hostDetailsPage.visitsHostDetailsPage(1)); + it("allows global admin to transfer host to an existing team", () => { + hostDetailsPage.allowsTransferHost("andCreate"); + hostDetailsPage.verifiesTransferredHost(); + }); + it("allows global admin to create an operating system policy", () => { + hostDetailsPage.allowsCreateOsPolicy(); + }); + it("allows global admin to custom query a host", () => { + hostDetailsPage.allowsCustomQueryHost(); + }); + it("allows global admin to delete a host", () => { + hostDetailsPage.allowsDeleteHost(); }); }); describe("Manage software page", () => { beforeEach(() => { - cy.visit("/software/manage"); + manageSoftwarePage.visitManageSoftwarePage(); }); // it(`displays "Probability of exploit" column`, () => { // cy.getAttached("thead").within(() => { @@ -392,177 +398,50 @@ describe("Premium tier - Global Admin user", () => { // }); // }); it("allows admin to click 'Manage automations' button", () => { - cy.findByRole("button", { name: /manage automations/i }).click(); - cy.findByRole("button", { name: /cancel/i }).click(); + manageSoftwarePage.allowsManageAutomations(); }); it("hides manage automations button since all teams not selected", () => { cy.getAttached(".manage-software-page__header-wrap").within(() => { - cy.getAttached(".Select").within(() => { - cy.findByText(/all teams/i).click(); - cy.findByText(/apples/i).click(); - }); - cy.findByText(/manage automations/i).should("not.exist"); + teamsDropdown.switchTeams("All teams", "Apples"); + manageSoftwarePage.hidesButton("Manage automations"); }); }); }); - describe("Host details page", () => { - beforeEach(() => cy.visit("hosts/2")); - it("allows global admin to transfer host to an existing team", () => { - cy.getAttached(".host-details__transfer-button").click(); - cy.findByText(/create a team/i).should("exist"); - cy.getAttached(".Select-control").click(); - cy.getAttached(".Select-menu").within(() => { - cy.findByText(/no team/i).should("exist"); - cy.findByText(/oranges/i).should("exist"); - cy.findByText(/apples/i).click(); - }); - cy.getAttached(".transfer-host-modal .modal-cta-wrap") - .contains("button", /transfer/i) - .click(); - cy.findByText(/transferred to apples/i).should("exist"); - cy.findByText(/team/i).next().contains("Apples"); - }); - it("allows global admin to create an operating system policy", () => { - cy.getAttached(".info-flex").within(() => { - cy.findByText(/ubuntu/i).should("exist"); - cy.getAttached(".host-summary__os-policy-button").click(); - }); - cy.getAttached(".modal__content") - .findByRole("button", { name: /create new policy/i }) - .should("exist"); - }); - it("allows global admin to create a custom query", () => { - cy.getAttached(".host-details__query-button").click(); - cy.contains("button", /create custom query/i).should("exist"); - cy.getAttached(".modal__ex").click(); - }); - it("allows global admin to delete a host", () => { - cy.getAttached(".host-details__action-button-container") - .contains("button", /delete/i) - .click(); - cy.getAttached(".delete-host-modal__modal").within(() => { - cy.findByText(/delete host/i).should("exist"); - cy.contains("button", /delete/i).should("exist"); - cy.getAttached(".modal__ex").click(); - }); - }); - }); - describe("Query pages", () => { - beforeEach(() => cy.visit("/queries/manage")); + beforeEach(() => manageQueriesPage.visitManageQueriesPage()); it("allows global admin to select teams targets for query", () => { - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ force: true }); - }); - cy.findAllByText(/detect presence/i).click(); - }); - - cy.getAttached(".query-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).click(); - }); - cy.contains("h3", /teams/i).should("exist"); - cy.contains(".selector-name", /apples/i).should("exist"); + manageQueriesPage.allowsSelectTeamTargets(); }); + // TODO: Allowed to delete self-authored query only }); // Global Admin schedule tested in integration/free/admin.spec.ts // Team Admin team schedule tested below in integration/premium/admin.spec.ts describe("Manage policies page", () => { - beforeEach(() => cy.visit("/policies/manage")); + beforeEach(() => managePoliciesPage.visitManagePoliciesPage()); it("allows global admin to add a new policy", () => { - cy.getAttached(".policies-table__action-button-container") - .findByRole("button", { name: /add a policy/i }) - .click(); - // Add a default policy - cy.findByText(/gatekeeper enabled/i).click(); - cy.getAttached(".policy-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).should("exist"); - cy.findByRole("button", { name: /save/i }).click(); - }); - cy.getAttached(".modal-cta-wrap").within(() => { - cy.findByRole("button", { name: /save policy/i }).click(); - }); - cy.findByText(/policy created/i).should("exist"); - cy.findByText(/gatekeeper enabled/i).should("exist"); + managePoliciesPage.allowsAddDefaultPolicy(); + managePoliciesPage.verifiesAddedDefaultPolicy(); }); it("allows global admin to automate a global policy", () => { - cy.getAttached(".button-wrap") - .findByRole("button", { name: /manage automations/i }) - .click(); - cy.getAttached(".manage-automations-modal").within(() => { - cy.getAttached(".fleet-slider").click(); - cy.getAttached(".fleet-checkbox__input").check({ force: true }); - cy.getAttached("#webhook-url") - .clear() - .type("https://example.com/global_admin"); - cy.findByText(/save/i).click(); - }); - cy.findByText(/successfully updated policy automations/i).should("exist"); + managePoliciesPage.allowsAutomatePolicy(); + managePoliciesPage.verifiesAutomatedPolicy(); }); it("allows global admin to automate a team policy webhook", () => { + managePoliciesPage.visitManagePoliciesPage(); + teamsDropdown.switchTeams("All teams", "Apples"); + managePoliciesPage.allowsAutomatePolicy(); + managePoliciesPage.verifiesAutomatedPolicy(); + }); + + it("allows global admin to delete a team policy", () => { cy.visit("/policies/manage"); - cy.getAttached(".Select-control").within(() => { - cy.findByText(/all teams/i).click(); - }); - cy.getAttached(".Select-menu") - .contains(/apples/i) - .click(); - cy.getAttached(".button-wrap") - .findByRole("button", { name: /manage automations/i }) - .click(); - cy.getAttached(".manage-automations-modal").within(() => { - cy.getAttached(".fleet-slider").click(); - cy.getAttached(".fleet-checkbox__input").check({ force: true }); - cy.getAttached("#webhook-url") - .clear() - .type("https://example.com/global_admin"); - cy.findByText(/save/i).click(); - }); - cy.findByText(/successfully updated policy automations/i).should("exist"); + teamsDropdown.switchTeams("All teams", "Apples"); + managePoliciesPage.allowsDeletePolicy(); }); - }); - it("allows global admin to delete a team policy", () => { - cy.visit("/policies/manage"); - cy.getAttached(".Select-control").within(() => { - cy.findByText(/all teams/i).click(); - }); - cy.getAttached(".Select-menu") - .contains(/apples/i) - .click(); - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ - force: true, - }); - }); - }); - cy.findByRole("button", { name: /delete/i }).click(); - cy.getAttached(".delete-policy-modal").within(() => { - cy.findByRole("button", { name: /delete/i }).should("exist"); - cy.findByRole("button", { name: /cancel/i }).click(); - }); - }); - it("allows global admin to edit a team policy", () => { - cy.visit("policies/manage"); - cy.findByText(/all teams/i).click(); - cy.findByText(/apples/i).click(); - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ - force: true, - }); - }); - }); - cy.findByText(/filevault enabled/i).click(); - cy.getAttached(".policy-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).should("exist"); - cy.findByRole("button", { name: /save/i }).should("exist"); + it("allows global admin to edit a team policy", () => { + managePoliciesPage.visitManagePoliciesPage(); + teamsDropdown.switchTeams("All teams", "Apples"); + managePoliciesPage.allowsSelectRunSavePolicy("filevault"); }); }); describe("Manage policies page (mock integrations)", () => { @@ -572,42 +451,18 @@ describe("Premium tier - Global Admin user", () => { "/api/latest/fleet/config", CONFIG_INTEGRATIONS_AUTOMATIONS ).as("getIntegrations"); - cy.visit("/policies/manage"); + managePoliciesPage.visitManagePoliciesPage(); cy.wait("@getIntegrations").then((configStub) => { console.log(JSON.stringify(configStub)); }); }); it("allows global admin to delete team policy", () => { - cy.visit("/policies/manage"); - cy.getAttached(".Select-control").within(() => { - cy.findByText(/all teams/i).click(); - }); - cy.getAttached(".Select-menu") - .contains(/apples/i) - .click(); - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ - force: true, - }); - }); - }); - cy.findByRole("button", { name: /delete/i }).click(); - cy.getAttached(".delete-policy-modal").within(() => { - cy.findByRole("button", { name: /delete/i }).should("exist"); - cy.findByRole("button", { name: /cancel/i }).click(); - }); + teamsDropdown.switchTeams("All teams", "Apples"); + managePoliciesPage.allowsDeletePolicy(); }); it("allows global admin to automate a team policy jira integration", () => { - cy.visit("/policies/manage"); - cy.getAttached(".Select-control").within(() => { - cy.findByText(/all teams/i).click(); - }); - cy.getAttached(".Select-menu") - .contains(/apples/i) - .click(); + managePoliciesPage.visitManagePoliciesPage; + teamsDropdown.switchTeams("All teams", "Apples"); cy.getAttached(".button-wrap") .findByRole("button", { name: /manage automations/i }) .click(); @@ -634,13 +489,8 @@ describe("Premium tier - Global Admin user", () => { }); it("allows global admin to automate a team policy zendesk integration", () => { - cy.visit("/policies/manage"); - cy.getAttached(".Select-control").within(() => { - cy.findByText(/all teams/i).click(); - }); - cy.getAttached(".Select-menu") - .contains(/apples/i) - .click(); + managePoliciesPage.visitManagePoliciesPage(); + teamsDropdown.switchTeams("All teams", "Apples"); cy.getAttached(".button-wrap") .findByRole("button", { name: /manage automations/i }) .click(); @@ -735,14 +585,9 @@ describe("Premium tier - Global Admin user", () => { }); }); describe("User profile page", () => { - it("renders elements according to role-based access controls", () => { - cy.visit("/profile"); - cy.getAttached(".user-side-panel").within(() => { - cy.findByText(/team/i) - .next() - .contains(/global/i); - cy.findByText("Role").next().contains(/admin/i); - }); + it("verifies admin user role and global access", () => { + userProfilePage.visitUserProfilePage(); + userProfilePage.showRole("Admin", "Global"); }); }); }); diff --git a/cypress/integration/premium/maintainer.spec.ts b/cypress/integration/premium/maintainer.spec.ts index c67b7dde1f..c2855b2808 100644 --- a/cypress/integration/premium/maintainer.spec.ts +++ b/cypress/integration/premium/maintainer.spec.ts @@ -1,4 +1,12 @@ import CONSTANTS from "../../support/constants"; +import hostDetailsPage from "../pages/hostDetailsPage"; +import managePoliciesPage from "../pages/managePoliciesPage"; +import manageHostsPage from "../pages/manageHostsPage"; +import manageQueriesPage from "../pages/manageQueriesPage"; +import manageSoftwarePage from "../pages/manageSoftwarePage"; +import teamsDropdown from "../pages/teamsDropdown"; +import userProfilePage from "../pages/userProfilePage"; +import dashboardPage from "../pages/dashboardPage"; const { GOOD_PASSWORD } = CONSTANTS; @@ -37,266 +45,92 @@ describe("Premium tier - Maintainer user", () => { }); }); describe("Dashboard", () => { - beforeEach(() => cy.visit("/dashboard")); - it("displays cards for all platforms", () => { - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/all teams/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-software").should("exist"); - cy.getAttached(".activity-feed").should("exist"); - }); + beforeEach(() => dashboardPage.visitsDashboardPage()); + it("displays cards for all platforms and does not filter host platform", () => { + dashboardPage.displaysCards("All"); + dashboardPage.verifiesFilteredHostByPlatform("none"); }); - it("displays cards for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/all teams/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for windows only and filters hosts by Windows platform", () => { + dashboardPage.switchesPlatform("Windows"); + dashboardPage.displaysCards("Windows"); + dashboardPage.verifiesFilteredHostByPlatform("Windows"); }); - it("displays cards for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/all teams/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for linux only and filters hosts by Linux platform", () => { + dashboardPage.switchesPlatform("Linux"); + dashboardPage.displaysCards("Linux"); + dashboardPage.verifiesFilteredHostByPlatform("Linux"); }); - it("displays cards for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/all teams/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-mdm").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); - }); - it("views all hosts for all platforms", () => { - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by/i }).should( - "not.exist" - ); - }); - it("views all hosts for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/Windows/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by Windows/i }).should( - "exist" - ); - }); - it("views all hosts for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by Linux/i }).should( - "exist" - ); - }); - it("views all hosts for macOS only", () => { - cy.get(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by macOS/i }).should( - "exist" - ); + it("displays cards for macOS only and filters hosts by macOS platform", () => { + dashboardPage.switchesPlatform("macOS"); + dashboardPage.displaysCards("macOS"); + dashboardPage.verifiesFilteredHostByPlatform("macOS"); }); }); describe("Manage hosts page", () => { - it("renders elements according to role-based access controls", () => { - cy.visit("/hosts/manage"); - // Hosts table includes teams column - cy.getAttached(".data-table__table th") - .contains("Team") - .should("be.visible"); - cy.getAttached(".button-wrap") - .contains("button", /add hosts/i) - .click(); - cy.getAttached(".modal__content").contains("button", /done/i).click(); - - cy.getAttached(".button-wrap") - .contains("button", /manage enroll secret/i) - .click(); - cy.getAttached(".enroll-secret-modal__add-secret") - .contains("button", /add secret/i) - .click(); - cy.getAttached(".secret-editor-modal .modal-cta-wrap") - .contains("button", /save/i) - .click(); - cy.getAttached(".enroll-secret-modal .modal-cta-wrap") - .contains("button", /done/i) - .click(); + beforeEach(() => manageHostsPage.visitsManageHostsPage()); + it("renders team elements", () => { + manageHostsPage.includesTeamDropdown(); + manageHostsPage.includesTeamColumn(); + }); + it("renders 'Add hosts', 'Add label', and 'Manage enroll secrets' buttons", () => { + manageHostsPage.allowsAddLabelForm(); + manageHostsPage.allowsAddHosts(); + manageHostsPage.allowsManageAndAddSecrets(); }); }); describe("Host details page", () => { beforeEach(() => { - cy.visit("/hosts/manage"); - cy.getAttached(".hostname__cell").first().click(); + hostDetailsPage.visitsHostDetailsPage(1); }); it("allows global maintainer to transfer host to an existing team", () => { - cy.getAttached(".host-details__transfer-button").click(); - cy.findByText(/create a team/i).should("not.exist"); - cy.getAttached(".Select-control").click(); - cy.getAttached(".Select-menu").within(() => { - cy.findByText(/no team/i).should("exist"); - cy.findByText(/apples/i).should("exist"); - cy.findByText(/oranges/i).click(); - }); - cy.getAttached(".transfer-host-modal .modal-cta-wrap") - .contains("button", /transfer/i) - .click(); - cy.findByText(/transferred to oranges/i).should("exist"); - cy.findByText(/team/i).next().contains("Oranges"); + hostDetailsPage.allowsTransferHost(); + hostDetailsPage.verifiesTransferredHost(); }); it("allows global maintainer to create an operating system policy", () => { - cy.getAttached(".info-flex").within(() => { - cy.findByText(/ubuntu/i).should("exist"); - cy.getAttached(".host-summary__os-policy-button").click(); - }); - cy.getAttached(".modal__content") - .findByRole("button", { name: /create new policy/i }) - .should("exist"); + hostDetailsPage.allowsCreateOsPolicy(); }); - it("allows global maintainer to create a custom query", () => { - cy.getAttached(".host-details__query-button").click(); - cy.contains("button", /create custom query/i).should("exist"); - cy.getAttached(".modal__ex").click(); + it("allows global maintainer to custom query a host", () => { + hostDetailsPage.allowsCustomQueryHost(); }); it("allows global maintainer to delete a host", () => { - cy.getAttached(".host-details__action-button-container") - .contains("button", /delete/i) - .click(); - cy.getAttached(".delete-host-modal__modal").within(() => { - cy.findByText(/delete host/i).should("exist"); - cy.contains("button", /delete/i).should("exist"); - cy.getAttached(".modal__ex").click(); - }); + hostDetailsPage.allowsDeleteHost(); }); }); describe("Manage software page", () => { - beforeEach(() => cy.visit("/software/manage")); + beforeEach(() => manageSoftwarePage.visitManageSoftwarePage()); it("hides 'Manage automations' button from global maintainer", () => { - cy.findByText(/manage automations/i).should("not.exist"); + manageSoftwarePage.hidesButton("Manage automations"); }); }); describe("Query pages", () => { - beforeEach(() => cy.visit("/queries/manage")); + beforeEach(() => manageQueriesPage.visitManageQueriesPage()); it("allows global maintainer to select teams targets for query", () => { - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ force: true }); - }); - cy.findAllByText(/detect presence/i).click(); - }); - - cy.getAttached(".query-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).click(); - }); - cy.contains("h3", /teams/i).should("exist"); - cy.contains(".selector-name", /apples/i).should("exist"); + manageQueriesPage.allowsSelectTeamTargets(); }); + // TODO: Allowed to delete self-authored query only }); describe("Manage policies page", () => { - beforeEach(() => cy.visit("/policies/manage")); + beforeEach(() => managePoliciesPage.visitManagePoliciesPage()); it("hides manage automations button", () => { - cy.findByText(/manage hosts/i).should("not.exist"); + managePoliciesPage.hidesButton("Manage automations"); }); it("allows global maintainer to add a new policy", () => { - cy.getAttached(".policies-table__action-button-container") - .findByRole("button", { name: /add a policy/i }) - .click(); - // Add a default policy - cy.findByText(/gatekeeper enabled/i).click(); - cy.getAttached(".policy-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).should("exist"); - cy.findByRole("button", { name: /save/i }).click(); - }); - cy.getAttached(".modal-cta-wrap").within(() => { - cy.findByRole("button", { name: /save policy/i }).click(); - }); - cy.findByText(/policy created/i).should("exist"); + managePoliciesPage.allowsAddDefaultPolicy(); + managePoliciesPage.verifiesAddedDefaultPolicy(); }); it("allows global maintainer to delete a team policy", () => { - cy.visit("/policies/manage"); - cy.getAttached(".Select-control").within(() => { - cy.findByText(/all teams/i).click(); - }); - cy.getAttached(".Select-menu") - .contains(/apples/i) - .click(); - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ - force: true, - }); - }); - }); - cy.findByRole("button", { name: /delete/i }).click(); - cy.getAttached(".delete-policy-modal").within(() => { - cy.findByRole("button", { name: /delete/i }).should("exist"); - cy.findByRole("button", { name: /cancel/i }).click(); - }); + teamsDropdown.switchTeams("All teams", "Apples"); + managePoliciesPage.allowsDeletePolicy(); }); it("allows global maintainer to edit a team policy", () => { - cy.visit("policies/manage"); - cy.findByText(/all teams/i).click(); - cy.findByText(/apples/i).click(); - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ - force: true, - }); - }); - }); - cy.findByText(/filevault enabled/i).click(); - cy.getAttached(".policy-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).should("exist"); - cy.findByRole("button", { name: /save/i }).should("exist"); - }); + teamsDropdown.switchTeams("All teams", "Apples"); + managePoliciesPage.allowsSelectRunSavePolicy("filevault"); }); }); describe("User profile page", () => { - it("renders elements according to role-based access controls", () => { - cy.visit("/profile"); - cy.getAttached(".user-side-panel").within(() => { - cy.findByText(/team/i) - .next() - .contains(/global/i); - cy.findByText("Role") - .next() - .contains(/maintainer/i); - }); + it("verifies user role and global access", () => { + userProfilePage.visitUserProfilePage(); + userProfilePage.showRole("Maintainer", "Global"); }); }); }); diff --git a/cypress/integration/premium/observer.spec.ts b/cypress/integration/premium/observer.spec.ts index b4b1ecae66..6370174091 100644 --- a/cypress/integration/premium/observer.spec.ts +++ b/cypress/integration/premium/observer.spec.ts @@ -1,4 +1,14 @@ import CONSTANTS from "../../support/constants"; +import dashboardPage from "../pages/dashboardPage"; +import hostDetailsPage from "../pages/hostDetailsPage"; +import manageHostsPage from "../pages/manageHostsPage"; +import managePacksPage from "../pages/managePacksPage"; +import managePoliciesPage from "../pages/managePoliciesPage"; +import manageQueriesPage from "../pages/manageQueriesPage"; +import manageSchedulePage from "../pages/manageSchedulePage"; +import manageSoftwarePage from "../pages/manageSoftwarePage"; +import teamsDropdown from "../pages/teamsDropdown"; +import userProfilePage from "../pages/userProfilePage"; const { GOOD_PASSWORD } = CONSTANTS; @@ -38,202 +48,76 @@ describe("Premium tier - Observer user", () => { }); }); describe("Dashboard", () => { - beforeEach(() => cy.visit("/dashboard")); - it("displays cards for all platforms", () => { - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/all teams/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-software").should("exist"); - cy.getAttached(".activity-feed").should("exist"); - }); + beforeEach(() => dashboardPage.visitsDashboardPage()); + it("displays cards for all platforms and does not filter host platform", () => { + dashboardPage.displaysCards("All"); + dashboardPage.verifiesFilteredHostByPlatform("none"); }); - it("displays cards for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/all teams/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for windows only and filters hosts by Windows platform", () => { + dashboardPage.switchesPlatform("Windows"); + dashboardPage.displaysCards("Windows"); + dashboardPage.verifiesFilteredHostByPlatform("Windows"); }); - it("displays cards for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/all teams/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for linux only and filters hosts by Linux platform", () => { + dashboardPage.switchesPlatform("Linux"); + dashboardPage.displaysCards("Linux"); + dashboardPage.verifiesFilteredHostByPlatform("Linux"); }); - it("displays cards for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/all teams/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-mdm").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); - }); - it("views all hosts for all platforms", () => { - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by/i }).should( - "not.exist" - ); - }); - it("views all hosts for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by Windows/i }).should( - "exist" - ); - }); - it("views all hosts for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by Linux/i }).should( - "exist" - ); - }); - it("views all hosts for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by macOS/i }).should( - "exist" - ); + it("displays cards for macOS only and filters hosts by macOS platform", () => { + dashboardPage.switchesPlatform("macOS"); + dashboardPage.displaysCards("macOS"); + dashboardPage.verifiesFilteredHostByPlatform("macOS"); }); }); describe("Manage hosts page", () => { - beforeEach(() => cy.visit("/hosts/manage")); - it("should render elements according to role-based access controls", () => { - // Ensure page is loaded with teams dropdown - cy.getAttached(".Select-value-label").contains("All teams"); - // Not see the "Manage enroll secret” or "Add hosts" button - cy.contains("button", /manage enroll secret/i).should("not.exist"); - cy.contains("button", /add hosts/i).should("not.exist"); - // Hosts table includes teams column - cy.getAttached("thead").within(() => { - cy.findByText(/team/i).should("exist"); - }); + beforeEach(() => manageHostsPage.visitsManageHostsPage()); + it("renders team elements", () => { + manageHostsPage.includesTeamDropdown(); + manageHostsPage.includesTeamColumn(); + }); + it("hides 'Add hosts', 'Add label', and 'Manage enroll secrets' buttons", () => { + manageHostsPage.hidesButton("Add label"); + manageHostsPage.hidesButton("Add hosts"); + manageHostsPage.hidesButton("Manage enroll secret"); }); }); describe("Host details page", () => { - beforeEach(() => cy.visit("/hosts/manage")); + beforeEach(() => hostDetailsPage.visitsHostDetailsPage(1)); it("should render elements according to role-based access controls", () => { - // Navigate to host details page for first host - cy.getAttached(".hostname__cell").first().click(); - - // Click query button and confirm observer cannot create custom query - cy.getAttached(".host-details__query-button").click(); - cy.contains("button", /create custom query/i).should("not.exist"); - cy.getAttached(".modal__ex").click(); - - // Confirm other actions are not available to observer - cy.getAttached(".host-details__action-button-container").within(() => { - cy.contains("button", /transfer/i).should("not.exist"); - cy.contains("button", /delete/i).should("not.exist"); - }); - - // Confirm additional host details for observer - cy.getAttached(".info-flex").within(() => { - // Team is shown for host - cy.findByText(/apples/i).should("exist"); - // OS is shown for host - cy.findByText(/ubuntu/i).should("exist"); - // Observer cannot create a new OS policy - cy.findByRole("button").should("not.exist"); - }); + hostDetailsPage.verifiesTeam("Apples"); + hostDetailsPage.hidesButton("Transfer"); + hostDetailsPage.hidesButton("Delete"); + hostDetailsPage.hidesCustomQueryHost(); + hostDetailsPage.hidesCreateOSPolicy(); }); }); describe("Manage software page", () => { - beforeEach(() => cy.visit("/software/manage")); + beforeEach(() => manageSoftwarePage.visitManageSoftwarePage()); it("hides manage automations button", () => { - cy.getAttached(".manage-software-page__header-wrap").within(() => { - cy.findByRole("button", { name: /manage automations/i }).should( - "not.exist" - ); - }); + manageSoftwarePage.hidesButton("Manage automations"); }); }); describe("Query pages", () => { - beforeEach(() => cy.visit("/queries/manage")); - it("should render elements according to role-based access controls", () => { - // Navigate to query detail page for first query on manage queries page - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.contains(".fleet-checkbox__input").should("not.exist"); - cy.findByText(/detect presence/i).click(); - }); - }); - cy.getAttached(".query-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).click(); - }); - cy.contains("h3", /teams/i).should("exist"); - cy.contains(".selector-name", /apples/i).should("exist"); + beforeEach(() => manageQueriesPage.visitManageQueriesPage()); + it("allows global observer to select teams targets for query", () => { + manageQueriesPage.allowsSelectTeamTargets(); }); }); describe("Policies pages", () => { - beforeEach(() => cy.visit("/policies/manage")); + beforeEach(() => managePoliciesPage.visitManagePoliciesPage()); it("should render elements according to role-based access controls", () => { // No global policies seeded, placeholder displayed cy.findByText(/ask yes or no questions/i).should("exist"); cy.findByText(/all your hosts/i).should("exist"); - // Cannot see "Manage automations" button - cy.findByRole("button", { name: /manage automations/i }).should( - "not.exist" - ); - // Cannot see "Add a policy" button - cy.findByRole("button", { name: /add a policy/i }).should("not.exist"); + managePoliciesPage.hidesButton("Manage automations"); + managePoliciesPage.hidesButton("Add a policy"); - // Switch to team policies - cy.getAttached(".Select-control").within(() => { - cy.findByText(/all teams/i).click(); - }); - cy.getAttached(".Select-menu") - .contains(/apples/i) - .click(); - cy.findByRole("button", { name: /add a policy/i }).should("not.exist"); + teamsDropdown.switchTeams("All teams", "Apples"); + managePoliciesPage.hidesButton("Manage automations"); + managePoliciesPage.hidesButton("Add a policy"); - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.contains(".fleet-checkbox__input").should("not.exist"); - cy.findByText(/filevault enabled/i).click(); - }); - }); - cy.getAttached(".policy-form__wrapper").within(() => { - cy.findByRole("button", { name: /run/i }).should("not.exist"); - cy.findByRole("button", { name: /save/i }).should("not.exist"); - }); + managePoliciesPage.allowsViewPolicyOnly(); }); }); }); @@ -254,61 +138,38 @@ describe("Premium tier - Observer user", () => { cy.findByText(/schedule/i).should("not.exist"); cy.visit("/settings/organization"); cy.findByText(/you do not have permissions/i).should("exist"); - cy.visit("/packs/manage"); + managePacksPage.visitsManagePacksPage(); cy.findByText(/you do not have permissions/i).should("exist"); - cy.visit("/schedule/manage"); + manageSchedulePage.visitManageSchedulePage(); cy.findByText(/you do not have permissions/i).should("exist"); }); }); describe("Manage hosts page", () => { it("should render elements according to role-based access controls", () => { - cy.visit("/hosts/manage"); - // Hosts table includes teams column - cy.getAttached(".data-table__table th") - .contains("Team") - .should("be.visible"); + manageHostsPage.visitsManageHostsPage(); + manageHostsPage.includesTeamColumn(); + manageHostsPage.hidesButton("Add hosts"); + manageHostsPage.hidesButton("Manage enroll secret"); + manageHostsPage.hidesButton("Add label"); }); }); describe("Manage policies page", () => { - it("should render elements according to role-based access controls", () => { - cy.visit("/policies/manage"); - cy.findByRole("button", { name: /add a policy/i }).should("not.exist"); + it("hides 'Add a policy'", () => { + managePoliciesPage.visitManagePoliciesPage(); + managePoliciesPage.hidesButton("Add a policy"); cy.findByText(/all teams/i).should("not.exist"); }); }); describe("Policy detail page", () => { - it("should render elements according to role-based access controls", () => { - cy.visit("/policies/manage"); - // Navigate to policy detail page for first policy in manage policies table - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.contains(".fleet-checkbox__input").should("not.exist"); - }); - }); - cy.getAttached(".data-table__table").within(() => { - cy.findByRole("button", { - name: /filevault enabled/i, - }).click(); - }); - cy.getAttached(".policy-form__wrapper").within(() => { - cy.findByRole("button", { name: /run/i }).should("not.exist"); - cy.findByRole("button", { name: /save/i }).should("not.exist"); - }); + it("allows viewing policies only", () => { + managePoliciesPage.visitManagePoliciesPage(); + managePoliciesPage.allowsViewPolicyOnly(); }); }); describe("User profile page", () => { - it("should render elements according to role-based access controls", () => { - cy.visit("/profile"); - cy.getAttached(".user-side-panel").within(() => { - cy.findByText(/team/i) - .next() - .contains(/apples/i); - cy.findByText("Role") - .next() - .contains(/observer/i); - }); + it("verifies observer role and team", () => { + userProfilePage.visitUserProfilePage(); + userProfilePage.showRole("Observer", "Apples"); }); }); }); diff --git a/cypress/integration/premium/team_admin.spec.ts b/cypress/integration/premium/team_admin.spec.ts index b57df11b9b..1b8555adca 100644 --- a/cypress/integration/premium/team_admin.spec.ts +++ b/cypress/integration/premium/team_admin.spec.ts @@ -1,4 +1,12 @@ import CONSTANTS from "../../support/constants"; +import dashboardPage from "../pages/dashboardPage"; +import hostDetailsPage from "../pages/hostDetailsPage"; +import manageHostsPage from "../pages/manageHostsPage"; +import managePoliciesPage from "../pages/managePoliciesPage"; +import manageQueriesPage from "../pages/manageQueriesPage"; +import manageSchedulePage from "../pages/manageSchedulePage"; +import manageSoftwarePage from "../pages/manageSoftwarePage"; +import userProfilePage from "../pages/userProfilePage"; const { GOOD_PASSWORD } = CONSTANTS; @@ -44,174 +52,58 @@ describe("Premium tier - Team Admin user", () => { }); describe("Dashboard", () => { beforeEach(() => cy.visit("/dashboard")); - it("displays cards for all platforms", () => { - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/apples/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-software").should("exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for team only, no activity card, and does not filter host platform", () => { + dashboardPage.displaysCards(); + dashboardPage.verifiesFilteredHostByPlatform("none"); }); - it("displays cards for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/apples/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for windows only and filters hosts by Windows platform", () => { + dashboardPage.switchesPlatform("Windows"); + dashboardPage.displaysCards("Windows"); + dashboardPage.verifiesFilteredHostByPlatform("Windows"); }); - it("displays cards for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/apples/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + it("displays cards for linux only and filters hosts by Linux platform", () => { + dashboardPage.switchesPlatform("Linux"); + dashboardPage.displaysCards("Linux"); + dashboardPage.verifiesFilteredHostByPlatform("Linux"); }); - it("displays cards for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/apples/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-mdm").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); - }); - it("views all hosts for all platforms", () => { - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by/i }).should( - "not.exist" - ); - }); - it("views all hosts for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by Windows/i }).should( - "exist" - ); - }); - it("views all hosts for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by Linux/i }).should( - "exist" - ); - }); - it("views all hosts for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.findByText(/view all hosts/i).click(); - cy.findByRole("status", { name: /hosts filtered by macOS/i }).should( - "exist" - ); + it("displays cards for macOS only and filters hosts by macOS platform", () => { + dashboardPage.switchesPlatform("macOS"); + dashboardPage.displaysCards("macOS"); + dashboardPage.verifiesFilteredHostByPlatform("macOS"); }); }); describe("Manage hosts page", () => { beforeEach(() => { - cy.visit("/hosts/manage"); + manageHostsPage.visitsManageHostsPage(); }); - it("displays team column in hosts table", () => { - cy.getAttached(".data-table__table th") - .contains("Team") - .should("be.visible"); - }); - it("allows team admin to see and click 'Add hosts'", () => { - cy.getAttached(".button-wrap") - .contains("button", /add hosts/i) - .click(); - cy.getAttached(".modal__content").contains("button", /done/i).click(); - }); - it("allows team admin to add new enroll secret", () => { - cy.getAttached(".button-wrap") - .contains("button", /manage enroll secret/i) - .click(); - cy.getAttached(".enroll-secret-modal__add-secret") - .contains("button", /add secret/i) - .click(); - cy.getAttached(".secret-editor-modal .modal-cta-wrap") - .contains("button", /save/i) - .click(); - cy.getAttached(".enroll-secret-modal .modal-cta-wrap") - .contains("button", /done/i) - .click(); + it("should render elements according to role-based access controls", () => { + manageHostsPage.includesTeamColumn(); + manageHostsPage.allowsAddHosts(); + manageHostsPage.allowsManageAndAddSecrets(); }); }); describe("Host details page", () => { - beforeEach(() => cy.visit("hosts/1")); + beforeEach(() => hostDetailsPage.visitsHostDetailsPage(1)); it("allows team admin to create an operating system policy", () => { - cy.getAttached(".info-flex").within(() => { - cy.findByText(/ubuntu/i).should("exist"); - cy.getAttached(".host-summary__os-policy-button").click(); - }); - cy.getAttached(".modal__content") - .findByRole("button", { name: /create new policy/i }) - .should("exist"); + hostDetailsPage.allowsCreateOsPolicy(); }); - it("allows team admin to query host but not transfer host", () => { - cy.getAttached(".host-details__query-button").should("exist"); - cy.findByText(/transfer/i).should("not.exist"); - }); - it("allows team admin to delete a host", () => { - cy.getAttached(".host-details__action-button-container") - .contains("button", /delete/i) - .click(); - cy.getAttached(".delete-host-modal__modal").within(() => { - cy.findByText(/delete host/i).should("exist"); - cy.contains("button", /delete/i).should("exist"); - cy.getAttached(".modal__ex").click(); - }); + it("allows team admin to query host, delete host but not transfer host", () => { + hostDetailsPage.allowsCustomQueryHost(); + hostDetailsPage.allowsDeleteHost(); + hostDetailsPage.verifiesDeletedHost; + hostDetailsPage.hidesButton("Transfer"); }); }); describe("Manage software page", () => { - beforeEach(() => cy.visit("/software/manage")); + beforeEach(() => manageSoftwarePage.visitManageSoftwarePage()); it("hides manage automations button", () => { - cy.findByText(/manage automations/i).should("not.exist"); + manageSoftwarePage.hidesButton("Manage automations"); }); }); describe("Query pages", () => { - beforeEach(() => cy.visit("/queries/manage")); + beforeEach(() => manageQueriesPage.visitManageQueriesPage()); it("allows team admin to select teams targets for query", () => { - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ force: true }); - }); - cy.findAllByText(/detect presence/i).click(); - }); - - cy.getAttached(".query-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).click(); - }); - cy.contains("h3", /teams/i).should("exist"); - cy.contains(".selector-name", /apples/i).should("exist"); + manageQueriesPage.allowsSelectTeamTargets(); }); it("disables team admin from deleting or editing a query not authored by them", () => { cy.getAttached("tbody").within(() => { @@ -227,129 +119,41 @@ describe("Premium tier - Team Admin user", () => { }); describe("Manage schedules page", () => { beforeEach(() => { - cy.visit("/schedule/manage"); + manageSchedulePage.visitManageSchedulePage(); }); it("hides advanced button when team admin", () => { - cy.getAttached(".manage-schedule-page__header-wrap").within(() => { - cy.findByText(/apples/i).should("exist"); - }); - cy.findByText(/advanced/i).should("not.exist"); + manageSchedulePage.confirmsTeam("Apples"); + manageSchedulePage.hidesButton("Advanced"); }); it("creates a new team scheduled query", () => { - cy.getAttached(".no-schedule__cta-buttons").should("exist"); - cy.getAttached(".no-schedule__schedule-button").click(); - cy.getAttached(".schedule-editor-modal__form").within(() => { - cy.findByText(/select query/i).click(); - cy.findByText(/detect presence/i).click(); - cy.getAttached(".modal-cta-wrap").within(() => { - cy.findByRole("button", { name: /schedule/i }).click(); - }); - }); - cy.findByText(/successfully added/i).should("be.visible"); + manageSchedulePage.allowsAddSchedule(); + manageSchedulePage.verifiesAddedSchedule(); }); it("edit a team's scheduled query successfully", () => { - cy.getAttached(".manage-schedule-page"); - cy.getAttached("tbody>tr") - .should("have.length", 1) - .within(() => { - cy.findByText(/action/i).click(); - cy.findByText(/edit/i).click(); - }); - cy.getAttached(".schedule-editor-modal__form").within(() => { - cy.findByText(/every day/i).click(); - cy.findByText(/every 6 hours/i).click(); - - cy.getAttached(".modal-cta-wrap").within(() => { - cy.findByRole("button", { name: /schedule/i }).click(); - }); - }); - cy.findByText(/successfully updated/i).should("be.visible"); + manageSchedulePage.allowsEditSchedule(); + manageSchedulePage.verifiesEditedSchedule(); }); it("remove a team's scheduled query successfully", () => { - cy.getAttached(".manage-schedule-page"); - cy.getAttached("tbody>tr") - .should("have.length", 1) - .within(() => { - cy.findByText(/6 hours/i).should("exist"); - cy.getAttached(".Select-placeholder").within(() => { - cy.findByText(/action/i).click(); - }); - cy.getAttached(".Select-menu").within(() => { - cy.findByText(/remove/i).click(); - }); - }); - cy.getAttached(".remove-scheduled-query-modal .modal-cta-wrap").within( - () => { - cy.findByRole("button", { name: /remove/i }).click(); - } - ); - cy.findByText(/successfully removed/i).should("be.visible"); + manageSchedulePage.allowsRemoveSchedule(); + manageSchedulePage.verifiesRemovedSchedule(); }); }); describe("Manage policies page", () => { - beforeEach(() => cy.visit("/policies/manage")); + beforeEach(() => managePoliciesPage.visitManagePoliciesPage()); it("allows team admin to add a new policy", () => { - cy.getAttached(".button-wrap") - .findByRole("button", { name: /add a policy/i }) - .click(); - // Add a default policy - cy.findByText(/gatekeeper enabled/i).click(); - cy.getAttached(".policy-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).should("exist"); - cy.findByRole("button", { name: /save/i }).click(); - }); - cy.getAttached(".modal-cta-wrap").within(() => { - cy.findByRole("button", { name: /save policy/i }).click(); - }); - cy.findByText(/policy created/i).should("exist"); + managePoliciesPage.allowsAddDefaultPolicy(); + managePoliciesPage.verifiesAddedDefaultPolicy(); }); it("allows team admin to edit a team policy", () => { - cy.visit("policies/manage"); - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ - force: true, - }); - }); - }); - cy.findByText(/filevault enabled/i).click(); - cy.getAttached(".policy-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).should("exist"); - cy.findByRole("button", { name: /save/i }).should("exist"); - }); + managePoliciesPage.visitManagePoliciesPage(); + managePoliciesPage.allowsSelectRunSavePolicy(); }); it("allows team admin to automate a team policy", () => { - cy.getAttached(".button-wrap") - .findByRole("button", { name: /manage automations/i }) - .click(); - cy.getAttached(".manage-automations-modal").within(() => { - cy.getAttached(".fleet-slider").click(); - cy.getAttached(".fleet-checkbox__input").check({ force: true }); - cy.getAttached("#webhook-url") - .clear() - .type("https://example.com/team_admin"); - cy.findByText(/save/i).click(); - }); - cy.findByText(/successfully updated policy automations/i).should("exist"); + managePoliciesPage.allowsAutomatePolicy(); + managePoliciesPage.verifiesAutomatedPolicy(); }); it("allows team admin to delete a team policy", () => { - cy.visit("/policies/manage"); - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.getAttached(".fleet-checkbox__input").check({ - force: true, - }); - }); - }); - cy.findByRole("button", { name: /delete/i }).click(); - cy.getAttached(".delete-policy-modal").within(() => { - cy.findByRole("button", { name: /delete/i }).should("exist"); - cy.findByRole("button", { name: /cancel/i }).click(); - }); + managePoliciesPage.allowsDeletePolicy(); }); }); describe("Team admin settings page", () => { @@ -399,13 +203,8 @@ describe("Premium tier - Team Admin user", () => { }); describe("User profile page", () => { it("should render elements according to role-based access controls", () => { - cy.visit("/profile"); - cy.getAttached(".user-side-panel").within(() => { - cy.findByText(/team/i) - .next() - .contains(/mystic/i); // Updated team name - cy.findByText("Role").next().contains(/admin/i); - }); + userProfilePage.visitUserProfilePage(); + userProfilePage.showRole("Admin", "Mystic"); }); }); }); diff --git a/cypress/integration/premium/team_maintainer_observer.spec.ts b/cypress/integration/premium/team_maintainer_observer.spec.ts index 5b13fe4abc..c8ed3b0f73 100644 --- a/cypress/integration/premium/team_maintainer_observer.spec.ts +++ b/cypress/integration/premium/team_maintainer_observer.spec.ts @@ -1,4 +1,12 @@ import CONSTANTS from "../../support/constants"; +import dashboardPage from "../pages/dashboardPage"; +import manageHostsPage from "../pages/manageHostsPage"; +import managePacksPage from "../pages/managePacksPage"; +import managePoliciesPage from "../pages/managePoliciesPage"; +import manageSchedulePage from "../pages/manageSchedulePage"; +import manageSoftwarePage from "../pages/manageSoftwarePage"; +import teamsDropdown from "../pages/teamsDropdown"; +import userProfilePage from "../pages/userProfilePage"; const { GOOD_PASSWORD } = CONSTANTS; @@ -37,7 +45,7 @@ describe("Premium tier - Team observer/maintainer user", () => { }); }); describe("Dashboard", () => { - beforeEach(() => cy.visit("/dashboard")); + beforeEach(() => dashboardPage.visitsDashboardPage()); it("displays cards for all platforms", () => { cy.getAttached(".homepage__wrapper").within(() => { cy.findByText(/apples/i).should("exist"); @@ -49,47 +57,16 @@ describe("Premium tier - Team observer/maintainer user", () => { }); }); it("displays cards for windows only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/windows/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/apples/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + dashboardPage.switchesPlatform("Windows"); + dashboardPage.displaysCards("Windows"); }); it("displays cards for linux only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/linux/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/apples/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + dashboardPage.switchesPlatform("Linux"); + dashboardPage.displaysCards("Linux"); }); it("displays cards for macOS only", () => { - cy.getAttached(".homepage__platforms").within(() => { - cy.getAttached(".Select-control").click(); - cy.findByText(/macos/i).click(); - }); - cy.getAttached(".homepage__wrapper").within(() => { - cy.findByText(/apples/i).should("exist"); - cy.getAttached(".hosts-summary").should("exist"); - cy.getAttached(".hosts-status").should("exist"); - cy.getAttached(".home-mdm").should("exist"); - // "get" because we expect it not to exist - cy.get(".home-software").should("not.exist"); - cy.get(".activity-feed").should("not.exist"); - }); + dashboardPage.switchesPlatform("macOS"); + dashboardPage.displaysCards("macOS"); }); it("views all hosts for all platforms", () => { cy.findByText(/view all hosts/i).click(); @@ -135,56 +112,41 @@ describe("Premium tier - Team observer/maintainer user", () => { }); describe("Manage hosts page", () => { it("should render elements according to role-based access controls", () => { - cy.visit("/hosts/manage"); - // Hosts table includes teams column - cy.getAttached(".data-table__table th") - .contains("Team") - .should("be.visible"); - cy.findByText(/add label/i).should("not.exist"); + manageHostsPage.visitsManageHostsPage(); - // On observing team, not see the "add hosts" and "Manage enroll secret" buttons cy.contains(/apples/i).should("exist"); - cy.contains("button", /add hosts/i).should("not.exist"); - cy.contains("button", /manage enroll secret/i).should("not.exist"); + manageHostsPage.includesTeamColumn(); + + manageHostsPage.hidesButton("Add label"); + manageHostsPage.hidesButton("Add hosts"); + manageHostsPage.hidesButton("Manage enroll secrets"); }); }); describe("Manage policies page", () => { - it("should render elements according to role-based access controls", () => { - cy.visit("/policies/manage"); - // On observing team, not see the "Add a policy" and "Manage automations" button - cy.findByText(/apples/i).should("exist"); - cy.findByText(/manage automations/i).should("not.exist"); - cy.findByText(/add a policy/i).should("not.exist"); + it("hides 'Manage automation' and 'Add a policy' buttons", () => { + managePoliciesPage.visitManagePoliciesPage(); + cy.contains(/apples/i).should("exist"); + + managePoliciesPage.hidesButton("Manage automations"); + managePoliciesPage.hidesButton("Add a policy"); }); }); describe("Policy detail page", () => { - it("should render elements according to role-based access controls", () => { - cy.visit("/policies/manage"); - // Navigate to policy detail page for first policy in manage policies table - cy.getAttached("tbody").within(() => { - cy.getAttached("tr") - .first() - .within(() => { - cy.contains(".fleet-checkbox__input").should("not.exist"); - cy.findByText(/filevault enabled/i).click(); - }); - }); - cy.getAttached(".policy-form__wrapper").within(() => { - cy.findByRole("button", { name: /run/i }).should("not.exist"); - cy.findByRole("button", { name: /save/i }).should("not.exist"); - }); + it("allows view policy only", () => { + managePoliciesPage.visitManagePoliciesPage(); + managePoliciesPage.allowsViewPolicyOnly(); }); }); // nav restrictions are at the end because we expect to see a // 403 error overlay which will hide the nav and make the test fail describe("Nav restrictions", () => { it("should restrict navigation according to role-based access controls", () => { - cy.visit("/dashboard"); + dashboardPage.visitsDashboardPage(); cy.findByText(/settings/i).should("not.exist"); cy.findByText(/schedule/i).should("exist"); cy.visit("/settings/organization"); cy.findByText(/you do not have permissions/i).should("exist"); - cy.visit("/packs/manage"); + managePacksPage.visitsManagePacksPage(); cy.findByText(/you do not have permissions/i).should("exist"); }); }); @@ -200,122 +162,56 @@ describe("Premium tier - Team observer/maintainer user", () => { beforeEach(() => { cy.loginWithCySession("marco@organization.com", GOOD_PASSWORD); - cy.visit("/hosts/manage"); + manageHostsPage.visitsManageHostsPage(); }); describe("Manage hosts page", () => { it("should render elements according to role-based access controls", () => { - // Hosts table includes teams column - cy.getAttached(".data-table__table th") - .contains("Team") - .should("be.visible"); - cy.findByText(/add label/i).should("not.exist"); + manageHostsPage.includesTeamColumn(); + manageHostsPage.hidesButton("Add label"); // On maintaining team, see the "add hosts" and "Manage enroll secret" buttons - cy.getAttached(".manage-hosts__header").within(() => { - cy.contains("Apples").click({ force: true }); - cy.contains("Oranges").click({ force: true }); - }); - cy.getAttached(".team_name__cell").within(() => { - cy.findByText(/oranges/i).should("exist"); - }); - cy.getAttached(".button-wrap") - .contains("button", /add hosts/i) - .click(); - cy.getAttached(".modal__content").contains("button", /done/i).click(); - - // On maintaining team, add new enroll secret - cy.getAttached(".button-wrap") - .contains("button", /manage enroll secret/i) - .click(); - cy.getAttached(".enroll-secret-modal__add-secret") - .contains("button", /add secret/i) - .click(); - cy.getAttached(".secret-editor-modal .modal-cta-wrap") - .contains("button", /save/i) - .click(); - cy.getAttached(".enroll-secret-modal .modal-cta-wrap") - .contains("button", /done/i) - .click(); + teamsDropdown.switchTeams("Apples", "Oranges"); + manageHostsPage.includesTeamDropdown("Oranges"); + manageHostsPage.allowsAddHosts(); + manageHostsPage.allowsManageAndAddSecrets(); }); }); describe("Manage software page", () => { - beforeEach(() => cy.visit("/software/manage")); + beforeEach(() => manageSoftwarePage.visitManageSoftwarePage()); it("hides manage automations button", () => { - cy.getAttached(".manage-software-page__header-wrap").within(() => { - cy.findByRole("button", { name: /manage automations/i }).should( - "not.exist" - ); - }); + manageSoftwarePage.hidesButton("Manage automations"); }); }); describe("Manage schedule page", () => { it("should render elements according to role-based access controls", () => { - cy.visit("/schedule/manage"); - cy.contains(/oranges/i).should("exist"); - cy.getAttached(".no-schedule__cta-buttons").within(() => { - cy.contains(/advanced/i).should("not.exist"); - }); - cy.getAttached(".no-schedule__schedule-button").click(); - // Schedule a query on maintaining team - cy.getAttached(".schedule-editor-modal__form").within(() => { - cy.findByText(/select query/i).click(); - cy.findByText(/detect presence/i).click(); - cy.findByText(/every day/i).click(); - cy.findByText(/every 6 hours/i).click(); - cy.getAttached(".modal-cta-wrap").within(() => { - cy.findByRole("button", { name: /schedule/i }).click(); - }); - }); - cy.findByText(/successfully added/i).should("be.visible"); - cy.getAttached("tbody>tr").should("have.length", 1); + manageSchedulePage.visitManageSchedulePage(); + manageSchedulePage.confirmsTeam("Oranges"); + manageSchedulePage.hidesButton("Advanced"); + manageSchedulePage.allowsAddSchedule(); + manageSchedulePage.verifiesAddedSchedule(); }); }); describe("Manage policies page", () => { - it("should render elements according to role-based access controls", () => { - cy.visit("/policies/manage"); - // Switch to from team apples to team oranges - cy.findByText(/apples/i).click(); - cy.findByText(/oranges/i).click(); + it("allows team maintainer to add, edit a policy, but not manage automation", () => { + managePoliciesPage.visitManagePoliciesPage(); + teamsDropdown.switchTeams("Apples", "Oranges"); - // On maintaining team, should not see the "Manage automations" button - cy.findByText(/manage automations/i).should("not.exist"); - // On maintaining team, should see "add a policy" and "save" a policy - cy.findByText(/add a policy/i).click(); - - // Add a default policy - cy.findByText(/gatekeeper enabled/i).click(); - cy.findByRole("button", { name: /save/i }).click(); - cy.getAttached(".modal-cta-wrap").within(() => { - cy.findByRole("button", { name: /save policy/i }).click(); - }); - cy.findByText(/policy created/i).should("exist"); - - // On maintaining team, should see "save" and "run" for a new policy - cy.getAttached(".policy-form__button-wrap").within(() => { - cy.findByRole("button", { name: /run/i }).should("exist"); - cy.findByRole("button", { name: /save/i }).should("exist"); - }); + managePoliciesPage.hidesButton("Manage automations"); + managePoliciesPage.allowsAddDefaultPolicy(); + managePoliciesPage.verifiesAddedDefaultPolicy(); }); }); describe("User profile page", () => { - it("should render elements according to role-based access controls", () => { - cy.visit("/profile"); - // See 2 Teams in the Team section and Various in the Role section - cy.getAttached(".user-side-panel").within(() => { - cy.findByText("Teams") - .next() - .contains(/2 teams/i); - cy.findByText("Role") - .next() - .contains(/various/i); - }); + it("verifies user role and team", () => { + userProfilePage.visitUserProfilePage(); + userProfilePage.showRole("Various", "2 teams"); }); }); // nav restrictions are at the end because we expect to see a // 403 error overlay which will hide the nav and make the test fail describe("Nav restrictions", () => { it("should restrict navigation according to role-based access controls", () => { - cy.visit("/dashboard"); + dashboardPage.visitsDashboardPage(); cy.contains("h2", "Hosts").should("exist"); cy.getAttached("nav").within(() => { diff --git a/cypress/integration/premium/teamflow.spec.ts b/cypress/integration/premium/teamflow.spec.ts index dd76b48427..49b9f950a9 100644 --- a/cypress/integration/premium/teamflow.spec.ts +++ b/cypress/integration/premium/teamflow.spec.ts @@ -1,3 +1,5 @@ +import manageSchedulePage from "../pages/manageSchedulePage"; + describe("Teams flow (empty)", () => { before(() => { Cypress.session.clearAllSavedSessions(); @@ -91,45 +93,12 @@ describe("Teams flow (seeded)", () => { describe("Manage schedules page", () => { beforeEach(() => { cy.loginWithCySession(); - cy.visit("/schedule/manage"); + manageSchedulePage.visitManageSchedulePage(); }); it("adds a query to team schedule", () => { - cy.getAttached(".manage-schedule-page__header").within(() => { - cy.contains("All teams").click({ force: true }); - cy.contains("Oranges").click({ force: true }); - }); - cy.getAttached(".no-schedule__schedule-button").click(); - cy.getAttached(".schedule-editor-modal__form").within(() => { - cy.findByText(/select query/i).click(); - cy.findByText(/detect presence/i).click(); - cy.findByText(/every day/i).click(); - cy.findByText(/every 6 hours/i).click(); - cy.findByText(/show advanced options/i).click(); - cy.findByText(/snapshot/i).click(); - cy.findByText(/ignore removals/i).click(); - cy.getAttached(".schedule-editor-modal__form-field--platform").within( - () => { - cy.findByText(/all/i).click(); - cy.findByText(/linux/i).click(); - } - ); - cy.getAttached( - ".schedule-editor-modal__form-field--osquer-vers" - ).within(() => { - cy.findByText(/all/i).click(); - cy.findByText(/4.6.0/i).click(); - }); - cy.getAttached(".schedule-editor-modal__form-field--shard").within( - () => { - cy.getAttached(".input-field").click().type("50"); - } - ); - cy.getAttached(".modal-cta-wrap").within(() => { - cy.findByRole("button", { name: /schedule/i }).click(); - }); - }); - cy.findByText(/successfully added/i).should("be.visible"); - cy.getAttached("tbody>tr").should("have.length", 1); + manageSchedulePage.changesTeam("All teams", "Oranges"); + manageSchedulePage.allowsAddSchedule(); + manageSchedulePage.verifiesAddedSchedule(); }); }); describe("Team details page", () => {