diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml new file mode 100644 index 0000000..67db720 --- /dev/null +++ b/.github/workflows/cypress.yml @@ -0,0 +1,46 @@ +name: Cypress Tests +on: [push] +jobs: + cypress-run: + runs-on: ubuntu-latest + # Runs tests in parallel with matrix strategy https://docs.cypress.io/guides/guides/parallelization + # https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs + # Also see warning here https://github.com/cypress-io/github-action#parallel + strategy: + fail-fast: false # https://github.com/cypress-io/github-action/issues/48 + matrix: + containers: [1, 2] # Uses 2 parallel instances + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Cypress run + # Uses the official Cypress GitHub action https://github.com/cypress-io/github-action + uses: cypress-io/github-action@v6 + with: + # Starts web server for E2E tests - replace with your own server invocation + # https://docs.cypress.io/guides/continuous-integration/introduction#Boot-your-server + start: npm start + wait-on: 'http://localhost:3000' # Waits for above + # Records to Cypress Cloud + # https://docs.cypress.io/guides/cloud/projects#Set-up-a-project-to-record + record: true + parallel: true # Runs test in parallel using settings above + env: + # For recording and parallelization to work you must set your CYPRESS_RECORD_KEY + # in GitHub repo → Settings → Secrets → Actions + CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} + # Creating a token https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # after the test run completes store videos and any screenshots + - uses: actions/upload-artifact@v3 + # add the line below to store screenshots only on failures + # if: failure() + with: + name: cypress-screenshots + path: cypress/screenshots + if-no-files-found: ignore # 'warn' or 'error' are also available, defaults to `warn` + - uses: actions/upload-artifact@v3 + with: + name: cypress-videos + path: cypress/videos + if-no-files-found: ignore # 'warn' or 'error' are also available, defaults to `warn` \ No newline at end of file diff --git a/cypress.config.ts b/cypress.config.ts new file mode 100644 index 0000000..7e6bd36 --- /dev/null +++ b/cypress.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "cypress"; + +export default defineConfig({ + projectId: 'xyzfv1', + e2e: { + baseUrl: 'http://localhost:3000', + setupNodeEvents(on, config) { + // implement node event listeners here + }, + }, +}) diff --git a/cypress/e2e/1-examples/examples.ts b/cypress/e2e/1-examples/examples.ts new file mode 100644 index 0000000..505ab48 --- /dev/null +++ b/cypress/e2e/1-examples/examples.ts @@ -0,0 +1,2475 @@ +// /// + +// // Welcome to Cypress! +// // +// // This spec file contains a variety of sample tests +// // for a todo list app that are designed to demonstrate +// // the power of writing tests in Cypress. +// // +// // To learn more about how Cypress works and +// // what makes it such an awesome testing tool, +// // please read our getting started guide: +// // https://on.cypress.io/introduction-to-cypress + +// describe('example to-do app', () => { +// beforeEach(() => { +// // Cypress starts out with a blank slate for each test +// // so we must tell it to visit our website with the `cy.visit()` command. +// // Since we want to visit the same URL at the start of all our tests, +// // we include it in our beforeEach function so that it runs before each test +// cy.visit('https://example.cypress.io/todo') +// }) + +// it('displays two todo items by default', () => { +// // We use the `cy.get()` command to get all elements that match the selector. +// // Then, we use `should` to assert that there are two matched items, +// // which are the two default items. +// cy.get('.todo-list li').should('have.length', 2) + +// // We can go even further and check that the default todos each contain +// // the correct text. We use the `first` and `last` functions +// // to get just the first and last matched elements individually, +// // and then perform an assertion with `should`. +// cy.get('.todo-list li').first().should('have.text', 'Pay electric bill') +// cy.get('.todo-list li').last().should('have.text', 'Walk the dog') +// }) + +// it('can add new todo items', () => { +// // We'll store our item text in a variable so we can reuse it +// const newItem = 'Feed the cat' + +// // Let's get the input element and use the `type` command to +// // input our new list item. After typing the content of our item, +// // we need to type the enter key as well in order to submit the input. +// // This input has a data-test attribute so we'll use that to select the +// // element in accordance with best practices: +// // https://on.cypress.io/selecting-elements +// cy.get('[data-test=new-todo]').type(`${newItem}{enter}`) + +// // Now that we've typed our new item, let's check that it actually was added to the list. +// // Since it's the newest item, it should exist as the last element in the list. +// // In addition, with the two default items, we should have a total of 3 elements in the list. +// // Since assertions yield the element that was asserted on, +// // we can chain both of these assertions together into a single statement. +// cy.get('.todo-list li') +// .should('have.length', 3) +// .last() +// .should('have.text', newItem) +// }) + +// it('can check off an item as completed', () => { +// // In addition to using the `get` command to get an element by selector, +// // we can also use the `contains` command to get an element by its contents. +// // However, this will yield the