Event cases

Sometimes you want to test your system with a variety of different values. For example, you might be testing a payment system where you can pay with many different currencies, and you need to ensure that GBP, EUR and USD all work.

You can use eventCases to test with these different values:

ts
const machine = createTestMachine({
initial: "onPaymentPage",
states: {
onPaymentPage: {
on: {
SUBMIT_PAYMENT_FORM: "submitted",
},
},
submitted: {},
},
});
const model = createTestModel({
eventCases: {
SUBMIT_PAYMENT_FORM: [
{
currency: "GBP",
},
{
currency: "USD",
},
{
currency: "EUR",
},
],
},
});
model.getPaths().forEach((path) => {
it(path.description, () => {
path.testSync({
events: ({ event }) => {
/**
* Select the currency from the event.currency
*/
cy.findByLabelText("Currency").select(
event.currency,
);
/**
* Submit the form
*/
cy.findByRole("button", {
name: "Submit",
}).click();
},
});
});
});
ts
const machine = createTestMachine({
initial: "onPaymentPage",
states: {
onPaymentPage: {
on: {
SUBMIT_PAYMENT_FORM: "submitted",
},
},
submitted: {},
},
});
const model = createTestModel({
eventCases: {
SUBMIT_PAYMENT_FORM: [
{
currency: "GBP",
},
{
currency: "USD",
},
{
currency: "EUR",
},
],
},
});
model.getPaths().forEach((path) => {
it(path.description, () => {
path.testSync({
events: ({ event }) => {
/**
* Select the currency from the event.currency
*/
cy.findByLabelText("Currency").select(
event.currency,
);
/**
* Submit the form
*/
cy.findByRole("button", {
name: "Submit",
}).click();
},
});
});
});

Using eventCases will create a different path for each case. In the example above, the test model will test that each currency can be submitted.