diff --git a/packages/cypress/README.md b/packages/cypress/README.md new file mode 100644 index 000000000..204f5077f --- /dev/null +++ b/packages/cypress/README.md @@ -0,0 +1,2 @@ + +Run `yarn && yarn cypress open` diff --git a/packages/cypress/cypress.json b/packages/cypress/cypress.json new file mode 100644 index 000000000..95e8b4323 --- /dev/null +++ b/packages/cypress/cypress.json @@ -0,0 +1,8 @@ +{ + "baseUrl": "http://localhost:3000", + "experimentalSessionSupport": true, + "fixturesFolder": false, + "supportFile": "cypress/support/index.js", + "pluginsFile": false, + "video": false +} diff --git a/packages/cypress/cypress/integration/authentication/register-w-email.js b/packages/cypress/cypress/integration/authentication/register-w-email.js new file mode 100644 index 000000000..ddfbbc0ee --- /dev/null +++ b/packages/cypress/cypress/integration/authentication/register-w-email.js @@ -0,0 +1,34 @@ +const email = 'tester@omnivore.app' +const username = 'testuser' +const password = 'testpassword' +const fullName = 'Test User' + +describe('Register with email', () => { + it('creates a new user', function () { + cy.visit('/email-registration') + + cy.get('input[name=email]').type(email) + cy.get('input[name=username]').type(username) + cy.get('input[name=password]').type(password) + cy.get('input[name=name]').type(fullName) + + cy.get('form').submit() + + // we should be redirected to /dashboard + cy.location('pathname').should('include', '/email-login') + }) +}) + +describe('Login with email', () => { + it('sets auth token and redirects', function () { + cy.visit('/email-login') + + cy.get('input[name=email]').type(email) + cy.get('input[name=password]').type(password) + + cy.get('form').submit() + + cy.getCookie('auth').should('exist') + cy.location('pathname').should('include', '/home') + }) +}) diff --git a/packages/cypress/cypress/integration/library/add-item.js b/packages/cypress/cypress/integration/library/add-item.js new file mode 100644 index 000000000..1b11e48f1 --- /dev/null +++ b/packages/cypress/cypress/integration/library/add-item.js @@ -0,0 +1,22 @@ + +describe('add link button', () => { + before(() => { + const email = 'tester@omnivore.app' + const password = 'testpassword' + + cy.login(email, password) + cy.visit('/home'); + }); + + it('should add a link', () => { + // Use keyboard command to open add link modal + cy.get('body').type('a') + + cy.focused().type('https://jacksonh.org/{enter}') + + // wait for the link to be added + cy.wait(2000) + + cy.reload() + }); +}); diff --git a/packages/cypress/cypress/integration/unauthenticated/redirects.js b/packages/cypress/cypress/integration/unauthenticated/redirects.js new file mode 100644 index 000000000..75e77bcd2 --- /dev/null +++ b/packages/cypress/cypress/integration/unauthenticated/redirects.js @@ -0,0 +1,8 @@ + +describe('pages that require auth', () => { + it('should redirect to login', () => { + cy.visit('/home') + cy.location('pathname') + .should('be.equal', '/login') + }); +}); diff --git a/packages/cypress/cypress/plugins/index.js b/packages/cypress/cypress/plugins/index.js new file mode 100644 index 000000000..59b2bab6e --- /dev/null +++ b/packages/cypress/cypress/plugins/index.js @@ -0,0 +1,22 @@ +/// +// *********************************************************** +// 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 +} diff --git a/packages/cypress/cypress/support/commands.js b/packages/cypress/cypress/support/commands.js new file mode 100644 index 000000000..3e0d1e5e4 --- /dev/null +++ b/packages/cypress/cypress/support/commands.js @@ -0,0 +1,16 @@ + +import '@testing-library/cypress/add-commands'; + +Cypress.Commands.add('login', (email, password) => { + cy.session([email, password], () => { + cy.visit('/email-login') + + cy.get('input[name=email]').type(email) + cy.get('input[name=password]').type(password) + + cy.get('form').submit() + + cy.getCookie('auth').should('exist') + cy.location('pathname').should('include', '/home') + }) +}) \ No newline at end of file diff --git a/packages/cypress/cypress/support/index.js b/packages/cypress/cypress/support/index.js new file mode 100644 index 000000000..d68db96df --- /dev/null +++ b/packages/cypress/cypress/support/index.js @@ -0,0 +1,20 @@ +// *********************************************************** +// 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' + +// Alternatively you can use CommonJS syntax: +// require('./commands') diff --git a/packages/cypress/package.json b/packages/cypress/package.json new file mode 100644 index 000000000..8b423acff --- /dev/null +++ b/packages/cypress/package.json @@ -0,0 +1,15 @@ +{ + "name": "@omnivore/cypress", + "version": "1.0.0", + "private": true, + "scripts": {}, + "dependencies": { + "@testing-library/cypress": "^8.0.2", + "cypress": "^9.5.3" + }, + "devDependencies": {}, + "volta": { + "node": "14.18.0", + "yarn": "1.22.10" + } +} diff --git a/packages/cypress/tsconfig.json b/packages/cypress/tsconfig.json new file mode 100644 index 000000000..297d3e23c --- /dev/null +++ b/packages/cypress/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "types": ["node"], + "incremental": true + }, + "include": ["**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +}