The snapshot testing feature is perhaps at the core of the framework’s utility. It makes sure your UI does not change unexpectedly by taking serializable snapshots of UI components and comparing them against previous snapshots. UI components are generally responsible for producing some DOM output to be rendered, so Jest simply ensures that the resulting output looks as expected. Writing tests that do this is easy in Jest, and allows you to cover more components with tests in the same amount of time. You just need to set up data or mock objects for the component inputs. You can then use the snapshot files, which live in a folder next to the tests that generated them, to check regressions when files change, with the interactive watch mode.
Jest can also be used to manage the changes in behavior of your application, by comparing outputs of not just UI components, but any other state-changing functionality. For example, if you are using Redux (or something similar) to control your application state, you can have Jest compare the resulting state of your entire app. Comparing results of top-level components gives you coverage similar to integration tests, since you can compare snapshots of large component trees that demonstrate components working together correctly. You can use Jest for anything that produces a structured response like analyzing API responses, or calls to any service or function.
But, of course, Jest is not without some limitations. For instance, State snapshots are not great at dealing with code side-effects. The work-around for this is to use spies in Jest to intercept function calls and trigger side-effects. You can then inspect the output snapshots per the usual method. Jest tests are also not made to be run on the browser, so your End-to-End testing will need to be covered by another testing framework; probably something that uses Selenium, such as WebdriverIO.