github statelyai/xstate @xstate/test@1.0.0-alpha.0

latest releases: @xstate/vue@4.0.0, @xstate/store@2.6.1, @xstate/svelte@4.0.0...
pre-release2 years ago

Major Changes

  • #3036 Thanks @mattpocock, @davidkpiano! - Substantially simplified how paths and plans work in TestModel. Changed getShortestPlans and getSimplePlans to getShortestPaths and getSimplePaths. These functions now return an array of paths, instead of an array of plans which contain paths.

    Also added getPaths, which defaults to getShortestPaths. This can be passed a pathGenerator to customize how paths are generated.

  • #3036 Thanks @mattpocock! - Moved event cases out of events, and into their own attribute called eventCases:

    const model = createTestModel(machine, {
      eventCases: {
        CHOOSE_CURRENCY: [
          {
            currency: 'GBP'
          },
          {
            currency: 'USD'
          }
        ]
      }
    });
    
    model.getPaths().forEach((path) => {
      it(path.description, async () => {
        await path.test({
          events: {
            CHOOSE_CURRENCY: ({ event }) => {
              console.log(event.currency);
            }
          }
        });
      });
    });

    eventCases will also now always produce a new path, instead of only creating a path for the first case which matches.

  • #3036 Thanks @davidkpiano! - Removed .testCoverage(), and instead made getPlans, getShortestPlans and getSimplePlans cover all states and transitions enabled by event cases by default.
  • #3036 Thanks @davidkpiano! - Added validation on createTestModel to ensure that you don't include invalid machine configuration in your test machine. Invalid machine configs include invoke, after, and any actions with a delay.

    Added createTestMachine, which provides a slimmed-down API for creating machines which removes these types from the config type signature.

  • #3036 Thanks @davidkpiano! - getShortestPaths() and getPaths() will now traverse all transitions by default, not just all events.

    Take this machine:

    const machine = createTestMachine({
      initial: 'toggledOn',
      states: {
        toggledOn: {
          on: {
            TOGGLE: 'toggledOff'
          }
        },
        toggledOff: {
          on: {
            TOGGLE: 'toggledOn'
          }
        }
      }
    });

    In @xstate/test version 0.x, this would run this path by default:

    toggledOn -> TOGGLE -> toggledOff
    

    This is because it satisfies two conditions:

    1. Covers all states
    2. Covers all events

    But this a complete test - it doesn't test if going from toggledOff to toggledOn works.

    Now, we seek to cover all transitions by default. So the path would be:

    toggledOn -> TOGGLE -> toggledOff -> TOGGLE -> toggledOn
    
  • #3036 Thanks @mattpocock, @davidkpiano! - Moved events from createTestModel to path.test.

    Old:

    const model = createTestModel(machine, {
      events: {}
    });

    New:

    const paths = model.getPaths().forEach((path) => {
      path.test({
        events: {}
      });
    });

    This allows for easier usage of per-test mocks and per-test context.

  • #3036 Thanks @mattpocock, @davidkpiano! - Added states to path.test():

    const paths = model.getPaths().forEach((path) => {
      path.test({
        states: {
          myState: () => {},
          'myState.deep': () => {}
        }
      });
    });

    This allows you to define your tests outside of your machine, keeping the machine itself easy to read.

Minor Changes

Patch Changes

Don't miss a new xstate release

NewReleases is sending notifications on new releases.