Skip to content

Commit

Permalink
feat: Improve Cypress setup and structure (#141)
Browse files Browse the repository at this point in the history
  • Loading branch information
dvvanessastoiber authored Aug 11, 2022
1 parent 8628da6 commit 212fec2
Show file tree
Hide file tree
Showing 8 changed files with 133 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,8 @@ node_modules/
/.awcache
/.cache-loader
package-lock.json

# ignore local cypress artifacts
/cypress/videos/
/cypress/screenshots/

10 changes: 10 additions & 0 deletions cypress.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"experimentalStudio": true,
"viewportWidth": 1920,
"viewportHeight": 1080,
"defaultCommandTimeout": 100000,
"responseTimeout": 100000,
"env": {
"host": "http://localhost:8080"
}
}
5 changes: 5 additions & 0 deletions cypress/fixtures/example.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "Using fixtures to represent data",
"email": "[email protected]",
"body": "Fixtures are a great way to mock data for responses to routes"
}
1 change: 1 addition & 0 deletions cypress/integration/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import 'tdp_publicdb/cypress/integration/';
22 changes: 22 additions & 0 deletions cypress/plugins/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/// <reference types="cypress" />
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************

// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)

/**
* @type {Cypress.PluginConfig}
*/
// eslint-disable-next-line no-unused-vars
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
}
37 changes: 37 additions & 0 deletions cypress/support/commands.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//


// -- This is a parent command --
Cypress.Commands.add('login', () => {

// Check if form is visible and the two inputs are not empty (so not to click too fast on the button)
cy.get('.form-signin').should('be.visible');
cy.get('.form-signin #login_username').invoke('val').should('not.be.empty');
cy.get('.form-signin #login_password').invoke('val').should('not.be.empty');
// Add a small wait just for safety
cy.wait(1000);
cy.get('.form-signin button[type="submit"]').click();
// Check that login disappears
cy.get('.form-signin button[type=submit]').should('not.be.visible');
});

// -- This is a child command --
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
48 changes: 48 additions & 0 deletions cypress/support/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************

// Import commands.js using ES2015 syntax:
import './commands'
import 'tdp_core/cypress/support/commands';
import 'ordino/cypress/support/commands';

// Alternatively you can use CommonJS syntax:
// require('./commands')


// Here we define the selector priority for cypress.
// We use Cypress.SelectorPlayground.defaults within itself, in order to define two different selector priorities,
// depending on whether the element has the data-testid attribute.
// This is a little hacky, but works and is the most stable solution.
// Why this works can be founde here: https://github.com/cypress-io/cypress/blob/b6c4ba144cd6ae3d210789bbb69b9aacc6a92094/packages/driver/src/cypress/selector_playground.ts
// If in the future changes happen in cypress, that interfere with this approach, this solution must be changed.

Cypress.SelectorPlayground.defaults({
// With onElement we can check whether the element has the data-testid attribute
onElement: (el) => {
if (el.attr('data-testid')) {
// If it has the data-testid attribute then it should only use it in the selector priority.
// This ensures that we get nice outputs in the cypress studio as we intended (hierarchy of data-testid elements).
Cypress.SelectorPlayground.defaults({
selectorPriority: ['data-testid'],
})
} else {
// If it does not have it (eg. line up) we use all the available selector types to ensure that a unique selector is returned.
Cypress.SelectorPlayground.defaults({
selectorPriority: ['data-testid', 'data-cy', 'data-test', 'class', 'tag', 'attributes', 'nth-child', 'id'],
})
}
},
})
6 changes: 5 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@
"release:minor": "npm version minor && npm publish && git push --follow-tags",
"release:patch": "npm version patch && npm publish && git push --follow-tags",
"predist": "npm run build && npm run docs",
"dist": "mkdir lib && cd dist && tar cvzf ../lib/ordino_public.tar.gz *"
"dist": "mkdir lib && cd dist && tar cvzf ../lib/ordino_public.tar.gz *",
"cy:open": "cypress open",
"cy:run": "cypress run"
},
"files": [
"src",
Expand All @@ -66,6 +68,7 @@
"@types/react-router-dom": "^5.1.7",
"@typescript-eslint/eslint-plugin": "^5.9.0",
"@typescript-eslint/parser": "^5.9.0",
"cypress": "^9.5.2",
"eslint": "^8.7.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-typescript": "^16.1.0",
Expand All @@ -78,6 +81,7 @@
"eslint-plugin-react-hooks": "^4.3.0",
"identity-obj-proxy": "~3.0.0",
"jest-raw-loader": "~1.0.1",
"local-cypress": "^1.2.5",
"prettier": "^2.5.1",
"rimraf": "~3.0.2",
"shx": "~0.3.3",
Expand Down

0 comments on commit 212fec2

Please sign in to comment.