# cypress-book-todomvc

ci status (opens new window) renovate-app badge (opens new window)

Repo bahmutov/cypress-book-todomvc (opens new window), read the blog post Cypress Book (opens new window). Uses cypress-book (opens new window) module to copy the screenshots.

# Initial screen

This application starts with an input field.

Initial screen

Initial view

# Main feature

User can enter several todos, and they are added to the list

Added three todos

cy.log('**entering 3 todos 📝**')
  .type('write in Markdown ⌨️{enter}')
  .type('code in JavaScript 💻{enter}')
  .type('test in Cypress 😻{enter}')
cy.log('**assertion ✅**')
cy.get('.todo-list li').should('have.length', 3)

# Completing tasks

Once there are several todo items, the user can mark some items "done" and then clear them using a button.

Completed several items

You can see just the completed items using the filters below the list

Just completed items

The "Clear completed" button is at the bottom and becomes visible only if there are completed items.


Hover over the button and click on it

Clear completed button

Only a single active todo remains

Single remaining todo

  .type('write in Markdown{enter}')
  .type('code in JavaScript{enter}')
  .type('test in Cypress{enter}')
cy.get('.todo-list li').should('have.length', 3)

cy.contains('.view', 'code in JavaScript').find('.toggle').click()
cy.contains('.view', 'test in Cypress').find('.toggle').click()
cy.get('.todo-list li.completed').should('have.length', 2)

cy.contains('.filters li', 'Completed').click()
cy.get('.todo-list li').should('have.length', 2)

cy.contains('.filters li', 'All').click()
cy.contains('Clear completed')
  .then(($el) => {
      textDecoration: 'underline',
      border: '1px solid pink',
      borderRadius: '2px',

// clear completed items and take a screenshot
// of the single active todo
cy.contains('Clear completed').click()
cy.get('.todo-list li').should('have.length', 1)

# Explanation

This README file contains tests Cypress understands and runs by using cypress-fiddle (opens new window) file preprocessor. Start the application and Cypress using

npm install
npm run dev

And click on the README.md file


The tests should run. These tests are above in this file, hiding inside an invisible HTML element and a comment:

<details style="display:none">
<!-- fiddle Initial -->
... Cypress test ...
<!-- fiddle-end -->

This is similar to what I have done in Self-testing JAM pages (opens new window)

The test usually includes several .screenshot (opens new window) commands, these images are moved into images folder using code in the cypress/plugins/index.js file.

You can also take a screenshot with the test runner to show how Cypress looks during the test.

TodoMVC test inside Cypress

TodoMVC test
cy.log('**entering 2 todos 📝**')
cy.get('.new-todo').type('I ❤️ tests{enter}').type('and 💕 tests{enter}')
cy.log('**assertion ✅**')
cy.get('.todo-list li').should('have.length', 2)
cy.screenshot('demo-test', { capture: 'runner', log: false })

For more advanced use case where you might want to generate video clips from tests, see cypress-movie (opens new window)

# on CI

This project is built from repo bahmutov/cypress-book-todomvc (opens new window) and tested using GitHub Actions (opens new window). If there are any changed screenshots, they are automatically committed and pushed to GH, see .github/workflows/main.yml (opens new window).

Note: screenshots are only overwritten if they are more than 0.1% different from the existing screenshots in file byte size.

Then this README is converted into a static site using VuePress (opens new window) and deployed to the GitHub Pages at https://glebbahmutov.com/cypress-book-todomvc/ (opens new window).

See also social image test

# Debugging

To see verbose messages from this project run with the environment variable