Space-separated words use implicit AND. Press / to focus the search bar. Operators &&||!! activate advanced mode; without them, legacy tag expressions (@a and @b or not @c) are also supported.
Status:
Happy Paths:
Duration ≥:seconds
Dependencies:
Details:lines
Scenario Timeline 🛈
Creating An Order Should Emit A Structured Log Entry
2.1s
Popular Recipes Should Return Recipe Types Ordered By Frequency
1.8s
Creating A Reservation Should Return The Confirmed Reservation
1.4s
Creating An Order Should Produce An Audit Log Entry And Events
1.0s
Listing Feedback For An Order Should Return The Feedback
1.0s
An Outbox Message Should Transition To Failed After Exhausting Retries
1.0s
A Valid Order Should Be Created And An Event Published
1.0s
The AsyncApi Endpoint Should Return A Valid Specification
876ms
The OpenApi Endpoint Should Return A Valid Specification
782ms
Retrieving An Existing Reservation Should Return The Reservation
707ms
Listing Usage By Ingredient Should Return Matching Records
646ms
The Scalar UI Endpoint Should Return A Valid Page
346ms
Health Check Should Report Degraded When Multiple Downstream Services Are Unavailable
237ms
Creating An Order When The Kitchen Service Returns An Error Should Still Create The Order
208ms
Creating An Order Should Produce A Retrievable Audit Log Entry
196ms
An Order Exceeding The Maximum Items Per Order Should Be Rejected
186ms
An Order At The Maximum Items Per Order Should Be Accepted
174ms
Exceeding The Rate Limit Should Return Too Many Requests
168ms
Creating An Order Should Write An Outbox Message That Gets Processed
166ms
Goat Milk Endpoint Should Return Fresh Goat Milk When Feature Is Enabled
151ms
A Waffle Request With More Toppings Than Allowed Should Return A Bad Request Response
148ms
Ingredient Shipments Should Be Recorded When Delivered Via EventGrid Webhook
148ms
Health Check Should Report Degraded When A Downstream Service Returns A Non Success Status
145ms
An Order Should Progress Through All Status Transitions To Completion
143ms
Listing Orders With A Small Page Size Should Limit Results
138ms
Toppings Should Include Raspberries When Feature Flag Is Enabled
136ms
Orders Endpoint Is Called With Invalid Fields Should Return A Bad Request Response [inputs: "InvalidFieldFromRequest { Field = CustomerName, Value = , Reason = Customer name is required }, InvalidFieldFromRequest { Field = Items, Value = , Reason = At least one item is required }, InvalidFieldFromRequest { Field = Items[0].ItemType, Value = , Reason = Item type is required }, InvalidFieldFromRequest { Field = Items[0].BatchId, Value = , Reason = Batch ID is required }, InvalidFieldFromRequest { Field = Items[0].Quantity, Value = 0, Reason = Quantity must be greater than zero }"] [outputs: "VerifiableErrorResult { ErrorMessage = 'Customer Name' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = The Items field is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Item Type' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Batch Id' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Quantity must be greater than zero., ResponseStatus = Bad Request }"]
134ms
Goat Milk Endpoint Should Return Not Found When Feature Is Disabled
131ms
A Valid Waffle Request Should Return A Fresh Batch
129ms
Health Check Should Report Degraded When The Cow Service Is Unavailable
125ms
Deleting A Staff Member Should Return No Content
125ms
Toppings Should Exclude Raspberries When Feature Flag Is Disabled
125ms
Requesting The Second Page Should Return Different Orders
123ms
A Valid Daily Special Order Should Return A Confirmation
121ms
Listing Orders Should Return A Paginated Response
120ms
Audit Logs Should Be Returned In Descending Timestamp Order
119ms
Retrieving Non Existent Review Should Return Not Found
119ms
Waffle Recipe Summary Should Return Correct Data
118ms
Cancelling A Reservation Should Return The Cancelled Reservation
103ms
The Menu Endpoint Should Return All Menu Items With Availability
100ms
Retrieving An Existing Inventory Item Should Return The Item
91ms
Muffins Endpoint Is Called With An Invalid Field "Cinnamon" Should Return A Bad Request Response [value: "<script>alert('xss')</script>"] [reason: "XSS in cinnamon"] [expectedError: "Cinnamon contains potentially dangerous content."] [expectedStatus: "Bad Request"]
86ms
Audit Logs Should Be Filterable By Entity Id
85ms
Deleting A Reservation Should Return No Content
74ms
An Invalid Status Transition Should Return A Conflict Response [fromStatus: "Preparing"] [toStatus: "Cancelled"]
72ms
Equipment Alerts Should Contain Data Ingested Via Event Hub Consumer
71ms
Submitting A Recipe Review Should Return The Created Review
69ms
A Previously Created Order Should Be Retrievable By Id
69ms
A Valid Status Transition Should Update The Order [fromStatus: "Ready"] [toStatus: "Completed"]
68ms
Getting Usage Summary Should Return Aggregated Data
68ms
Order Status Via Grpc Should Return Order Details
66ms
An Invalid Status Transition Should Return A Conflict Response [fromStatus: "Completed"] [toStatus: "Preparing"]
65ms
The Menu Should Return Cached Results On Subsequent Requests
63ms
An Invalid Status Transition Should Return A Conflict Response [fromStatus: "Created"] [toStatus: "Ready"]
62ms
An Invalid Status Transition Should Return A Conflict Response [fromStatus: "Created"] [toStatus: "Completed"]
61ms
Streaming Order Updates Should Return The Current Status
61ms
A Valid Status Transition Should Update The Order [fromStatus: "Created"] [toStatus: "Preparing"]
59ms
Recipe Reports Should Contain Ingested Recipe Data
58ms
The Health Check Endpoint Should Return A Healthy Status With Dependency Details
57ms
Retrieving Existing Review By Id Should Return The Review
56ms
Order Summaries Should Contain Ingested Order Data
56ms
Order Status Update Endpoint Is Called With Invalid Fields Should Return A Bad Request Response [inputs: "InvalidFieldFromRequest { Field = Status, Value = , Reason = Status is required }"] [outputs: "VerifiableErrorResult { ErrorMessage = 'Status' is required., ResponseStatus = Bad Request }"]
54ms
An Invalid Status Transition Should Return A Conflict Response [fromStatus: "Cancelled"] [toStatus: "Ready"]
52ms
An Invalid Status Transition Should Return A Conflict Response [fromStatus: "Cancelled"] [toStatus: "Preparing"]
52ms
Requesting The Menu When The Supplier Service Is Unavailable Should Mark Items As Unavailable
51ms
An Invalid Status Transition Should Return A Conflict Response [fromStatus: "Ready"] [toStatus: "Preparing"]
51ms
Batch Completions Should Contain Data Ingested Via PubSub Consumer
50ms
Ingredient Usage Should Aggregate Across Multiple Recipes
49ms
Retrieving An Existing Staff Member Should Return The Member
48ms
Sending A Request With An Unsupported Content Type Should Return An Unsupported Media Type Response [contentType: "text/plain"]
Adding A New Topping Should Return The Created Topping
45ms
Deleting An Inventory Item Should Return No Content
44ms
Ordering A Daily Special Beyond The Threshold Should Return A Conflict Response
44ms
A Valid Pancake Request Should Return A Fresh Batch
43ms
A Request With A Correlation Id Should Forward It To The Cow Service
43ms
Submitting The Same Order With The Same Idempotency Key Should Return The Same Confirmation
42ms
Updating Customer Preferences Should Return The Updated Preferences
41ms
Update Toppings Endpoint Is Called With Invalid Or Dangerous Input [inputs: "InvalidFieldFromRequest { Field = Name, Value = <script>alert('xss')</script>, Reason = Script tag in name }, InvalidFieldFromRequest { Field = Name, Value = <img src=x onerror=alert(1)>, Reason = Event handler in name }, InvalidFieldFromRequest { Field = Category, Value = <script>alert('xss')</script>, Reason = Script tag in category }, InvalidFieldFromRequest { Field = Category, Value = javascript:alert(1), Reason = Javascript protocol }, InvalidFieldFromRequest { Field = Name, Value = , Reason = Name is required }, InvalidFieldFromRequest { Field = Category, Value = , Reason = Category is required }"] [outputs: "VerifiableErrorResult { ErrorMessage = Name contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Name contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Category contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Category contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Name' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Category' is required., ResponseStatus = Bad Request }"]
41ms
Retrieving Existing Feedback By Id Should Return The Feedback
38ms
Audit Logs Should Be Filterable By Entity Type
37ms
Pancakes Endpoint Is Called With Invalid Ingredients Should Return A Bad Request Response [inputs: "InvalidFieldFromRequest { Field = Milk, Value = , Reason = Milk is required }, InvalidFieldFromRequest { Field = Flour, Value = , Reason = Flour is required }, InvalidFieldFromRequest { Field = Eggs, Value = , Reason = Eggs is required }, InvalidFieldFromRequest { Field = Milk, Value = <script>alert</script>, Reason = XSS in milk }, InvalidFieldFromRequest { Field = Flour, Value = <img onerror=x>, Reason = XSS in flour }, InvalidFieldFromRequest { Field = Eggs, Value = javascript:void(0), Reason = XSS in eggs }"] [outputs: "VerifiableErrorResult { ErrorMessage = 'Milk' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Flour' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Eggs' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Milk contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Flour contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Eggs contains potentially dangerous content., ResponseStatus = Bad Request }"]
37ms
A Valid Status Transition Should Update The Order [fromStatus: "Preparing"] [toStatus: "Ready"]
37ms
Muffins Endpoint Is Called With An Invalid Field "Eggs" Should Return A Bad Request Response [value: ""] [reason: "Eggs is required"] [expectedError: "'Eggs' is required."] [expectedStatus: "Bad Request"]
35ms
Listing All Inventory Items Should Return All Items
34ms
Toppings Endpoint Is Called With Invalid Or Dangerous Input [inputs: "InvalidFieldFromRequest { Field = Name, Value = <script>alert('xss')</script>, Reason = Script tag in name }, InvalidFieldFromRequest { Field = Name, Value = <img src=x onerror=alert(1)>, Reason = Event handler in name }, InvalidFieldFromRequest { Field = Category, Value = <script>alert('xss')</script>, Reason = Script tag in category }, InvalidFieldFromRequest { Field = Category, Value = javascript:alert(1), Reason = Javascript protocol }, InvalidFieldFromRequest { Field = Name, Value = , Reason = Name is required }, InvalidFieldFromRequest { Field = Category, Value = , Reason = Category is required }"] [outputs: "VerifiableErrorResult { ErrorMessage = Name contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Name contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Category contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Category contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Name' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Category' is required., ResponseStatus = Bad Request }"]
34ms
A Valid Status Transition Should Update The Order [fromStatus: "Created"] [toStatus: "Cancelled"]
31ms
Updating An Inventory Item Should Return The Updated Item
31ms
A Request With A Correlation Id Should Forward It To The Supplier Service
30ms
Recording Usage With Zero Quantity Should Return Bad Request
30ms
Order Status For Non Existent Order Should Return Not Found
29ms
The Goat Milk Endpoint Should Return Fresh Goat Milk From The Goat Service
29ms
Listing Orders When None Exist Should Return An Empty Page
28ms
Sending A Request With An Unsupported Content Type Should Return An Unsupported Media Type Response [contentType: "application/xml"]
28ms
A Pancake Request With More Toppings Than Allowed Should Return A Bad Request Response
28ms
Listing Reviews By Recipe Should Return Matching Reviews
27ms
Saving Customer Preferences Should Return The Saved Preferences
26ms
Adding A New Staff Member Should Return The Created Member
24ms
Retrieving Existing Customer Preferences Should Return The Preferences
24ms
Filtering Audit Logs By A Non Existent Entity Type Should Return An Empty Collection
24ms
Deleting An Existing Topping Should Return No Content
22ms
Cancelling An Already Cancelled Reservation Should Return A Conflict Response
21ms
Requesting Goat Milk When The Goat Service Is Unavailable Should Return A Bad Gateway Response
21ms
The Daily Specials Endpoint Should Return All Available Specials
21ms
Remaining Quantity Should Decrease After Each Order
21ms
The Toppings Endpoint Should Return All Available Toppings
21ms
Updating An Existing Topping Should Return The Updated Topping
20ms
Submitting Feedback Should Return The Created Feedback
Requesting Milk When The Cow Service Times Out Should Return A Bad Gateway Response
18ms
Muffins Endpoint Is Called With An Invalid Field "Milk" Should Return A Bad Request Response [value: ""] [reason: "Milk is required"] [expectedError: "'Milk' is required."] [expectedStatus: "Bad Request"]
18ms
Retrieving Non Existent Customer Preferences Should Return Not Found
17ms
Waffles Endpoint Is Called With Invalid Ingredients Should Return A Bad Request Response [inputs: "InvalidFieldFromRequest { Field = Milk, Value = , Reason = Milk is required }, InvalidFieldFromRequest { Field = Flour, Value = , Reason = Flour is required }, InvalidFieldFromRequest { Field = Eggs, Value = , Reason = Eggs is required }, InvalidFieldFromRequest { Field = Butter, Value = , Reason = Butter is required }, InvalidFieldFromRequest { Field = Milk, Value = <script>alert</script>, Reason = XSS in milk }, InvalidFieldFromRequest { Field = Butter, Value = <img onerror=x>, Reason = XSS in butter }"] [outputs: "VerifiableErrorResult { ErrorMessage = 'Milk' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Flour' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Eggs' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Butter' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Milk contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Butter contains potentially dangerous content., ResponseStatus = Bad Request }"]
17ms
Order Summaries Should Return An Empty List When No Orders Exist
A Valid Apple Cinnamon Muffin Request Should Return A Fresh Batch
16ms
Muffins Endpoint Is Called With An Invalid Field "Flour" Should Return A Bad Request Response [value: ""] [reason: "Flour is required"] [expectedError: "'Flour' is required."] [expectedStatus: "Bad Request"]
16ms
The Health Check Response Should Include Description And Data For Each Entry
15ms
Retrieving A Non Existent Order Should Return Not Found
15ms
The Heartbeat Endpoint Should Return A Running Message
13ms
Adding A New Inventory Item Should Return The Created Item
12ms
Recording Ingredient Usage Should Return The Created Record
12ms
Requesting Milk When The Cow Service Is Unavailable Should Return A Bad Gateway Response
11ms
Submitting The Same Order With Different Idempotency Keys Should Return Different Confirmations
11ms
A Request Without A Correlation Id Should Have One Generated In The Response
11ms
Unknown Recipe Type Should Return Zero Batches
11ms
Updating The Status Of A Non Existent Order Should Return Not Found
10ms
Daily Special Order Endpoint Is Called With Invalid Fields Should Return A Bad Request Response [inputs: "InvalidFieldFromRequest { Field = SpecialId, Value = , Reason = Special ID is required }, InvalidFieldFromRequest { Field = Quantity, Value = 0, Reason = Quantity must be greater than zero }"] [outputs: "VerifiableErrorResult { ErrorMessage = 'Special Id' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Quantity must be greater than zero., ResponseStatus = Bad Request }"]
10ms
Pancake Recipe Summary Should Return Correct Data
10ms
Sending A Request With An Unsupported Content Type Should Return An Unsupported Media Type Response [contentType: "text/html"]
10ms
Requesting Milk When The Cow Service Returns An Invalid Response Should Return A Bad Gateway Response
9ms
Adding A Staff Member With An Invalid Role Should Return A Bad Request Response
9ms
Requesting Goat Milk When The Goat Service Returns An Invalid Response Should Return A Bad Gateway Response
8ms
A Request With A Correlation Id Should Return The Same Id In The Response
7ms
Retrieving Non Existent Feedback Should Return Not Found
7ms
Muffins Endpoint Is Called With An Invalid Field "Apples" Should Return A Bad Request Response [value: ""] [reason: "Apples is required"] [expectedError: "'Apples' is required."] [expectedStatus: "Bad Request"]
7ms
Ordering A Non Existent Daily Special Should Return Not Found
7ms
Submitting Feedback With Invalid Rating Should Return Bad Request
6ms
Streaming Updates For Non Existent Order Should Return Not Found
6ms
Muffins Endpoint Is Called With An Invalid Field "Cinnamon" Should Return A Bad Request Response [value: ""] [reason: "Cinnamon is required"] [expectedError: "'Cinnamon' is required."] [expectedStatus: "Bad Request"]
6ms
Recording Usage With Missing Ingredient Name Should Return Bad Request
5ms
Retrieving A Non Existent Inventory Item Should Return Not Found
5ms
Saving Customer Preferences With Missing Customer Name Should Return Bad Request
5ms
Submitting Review With Missing Recipe Name Should Return Bad Request
5ms
Updating A Non Existent Topping Should Return Not Found
5ms
Submitting Review With Invalid Rating Should Return Bad Request
5ms
Sending A Request With An Unsupported Content Type Should Return An Unsupported Media Type Response [contentType: "text/plain"]
5ms
Deleting A Non Existent Topping Should Return Not Found
5ms
Submitting Feedback With Missing Customer Name Should Return Bad Request
4ms
Sending A Request With An Unsupported Content Type Should Return An Unsupported Media Type Response [contentType: "text/html"]
3ms
Sending A Request With An Unsupported Content Type Should Return An Unsupported Media Type Response [contentType: "application/xml"]
3ms
Apple Cinnamon Muffins Creation Feature
/muffins - Creating apple cinnamon muffins with baking profiles and toppings
A Valid Apple Cinnamon Muffin Request Should Return A Fresh Batch Happy Path16ms🔗Steps✓GIVENA valid muffin recipe with all ingredients(4ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour steps response message status code should be OK(0ms)
✓WHENThe muffins are prepared(4ms)
✓THENThe muffin response should contain a valid batch with all ingredients(2ms)
✓Muffin steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Muffin steps response ingredients should contain 'Some_Fresh_Milk'(0ms)
✓Muffin steps response ingredients should contain 'Some_Eggs'(0ms)
✓Muffin steps response ingredients should contain 'Some_Flour'(0ms)
✓Muffin steps response ingredients should contain GrannySmithApples(0ms)
✓Muffin steps response ingredients should contain CeylonCinnamon(0ms)
✓Muffin steps response toppings should have count 1(0ms)
✓Muffin steps response baking temperature should be DefaultTemperature(0ms)
✓Muffin steps response baking duration should be DefaultDuration(0ms)
✓ANDThe cow service should have received a milk request(1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ](0ms)
Diagrams
Details:lines
Different muffin recipes should produce the expected batch 3/3 passed81ms🔗
Saving Customer Preferences Should Return The Saved Preferences Happy Path26ms🔗Steps
✓GIVENA valid customer preference request(0ms)
✓WHENThe customer preferences are saved(4ms)
✓THENThe preference response should contain the saved preferences(20ms)
✓The put response http status should be ok(0ms)
✓Put steps response message status code should be OK(0ms)
✓The put response should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The saved preferences should have the correct milk type(0ms)
✓Put steps response preferred milk type should be "Oat"(0ms)
✓The saved preferences should have the correct favourite item(0ms)
✓Put steps response favourite item should be "Blueberry Pancakes"(0ms)
Diagrams
Details:lines
Retrieving Existing Customer Preferences Should Return The Preferences 24ms🔗Steps✓GIVENCustomer preferences exist(7ms)
✓A valid customer preference request(0ms)
✓The customer preferences are saved(4ms)
✓The setup response should be ok(0ms)
✓Put steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe customer preferences are retrieved(7ms)
✓THENThe preference get response should contain the preferences(6ms)
✓The get response http status should be ok(0ms)
✓Get steps response message status code should be OK(0ms)
✓The get response should be valid json(1ms)
✓Response content is valid json should be true(0ms)
✓The retrieved preferences should match the saved preferences(1ms)
✓Get steps response customer id should be '5ca0c40ad92e401eadd730e7a964f218'(0ms)
✓Get steps response preferred milk type should be "Oat"(0ms)
✓Get steps response likes extra toppings should be true(0ms)
Diagrams
Details:lines
Retrieving Non Existent Customer Preferences Should Return Not Found 17ms🔗Steps
✓WHENNon existent customer preferences are retrieved(15ms)
✓THENThe preference get response should indicate not found(0ms)
✓Get steps response message status code should be NotFound(0ms)
Diagrams
Details:lines
Saving Customer Preferences With Missing Customer Name Should Return Bad Request 5ms🔗Steps
✓GIVENA customer preference request with missing customer name(0ms)
✓WHENThe customer preferences are saved(2ms)
✓THENThe preference response should indicate bad request(0ms)
✓Put steps response message status code should be BadRequest(0ms)
Diagrams
Details:lines
Updating Customer Preferences Should Return The Updated Preferences 41ms🔗Steps✓GIVENCustomer preferences exist(26ms)
✓A valid customer preference request(0ms)
✓The customer preferences are saved(20ms)
✓The setup response should be ok(2ms)
✓Put steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe customer preferences are updated(5ms)
✓THENThe preference update response should contain the updated values(5ms)
✓The update response http status should be ok(0ms)
✓Put steps response message status code should be OK(0ms)
✓The update response should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The updated preferences should have the new milk type(0ms)
✓Put steps response preferred milk type should be "Almond"(0ms)
✓The updated preferences should have the new favourite item(0ms)
✓Put steps response favourite item should be "Belgian Waffles"(0ms)
Diagrams
Details:lines
Daily Specials Idempotency Feature
/daily-specials/orders - Idempotent order creation using Idempotency-Key header
Submitting The Same Order With Different Idempotency Keys Should Return Different Confirmations 11ms🔗Steps
✓GIVENThe cinnamon swirl order count is reset(0ms)
✓ANDAn order request for the same special(0ms)
✓WHENThe order is submitted with two different idempotency keys(6ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓THENThe responses should have different confirmation ids(0ms)
✓First confirmation id should not be '5b95420b-670e-4937-aeee-2e54ff2bc881'(0ms)
Diagrams
Details:lines
Submitting The Same Order With The Same Idempotency Key Should Return The Same Confirmation 42ms🔗Steps
✓GIVENThe cinnamon swirl order count is reset(1ms)
✓ANDAn order request with an idempotency key(0ms)
✓WHENThe order is submitted twice with the same idempotency key(36ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓THENBoth responses should return the same confirmation id(0ms)
✓First confirmation id should be '3ceecff3-14f5-4a21-bbba-aeb71c9d7bf6'(0ms)
Diagrams
Details:lines
Daily Specials Not Found Feature
/daily-specials/orders - Ordering a non-existent daily special
Ordering A Non Existent Daily Special Should Return Not Found 7ms🔗Steps
✓GIVENA daily special order request for a non existent special(0ms)
✓WHENThe daily special order is submitted(3ms)
✓THENThe response should indicate not found(0ms)
✓Post steps response message status code should be NotFound(0ms)
Diagrams
Details:lines
Daily Specials Ordering Feature
/daily-specials - Ordering daily specials with threshold limits
A Valid Daily Special Order Should Return A Confirmation Happy Path121ms🔗Steps
✓GIVENThe cinnamon swirl order count is reset(24ms)
✓ANDA valid daily special order request for cinnamon swirl(0ms)
✓WHENThe daily special order is submitted(69ms)
✓THENThe daily special order response should contain a valid confirmation(23ms)
✓The post response http status should be created(3ms)
✓Post steps response message status code should be Created(0ms)
✓The order response should be valid json(4ms)
✓Response content is valid json should be true(0ms)
✓The order response should contain the correct special id(0ms)
✓Post steps response special id should be CinnamonSwirlId(0ms)
✓The order response should have a valid confirmation id(3ms)
✓Post steps response order confirmation id should not be empty(0ms)
Diagrams
Details:lines
Ordering A Daily Special Beyond The Threshold Should Return A Conflict Response 44ms🔗Steps
✓GIVENThe matcha waffles order count is reset(4ms)
✓ANDThe matcha waffles special has been ordered up to the configured limit(5ms)
✓Post steps response message status code should be Created(0ms)
✓WHENAnother order is placed for the matcha waffles special(4ms)
✓THENThe response should indicate the daily special is sold out(0ms)
✓Post steps response message status code should be Conflict(0ms)
Diagrams
Details:lines
Remaining Quantity Should Decrease After Each Order 21ms🔗Steps
✓GIVENThe lemon ricotta order count is reset(4ms)
✓ANDA daily special order for lemon ricotta of quantity one is placed(8ms)
✓Post steps response message status code should be Created(0ms)
✓WHENThe available daily specials are requested(0ms)
✓THENThe lemon ricotta special should have one fewer remaining(2ms)
✓Response content is valid json should be true(0ms)
✓Lemon ricotta remaining quantity should be MaxOrdersPerSpecial - 1(0ms)
Diagrams
Details:lines
The Daily Specials Endpoint Should Return All Available Specials 21ms🔗Steps
✓WHENThe available daily specials are requested(11ms)
✓THENThe daily specials response should contain all expected specials(7ms)
✓The get response http status should be ok(0ms)
✓Get steps response message status code should be OK(0ms)
✓The daily specials response should be valid json(3ms)
✓Response content is valid json should be true(0ms)
✓The daily specials list should contain all expected specials(0ms)
✓Get steps response should have count ExpectedSpecialsCount(0ms)
Diagrams
Details:lines
Daily Specials Validation Feature
/daily-specials/orders - Input validation for daily special orders
Daily special order endpoint is called with invalid fields should return a bad request response 1/1 passed10ms🔗
#
Input Parameters
Status
Duration
Inputs
Outputs
1
Field
SpecialId
Value
0
Reason
Quantity must be greater than zero
ErrorMessage
'Special Id' is required
ResponseStatus
Bad Request
Passed
10ms
Steps
✓GIVENValid daily special order requests with an invalid field InvalidFieldFromRequest { Field = SpecialId, Value = , Reason = Special ID is required }, InvalidFieldFromRequest { Field = Quantity, Value = 0, Reason = Quantity must be greater than zero }(2ms)
✓WHENThe invalid daily special order requests are submitted(3ms)
✓THENThe responses should each contain the validation error for the invalid field VerifiableErrorResult { ErrorMessage = 'Special Id' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Quantity must be greater than zero., ResponseStatus = Bad Request }(0ms)
Diagrams
Details:lines
Feedback Management Feature
/feedback - Submitting and retrieving customer feedback
Submitting Feedback Should Return The Created Feedback Happy Path19ms🔗Steps
✓GIVENA valid feedback request(0ms)
✓WHENThe feedback is submitted(6ms)
✓THENThe feedback response should contain the created feedback(11ms)
✓The post response http status should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓The post response should be valid json(3ms)
✓Response content is valid json should be true(0ms)
✓The created feedback should have the correct customer name(0ms)
✓Post steps response customer name should be 'Customer-cb201ab5049048a6b59cfdc24bb268eb'(0ms)
✓The created feedback should have the correct rating(0ms)
✓Post steps response rating should be 4(0ms)
Diagrams
Details:lines
Listing Feedback For An Order Should Return The Feedback 1.0s🔗Steps✓GIVENA feedback entry exists(780ms)
✓A valid feedback request(0ms)
✓The feedback is submitted(772ms)
✓The setup response should be created(3ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe feedback is retrieved by order id(230ms)
✓THENThe feedback list response should contain the feedback(8ms)
✓The list response http status should be ok(0ms)
✓Get steps response message status code should be OK(0ms)
✓The list response should be valid json(2ms)
✓Response content is valid json should be true(0ms)
✓The list should contain the created feedback(2ms)
✓Get steps list response should contain [ f => f.FeedbackId == 'd9c89968-89af-411f-b0d0-fb0bf62ad5db' ](0ms)
Diagrams
(Warning: 76 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Retrieving Existing Feedback By Id Should Return The Feedback 38ms🔗Steps✓GIVENA feedback entry exists(8ms)
✓A valid feedback request(0ms)
✓The feedback is submitted(3ms)
✓The setup response should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe feedback is retrieved by id(15ms)
✓THENThe feedback get response should contain the feedback(6ms)
✓The get response http status should be ok(0ms)
✓Get steps response message status code should be OK(0ms)
✓The get response should be valid json(1ms)
✓Response content is valid json should be true(0ms)
✓The retrieved feedback should match the created feedback(1ms)
✓Get steps response feedback id should be '5c4c1b4d-8a8d-40b1-8f79-394d1af66fc5'(0ms)
✓Get steps response customer name should be 'CustomerName'(0ms)
✓Get steps response rating should be 4(0ms)
Diagrams
Details:lines
Retrieving Non Existent Feedback Should Return Not Found 7ms🔗Steps
✓WHENA non existent feedback is retrieved(5ms)
✓THENThe feedback get response should indicate not found(0ms)
✓Get steps response message status code should be NotFound(0ms)
Diagrams
Details:lines
Submitting Feedback With Invalid Rating Should Return Bad Request 6ms🔗Steps
✓GIVENA feedback request with an invalid rating(0ms)
✓WHENThe feedback is submitted(3ms)
✓THENThe feedback response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
Details:lines
Submitting Feedback With Missing Customer Name Should Return Bad Request 4ms🔗Steps
✓GIVENA feedback request with missing customer name(0ms)
✓WHENThe feedback is submitted(1ms)
✓THENThe feedback response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
Details:lines
Grpc Order Status Feature
/grpc - Retrieving order status via gRPC
Order Status Via Grpc Should Return Order Details Happy Path66ms🔗Steps✓GIVENA pancake batch has been created(34ms)
✓A pancake request is submitted with ingredients(31ms)
✓The pancake batch response should be successful(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓ANDAn order has been created for the batch(16ms)
✓An order request is submitted(13ms)
✓The order creation response should be successful(0ms)
✓Order steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe order status is requested via grpc(7ms)
✓THENThe grpc response should contain the order details(5ms)
✓The grpc order id should match(0ms)
✓Grpc steps order status reply order id should be _createdOrderId.ToString()(0ms)
✓The grpc customer name should match(0ms)
✓Grpc steps order status reply customer name should be 'TestCustomer_4055548983369331056'(0ms)
✓The grpc status should be created(0ms)
✓Grpc steps order status reply status should be Created(0ms)
Diagrams
Details:lines
Order Status For Non Existent Order Should Return Not Found 29ms🔗Steps
✓WHENThe order status for a non existent order is requested via grpc(26ms)
✓THENThe grpc response should be a not found error(1ms)
✓Grpc steps rpc exception should not be null(0ms)
✓Grpc steps rpc exception status code should be NotFound(0ms)
Diagrams
Details:lines
Grpc Recipe Summary Feature
/grpc - Retrieving recipe summaries via gRPC
Pancake Recipe Summary Should Return Correct Data Happy Path10ms🔗Steps
✓WHENA recipe summary is requested for pancakes via grpc(1ms)
✓THENThe recipe summary should contain pancake data(6ms)
✓The recipe type should be Pancakes(0ms)
✓Grpc steps recipe summary reply recipe type should be 'Pancakes'(0ms)
✓The total batches should be 42(0ms)
✓Grpc steps recipe summary reply total batches should be '42'(0ms)
✓The common ingredients should contain Milk, Flour, Eggs(1ms)
✓Grpc steps recipe summary reply common ingredients should be equivalent to '[ "Milk", "Flour", "Eggs" ]'(0ms)
Diagrams
Details:lines
Waffle Recipe Summary Should Return Correct Data Happy Path118ms🔗Steps
✓WHENA recipe summary is requested for waffles via grpc(25ms)
✓THENThe recipe summary should contain waffle data(81ms)
✓The recipe type should be Waffles(0ms)
✓Grpc steps recipe summary reply recipe type should be 'Waffles'(0ms)
✓The total batches should be 28(0ms)
✓Grpc steps recipe summary reply total batches should be '28'(0ms)
✓The common ingredients should contain Milk, Flour, Eggs, Butter(72ms)
✓Grpc steps recipe summary reply common ingredients should be equivalent to '[ "Milk", "Flour", "Eggs", "Butter" ]'(0ms)
Diagrams
Details:lines
Unknown Recipe Type Should Return Zero Batches 11ms🔗Steps
✓WHENA recipe summary is requested for an unknown type via grpc(2ms)
✓THENThe recipe summary should contain zero batches and no ingredients(6ms)
✓The recipe type should be Unknown(0ms)
✓Grpc steps recipe summary reply recipe type should be 'Unknown'(0ms)
✓The total batches should be 0(0ms)
✓Grpc steps recipe summary reply total batches should be '0'(0ms)
✓The common ingredients should be empty(1ms)
✓Grpc steps recipe summary reply common ingredients should be empty(0ms)
Diagrams
Details:lines
Grpc Stream Order Updates Feature
/grpc - Streaming order updates via gRPC server streaming
Streaming Order Updates Should Return The Current Status Happy Path61ms🔗Steps✓GIVENA pancake batch has been created(13ms)
✓A pancake request is submitted with ingredients(10ms)
✓The pancake batch response should be successful(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓ANDAn order has been created for the batch(14ms)
✓An order request is submitted(10ms)
✓The order creation response should be successful(1ms)
✓Order steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENOrder updates are streamed via grpc(9ms)
✓THENThe streamed response should contain the order status(21ms)
✓The stream should contain one reply(0ms)
✓Grpc steps streamed replies should have count 1(0ms)
✓The streamed order id should match(15ms)
✓Grpc steps streamed replies[0] order id should be _createdOrderId.ToString()(0ms)
✓The streamed customer name should match(0ms)
✓Grpc steps streamed replies[0] customer name should be 'TestCustomer_1550714023175857438'(0ms)
✓The streamed status should be created(0ms)
✓Grpc steps streamed replies[0] status should be Created(0ms)
Diagrams
Details:lines
Streaming Updates For Non Existent Order Should Return Not Found 6ms🔗Steps
✓WHENOrder updates for a non existent order are streamed via grpc(4ms)
✓THENThe grpc stream should return a not found error(0ms)
✓Grpc steps rpc exception should not be null(0ms)
✓Grpc steps rpc exception status code should be NotFound(0ms)
Diagrams
Details:lines
Infrastructure Correlation Id Feature
Cross-cutting - X-Correlation-Id header propagation across API responses
A Request With A Correlation Id Should Return The Same Id In The Response Happy Path7ms🔗Steps
✓GIVENA request with a known correlation id(0ms)
✓WHENThe request is sent to the menu endpoint(1ms)
✓THENThe response should contain the same correlation id(0ms)
✓Response contains correlation id header should be true(0ms)
✓First correlation id header value should be 'b74129fa-b662-4543-8c13-a3a9ecadc03d'(0ms)
Diagrams
Details:lines
A Request Without A Correlation Id Should Have One Generated In The Response 11ms🔗Steps
✓WHENA request without a correlation id is sent to the menu endpoint(9ms)
✓THENThe response should contain a generated correlation id(0ms)
✓Response contains correlation id header should be true(0ms)
✓First correlation id header value should not be null or empty(0ms)
Diagrams
Details:lines
Infrastructure Degraded Health Check Feature
/health - Health check endpoint reporting degraded status when downstream services are unavailable
Health Check Should Report Degraded When Multiple Downstream Services Are Unavailable 237ms🔗Steps
✓GIVENThe cow service is configured to be unreachable(0ms)
✓ANDThe supplier service is configured to be unreachable(0ms)
✓WHENThe health check endpoint is called(223ms)
✓THENThe health check response should indicate a degraded status(5ms)
✓The health check response status should be ok(0ms)
✓Health response status code should be OK(0ms)
✓The health check response should be valid json(0ms)
✓Health check result should not be null(0ms)
✓The overall status should be degraded(0ms)
✓Health check result status should be Degraded(0ms)
✓ANDThe cow service dependency should report degraded(0ms)
✓Health check result results should contain key CowService(0ms)
✓Health check result results[ health check names cow service] status should be Degraded(0ms)
✓ANDThe supplier service dependency should report degraded(0ms)
✓Health check result results should contain key SupplierService(0ms)
✓Health check result results[ health check names supplier service] status should be Degraded(0ms)
Diagrams
Details:lines
Health Check Should Report Degraded When The Cow Service Is Unavailable 125ms🔗Steps
✓GIVENThe cow service is configured to be unreachable(0ms)
✓WHENThe health check endpoint is called(118ms)
✓THENThe health check response should indicate a degraded status(3ms)
✓The health check response status should be ok(0ms)
✓Health response status code should be OK(0ms)
✓The health check response should be valid json(0ms)
✓Health check result should not be null(0ms)
✓The overall status should be degraded(0ms)
✓Health check result status should be Degraded(0ms)
✓ANDThe cow service dependency should report degraded(0ms)
✓Health check result results should contain key CowService(0ms)
✓Health check result results[ health check names cow service] status should be Degraded(0ms)
Diagrams
Details:lines
Infrastructure Downstream Error Health Check Feature
/health - Health check reports degraded when a downstream service returns a non-success HTTP status
Health Check Should Report Degraded When A Downstream Service Returns A Non Success Status 145ms🔗Steps
✓GIVENThe kitchen service health check is configured to use a failing endpoint(0ms)
✓WHENThe health check endpoint is called(134ms)
✓THENThe health check response should indicate a degraded status(6ms)
✓The health check response status should be ok(0ms)
✓Health response status code should be OK(0ms)
✓The health check response should be valid json(0ms)
✓Health check result should not be null(0ms)
✓The overall status should be degraded(0ms)
✓Health check result status should be Degraded(0ms)
✓ANDThe kitchen service dependency should report degraded with a status code description(1ms)
✓Health check result results should contain key KitchenService(0ms)
✓Kitchen service health status should be Degraded(0ms)
✓Kitchen service health description should contain "503"(0ms)
Diagrams
Details:lines
Infrastructure Header Propagation Feature
/milk; /menu - X-Correlation-Id header propagation to downstream services
A Request With A Correlation Id Should Forward It To The Cow Service Happy Path43ms🔗Steps
✓GIVENA request with a known correlation id(0ms)
✓WHENMilk is requested from the milk endpoint(34ms)
✓THENThe cow service should have received the correlation id(4ms)
✓Requests should not be empty(0ms)
✓Request headers should contain key CorrelationId(0ms)
✓Request headers[ custom headers correlation id] should be '5292e68f-326a-4808-8892-70c87b8c3a8d'(0ms)
Diagrams
Details:lines
A Request With A Correlation Id Should Forward It To The Supplier Service 30ms🔗Steps
✓GIVENA request with a known correlation id(0ms)
✓ANDThe menu cache is cleared(12ms)
✓WHENThe menu is requested(13ms)
✓THENThe supplier service should have received the correlation id(0ms)
✓Requests should not be empty(0ms)
✓Request headers should contain key CorrelationId(0ms)
✓Request headers[ custom headers correlation id] should be '374a3dda-3469-42d3-a9cd-37c82faa2b5a'(0ms)
Diagrams
Details:lines
Infrastructure Health Check Detail Feature
/health - Health check response includes detailed entry descriptions and data
The Health Check Response Should Include Description And Data For Each Entry 15ms🔗Steps
✓WHENThe health check endpoint is called(6ms)
✓THENThe health check response should contain detailed entries(8ms)
✓The health check response status should be ok(0ms)
✓Health response status code should be OK(0ms)
✓The health check response should be valid json(0ms)
✓Health check result should not be null(0ms)
✓Each entry should have a status(0ms)
✓Health check entry status should not be null or empty $"health check entry '{entry.Key}' should have a status"(0ms)
✓Health check entry status should not be null or empty $"health check entry '{entry.Key}' should have a status"(0ms)
✓Health check entry status should not be null or empty $"health check entry '{entry.Key}' should have a status"(0ms)
✓Health check entry status should not be null or empty $"health check entry '{entry.Key}' should have a status"(0ms)
✓Health check entry status should not be null or empty $"health check entry '{entry.Key}' should have a status"(0ms)
✓Health check entry status should not be null or empty $"health check entry '{entry.Key}' should have a status"(0ms)
✓Health check entry status should not be null or empty $"health check entry '{entry.Key}' should have a status"(0ms)
✓Health check entry status should not be null or empty $"health check entry '{entry.Key}' should have a status"(0ms)
✓Health check entry status should not be null or empty $"health check entry '{entry.Key}' should have a status"(0ms)
✓Health check entry status should not be null or empty $"health check entry '{entry.Key}' should have a status"(0ms)
✓Each downstream entry should have a description(0ms)
✓Health check result results should contain key 'CowService'(0ms)
✓Health check description should not be null or empty $"health check entry '{checkName}' should have a description"(0ms)
✓Health check result results should contain key 'GoatService'(0ms)
✓Health check description should not be null or empty $"health check entry '{checkName}' should have a description"(0ms)
✓Health check result results should contain key 'SupplierService'(0ms)
✓Health check description should not be null or empty $"health check entry '{checkName}' should have a description"(0ms)
✓Health check result results should contain key 'KitchenService'(0ms)
✓Health check description should not be null or empty $"health check entry '{checkName}' should have a description"(0ms)
✓Each entry should have a data object(0ms)
✓Health check entry data should not be null $"health check entry '{entry.Key}' should have a data object"(0ms)
✓Health check entry data should not be null $"health check entry '{entry.Key}' should have a data object"(0ms)
✓Health check entry data should not be null $"health check entry '{entry.Key}' should have a data object"(0ms)
✓Health check entry data should not be null $"health check entry '{entry.Key}' should have a data object"(0ms)
✓Health check entry data should not be null $"health check entry '{entry.Key}' should have a data object"(0ms)
✓Health check entry data should not be null $"health check entry '{entry.Key}' should have a data object"(0ms)
✓Health check entry data should not be null $"health check entry '{entry.Key}' should have a data object"(0ms)
✓Health check entry data should not be null $"health check entry '{entry.Key}' should have a data object"(0ms)
✓Health check entry data should not be null $"health check entry '{entry.Key}' should have a data object"(0ms)
✓Health check entry data should not be null $"health check entry '{entry.Key}' should have a data object"(0ms)
Diagrams
Details:lines
Infrastructure Health Check Feature
/health - Health check endpoint with dependency status for monitoring
The Health Check Endpoint Should Return A Healthy Status With Dependency Details Happy Path57ms🔗Steps
✓WHENThe health check endpoint is called(31ms)
✓THENThe health check response should indicate healthy with all dependencies(23ms)
✓The health check response status should be ok(0ms)
✓Health response status code should be OK(0ms)
✓The health check response should be valid json(4ms)
✓Health check result should not be null(0ms)
✓The overall status should be healthy(0ms)
✓Health check result status should be Healthy(0ms)
✓The response should include cow service check(5ms)
✓Health check result results should contain key CowService(0ms)
✓The response should include goat service check(0ms)
✓Health check result results should contain key GoatService(0ms)
✓The response should include supplier service check(0ms)
✓Health check result results should contain key SupplierService(0ms)
✓The response should include kitchen service check(0ms)
✓Health check result results should contain key KitchenService(0ms)
✓The response should include cosmos db check(0ms)
✓Health check result results should contain key CosmosDb(0ms)
✓The response should include kafka check(0ms)
✓Health check result results should contain key Kafka(0ms)
Diagrams
Details:lines
Infrastructure Heartbeat Feature
/ - Heartbeat endpoint confirming the service is running
The Heartbeat Endpoint Should Return A Running Message Happy Path13ms🔗Steps
✓WHENThe heartbeat endpoint is called(4ms)
✓THENThe heartbeat response should indicate the service is running(7ms)
✓The heartbeat response status should be ok(0ms)
✓Heartbeat response status code should be OK(0ms)
✓The heartbeat response should be valid json(2ms)
✓Heartbeat result should not be null(0ms)
✓The heartbeat status should be ok(0ms)
✓Heartbeat result status should be HeartbeatStatus(0ms)
Diagrams
Details:lines
Infrastructure Telemetry Feature
/orders - Structured logging and telemetry verification
Creating An Order Should Emit A Structured Log Entry Happy Path2.1s🔗Steps
✓GIVENThe application is configured with an in memory log capture(460ms)
✓ANDA pancake batch has been created(478ms)
✓A pancake request is submitted with ingredients(458ms)
✓The pancake batch should be successful(4ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓ANDA valid order request(0ms)
✓WHENThe order is submitted(1.1s)
✓Order steps response message status code should be Created(0ms)
✓THENA structured log entry should have been captured for order creation(11ms)
✓The log should contain an order created message(4ms)
✓Log provider entries should contain [ e => e.Message.Contains("created for customer") ](0ms)
✓The log message should include the customer name(1ms)
✓=> _log provider entries should contain [ e => e.Message.Contains('TelemetryTest_8495375396784096238') ](0ms)
✓The log message should include the item count(2ms)
✓=> _log provider entries should contain [ e => e.Message.Contains("1 items") ](0ms)
Diagrams
Details:lines
Ingredient Usage Analytics Feature
/ingredient-usage - Recording and summarising ingredient usage (BigQuery)
Recording Ingredient Usage Should Return The Created Record Happy Path12ms🔗Steps
✓GIVENA valid ingredient usage request(0ms)
✓WHENThe usage is recorded(6ms)
✓THENThe response should contain the created record(3ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Post steps response ingredient name should be 'Flour-cd40213832fc4a3f88c830aa7102d703'(0ms)
✓Post steps response quantity used should be '5m'(0ms)
✓Post steps response usage id should not be null or empty(0ms)
Diagrams
Details:lines
Getting Usage Summary Should Return Aggregated Data 68ms🔗Steps✓GIVENAn ingredient usage record exists(7ms)
✓A valid ingredient usage request(0ms)
✓The usage is recorded(3ms)
✓The setup response should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe summary is requested(50ms)
✓THENThe summary should contain aggregated data(6ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps summary response should contain [ s => s.IngredientName == 'Flour-beb4f439e09b40ff945ad761e85e731f' ](0ms)
Diagrams
Details:lines
Listing Usage By Ingredient Should Return Matching Records 646ms🔗Steps✓GIVENAn ingredient usage record exists(152ms)
✓A valid ingredient usage request(0ms)
✓The usage is recorded(144ms)
✓The setup response should be created(4ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe usage is listed by ingredient(466ms)
✓THENThe list response should contain the record(24ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps list response should contain [ u => u.IngredientName == 'Flour-eaede595d7cc48b19a89696a50675a95' ](0ms)
Diagrams
Details:lines
Recording Usage With Missing Ingredient Name Should Return Bad Request 5ms🔗Steps
✓GIVENA usage request with missing ingredient name(0ms)
✓WHENThe usage is recorded(1ms)
✓THENThe usage response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
Details:lines
Recording Usage With Zero Quantity Should Return Bad Request 30ms🔗Steps
✓GIVENA usage request with zero quantity(3ms)
✓WHENThe usage is recorded(20ms)
✓THENThe usage response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
Details:lines
Ingredients Goat Milk Downstream Failure Feature
/goat-milk - Handling downstream Goat Service failures
Requesting Goat Milk When The Goat Service Is Unavailable Should Return A Bad Gateway Response 21ms🔗Steps
✓GIVENThe goat service will return service unavailable(0ms)
✓WHENGoat milk is requested(15ms)
✓THENThe goat milk response should indicate a bad gateway(3ms)
✓The goat milk response http status should be bad gateway(0ms)
✓Goat milk steps response message status code should be BadGateway(0ms)
✓The goat milk error should indicate goat service unavailable(0ms)
✓Goat milk error response body should contain GoatServiceUnavailableTitle(0ms)
Diagrams
Details:lines
Requesting Goat Milk When The Goat Service Returns An Invalid Response Should Return A Bad Gateway Response 8ms🔗Steps
✓GIVENThe goat service will return an invalid response(0ms)
✓WHENGoat milk is requested(3ms)
✓THENThe goat milk response should indicate a bad gateway(2ms)
✓The goat milk response http status should be bad gateway(0ms)
✓Goat milk steps response message status code should be BadGateway(0ms)
✓The goat milk error should indicate goat service unavailable(0ms)
✓Goat milk error response body should contain GoatServiceUnavailableTitle(0ms)
Diagrams
Details:lines
Ingredients Goat Milk Feature Flag Feature
/goat-milk - Goat milk availability controlled by feature flag
Goat Milk Endpoint Should Return Fresh Goat Milk When Feature Is Enabled 151ms🔗Steps
✓GIVENThe goat milk feature flag is enabled(126ms)
✓WHENGoat milk is requested(17ms)
✓THENThe goat milk response should contain fresh goat milk(3ms)
✓The goat milk response http status should be ok(0ms)
✓Goat milk steps response message status code should be OK(0ms)
✓The goat milk should be fresh(0ms)
✓Goat milk steps goat milk response goat milk should be FreshGoatMilk(0ms)
Diagrams
Details:lines
Goat Milk Endpoint Should Return Not Found When Feature Is Disabled 131ms🔗Steps
✓GIVENThe goat milk feature flag is disabled(110ms)
✓WHENGoat milk is requested(14ms)
✓THENThe goat milk response should indicate feature disabled(3ms)
✓The goat milk response http status should be not found(0ms)
✓Goat milk steps response message status code should be NotFound(0ms)
✓The goat milk error should indicate feature disabled(0ms)
✓Goat milk feature disabled response body should contain FeatureDisabled(0ms)
Diagrams
Details:lines
Ingredients Goat Milk Sourcing Feature
/goat-milk - Sourcing goat milk from the Goat Service
The Goat Milk Endpoint Should Return Fresh Goat Milk From The Goat Service Happy Path29ms🔗Steps
✓WHENGoat milk is requested(8ms)
✓THENThe goat milk response should contain fresh goat milk(5ms)
✓The goat milk response http status should be ok(0ms)
✓Goat milk steps response message status code should be OK(0ms)
✓The goat milk response should be valid json(0ms)
✓Goat milk steps goat milk response should not be null(0ms)
✓The goat milk should be fresh(0ms)
✓Goat milk steps goat milk response goat milk should be FreshGoatMilk(0ms)
✓ANDThe goat service should have received a goat milk request(1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/goat-milk" && r.Method == HttpMethod.Get ](0ms)
Diagrams
Details:lines
Ingredients Milk Downstream Failure Feature
/milk - Handling downstream Cow Service failures
Requesting Milk When The Cow Service Is Unavailable Should Return A Bad Gateway Response 11ms🔗Steps
✓GIVENThe cow service will return service unavailable(0ms)
✓WHENMilk is requested(2ms)
✓THENThe milk response should indicate a bad gateway(1ms)
✓The milk response http status should be bad gateway(0ms)
✓Milk steps response message status code should be BadGateway(0ms)
✓The milk error should indicate cow service unavailable(0ms)
✓Milk error response body should contain CowServiceUnavailableTitle(0ms)
Diagrams
Details:lines
Requesting Milk When The Cow Service Returns An Invalid Response Should Return A Bad Gateway Response 9ms🔗Steps
✓GIVENThe cow service will return an invalid response(0ms)
✓WHENMilk is requested(4ms)
✓THENThe milk response should indicate a bad gateway(1ms)
✓The milk response http status should be bad gateway(0ms)
✓Milk steps response message status code should be BadGateway(0ms)
✓The milk error should indicate cow service unavailable(0ms)
✓Milk error response body should contain CowServiceUnavailableTitle(0ms)
Diagrams
Details:lines
Requesting Milk When The Cow Service Times Out Should Return A Bad Gateway Response 18ms🔗Steps
✓GIVENThe cow service will return a timeout(0ms)
✓WHENMilk is requested(11ms)
✓THENThe milk response should indicate a bad gateway(4ms)
✓The milk response http status should be bad gateway(0ms)
✓Milk steps response message status code should be BadGateway(0ms)
✓The milk error should indicate cow service unavailable(0ms)
✓Milk error response body should contain CowServiceUnavailableTitle(0ms)
Diagrams
Details:lines
Inventory Management Feature
/inventory - Managing ingredient inventory with full CRUD operations
Adding A New Inventory Item Should Return The Created Item Happy Path12ms🔗Steps
✓GIVENA valid inventory item request(0ms)
✓WHENThe inventory item is submitted(2ms)
✓THENThe inventory response should contain the created item(6ms)
✓The post response http status should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓The post response should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The created item should have the correct name(0ms)
✓Post steps response name should be 'Flour-003d7ad75da24059ba05e06c10013886'(0ms)
✓The created item should have the correct category(0ms)
✓Post steps response category should be "Dry Goods"(0ms)
Diagrams
Details:lines
Deleting An Inventory Item Should Return No Content 44ms🔗Steps✓GIVENAn inventory item exists(5ms)
✓A valid inventory item request(0ms)
✓The inventory item is submitted(3ms)
✓The setup response should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe inventory item is deleted(35ms)
✓THENThe inventory delete response should indicate no content(0ms)
✓Delete steps response message status code should be NoContent(0ms)
Diagrams
Details:lines
Listing All Inventory Items Should Return All Items 34ms🔗Steps✓GIVENAn inventory item exists(5ms)
✓A valid inventory item request(0ms)
✓The inventory item is submitted(3ms)
✓The setup response should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENAll inventory items are requested(18ms)
✓THENThe inventory list response should contain the item(7ms)
✓The list response http status should be ok(0ms)
✓Get steps response message status code should be OK(0ms)
✓The list response should be valid json(2ms)
✓Response content is valid json should be true(0ms)
✓The list should contain the created item(1ms)
✓Get steps list response should contain [ i => i.Id == '4' ](0ms)
Diagrams
Details:lines
Retrieving A Non Existent Inventory Item Should Return Not Found 5ms🔗Steps
✓WHENA non existent inventory item is retrieved(3ms)
✓THENThe inventory get response should indicate not found(0ms)
✓Get steps response message status code should be NotFound(0ms)
Diagrams
Details:lines
Retrieving An Existing Inventory Item Should Return The Item 91ms🔗Steps✓GIVENAn inventory item exists(62ms)
✓A valid inventory item request(0ms)
✓The inventory item is submitted(55ms)
✓The setup response should be created(4ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe inventory item is retrieved by id(21ms)
✓THENThe inventory get response should contain the item(6ms)
✓The get response http status should be ok(0ms)
✓Get steps response message status code should be OK(0ms)
✓The get response should be valid json(1ms)
✓Response content is valid json should be true(0ms)
✓The retrieved item should match the created item(0ms)
✓Get steps response id should be '1'(0ms)
✓Get steps response name should be 'Name'(0ms)
Diagrams
Details:lines
Updating An Inventory Item Should Return The Updated Item 31ms🔗Steps✓GIVENAn inventory item exists(5ms)
✓A valid inventory item request(0ms)
✓The inventory item is submitted(3ms)
✓The setup response should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe inventory item is updated(17ms)
✓THENThe inventory update response should contain the updated values(6ms)
✓The put response http status should be ok(0ms)
✓Put steps response message status code should be OK(0ms)
✓The put response should be valid json(1ms)
✓Response content is valid json should be true(0ms)
✓The updated item should have the new category(0ms)
✓Put steps response category should be "Updated Category"(0ms)
Diagrams
Details:lines
Menu Availability Feature
/menu - Retrieving the breakfast menu with ingredient availability
The Menu Endpoint Should Return All Menu Items With Availability Happy Path100ms🔗Steps
✓WHENThe menu is requested(61ms)
✓THENThe menu response should contain all menu items(13ms)
✓The menu response http status should be ok(0ms)
✓Menu steps response message status code should be OK(0ms)
✓The menu list should be valid json(3ms)
✓Response content is valid json should be true(0ms)
✓The menu should contain classic pancakes(2ms)
✓Menu steps response should contain [ m => m.Name == MenuDefaults.ClassicPancakes ](0ms)
✓The menu should contain belgian waffles(1ms)
✓Menu steps response should contain [ m => m.Name == MenuDefaults.BelgianWaffles ](0ms)
✓The menu should contain goat milk pancakes(1ms)
✓Menu steps response should contain [ m => m.Name == MenuDefaults.GoatMilkPancakes ](0ms)
✓ANDThe menu items should be in alphabetical order(10ms)
✓Response content is valid json should be true(0ms)
✓Menu steps response should be in ascending order [ m => m.Name ](0ms)
✓ANDThe supplier service should have received an availability request(7ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath.Contains("/availability") && r.Method == HttpMethod.Get ](0ms)
Diagrams
Details:lines
Menu Caching Feature
/menu - Menu response caching behaviour
The Menu Should Return Cached Results On Subsequent Requests 63ms🔗Steps✓GIVENThe menu has been requested and cached(48ms)
✓The menu cache is cleared(12ms)
✓The first menu request is sent(31ms)
✓The first menu response should be successful(0ms)
✓Menu steps response message status code should be OK(0ms)
✓ANDThe supplier service is then made unavailable(0ms)
✓WHENThe menu is requested again(5ms)
✓THENThe menu response should still return available items(5ms)
✓The cached menu response http status should be ok(0ms)
✓Second menu steps response message status code should be OK(0ms)
✓The cached menu list should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The cached menu should contain available items(0ms)
✓Second menu steps response should contain [ m => m.IsAvailable ](0ms)
Diagrams
Details:lines
Menu Downstream Failure Feature
/menu - Handling downstream Supplier Service failures
Requesting The Menu When The Supplier Service Is Unavailable Should Mark Items As Unavailable 51ms🔗Steps
✓GIVENThe supplier service will return service unavailable(13ms)
✓WHENThe menu is requested(30ms)
✓THENThe menu response should mark all items as unavailable(5ms)
✓The menu response http status should be ok(0ms)
✓Menu steps response message status code should be OK(0ms)
✓The menu list should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓All menu items should be marked as unavailable(1ms)
✓Menu steps response should only contain [ m => m.IsAvailable == false ](0ms)
Diagrams
Details:lines
Orders Breakfast Order Feature
/orders - Creating and managing breakfast orders with event publishing
A Valid Order Should Be Created And An Event Published Happy Path1.0s🔗Steps✓GIVENA pancake batch has been created(31ms)
✓Milk is retrieved from the milk endpoint(3ms)
✓The milk response should be successful(0ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs are retrieved from the eggs endpoint(6ms)
✓The eggs response should be successful(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour is retrieved from the flour endpoint(6ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓A pancake request is submitted with all ingredients(7ms)
✓The pancake batch response should be successful(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓The batch id is captured from the pancakes response(0ms)
✓ANDA valid order request for the created batch(0ms)
✓WHENThe breakfast order is placed(33ms)
✓THENThe order response should contain a complete order(3ms)
✓The order response http status should be created(0ms)
✓Order steps response message status code should be Created(0ms)
✓The order response should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The order should contain the customer name(0ms)
✓Order steps response customer name should be 'TestCustomer_968754332007347441'(0ms)
✓The order should contain the ordered items(0ms)
✓Order steps response items should have count 1(0ms)
✓ANDAn order created event should have been published(925ms)
✓ANDThe kitchen service should have received a preparation request(1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ](0ms)
Diagrams
Details:lines
Creating An Order Should Produce An Audit Log Entry And Events 1.0s🔗Steps✓GIVENA pancake batch has been created(90ms)
✓Milk is retrieved from the milk endpoint(20ms)
✓The milk response should be successful(0ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs are retrieved from the eggs endpoint(1ms)
✓The eggs response should be successful(1ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour is retrieved from the flour endpoint(14ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓A pancake request is submitted with all ingredients(38ms)
✓The pancake batch response should be successful(3ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓The batch id is captured from the pancakes response(0ms)
✓ANDA valid order request for the created batch(0ms)
✓WHENThe breakfast order is placed(9ms)
✓THENThe order response should contain a complete order(9ms)
✓The order response http status should be created(0ms)
✓Order steps response message status code should be Created(0ms)
✓The order response should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The order should contain the customer name(0ms)
✓Order steps response customer name should be 'TestCustomer_255089917011361961'(0ms)
✓The order should contain the ordered items(1ms)
✓Order steps response items should have count 1(0ms)
✓ANDAn order created event should have been published(906ms)
✓ANDA recipe log should have been published to kafka(22ms)
Diagrams
Details:lines
Creating An Order Should Write An Outbox Message That Gets Processed 166ms🔗Steps✓GIVENA pancake batch has been created(50ms)
✓Milk is retrieved from the milk endpoint(8ms)
✓The milk response should be successful(0ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs are retrieved from the eggs endpoint(2ms)
✓The eggs response should be successful(2ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour is retrieved from the flour endpoint(0ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓A pancake request is submitted with all ingredients(13ms)
✓The pancake batch response should be successful(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓The batch id is captured from the pancakes response(0ms)
✓ANDA valid order request for the created batch(0ms)
✓WHENThe breakfast order is placed(31ms)
✓THENThe order response should contain a complete order(6ms)
✓The order response http status should be created(0ms)
✓Order steps response message status code should be Created(0ms)
✓The order response should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The order should contain the customer name(0ms)
✓Order steps response customer name should be 'TestCustomer_6211119482584192132'(0ms)
✓The order should contain the ordered items(0ms)
✓Order steps response items should have count 1(0ms)
✓ANDAn outbox message should have been written for the order created event(58ms)
✓Outbox messages should contain [ m => m.EventType == 'OrderCreatedEvent', $"an outbox message should exist for event type '{eventType}'" ](0ms)
✓ANDThe outbox message should have been processed(11ms)
Diagrams
Details:lines
Orders Complete Lifecycle Feature
/orders - Complete order lifecycle from creation through to completion
An Order Should Progress Through All Status Transitions To Completion Happy Path143ms🔗Steps✓GIVENA pancake batch has been created(24ms)
✓Milk is retrieved from the milk endpoint(3ms)
✓The milk response should be successful(0ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs are retrieved from the eggs endpoint(1ms)
✓The eggs response should be successful(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour is retrieved from the flour endpoint(1ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓A pancake request is submitted with all ingredients(7ms)
✓The pancake batch response should be successful(1ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓ANDA breakfast order has been placed for the batch(17ms)
✓An order request is submitted for the pancake batch(12ms)
✓The order creation response should be successful(1ms)
✓Order steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Order steps response should not be null(0ms)
✓The order id is captured from the order response(0ms)
✓Order id should not be empty(0ms)
✓WHENThe order is progressed through the complete lifecycle(44ms)
✓The order status is updated to preparing(20ms)
✓The preparing transition should succeed(1ms)
✓Patch steps response message status code should be OK(0ms)
✓The order status is updated to ready(7ms)
✓The ready transition should succeed(0ms)
✓Patch steps response message status code should be OK(0ms)
✓The order status is updated to completed(7ms)
✓The completed transition should succeed(0ms)
✓Patch steps response message status code should be OK(0ms)
✓THENThe completed order should be retrievable with all details(18ms)
✓The order is retrieved by id(3ms)
✓The retrieval response should be ok(0ms)
✓Retrieval steps response message status code should be OK(0ms)
✓The retrieved order should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The retrieved order status should be completed(0ms)
✓Retrieval steps response status should be Completed(0ms)
✓The retrieved customer name should match(0ms)
✓Retrieval steps response customer name should be 'LifecycleTestCustomer_4025282154167691853'(0ms)
✓The retrieved items should match(0ms)
✓Retrieval steps response items should have count 1(0ms)
✓The retrieved table number should match(1ms)
✓Retrieval steps response table number should be 4(0ms)
✓ANDThe order timestamps should be recent(2ms)
✓Retrieval steps response created at should be close to DateTime.UtcNow, TimeSpan.FromMinutes(2)(0ms)
✓ANDThe order id should be a valid guid format(1ms)
✓Retrieval steps response order id to string() should match regex @"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"(0ms)
✓ANDAn audit log entry should exist for the order(25ms)
✓Audit logs are retrieved for the order(20ms)
✓Audit log response status code should be OK(0ms)
✓The audit logs should contain the order creation entry(2ms)
✓Audit logs should contain [ l => l.EntityId == '1f7fb5dc-eb54-4ed0-9277-dfc03bb433f1' && l.Action == AuditLogDefaults.CreatedAction ](0ms)
✓ANDThe cow service should have received a milk request(1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ](0ms)
✓ANDThe kitchen service should have received a preparation request(1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ](0ms)
Diagrams
Details:lines
Orders Cross Field Validation Feature
/orders - Cross-field validation with configurable item limits
An Order At The Maximum Items Per Order Should Be Accepted 174ms🔗Steps
✓GIVENThe maximum items per order is configured to two(103ms)
✓ANDA pancake batch has been created(43ms)
✓A pancake request is submitted with ingredients(40ms)
✓The pancake batch should be successful(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓ANDAn order request with two items(0ms)
✓WHENThe order is submitted(21ms)
✓THENThe response should indicate success(0ms)
✓Order steps response message status code should be Created(0ms)
Diagrams
Details:lines
An Order Exceeding The Maximum Items Per Order Should Be Rejected 186ms🔗Steps
✓GIVENThe maximum items per order is configured to two(101ms)
✓ANDA pancake batch has been created(62ms)
✓A pancake request is submitted with ingredients(60ms)
✓The pancake batch should be successful(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓ANDAn order request with three items(0ms)
✓WHENThe order is submitted(11ms)
✓THENThe response should indicate a validation error(2ms)
✓The order response status should be bad request(0ms)
✓Order steps response message status code should be BadRequest(0ms)
✓ANDThe error message should reference the item limit(2ms)
✓Order validation errors should contain [ e => e.Contains("cannot contain more than 2 items") ](0ms)
Diagrams
Details:lines
Orders Kitchen Service Failure Feature
/orders - Creating orders when the Kitchen Service returns an error
Creating An Order When The Kitchen Service Returns An Error Should Still Create The Order 208ms🔗Steps✓GIVENA pancake batch has been created(24ms)
✓Milk is retrieved(3ms)
✓The milk response should be successful(1ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs are retrieved(1ms)
✓The eggs response should be successful(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour is retrieved(1ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓A pancake request is submitted(6ms)
✓The pancake response should be successful(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓ANDA valid order request for the created batch(1ms)
✓ANDThe kitchen service will return an error(0ms)
✓WHENThe breakfast order is placed(167ms)
✓THENThe order should still be created successfully(5ms)
✓The order response http status should be created(0ms)
✓Order steps response message status code should be Created(0ms)
✓The order response should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The order should contain the customer name(0ms)
✓Order steps response customer name should be 'TestCustomer_936872621067903209'(0ms)
✓ANDThe order should be retrievable by its id(2ms)
✓Get order steps response message status code should be OK(0ms)
Diagrams
Details:lines
Orders Order Retrieval Feature
/orders - Retrieving breakfast orders by ID
A Previously Created Order Should Be Retrievable By Id Happy Path69ms🔗Steps✓GIVENA pancake batch has been created(17ms)
✓A pancake request is submitted with ingredients(14ms)
✓The pancake batch response should be successful(1ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓ANDAn order has been created for the batch(32ms)
✓An order request is submitted(26ms)
✓The order creation response should be successful(1ms)
✓Order steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Order steps response should not be null(0ms)
✓Order steps response order id should not be empty(0ms)
✓WHENThe order is retrieved by id(3ms)
✓THENThe retrieved order should match the created order(9ms)
✓The retrieval response http status should be ok(0ms)
✓Retrieval steps response message status code should be OK(0ms)
✓The retrieval response should be valid json(1ms)
✓Response content is valid json should be true(0ms)
✓The retrieved order id should match(0ms)
✓Retrieval steps response order id should be 'OrderId'(0ms)
✓The retrieved customer name should match(0ms)
✓Retrieval steps response customer name should be 'TestCustomer_1982997484224286572'(0ms)
✓The retrieved items should match(0ms)
✓Retrieval steps response items should have count 1(0ms)
✓ANDThe cow service should have received a milk request(0ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ](0ms)
✓ANDThe kitchen service should have received a preparation request(0ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ](0ms)
Diagrams
Details:lines
Retrieving A Non Existent Order Should Return Not Found 15ms🔗Steps
✓GIVENA non existent order id(0ms)
✓WHENThe order is retrieved by id(11ms)
✓THENThe response should be not found(0ms)
✓Retrieval steps response message status code should be NotFound(0ms)
Diagrams
Details:lines
Orders Outbox Retry Exhaustion Feature
/orders - Outbox message transitions to failed after exhausting retries
An Outbox Message Should Transition To Failed After Exhausting Retries 1.0s🔗Steps
✓GIVENA pending outbox message with a test specific destination(2ms)
✓THENThe outbox message should transition to failed(1.0s)
Sequence Diagrams
Details:lines
Orders Pagination Feature
/orders - Paginated listing of breakfast orders
Listing Orders Should Return A Paginated Response Happy Path120ms🔗Steps✓GIVENMultiple orders have been created(97ms)
✓A pancake batch is created(43ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Two orders are created for the batch(52ms)
✓Order steps response message status code should be Created(0ms)
✓Order steps response message status code should be Created(0ms)
✓WHENOrders are listed with default pagination(10ms)
✓THENThe paginated response should contain the correct metadata(10ms)
✓The list response should be ok(0ms)
✓List steps response message status code should be OK(0ms)
✓The list response should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The response should contain the created orders(3ms)
✓List steps response items should have count greater than or equal to '2'(0ms)
✓The page number should be one(0ms)
✓List steps response page should be 1(0ms)
✓The total count should match the created order count(0ms)
✓List steps response total count should be greater than or equal to '2'(0ms)
Diagrams
Details:lines
Listing Orders When None Exist Should Return An Empty Page 28ms🔗Steps
✓WHENOrders are listed with default pagination(19ms)
✓THENThe paginated response should be empty(7ms)
✓The list response should be ok(0ms)
✓List steps response message status code should be OK(0ms)
✓The list response should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The items list should be empty(0ms)
✓List steps response items should be empty(0ms)
✓The total count should be zero(0ms)
✓List steps response total count should be 0(0ms)
Diagrams
Details:lines
Listing Orders With A Small Page Size Should Limit Results 138ms🔗Steps✓GIVENMultiple orders have been created(105ms)
✓A pancake batch is created(43ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Two orders are created for the batch(60ms)
✓Order steps response message status code should be Created(0ms)
✓Order steps response message status code should be Created(0ms)
✓WHENOrders are listed with a page size of one(24ms)
✓THENThe paginated response should contain only one item(5ms)
✓List steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓List steps response items should have count 1(0ms)
✓ANDThe total pages should reflect the full order count(0ms)
✓List steps response total pages should be greater than or equal to '2'(0ms)
Diagrams
Details:lines
Requesting The Second Page Should Return Different Orders 123ms🔗Steps✓GIVENMultiple orders have been created(101ms)
✓A pancake batch is created(69ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Two orders are created for the batch(30ms)
✓Order steps response message status code should be Created(0ms)
✓Order steps response message status code should be Created(0ms)
✓WHENThe second page of orders is requested with a page size of one(16ms)
✓THENThe paginated response should contain only one item(0ms)
✓List steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓List steps response items should have count 1(0ms)
✓ANDThe page number should be two(0ms)
✓List steps response page should be 2(0ms)
Diagrams
Details:lines
Orders Rate Limiting Feature
/orders - Rate limiting on order creation
Exceeding The Rate Limit Should Return Too Many Requests 168ms🔗Steps
✓GIVENThe rate limit is configured to allow one request per window(93ms)
✓ANDA pancake batch has been created(45ms)
✓A pancake request is submitted with ingredients(42ms)
✓The pancake batch should be successful(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓ANDA valid order request(0ms)
✓WHENThe order is submitted twice in rapid succession(23ms)
✓THENThe first request should succeed(0ms)
✓First response status code should be Created(0ms)
✓ANDThe second request should be rate limited(0ms)
✓Second response status code should be TooManyRequests(0ms)
Diagrams
Details:lines
Orders Status Transition Feature
/orders - Order status transitions following the order lifecycle
A valid status transition should update the order 4/4 passed197ms🔗
#
Input Parameters
Status
Duration
From Status
To Status
1
Created
Cancelled
Passed
31ms
2
Created
Preparing
Passed
59ms
3
Preparing
Ready
Passed
37ms
4
Ready
Completed
Passed
68ms
Steps✓GIVENAn order exists with status Created(21ms)
✓A pancake batch is created(10ms)
✓Response content is valid json should be true(0ms)
✓An order is created for the batch(7ms)
✓Response content is valid json should be true(0ms)
✓The order is transitioned to Created(0ms)
✓WHENThe order status is updated to Cancelled(2ms)
✓THENThe order should be updated successfully to Cancelled(2ms)
✓The patch response http status should be ok(0ms)
✓Patch steps response message status code should be OK(0ms)
✓The updated order status should be Cancelled(0ms)
✓Response content is valid json should be true(0ms)
✓Patch steps response status should be 'Cancelled'(0ms)
Steps✓GIVENAn order exists with status Created(49ms)
✓A pancake batch is created(34ms)
✓Response content is valid json should be true(0ms)
✓An order is created for the batch(12ms)
✓Response content is valid json should be true(0ms)
✓The order is transitioned to Created(0ms)
✓WHENThe order status is updated to Preparing(3ms)
✓THENThe order should be updated successfully to Preparing(3ms)
✓The patch response http status should be ok(0ms)
✓Patch steps response message status code should be OK(0ms)
✓The updated order status should be Preparing(0ms)
✓Response content is valid json should be true(0ms)
✓Patch steps response status should be 'Preparing'(0ms)
Steps✓GIVENAn order exists with status Preparing(25ms)
✓A pancake batch is created(9ms)
✓Response content is valid json should be true(0ms)
✓An order is created for the batch(8ms)
✓Response content is valid json should be true(0ms)
✓The order is transitioned to Preparing(3ms)
✓Patch steps response message status code should be OK(0ms)
✓WHENThe order status is updated to Ready(3ms)
✓THENThe order should be updated successfully to Ready(2ms)
✓The patch response http status should be ok(0ms)
✓Patch steps response message status code should be OK(0ms)
✓The updated order status should be Ready(0ms)
✓Response content is valid json should be true(0ms)
✓Patch steps response status should be 'Ready'(0ms)
Steps✓GIVENAn order exists with status Ready(54ms)
✓A pancake batch is created(11ms)
✓Response content is valid json should be true(0ms)
✓An order is created for the batch(12ms)
✓Response content is valid json should be true(0ms)
✓The order is transitioned to Ready(26ms)
✓Patch steps response message status code should be OK(0ms)
✓Patch steps response message status code should be OK(0ms)
✓WHENThe order status is updated to Completed(3ms)
✓THENThe order should be updated successfully to Completed(6ms)
✓The patch response http status should be ok(1ms)
✓Patch steps response message status code should be OK(0ms)
✓The updated order status should be Completed(1ms)
✓Response content is valid json should be true(0ms)
✓Patch steps response status should be 'Completed'(0ms)
Diagrams
Details:lines
An invalid status transition should return a conflict response 7/7 passed417ms🔗
#
Input Parameters
Status
Duration
From Status
To Status
1
Cancelled
Preparing
Passed
52ms
2
Cancelled
Ready
Passed
52ms
3
Completed
Preparing
Passed
65ms
4
Created
Completed
Passed
61ms
5
Created
Ready
Passed
62ms
6
Preparing
Cancelled
Passed
72ms
7
Ready
Preparing
Passed
51ms
Steps✓GIVENAn order exists with status Cancelled(44ms)
✓A pancake batch is created(19ms)
✓Response content is valid json should be true(0ms)
✓An order is created for the batch(14ms)
✓Response content is valid json should be true(0ms)
✓The order is transitioned to Cancelled(4ms)
✓Patch steps response message status code should be OK(0ms)
✓WHENThe order status is updated to Preparing(2ms)
✓THENThe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓GIVENAn order exists with status Cancelled(46ms)
✓A pancake batch is created(11ms)
✓Response content is valid json should be true(0ms)
✓An order is created for the batch(27ms)
✓Response content is valid json should be true(0ms)
✓The order is transitioned to Cancelled(4ms)
✓Patch steps response message status code should be OK(0ms)
✓WHENThe order status is updated to Ready(2ms)
✓THENThe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓GIVENAn order exists with status Completed(57ms)
✓A pancake batch is created(11ms)
✓Response content is valid json should be true(0ms)
✓An order is created for the batch(32ms)
✓Response content is valid json should be true(0ms)
✓The order is transitioned to Completed(11ms)
✓Patch steps response message status code should be OK(0ms)
✓Patch steps response message status code should be OK(0ms)
✓Patch steps response message status code should be OK(0ms)
✓WHENThe order status is updated to Preparing(1ms)
✓THENThe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓GIVENAn order exists with status Created(41ms)
✓A pancake batch is created(13ms)
✓Response content is valid json should be true(0ms)
✓An order is created for the batch(19ms)
✓Response content is valid json should be true(0ms)
✓The order is transitioned to Created(0ms)
✓WHENThe order status is updated to Completed(2ms)
✓THENThe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓GIVENAn order exists with status Created(54ms)
✓A pancake batch is created(39ms)
✓Response content is valid json should be true(0ms)
✓An order is created for the batch(12ms)
✓Response content is valid json should be true(0ms)
✓The order is transitioned to Created(0ms)
✓WHENThe order status is updated to Ready(1ms)
✓THENThe response should indicate an invalid state transition(2ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓GIVENAn order exists with status Preparing(65ms)
✓A pancake batch is created(11ms)
✓Response content is valid json should be true(0ms)
✓An order is created for the batch(14ms)
✓Response content is valid json should be true(0ms)
✓The order is transitioned to Preparing(30ms)
✓Patch steps response message status code should be OK(0ms)
✓WHENThe order status is updated to Cancelled(2ms)
✓THENThe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓GIVENAn order exists with status Ready(42ms)
✓A pancake batch is created(10ms)
✓Response content is valid json should be true(0ms)
✓An order is created for the batch(11ms)
✓Response content is valid json should be true(0ms)
✓The order is transitioned to Ready(17ms)
✓Patch steps response message status code should be OK(0ms)
✓Patch steps response message status code should be OK(0ms)
✓WHENThe order status is updated to Preparing(5ms)
✓THENThe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Diagrams
Details:lines
Orders Status Update Not Found Feature
/orders - Updating the status of a non-existent order
Updating The Status Of A Non Existent Order Should Return Not Found 10ms🔗Steps
✓GIVENA non existent order id(0ms)
✓WHENThe order status is updated to preparing(7ms)
✓THENThe response should indicate not found(0ms)
✓Patch steps response message status code should be NotFound(0ms)
Diagrams
Details:lines
Orders Validation Feature
/orders - Input validation for order creation and status updates
Order status update endpoint is called with invalid fields should return a bad request response 1/1 passed54ms🔗
#
Input Parameters
Status
Duration
Inputs
Outputs
1
Field
Status
Value
null
Reason
Status is required
ErrorMessage
'Status' is required
ResponseStatus
Bad Request
Passed
54ms
Steps
✓GIVENValid status update requests with an invalid field InvalidFieldFromRequest { Field = Status, Value = , Reason = Status is required }(1ms)
✓WHENThe invalid status update requests are submitted(45ms)
✓THENThe status update responses should each contain the validation error for the invalid field VerifiableErrorResult { ErrorMessage = 'Status' is required., ResponseStatus = Bad Request }(0ms)
Diagrams
Details:lines
Orders endpoint is called with invalid fields should return a bad request response 1/1 passed134ms🔗
#
Input Parameters
Status
Duration
Inputs
Outputs
1
Field
CustomerName
Value
0
Reason
Quantity must be greater than zero
ErrorMessage
'Customer Name' is required
ResponseStatus
Bad Request
Passed
134ms
Steps
✓GIVENValid order requests with an invalid field InvalidFieldFromRequest { Field = CustomerName, Value = , Reason = Customer name is required }, InvalidFieldFromRequest { Field = Items, Value = , Reason = At least one item is required }, InvalidFieldFromRequest { Field = Items[0].ItemType, Value = , Reason = Item type is required }, InvalidFieldFromRequest { Field = Items[0].BatchId, Value = , Reason = Batch ID is required }, InvalidFieldFromRequest { Field = Items[0].Quantity, Value = 0, Reason = Quantity must be greater than zero }(34ms)
✓WHENThe invalid order requests are submitted(87ms)
✓THENThe responses should each contain the validation error for the invalid field VerifiableErrorResult { ErrorMessage = 'Customer Name' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = The Items field is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Item Type' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Batch Id' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Quantity must be greater than zero., ResponseStatus = Bad Request }(6ms)
Diagrams
Details:lines
Pancakes Content Negotiation Feature
/pancakes - Content negotiation and unsupported media types
Sending a request with an unsupported content type should return an unsupported media type response 3/3 passed12ms🔗
#
Input Parameters
Status
Duration
Content Type
1
application/xml
Passed
3ms
2
text/html
Passed
3ms
3
text/plain
Passed
5ms
Steps
✓GIVENA pancake request with content type application/xml(0ms)
✓WHENThe pancakes are prepared(0ms)
✓THENThe response should indicate unsupported media type(0ms)
✓Response status code should be UnsupportedMediaType(0ms)
Steps
✓GIVENA pancake request with content type text/html(0ms)
✓WHENThe pancakes are prepared(0ms)
✓THENThe response should indicate unsupported media type(0ms)
✓Response status code should be UnsupportedMediaType(0ms)
Steps
✓GIVENA pancake request with content type text/plain(0ms)
✓WHENThe pancakes are prepared(1ms)
✓THENThe response should indicate unsupported media type(0ms)
✓Response status code should be UnsupportedMediaType(0ms)
Diagrams
Details:lines
Pancakes Creation Feature
/pancakes - Creating pancakes with ingredients and optional toppings
A Valid Pancake Request Should Return A Fresh Batch Happy Path43ms🔗Steps✓GIVENA valid pancake recipe with all ingredients(24ms)
✓A valid request body(22ms)
✓The body specifies milk(7ms)
✓Milk is retrieved from the get milk endpoint(3ms)
✓The milk response should be successful(0ms)
✓Milk steps response message status code should be OK(0ms)
✓Retrieved milk is set on the body(0ms)
✓The body specifies eggs(5ms)
✓Eggs are retrieved from the get eggs endpoint(1ms)
✓The eggs response should be successful(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Retrieved eggs are set on the body(0ms)
✓The body specifies flour(5ms)
✓Flour is retrieved from the get flour endpoint(1ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓Retrieved flour is set on the body(0ms)
✓WHENThe pancakes are prepared(6ms)
✓THENThe pancakes response should contain a valid batch with all ingredients(8ms)
✓The response http status should be created(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓The response should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The response ingredients should include milk(0ms)
✓Pancake steps response ingredients should contain 'Some_Fresh_Milk'(0ms)
✓The response ingredients should include eggs(0ms)
✓Pancake steps response ingredients should contain 'Some_Eggs'(0ms)
✓The response ingredients should include flour(0ms)
✓Pancake steps response ingredients should contain 'Some_Flour'(0ms)
✓ANDThe cow service should have received a milk request(0ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ](0ms)
Diagrams
Details:lines
A Pancake Request With More Toppings Than Allowed Should Return A Bad Request Response 28ms🔗Steps
✓GIVENThe max toppings per item is 5(0ms)
✓ANDA valid pancake recipe with all ingredients(15ms)
✓A valid request body(14ms)
✓The body specifies milk(5ms)
✓Milk is retrieved from the get milk endpoint(2ms)
✓The milk response should be successful(0ms)
✓Milk steps response message status code should be OK(0ms)
✓Retrieved milk is set on the body(0ms)
✓The body specifies eggs(3ms)
✓Eggs are retrieved from the get eggs endpoint(0ms)
✓The eggs response should be successful(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Retrieved eggs are set on the body(0ms)
✓The body specifies flour(3ms)
✓Flour is retrieved from the get flour endpoint(0ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓Retrieved flour is set on the body(0ms)
✓ANDThe request has more toppings than the configured limit(0ms)
✓WHENThe pancakes are prepared(2ms)
✓THENThe pancakes response should indicate too many toppings(3ms)
✓The response http status should be bad request(0ms)
✓Pancake steps response message status code should be BadRequest(0ms)
✓The response should contain max toppings error(0ms)
✓Pancake error response body should contain MaxToppingsExceeded(0ms)
Diagrams
Details:lines
Pancakes endpoint is called with invalid ingredients should return a bad request response 1/1 passed37ms🔗
#
Input Parameters
Status
Duration
Inputs
Outputs
1
Field
Milk
Value
javascript:void(0)
Reason
XSS in eggs
ErrorMessage
'Milk' is required
ResponseStatus
Bad Request
Passed
37ms
Steps
✓GIVENValid pancake requests with an invalid field InvalidFieldFromRequest { Field = Milk, Value = , Reason = Milk is required }, InvalidFieldFromRequest { Field = Flour, Value = , Reason = Flour is required }, InvalidFieldFromRequest { Field = Eggs, Value = , Reason = Eggs is required }, InvalidFieldFromRequest { Field = Milk, Value = <script>alert</script>, Reason = XSS in milk }, InvalidFieldFromRequest { Field = Flour, Value = <img onerror=x>, Reason = XSS in flour }, InvalidFieldFromRequest { Field = Eggs, Value = javascript:void(0), Reason = XSS in eggs }(24ms)
✓WHENThe invalid pancake requests are submitted(8ms)
✓THENThe responses should each contain the validation error for the invalid field VerifiableErrorResult { ErrorMessage = 'Milk' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Flour' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Eggs' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Milk contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Flour contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Eggs contains potentially dangerous content., ResponseStatus = Bad Request }(1ms)
Diagrams
Details:lines
Recipe Reviews Management Feature
/recipe-reviews - Submitting and retrieving recipe reviews (MongoDB)
Submitting A Recipe Review Should Return The Created Review Happy Path69ms🔗Steps
✓GIVENA valid recipe review request(0ms)
✓WHENThe review is submitted(55ms)
✓THENThe review response should contain the created review(9ms)
✓The post response http status should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓The post response should be valid json(3ms)
✓Response content is valid json should be true(0ms)
✓The created review should have the correct recipe name(0ms)
✓Post steps response recipe name should be 'Recipe-1b3ee342d7e54c76a15ec3360c896d5c'(0ms)
✓The created review should have the correct rating(0ms)
✓Post steps response rating should be 5(0ms)
Diagrams
Details:lines
Listing Reviews By Recipe Should Return Matching Reviews 27ms🔗Steps✓GIVENA review entry exists(4ms)
✓A valid recipe review request(0ms)
✓The review is submitted(1ms)
✓The setup response should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe reviews are listed by recipe(16ms)
✓THENThe review list response should contain the review(4ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps list response should contain [ r => r.ReviewId == '84f86bae-8046-43c7-bb3a-c9086ef325be' ](0ms)
Diagrams
Details:lines
Retrieving Existing Review By Id Should Return The Review 56ms🔗Steps✓GIVENA review entry exists(6ms)
✓A valid recipe review request(0ms)
✓The review is submitted(2ms)
✓The setup response should be created(1ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe review is retrieved by id(45ms)
✓THENThe review get response should contain the review(1ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps response review id should be '0142ad45-7d6f-4bb9-85b4-f6926244133b'(0ms)
✓Get steps response recipe name should be 'Recipe-15e0c73c3c7c4c3d9270bbf8910a923f'(0ms)
Diagrams
Details:lines
Retrieving Non Existent Review Should Return Not Found 119ms🔗Steps
✓WHENA non existent review is retrieved(116ms)
✓THENThe review get response should indicate not found(0ms)
✓Get steps response message status code should be NotFound(0ms)
Diagrams
Details:lines
Submitting Review With Invalid Rating Should Return Bad Request 5ms🔗Steps
✓GIVENA review request with an invalid rating(0ms)
✓WHENThe review is submitted(2ms)
✓THENThe review response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
Details:lines
Submitting Review With Missing Recipe Name Should Return Bad Request 5ms🔗Steps
✓GIVENA review request with missing recipe name(0ms)
✓WHENThe review is submitted(2ms)
✓THENThe review response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
Details:lines
Reporting Batch Completions Feature
/graphql - Querying batch completion records populated by Pub/Sub consumption
Batch Completions Should Contain Data Ingested Via PubSub Consumer Happy Path50ms🔗Steps✓GIVENA pancake batch has been created(22ms)
✓Milk is retrieved from the milk endpoint(3ms)
✓The milk response should be successful(0ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs are retrieved from the eggs endpoint(1ms)
✓The eggs response should be successful(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour is retrieved from the flour endpoint(1ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓A pancake request is submitted with all ingredients(6ms)
✓The pancake batch response should be successful(1ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓WHENThe batch completions are queried via graphql(14ms)
✓THENThe graphql response should contain the batch completion record(10ms)
✓The batch completions response should be successful(1ms)
✓Graph ql steps response message status code should be OK(0ms)
✓The batch completions response should be valid json(3ms)
✓The batch completions should contain the pancake batch(3ms)
✓Graph ql steps batch completions should contain [ r => r.BatchId == 'fd558959-299d-4fcd-a553-0595a1671af9' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ](0ms)
Diagrams
Details:lines
Reporting Equipment Alerts Feature
/graphql - Querying equipment alerts populated by Event Hub consumption
Equipment Alerts Should Contain Data Ingested Via Event Hub Consumer Happy Path71ms🔗Steps✓GIVENA pancake batch has been created(41ms)
✓Milk is retrieved from the milk endpoint(8ms)
✓The milk response should be successful(0ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs are retrieved from the eggs endpoint(1ms)
✓The eggs response should be successful(3ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour is retrieved from the flour endpoint(1ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓A pancake request is submitted with all ingredients(11ms)
✓The pancake batch response should be successful(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓WHENThe equipment alerts are queried via graphql(14ms)
✓THENThe graphql response should contain the equipment alert record(12ms)
✓The equipment alerts response should be successful(0ms)
✓Graph ql steps response message status code should be OK(0ms)
✓The equipment alerts response should be valid json(5ms)
✓The equipment alerts should contain the pancake batch alert(3ms)
/webhooks/eventgrid - Receiving and processing EventGrid webhook events
Ingredient Shipments Should Be Recorded When Delivered Via EventGrid Webhook Happy Path148ms🔗Steps✓GIVENAn ingredient delivery event has been received via eventgrid webhook(78ms)
✓An ingredient delivery event is posted to the webhook(72ms)
✓The webhook response should be successful(3ms)
✓Webhook response status code should be OK(0ms)
✓WHENThe ingredient shipments are queried via graphql(54ms)
✓THENThe graphql response should contain the ingredient shipment(12ms)
✓The ingredient shipments response should be successful(0ms)
✓Graph ql steps response message status code should be OK(0ms)
✓The ingredient shipments response should be valid json(5ms)
✓The ingredient shipments should contain the delivery(3ms)
/graphql - Querying order summary reports via GraphQL
Order Summaries Should Contain Ingested Order Data Happy Path56ms🔗Steps✓GIVENA pancake batch has been created(24ms)
✓Milk is retrieved from the milk endpoint(4ms)
✓The milk response should be successful(0ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs are retrieved from the eggs endpoint(1ms)
✓The eggs response should be successful(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour is retrieved from the flour endpoint(1ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓A pancake request is submitted with all ingredients(8ms)
✓The pancake batch response should be successful(1ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓ANDA breakfast order has been placed for the batch(15ms)
✓An order request is submitted for the pancake batch(11ms)
✓The order creation response should be successful(1ms)
✓Order steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Order steps response should not be null(0ms)
✓The order id is captured from the order response(0ms)
✓Order id should not be empty(0ms)
✓WHENThe order summaries are queried via graphql(5ms)
✓THENThe graphql response should contain the ingested order summary(7ms)
✓The graphql response should be successful(0ms)
✓Graph ql steps response message status code should be OK(0ms)
✓The order summaries response should be valid json(0ms)
✓The order summaries should contain the test order(3ms)
✓Graph ql steps order summaries should contain [ o => o.OrderId == '19881117-61f8-4c61-bf14-12363f69bb42' && o.CustomerName == 'TestCustomer_7018070925813112057' && o.ItemCount == 1 && o.TableNumber == 7 ](0ms)
Diagrams
Details:lines
Order Summaries Should Return An Empty List When No Orders Exist 16ms🔗Steps
✓WHENThe order summaries are queried via graphql(9ms)
✓THENThe graphql response should be successful(0ms)
✓Graph ql steps response message status code should be OK(0ms)
✓ANDThe order summaries list should be empty or not contain the test order(4ms)
✓Graph ql steps order summaries should not contain [ o => o.OrderId == '00000000-0000-0000-0000-000000000000' ](0ms)
Diagrams
Details:lines
Reporting Recipe Reports Feature
/graphql - Querying recipe reports and aggregations via GraphQL
Recipe Reports Should Contain Ingested Recipe Data Happy Path58ms🔗Steps✓GIVENA pancake batch has been created(28ms)
✓Milk is retrieved from the milk endpoint(3ms)
✓The milk response should be successful(0ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs are retrieved from the eggs endpoint(1ms)
✓The eggs response should be successful(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour is retrieved from the flour endpoint(1ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓A pancake request is submitted with all ingredients(8ms)
✓The pancake batch response should be successful(3ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓WHENThe recipe reports are queried via graphql(16ms)
✓THENThe graphql response should contain the ingested recipe reports(10ms)
✓The recipe reports response should be successful(0ms)
✓Graph ql steps response message status code should be OK(0ms)
✓The recipe reports response should be valid json(3ms)
✓The recipe reports should contain the pancake entry(3ms)
✓Graph ql steps recipe reports should contain [ r => r.OrderId == '5d3d92af-a9fe-4476-a18c-48ec20d3c39f' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ](0ms)
Diagrams
Details:lines
Ingredient Usage Should Aggregate Across Multiple Recipes 49ms🔗Steps✓GIVENMultiple recipe logs have been ingested with overlapping ingredients(10ms)
✓A pancake recipe is seeded with common ingredients(4ms)
✓A waffle recipe is seeded with overlapping ingredients(2ms)
✓WHENThe ingredient usage is queried via graphql(24ms)
✓THENThe ingredient usage should reflect aggregated counts(11ms)
✓The ingredient usage response should be successful(0ms)
✓Graph ql steps response message status code should be OK(0ms)
✓The ingredient usage response should be valid json(2ms)
✓Milk should appear in two recipes(2ms)
✓Graph ql steps ingredient usage should contain [ i => i.Ingredient == "Milk" && i.Count >= 2 ](0ms)
✓Butter should appear in one recipe(1ms)
✓Graph ql steps ingredient usage should contain [ i => i.Ingredient == "Butter" && i.Count >= 1 ](0ms)
Diagrams
Details:lines
Popular Recipes Should Return Recipe Types Ordered By Frequency 1.8s🔗Steps✓GIVENMultiple recipe logs of different types have been ingested(188ms)
✓Two pancake recipes are seeded(181ms)
✓One waffle recipe is seeded(2ms)
✓WHENThe popular recipes are queried via graphql(1.5s)
✓THENThe popular recipes should be ordered by count descending(19ms)
✓The popular recipes response should be successful(0ms)
✓Graph ql steps response message status code should be OK(0ms)
✓The popular recipes response should be valid json(6ms)
✓Pancakes should be the most popular recipe(3ms)
✓Pancakes should not be null(0ms)
✓Pancakes count should be greater than or equal to 2(0ms)
✓Waffles should also be in the results(2ms)
✓Graph ql steps popular recipes should contain [ r => r.RecipeType == "Waffles" && r.Count >= 1 ](0ms)
Diagrams
Details:lines
Reservations Management Feature
/reservations - Managing table reservations with full CRUD operations and cancellation
Creating A Reservation Should Return The Confirmed Reservation Happy Path1.4s🔗Steps
✓GIVENA valid reservation request(18ms)
✓WHENThe reservation is submitted(1.4s)
✓THENThe reservation response should contain the confirmed booking(12ms)
✓The post response http status should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓The post response should be valid json(4ms)
✓Response content is valid json should be true(0ms)
✓The reservation status should be confirmed(2ms)
✓Post steps response status should be "Confirmed"(0ms)
✓The reservation customer name should match(0ms)
✓Post steps response customer name should be 'Customer-54d4ae70f8af4ee39f5d6cf7190c376d'(0ms)
Diagrams
Details:lines
Cancelling A Reservation Should Return The Cancelled Reservation 103ms🔗Steps✓GIVENA reservation exists(30ms)
✓A valid reservation request(0ms)
✓The reservation is submitted(27ms)
✓The setup response should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe reservation is cancelled(59ms)
✓THENThe cancellation response should indicate the reservation is cancelled(11ms)
✓The cancel response http status should be ok(1ms)
✓Cancel steps response message status code should be OK(0ms)
✓The cancel response should be valid json(2ms)
✓Response content is valid json should be true(0ms)
✓The cancelled reservation status should be cancelled(0ms)
✓Cancel steps response status should be "Cancelled"(0ms)
Diagrams
Details:lines
Cancelling An Already Cancelled Reservation Should Return A Conflict Response 21ms🔗Steps✓GIVENA cancelled reservation exists(13ms)
✓A valid reservation request(0ms)
✓The reservation is submitted(4ms)
✓The setup response should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓The reservation is cancelled for setup(2ms)
✓The setup cancellation should succeed(1ms)
✓Cancel steps response message status code should be OK(0ms)
✓WHENThe reservation is cancelled again(4ms)
✓THENThe cancellation response should indicate a conflict(0ms)
✓Cancel steps response message status code should be Conflict(0ms)
Diagrams
Details:lines
Deleting A Reservation Should Return No Content 74ms🔗Steps✓GIVENA reservation exists(14ms)
✓A valid reservation request(0ms)
✓The reservation is submitted(5ms)
✓The setup response should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe reservation is deleted(56ms)
✓THENThe reservation delete response should indicate no content(0ms)
✓Delete response status code should be NoContent(0ms)
Diagrams
Details:lines
Retrieving An Existing Reservation Should Return The Reservation 707ms🔗Steps✓GIVENA reservation exists(56ms)
✓A valid reservation request(0ms)
✓The reservation is submitted(51ms)
✓The setup response should be created(1ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe reservation is retrieved by id(623ms)
✓THENThe reservation get response should contain the reservation(25ms)
✓The get response http status should be ok(7ms)
✓Get steps response message status code should be OK(0ms)
✓The get response should be valid json(1ms)
✓Response content is valid json should be true(0ms)
✓The retrieved reservation should match the created booking(6ms)
✓Get steps response id should be '2'(0ms)
✓Get steps response customer name should be 'CustomerName'(0ms)
✓Get steps response status should be "Confirmed"(0ms)
Diagrams
Details:lines
Specifications Async Api Feature
/asyncapi/v1.json - Serving the AsyncAPI specification describing event-driven messaging
The AsyncApi Endpoint Should Return A Valid Specification Happy Path876ms🔗Steps
✓WHENThe asyncapi endpoint is called(699ms)
✓THENThe response should be valid(105ms)
✓The response status should be ok(31ms)
✓Async api response status code should be OK(0ms)
✓The response should be valid json(62ms)
✓Async api response is valid json should be true $"response body (first 500 chars): {_asyncApiJsonString?[..Math.Min(_asyncApiJsonString.Length, 500)]}"(0ms)
✓ANDThe asyncapi spec is written to disk(41ms)
✓The asyncapi spec should contain asyncapi(11ms)
✓Async api json root element get property(name) should not be null(0ms)
✓The asyncapi spec should contain info(0ms)
✓Async api json root element get property(name) should not be null(0ms)
✓The asyncapi spec should contain defaultContentType(0ms)
✓Async api json root element get property(name) should not be null(0ms)
✓The asyncapi spec should contain channels(0ms)
✓Async api json root element get property(name) should not be null(0ms)
✓The asyncapi spec should contain operations(0ms)
✓Async api json root element get property(name) should not be null(0ms)
✓The asyncapi spec should contain components(0ms)
✓Async api json root element get property(name) should not be null(0ms)
✓The asyncapi spec is written to disk as json(7ms)asyncapi.json
Diagrams
Details:lines
Specifications Open Api Feature
/openapi/v1.json - Serving the OpenAPI specification describing all REST endpoints
The OpenApi Endpoint Should Return A Valid Specification Happy Path782ms🔗Steps
✓WHENThe open api endpoint is called(661ms)
✓THENThe response should be valid(71ms)
✓The response status should be ok(6ms)
✓Swagger response status code should be OK(0ms)
✓The response should be valid json(56ms)
✓Open api response is valid json should be true(0ms)
✓ANDThe response should contain all the endpoints(35ms)
✓The response should contain the endpoint /pancakes(11ms)
✓Swagger json root element get property("paths") get property(path) should not be null(0ms)
✓The response should contain the endpoint /waffles(0ms)
✓Swagger json root element get property("paths") get property(path) should not be null(0ms)
✓The response should contain the endpoint /orders(0ms)
✓Swagger json root element get property("paths") get property(path) should not be null(0ms)
✓The response should contain the endpoint /orders/{orderId}(0ms)
✓Swagger json root element get property("paths") get property(path) should not be null(0ms)
✓The response should contain the endpoint /toppings(0ms)
✓Swagger json root element get property("paths") get property(path) should not be null(0ms)
✓The response should contain the endpoint /menu(0ms)
✓Swagger json root element get property("paths") get property(path) should not be null(0ms)
✓The response should contain the endpoint /milk(0ms)
✓Swagger json root element get property("paths") get property(path) should not be null(0ms)
✓The response should contain the endpoint /eggs(0ms)
✓Swagger json root element get property("paths") get property(path) should not be null(0ms)
✓The response should contain the endpoint /flour(0ms)
✓Swagger json root element get property("paths") get property(path) should not be null(0ms)
✓The response should contain the endpoint /goat-milk(0ms)
✓Swagger json root element get property("paths") get property(path) should not be null(0ms)
✓The response should contain the endpoint /audit-logs(0ms)
✓Swagger json root element get property("paths") get property(path) should not be null(0ms)
✓ANDThe openapi spec is written to disk(9ms)
✓The openapi spec is written to disk as json(7ms)openapi.json
Diagrams
Details:lines
Specifications Open Api Scalar UI Feature
/scalar/v1 - Serving the interactive API documentation UI powered by Scalar
The Scalar UI Endpoint Should Return A Valid Page Happy Path346ms🔗Steps
✓WHENThe scalar ui endpoint is called(312ms)
✓THENThe response should be a valid scalar page(32ms)
✓The response status should be ok(0ms)
✓Scalar response status code should be OK(0ms)
✓The response should be valid html(0ms)
✓Scalar ui response body should contain "<html"(0ms)
✓The response should refer to scalar(0ms)
✓Scalar ui response body should contain "scalar"(0ms)
Diagrams
Details:lines
Staff Management Feature
/staff - Managing kitchen staff members with full CRUD operations
Adding A New Staff Member Should Return The Created Member Happy Path24ms🔗Steps
✓GIVENA valid staff member request(0ms)
✓WHENThe staff member is submitted(4ms)
✓THENThe staff response should contain the created member(14ms)
✓The post response http status should be created(3ms)
✓Post steps response message status code should be Created(0ms)
✓The post response should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The created member should have the correct name(0ms)
✓Post steps response name should be 'Chef-4d5f70caf3db45489b45330c82567e5a'(0ms)
✓The created member should have the correct role(3ms)
✓Post steps response role should be "Chef"(0ms)
Diagrams
Details:lines
Adding A Staff Member With An Invalid Role Should Return A Bad Request Response 9ms🔗Steps
✓GIVENA staff member request with an invalid role(0ms)
✓WHENThe staff member is submitted(2ms)
✓THENThe staff response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
Details:lines
Deleting A Staff Member Should Return No Content 125ms🔗Steps✓GIVENA staff member exists(95ms)
✓A valid staff member request(1ms)
✓The staff member is submitted(84ms)
✓The setup response should be created(5ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe staff member is deleted(26ms)
✓THENThe staff delete response should indicate no content(0ms)
✓Delete response status code should be NoContent(0ms)
Diagrams
Details:lines
Retrieving An Existing Staff Member Should Return The Member 48ms🔗Steps✓GIVENA staff member exists(5ms)
✓A valid staff member request(0ms)
✓The staff member is submitted(2ms)
✓The setup response should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓WHENThe staff member is retrieved by id(14ms)
✓THENThe staff get response should contain the member(26ms)
✓The get response http status should be ok(0ms)
✓Get steps response message status code should be OK(0ms)
✓The get response should be valid json(18ms)
✓Response content is valid json should be true(0ms)
✓The retrieved member should match the created member(1ms)
✓Get steps response id should be '3'(0ms)
✓Get steps response name should be 'Name'(0ms)
✓Get steps response role should be "Chef"(0ms)
Diagrams
Details:lines
Toppings Deletion Feature
/toppings - Deleting toppings from the system
Deleting An Existing Topping Should Return No Content Happy Path22ms🔗Steps
✓GIVENA known topping exists(0ms)
✓WHENThe topping is deleted(7ms)
✓THENThe delete response should indicate success(0ms)
✓Delete steps response message status code should be NoContent(0ms)
Diagrams
Details:lines
Deleting A Non Existent Topping Should Return Not Found 5ms🔗Steps
✓GIVENA topping id that does not exist(0ms)
✓WHENThe topping is deleted(1ms)
✓THENThe delete response should indicate not found(0ms)
✓Delete steps response message status code should be NotFound(0ms)
Diagrams
Details:lines
Toppings Feature Flag Feature
/toppings - Topping availability controlled by feature flags
Toppings Should Exclude Raspberries When Feature Flag Is Disabled 125ms🔗Steps
✓GIVENThe raspberry topping feature flag is disabled(106ms)
✓WHENToppings are requested(10ms)
✓THENThe toppings response should not include raspberries(4ms)
✓The toppings response http status should be ok(0ms)
✓Toppings steps response message status code should be OK(0ms)
✓The toppings list should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The toppings list should not contain raspberries(1ms)
✓Toppings steps response should not contain [ t => t.Name == ToppingDefaults.Raspberries ](0ms)
Diagrams
Details:lines
Toppings Should Include Raspberries When Feature Flag Is Enabled 136ms🔗Steps
✓GIVENThe raspberry topping feature flag is enabled(112ms)
✓WHENToppings are requested(14ms)
✓THENThe toppings response should include raspberries(7ms)
✓The toppings response http status should be ok(0ms)
✓Toppings steps response message status code should be OK(0ms)
✓The toppings list should be valid json(0ms)
✓Response content is valid json should be true(0ms)
✓The toppings list should contain raspberries(2ms)
✓Toppings steps response should contain [ t => t.Name == ToppingDefaults.Raspberries ](0ms)
Diagrams
Details:lines
Toppings Management Feature
/toppings - Listing available toppings and adding custom toppings
The Toppings Endpoint Should Return All Available Toppings Happy Path21ms🔗Steps
✓WHENThe available toppings are requested(4ms)
✓THENThe toppings response should contain the default toppings(14ms)
✓The toppings get response http status should be ok(0ms)
✓Get steps response message status code should be OK(0ms)
✓The toppings list should be valid json(1ms)
✓Response content is valid json should be true(0ms)
✓The toppings list should contain the expected items(8ms)
✓Get steps response should have count ExpectedToppingCount(0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.Raspberries ](0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.Blueberries ](0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.MapleSyrup ](0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.WhippedCream ](0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.ChocolateChips ](0ms)
Diagrams
Details:lines
Adding A New Topping Should Return The Created Topping 45ms🔗Steps
✓GIVENA valid topping request(0ms)
✓WHENThe new topping is submitted(34ms)
✓THENThe topping response should contain the created topping(8ms)
✓The topping post response http status should be created(0ms)
✓Post steps response message status code should be Created(0ms)
✓The topping post response should be valid json(1ms)
✓Response content is valid json should be true(0ms)
✓The created topping should have the correct name(0ms)
✓Post steps response name should be Strawberries(0ms)
✓The created topping should have the correct category(0ms)
✓Post steps response category should be FruitCategory(0ms)
Diagrams
Details:lines
Toppings Update Feature
/toppings - Updating existing toppings
Updating An Existing Topping Should Return The Updated Topping Happy Path20ms🔗Steps
✓GIVENA known topping exists(0ms)
✓ANDA valid update topping request(0ms)
✓WHENThe topping is updated(5ms)
✓THENThe update response should contain the updated topping(10ms)
✓The update response http status should be ok(0ms)
✓Put steps response message status code should be OK(0ms)
✓The update response should be valid json(2ms)
✓Response content is valid json should be true(0ms)
✓The updated topping should have the correct id(0ms)
✓Put steps response topping id should be KnownBlueberryToppingId(0ms)
✓The updated topping should have the correct name(0ms)
✓Put steps response name should be Strawberries(0ms)
✓The updated topping should have the correct category(0ms)
✓Put steps response category should be FruitCategory(0ms)
Diagrams
Details:lines
Update toppings endpoint is called with invalid or dangerous input 1/1 passed41ms🔗
#
Input Parameters
Status
Duration
Inputs
Outputs
1
Field
Name
Value
null
Reason
Category is required
ErrorMessage
Name contains potentially dangerous content
ResponseStatus
Bad Request
Passed
41ms
Steps
✓GIVENA known topping exists(0ms)
✓ANDValid update topping requests with an invalid field InvalidFieldFromRequest { Field = Name, Value = <script>alert('xss')</script>, Reason = Script tag in name }, InvalidFieldFromRequest { Field = Name, Value = <img src=x onerror=alert(1)>, Reason = Event handler in name }, InvalidFieldFromRequest { Field = Category, Value = <script>alert('xss')</script>, Reason = Script tag in category }, InvalidFieldFromRequest { Field = Category, Value = javascript:alert(1), Reason = Javascript protocol }, InvalidFieldFromRequest { Field = Name, Value = , Reason = Name is required }, InvalidFieldFromRequest { Field = Category, Value = , Reason = Category is required }(3ms)
✓WHENThe invalid update topping requests are submitted(28ms)
✓THENThe update responses should each contain the validation error for the invalid field VerifiableErrorResult { ErrorMessage = Name contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Name contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Category contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Category contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Name' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Category' is required., ResponseStatus = Bad Request }(1ms)
Diagrams
Details:lines
Updating A Non Existent Topping Should Return Not Found 5ms🔗Steps
✓GIVENA topping id that does not exist(0ms)
✓ANDA valid update topping request(0ms)
✓WHENThe topping is updated(1ms)
✓THENThe update response should indicate not found(0ms)
✓Put steps response message status code should be NotFound(0ms)
Diagrams
Details:lines
Toppings Xss Validation Feature
/toppings - XSS and input validation for toppings
Toppings endpoint is called with invalid or dangerous input 1/1 passed34ms🔗
#
Input Parameters
Status
Duration
Inputs
Outputs
1
Field
Name
Value
null
Reason
Category is required
ErrorMessage
Name contains potentially dangerous content
ResponseStatus
Bad Request
Passed
34ms
Steps
✓GIVENValid topping requests with an invalid field InvalidFieldFromRequest { Field = Name, Value = <script>alert('xss')</script>, Reason = Script tag in name }, InvalidFieldFromRequest { Field = Name, Value = <img src=x onerror=alert(1)>, Reason = Event handler in name }, InvalidFieldFromRequest { Field = Category, Value = <script>alert('xss')</script>, Reason = Script tag in category }, InvalidFieldFromRequest { Field = Category, Value = javascript:alert(1), Reason = Javascript protocol }, InvalidFieldFromRequest { Field = Name, Value = , Reason = Name is required }, InvalidFieldFromRequest { Field = Category, Value = , Reason = Category is required }(3ms)
✓WHENThe invalid topping requests are submitted(25ms)
✓THENThe responses should each contain the validation error for the invalid field VerifiableErrorResult { ErrorMessage = Name contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Name contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Category contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Category contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Name' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Category' is required., ResponseStatus = Bad Request }(1ms)
Diagrams
Details:lines
Waffles Content Negotiation Feature
/waffles - Content negotiation and unsupported media types
Sending a request with an unsupported content type should return an unsupported media type response 3/3 passed86ms🔗
#
Input Parameters
Status
Duration
Content Type
1
application/xml
Passed
28ms
2
text/html
Passed
10ms
3
text/plain
Passed
47ms
Steps
✓GIVENA waffle request with content type application/xml(0ms)
✓WHENThe waffles are prepared(25ms)
✓THENThe response should indicate unsupported media type(0ms)
✓Response status code should be UnsupportedMediaType(0ms)
Steps
✓GIVENA waffle request with content type text/html(0ms)
✓WHENThe waffles are prepared(6ms)
✓THENThe response should indicate unsupported media type(0ms)
✓Response status code should be UnsupportedMediaType(0ms)
Steps
✓GIVENA waffle request with content type text/plain(0ms)
✓WHENThe waffles are prepared(42ms)
✓THENThe response should indicate unsupported media type(0ms)
✓Response status code should be UnsupportedMediaType(0ms)
Diagrams
Details:lines
Waffles Creation Feature
/waffles - Creating waffles with ingredients and optional toppings
A Valid Waffle Request Should Return A Fresh Batch Happy Path129ms🔗Steps✓GIVENA valid waffle recipe with all ingredients(58ms)
✓A valid request body(57ms)
✓The body specifies milk(9ms)
✓Milk is retrieved from the get milk endpoint(3ms)
✓The milk response should be successful(0ms)
✓Milk steps response message status code should be OK(0ms)
✓Retrieved milk is set on the body(0ms)
✓The body specifies eggs(27ms)
✓Eggs are retrieved from the get eggs endpoint(1ms)
✓The eggs response should be successful(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Retrieved eggs are set on the body(0ms)
✓The body specifies flour(10ms)
✓Flour is retrieved from the get flour endpoint(0ms)
✓The flour response should be successful(0ms)
✓Flour steps response message status code should be OK(0ms)
✓Retrieved flour is set on the body(0ms)
✓The body specifies butter(0ms)
✓WHENThe waffles are prepared(28ms)
✓THENThe waffles response should contain a valid batch with all ingredients(26ms)
✓The response http status should be created(0ms)
✓Waffle steps response message status code should be Created(0ms)
✓The response should be valid json(5ms)
✓Response content is valid json should be true(0ms)
✓The response ingredients should include milk(1ms)
✓Waffle steps response ingredients should contain 'Some_Fresh_Milk'(0ms)
✓The response ingredients should include eggs(0ms)
✓Waffle steps response ingredients should contain 'Some_Eggs'(0ms)
✓The response ingredients should include flour(0ms)
✓Waffle steps response ingredients should contain 'Some_Flour'(0ms)
✓The response ingredients should include butter(2ms)
✓Waffle steps response ingredients should contain UnsaltedButter(0ms)
✓ANDThe cow service should have received a milk request(1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ](0ms)
Diagrams
Details:lines
A Waffle Request With More Toppings Than Allowed Should Return A Bad Request Response 148ms🔗Steps
✓GIVENThe max toppings per item is 5(3ms)
✓ANDA valid waffle recipe with all ingredients(41ms)
✓A valid request body(39ms)
✓The body specifies milk(13ms)
✓Milk is retrieved from the get milk endpoint(4ms)
✓The milk response should be successful(2ms)
✓Milk steps response message status code should be OK(0ms)
✓Retrieved milk is set on the body(0ms)
✓The body specifies eggs(8ms)
✓Eggs are retrieved from the get eggs endpoint(1ms)
✓The eggs response should be successful(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Retrieved eggs are set on the body(2ms)
✓The body specifies flour(10ms)
✓Flour is retrieved from the get flour endpoint(1ms)
✓The flour response should be successful(1ms)
✓Flour steps response message status code should be OK(0ms)
✓Retrieved flour is set on the body(0ms)
✓The body specifies butter(0ms)
✓ANDThe request has more toppings than the configured limit(4ms)
✓WHENThe waffles are prepared(71ms)
✓THENThe waffles response should indicate too many toppings(16ms)
✓The response http status should be bad request(0ms)
✓Waffle steps response message status code should be BadRequest(0ms)
✓The response should contain max toppings error(6ms)
✓Waffle error response body should contain MaxToppingsExceeded(0ms)
Diagrams
Details:lines
Waffles endpoint is called with invalid ingredients should return a bad request response 1/1 passed17ms🔗
#
Input Parameters
Status
Duration
Inputs
Outputs
1
Field
Milk
Value
<img onerror=x>
Reason
XSS in butter
ErrorMessage
'Milk' is required
ResponseStatus
Bad Request
Passed
17ms
Steps
✓GIVENValid waffle requests with an invalid field InvalidFieldFromRequest { Field = Milk, Value = , Reason = Milk is required }, InvalidFieldFromRequest { Field = Flour, Value = , Reason = Flour is required }, InvalidFieldFromRequest { Field = Eggs, Value = , Reason = Eggs is required }, InvalidFieldFromRequest { Field = Butter, Value = , Reason = Butter is required }, InvalidFieldFromRequest { Field = Milk, Value = <script>alert</script>, Reason = XSS in milk }, InvalidFieldFromRequest { Field = Butter, Value = <img onerror=x>, Reason = XSS in butter }(3ms)
✓WHENThe invalid waffle requests are submitted(9ms)
✓THENThe responses should each contain the validation error for the invalid field VerifiableErrorResult { ErrorMessage = 'Milk' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Flour' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Eggs' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = 'Butter' is required., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Milk contains potentially dangerous content., ResponseStatus = Bad Request }, VerifiableErrorResult { ErrorMessage = Butter contains potentially dangerous content., ResponseStatus = Bad Request }(1ms)