From ab0007317e0aebfb10340539bae34d76e2b4a33e Mon Sep 17 00:00:00 2001 From: Satbir Singh Date: Thu, 12 Dec 2019 07:50:53 +0000 Subject: [PATCH] Added cypress for e2e tests. --- app/client/cypress.json | 1 + app/client/cypress/fixtures/example.json | 5 + .../integration/examples/actions.spec.js | 309 +++++++++++++ .../integration/examples/aliasing.spec.js | 46 ++ .../integration/examples/assertions.spec.js | 168 +++++++ .../integration/examples/connectors.spec.js | 96 ++++ .../integration/examples/cookies.spec.js | 79 ++++ .../integration/examples/cypress_api.spec.js | 228 ++++++++++ .../integration/examples/files.spec.js | 119 +++++ .../examples/local_storage.spec.js | 58 +++ .../integration/examples/location.spec.js | 34 ++ .../cypress/integration/examples/misc.spec.js | 93 ++++ .../integration/examples/navigation.spec.js | 60 +++ .../examples/network_requests.spec.js | 217 +++++++++ .../integration/examples/querying.spec.js | 114 +++++ .../examples/spies_stubs_clocks.spec.js | 98 ++++ .../integration/examples/traversal.spec.js | 140 ++++++ .../integration/examples/utilities.spec.js | 145 ++++++ .../integration/examples/viewport.spec.js | 63 +++ .../integration/examples/waiting.spec.js | 35 ++ .../integration/examples/window.spec.js | 24 + app/client/cypress/integration/test.js | 43 ++ app/client/cypress/plugins/index.js | 17 + app/client/cypress/support/commands.js | 25 ++ app/client/cypress/support/index.js | 20 + app/client/package.json | 2 + .../src/pages/common/ProtectedRoute.tsx | 9 +- app/client/yarn.lock | 417 ++++++++++++++++-- 28 files changed, 2630 insertions(+), 35 deletions(-) create mode 100644 app/client/cypress.json create mode 100644 app/client/cypress/fixtures/example.json create mode 100644 app/client/cypress/integration/examples/actions.spec.js create mode 100644 app/client/cypress/integration/examples/aliasing.spec.js create mode 100644 app/client/cypress/integration/examples/assertions.spec.js create mode 100644 app/client/cypress/integration/examples/connectors.spec.js create mode 100644 app/client/cypress/integration/examples/cookies.spec.js create mode 100644 app/client/cypress/integration/examples/cypress_api.spec.js create mode 100644 app/client/cypress/integration/examples/files.spec.js create mode 100644 app/client/cypress/integration/examples/local_storage.spec.js create mode 100644 app/client/cypress/integration/examples/location.spec.js create mode 100644 app/client/cypress/integration/examples/misc.spec.js create mode 100644 app/client/cypress/integration/examples/navigation.spec.js create mode 100644 app/client/cypress/integration/examples/network_requests.spec.js create mode 100644 app/client/cypress/integration/examples/querying.spec.js create mode 100644 app/client/cypress/integration/examples/spies_stubs_clocks.spec.js create mode 100644 app/client/cypress/integration/examples/traversal.spec.js create mode 100644 app/client/cypress/integration/examples/utilities.spec.js create mode 100644 app/client/cypress/integration/examples/viewport.spec.js create mode 100644 app/client/cypress/integration/examples/waiting.spec.js create mode 100644 app/client/cypress/integration/examples/window.spec.js create mode 100644 app/client/cypress/integration/test.js create mode 100644 app/client/cypress/plugins/index.js create mode 100644 app/client/cypress/support/commands.js create mode 100644 app/client/cypress/support/index.js diff --git a/app/client/cypress.json b/app/client/cypress.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/app/client/cypress.json @@ -0,0 +1 @@ +{} diff --git a/app/client/cypress/fixtures/example.json b/app/client/cypress/fixtures/example.json new file mode 100644 index 0000000000..da18d9352a --- /dev/null +++ b/app/client/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} \ No newline at end of file diff --git a/app/client/cypress/integration/examples/actions.spec.js b/app/client/cypress/integration/examples/actions.spec.js new file mode 100644 index 0000000000..03eba5e333 --- /dev/null +++ b/app/client/cypress/integration/examples/actions.spec.js @@ -0,0 +1,309 @@ +/// + +context("Actions", () => { + beforeEach(() => { + cy.visit("https://example.cypress.io/commands/actions"); + }); + + // https://on.cypress.io/interacting-with-elements + + it(".type() - type into a DOM element", () => { + // https://on.cypress.io/type + cy.get(".action-email") + .type("fake@email.com") + .should("have.value", "fake@email.com") + + // .type() with special character sequences + .type("{leftarrow}{rightarrow}{uparrow}{downarrow}") + .type("{del}{selectall}{backspace}") + + // .type() with key modifiers + .type("{alt}{option}") //these are equivalent + .type("{ctrl}{control}") //these are equivalent + .type("{meta}{command}{cmd}") //these are equivalent + .type("{shift}") + + // Delay each keypress by 0.1 sec + .type("slow.typing@email.com", { delay: 100 }) + .should("have.value", "slow.typing@email.com"); + + cy.get(".action-disabled") + // Ignore error checking prior to type + // like whether the input is visible or disabled + .type("disabled error checking", { force: true }) + .should("have.value", "disabled error checking"); + }); + + it(".focus() - focus on a DOM element", () => { + // https://on.cypress.io/focus + cy.get(".action-focus") + .focus() + .should("have.class", "focus") + .prev() + .should("have.attr", "style", "color: orange;"); + }); + + it(".blur() - blur off a DOM element", () => { + // https://on.cypress.io/blur + cy.get(".action-blur") + .type("About to blur") + .blur() + .should("have.class", "error") + .prev() + .should("have.attr", "style", "color: red;"); + }); + + it(".clear() - clears an input or textarea element", () => { + // https://on.cypress.io/clear + cy.get(".action-clear") + .type("Clear this text") + .should("have.value", "Clear this text") + .clear() + .should("have.value", ""); + }); + + it(".submit() - submit a form", () => { + // https://on.cypress.io/submit + cy.get(".action-form") + .find('[type="text"]') + .type("HALFOFF"); + cy.get(".action-form") + .submit() + .next() + .should("contain", "Your form has been submitted!"); + }); + + it(".click() - click on a DOM element", () => { + // https://on.cypress.io/click + cy.get(".action-btn").click(); + + // You can click on 9 specific positions of an element: + // ----------------------------------- + // | topLeft top topRight | + // | | + // | | + // | | + // | left center right | + // | | + // | | + // | | + // | bottomLeft bottom bottomRight | + // ----------------------------------- + + // clicking in the center of the element is the default + cy.get("#action-canvas").click(); + + cy.get("#action-canvas").click("topLeft"); + cy.get("#action-canvas").click("top"); + cy.get("#action-canvas").click("topRight"); + cy.get("#action-canvas").click("left"); + cy.get("#action-canvas").click("right"); + cy.get("#action-canvas").click("bottomLeft"); + cy.get("#action-canvas").click("bottom"); + cy.get("#action-canvas").click("bottomRight"); + + // .click() accepts an x and y coordinate + // that controls where the click occurs :) + + cy.get("#action-canvas") + .click(80, 75) // click 80px on x coord and 75px on y coord + .click(170, 75) + .click(80, 165) + .click(100, 185) + .click(125, 190) + .click(150, 185) + .click(170, 165); + + // click multiple elements by passing multiple: true + cy.get(".action-labels>.label").click({ multiple: true }); + + // Ignore error checking prior to clicking + cy.get(".action-opacity>.btn").click({ force: true }); + }); + + it(".dblclick() - double click on a DOM element", () => { + // https://on.cypress.io/dblclick + + // Our app has a listener on 'dblclick' event in our 'scripts.js' + // that hides the div and shows an input on double click + cy.get(".action-div") + .dblclick() + .should("not.be.visible"); + cy.get(".action-input-hidden").should("be.visible"); + }); + + it(".rightclick() - right click on a DOM element", () => { + // https://on.cypress.io/rightclick + + // Our app has a listener on 'contextmenu' event in our 'scripts.js' + // that hides the div and shows an input on right click + cy.get(".rightclick-action-div") + .rightclick() + .should("not.be.visible"); + cy.get(".rightclick-action-input-hidden").should("be.visible"); + }); + + it(".check() - check a checkbox or radio element", () => { + // https://on.cypress.io/check + + // By default, .check() will check all + // matching checkbox or radio elements in succession, one after another + cy.get('.action-checkboxes [type="checkbox"]') + .not("[disabled]") + .check() + .should("be.checked"); + + cy.get('.action-radios [type="radio"]') + .not("[disabled]") + .check() + .should("be.checked"); + + // .check() accepts a value argument + cy.get('.action-radios [type="radio"]') + .check("radio1") + .should("be.checked"); + + // .check() accepts an array of values + cy.get('.action-multiple-checkboxes [type="checkbox"]') + .check(["checkbox1", "checkbox2"]) + .should("be.checked"); + + // Ignore error checking prior to checking + cy.get(".action-checkboxes [disabled]") + .check({ force: true }) + .should("be.checked"); + + cy.get('.action-radios [type="radio"]') + .check("radio3", { force: true }) + .should("be.checked"); + }); + + it(".uncheck() - uncheck a checkbox element", () => { + // https://on.cypress.io/uncheck + + // By default, .uncheck() will uncheck all matching + // checkbox elements in succession, one after another + cy.get('.action-check [type="checkbox"]') + .not("[disabled]") + .uncheck() + .should("not.be.checked"); + + // .uncheck() accepts a value argument + cy.get('.action-check [type="checkbox"]') + .check("checkbox1") + .uncheck("checkbox1") + .should("not.be.checked"); + + // .uncheck() accepts an array of values + cy.get('.action-check [type="checkbox"]') + .check(["checkbox1", "checkbox3"]) + .uncheck(["checkbox1", "checkbox3"]) + .should("not.be.checked"); + + // Ignore error checking prior to unchecking + cy.get(".action-check [disabled]") + .uncheck({ force: true }) + .should("not.be.checked"); + }); + + it(".select() - select an option in a