-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #3036 from statelyai/davidkpiano/xstate-test-1
[@xstate/test] Next version low-level API
- Loading branch information
Showing
41 changed files
with
4,065 additions
and
11,161 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
--- | ||
'@xstate/graph': major | ||
--- | ||
|
||
pr: #3036 | ||
@author: @davidkpiano | ||
|
||
Renamed `getAdjacencyMap` to `getValueAdjacencyMap`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
--- | ||
'@xstate/graph': major | ||
--- | ||
|
||
pr: #3036 | ||
@author: @davidkpiano | ||
|
||
Changed `getSimplePaths` to `getSimplePlans`, and `getShortestPaths` to `getShortestPlans`. Both of these functions can be passed a machine, and return `StatePlan[]`. | ||
|
||
Added functions `traverseSimplePlans`, `traverseShortestPlans`,`traverseShortestPlansFromTo`, `traverseSimplePlansTo` and `traverseSimplePlansFromTo`, which can be passed a `Behavior` and return `StatePlan[]`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
--- | ||
'@xstate/test': major | ||
--- | ||
|
||
pr: #3036 | ||
|
||
@author: @mattpocock | ||
@author: @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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
--- | ||
'@xstate/test': major | ||
--- | ||
|
||
pr: #3036 | ||
@author: @mattpocock | ||
|
||
Moved event cases out of `events`, and into their own attribute called `eventCases`: | ||
|
||
```ts | ||
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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
--- | ||
'@xstate/test': major | ||
--- | ||
|
||
pr: #3036 | ||
@author: @davidkpiano | ||
|
||
Removed `.testCoverage()`, and instead made `getPlans`, `getShortestPlans` and `getSimplePlans` cover all states and transitions enabled by event cases by default. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
--- | ||
'@xstate/test': major | ||
--- | ||
|
||
pr: #3036 | ||
@author: @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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
--- | ||
'@xstate/test': major | ||
--- | ||
|
||
pr: #3036 | ||
@author: @davidkpiano | ||
|
||
`getShortestPaths()` and `getPaths()` will now traverse all _transitions_ by default, not just all events. | ||
|
||
Take this machine: | ||
|
||
```ts | ||
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: | ||
|
||
```txt | ||
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: | ||
|
||
```txt | ||
toggledOn -> TOGGLE -> toggledOff -> TOGGLE -> toggledOn | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
--- | ||
'@xstate/test': minor | ||
--- | ||
|
||
pr: #3036 | ||
@author: @mattpocock @davidkpiano | ||
|
||
Added `path.testSync(...)` to allow for testing paths in sync-only environments, such as Cypress. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
--- | ||
'@xstate/test': major | ||
--- | ||
|
||
pr: #3036 | ||
@author: @mattpocock @davidkpiano | ||
|
||
Moved `events` from `createTestModel` to `path.test`. | ||
|
||
Old: | ||
|
||
```ts | ||
const model = createTestModel(machine, { | ||
events: {} | ||
}); | ||
``` | ||
|
||
New: | ||
|
||
```ts | ||
const paths = model.getPaths().forEach((path) => { | ||
path.test({ | ||
events: {} | ||
}); | ||
}); | ||
``` | ||
|
||
This allows for easier usage of per-test mocks and per-test context. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
--- | ||
'@xstate/test': major | ||
--- | ||
|
||
pr: #3036 | ||
@author: @mattpocock @davidkpiano | ||
|
||
Added `states` to `path.test()`: | ||
|
||
```ts | ||
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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.