Breakfast Provider (ReqNRoll) Test Run Report

Features Summary
FeatureScenariosPassedFailedSkippedStepsPassedFailedSkippedDurationAvgLongest
Apple Cinnamon Muffins Creation101000909000370ms37ms133ms
Audit Log Filtering44005252001s254ms865ms
Audit Log Retrieval1100212100200ms200ms200ms
Breakfast Order33005656001s478ms926ms
Chef Notes Management8800515100538ms67ms161ms
Complete Order Lifecycle1100292900221ms221ms221ms
Correlation Id2200990092ms46ms78ms
Customer Feedback Alert Processing1100660077ms77ms77ms
Customer Preferences Management5500333300305ms61ms128ms
Daily Specials Idempotency2200181800175ms87ms153ms
Daily Specials Not Found1100440076ms76ms76ms
Daily Specials Ordering4400262600104ms26ms30ms
Daily Specials Validation2200880034ms17ms26ms
Degraded Health Check2200202000422ms211ms219ms
Downstream Error Health Check11009900215ms215ms215ms
Equipment Alerts110012120076ms76ms76ms
Equipment Readings Monitoring5500343400351ms70ms147ms
Feedback Management66003636001s306ms1s
Goat Milk Downstream Failure2200101000156ms78ms126ms
Goat Milk Feature Flag2200101000477ms238ms264ms
Goat Milk Sourcing110044007ms7ms7ms
Header Propagation220013130037ms18ms27ms
Health Check110011110031ms31ms31ms
Health Check Detail1100333300162ms162ms162ms
Heartbeat1100550020ms20ms20ms
Ingredient Usage Analytics55003232001s246ms589ms
Ingredient Waste Tracking6600353500688ms114ms556ms
Inventory Management66004141001s326ms1s
Kitchen Service Failure110015150086ms86ms86ms
Menu Availability11007700261ms261ms261ms
Menu Caching11008800247ms247ms247ms
Menu Downstream Failure11006600360ms360ms360ms
Milk Downstream Failure330015150042ms14ms21ms
Order Cross Field Validation2200282800400ms200ms267ms
Order Pagination4400383800734ms183ms285ms
Order Rate Limiting1100151500427ms427ms427ms
Order Retrieval2200111100128ms64ms110ms
Order Status Transition111100858500476ms43ms88ms
Order Status Via G RPC2200222200159ms79ms98ms
Order Summaries22001010001s637ms1s
Order Timings Analytics5500323200760ms152ms489ms
Order Validation660024240099ms16ms34ms
Outbox Retry Exhaustion110033001s1s1s
Pancakes Content Negotiation330012120033ms11ms21ms
Pancakes Creation8800474700187ms23ms48ms
Recipe Cost Analysis Processing110066001s1s1s
Recipe Reports33001818001s576ms1s
Recipe Reviews Management6600363600772ms128ms400ms
Recipe Summary Via G RPC3300151500197ms65ms171ms
Reporting Batch Completions1100121200107ms107ms107ms
Reporting Event Grid Webhook11006600114ms114ms114ms
Reservations Management5500383800661ms132ms411ms
Service Time Analysis1100660096ms96ms96ms
Specifications Async Api1100111100346ms346ms346ms
Specifications Open Api1100171700547ms547ms547ms
Specifications Open Api Scalar UI11005500435ms435ms435ms
Staff Management4400272700276ms69ms159ms
Status Update Not Found1100330054ms54ms54ms
Stream Order Updates Via G RPC220022220088ms44ms70ms
Telemetry11001515001s1s1s
Toppings Deletion2200880060ms30ms33ms
Toppings Feature Flag2200121200479ms239ms321ms
Toppings Management2200171700132ms66ms93ms
Toppings Update8800444400268ms33ms144ms
Toppings XSS Validation660024240060ms10ms18ms
Waffles Content Negotiation3300121200177ms59ms155ms
Waffles Creation101000565600400ms40ms132ms

Test Execution Summary

ExecutionContent
Overall status:PassedFeatures: 67
Start Date:2026-09-05 (UTC)Scenarios: 205
Start Time:07:57:35 (UTC)Passed Scenarios: 205
End Time:07:57:47 (UTC)Failed Scenarios: 0
Duration:12sSkipped Scenarios: 0
Kronikol Version:3.0.83+ab26fa9c690342d2737338029b76c2d104cc118d
Passed: 205 (100%)100%

Filtering

Filters
Status:
Happy Paths:
Duration ≥:
Dependencies:
Details:lines
Apple Cinnamon Muffins Creation
/muffins - Creating apple cinnamon muffins with baking profiles and toppings
A valid apple cinnamon muffin request should return a fresh batch Happy Path 43ms🔗
Steps
Given a valid apple cinnamon muffin recipe with all ingredients (9ms)
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)
When the muffins are prepared (12ms)
Then the muffin response should contain a valid batch with all ingredients (12ms)
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 'Milk' (0ms)
Muffin steps response ingredients should contain 'Eggs' (0ms)
Muffin steps response ingredients should contain '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)
And the cow service should have received a milk request for the muffins (6ms)
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 passed 147ms🔗
#Input ParametersStatusDuration
Recipe NameFlourApple VarietyCinnamon TypeTemperatureDurationPan TypeTopping 1Amount 1Topping 2Amount 2Expected Ingredient CountExpected Topping Count
1ClassicPlain FlourGranny SmithCeylon18025StandardStreuselLightIcing GlazeDrizzle52Passed15ms
2Rustic WholesomeWhole WheatHoneycrispCassia17530Cast IronBrown Sugar CrumbHeavyMaple DrizzleLight52Passed22ms
3Spiced DeluxeAlmondPink LadySaigon19020SiliconeCinnamon SugarHeavyCream Cheese SwirlThick52Passed108ms
Steps
Given a muffin recipe "Classic" with the following ingredients: (4ms)
FlourApplesCinnamon
Plain FlourGranny SmithCeylon
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
And with baking at 180 degrees for 25 minutes in a "Standard" pan (0ms)
And the following muffin toppings: (0ms)
NameAmount
StreuselLight
Icing GlazeDrizzle
When the muffins are prepared (6ms)
Then the muffin batch should have 5 ingredients (0ms)
Muffin steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Muffin steps response ingredients should have count '5' (0ms)
And the muffin response should include 2 toppings (0ms)
Muffin steps response toppings should have count '2' (0ms)
And the muffin response should include baking information (0ms)
Muffin steps response baking temperature should be greater than 0 (0ms)
Diagrams
Details:lines
Muffins endpoint called with an invalid field should return a bad request response 6/6 passed 180ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1ApplesApples is required'Apples' is required.Bad RequestPassed9ms
2Cinnamon<script>alert('xss')</script>XSS in cinnamonCinnamon contains potentially dangerous content.Bad RequestPassed133ms
3CinnamonCinnamon is required'Cinnamon' is required.Bad RequestPassed4ms
4EggsEggs is required'Eggs' is required.Bad RequestPassed17ms
5FlourFlour is required'Flour' is required.Bad RequestPassed5ms
6MilkMilk is required'Milk' is required.Bad RequestPassed10ms
Steps
Given a valid muffin request with "Apples" set to "" (3ms)
When the invalid muffin request is submitted (3ms)
Then the muffin response should contain error "'Apples' is required." with status "Bad Request" (1ms)
Response body should contain ''Apples' is required.' (0ms)
Muffin steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Audit Log Filtering
/audit-logs - Filtering audit logs by entity type and entity ID
Audit logs should be filterable by entity id 865ms🔗
Steps
Given a pancake batch has been created (370ms)
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)
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)
And an order has been created for the batch (414ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When audit logs are requested filtered by entity id (70ms)
Then the audit log response should contain the specific order entry (5ms)
Audit log response status code should be OK (0ms)
Audit logs should contain [ l => l.EntityId == 'aed6327f-e0ba-49ac-a6bb-56866b99ae33' ] (0ms)
Diagrams
Details:lines
Audit logs should be filterable by entity type 72ms🔗
Steps
Given a pancake batch has been created (31ms)
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)
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)
And an order has been created for the batch (15ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When audit logs are requested filtered by entity type (15ms)
Then the audit log response should only contain order entries (7ms)
Audit log response status code should be OK (0ms)
Audit logs should only contain [ l => l.EntityType == AuditLogDefaults.OrderEntityType ] (0ms)
Diagrams
Details:lines
Audit logs should be returned in descending timestamp order 50ms🔗
Steps
Given a pancake batch has been created (19ms)
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)
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)
And an order has been created for the batch (12ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When audit logs are requested filtered by entity type (5ms)
Then the audit logs should be ordered by timestamp descending (11ms)
Audit logs should not be null or empty (0ms)
Audit logs should be in descending order [ l => l.Timestamp ] (0ms)
Diagrams
Details:lines
Filtering audit logs by a non-existent entity type should return an empty collection 28ms🔗
Steps
When audit logs are requested filtered by a non-existent entity type (15ms)
Then the audit log response should be an empty collection (11ms)
Audit log response status code should be OK (0ms)
Audit logs from different time range should be empty (0ms)
Diagrams
Details:lines
Audit Log Retrieval
/audit-logs - Retrieving audit log entries for order operations
Creating an order should produce a retrievable audit log entry Happy Path 200ms🔗
Steps
Given a pancake batch has been created (14ms)
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)
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)
And an order has been created for the batch (10ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When the audit logs are retrieved (123ms)
Then the audit log response should contain the order creation entry (22ms)
Audit steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Audit steps response should contain [ a => a.Action == AuditLogDefaults.CreatedAction && a.EntityType == AuditLogDefaults.OrderEntityType && a.Details.Contains('TestCustomer_3003254498391496470') ] (0ms)
And the cow service should have received a milk request (3ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
And the 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
Breakfast Order
/orders - Creating and managing breakfast orders with event publishing
Creating an order publishes events and notifies the kitchen
A valid order should be created and an event published Happy Path 926ms🔗
Steps
Given a pancake batch has been created (11ms)
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)
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)
And a valid order request for the created batch (0ms)
When the breakfast order is placed (9ms)
Then the order response should contain a complete order (0ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response customer name should be 'TestCustomer_7643611584290268907' (0ms)
Order steps response items should have count 1 (0ms)
And an order created event should have been published (900ms)
Event store should not be null (0ms)
And the 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
Creating an order produces audit and recipe logs
Creating an order should produce an audit log entry and events 345ms🔗
Steps
Given a pancake batch has been created (10ms)
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)
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)
And a valid order request for the created batch (0ms)
When the breakfast order is placed (9ms)
Then the order response should contain a complete order (0ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response customer name should be 'TestCustomer_6447564057217514397' (0ms)
Order steps response items should have count 1 (0ms)
And an order created event should have been published (307ms)
Event store should not be null (0ms)
And a recipe log should have been published to kafka (14ms)
Kafka store should not be null (0ms)
Diagrams
Details:lines
Creating an order writes an outbox message for reliable delivery
Creating an order should write an outbox message that gets processed 162ms🔗
Steps
Given a pancake batch has been created (15ms)
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)
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)
And a valid order request for the created batch (1ms)
When the breakfast order is placed (17ms)
Then the order response should contain a complete order (5ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response customer name should be 'TestCustomer_6937937718522117583' (0ms)
Order steps response items should have count 1 (0ms)
And an outbox message should have been written for the order created event (74ms)
Outbox messages should contain [ m => m.EventType == 'OrderCreatedEvent', $"an outbox message should exist for event type '{eventType}'" ] (0ms)
And the outbox message should have been processed (42ms)
Diagrams
Details:lines
Chef Notes Management
/chef-notes - Creating, retrieving, and updating chef notes (MongoDB)
Creating a chef note should return the created note Happy Path 20ms🔗
Steps
Given a valid chef note request (2ms)
When the note is submitted (4ms)
Then the response should contain the created note (11ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response recipe name should be 'Recipe-be544c9c26a44576a5fd7d3cba7c9b26' (0ms)
Post steps response note text should be "Remember to fold the batter gently to keep it fluffy." (0ms)
Post steps response category should be "Technique" (0ms)
Post steps response note id should not be null or empty (0ms)
Diagrams
Details:lines
Creating a note with missing note text should return bad request 18ms🔗
Steps
Given a note request with missing note text (6ms)
When the note is submitted (5ms)
Then the note response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Creating a note with missing recipe name should return bad request 9ms🔗
Steps
Given a note request with a missing recipe name (1ms)
When the note is submitted (1ms)
Then the note response should indicate bad request (4ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Listing notes by recipe should return matching notes 161ms🔗
Steps
Given a chef note exists (75ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the notes are listed by recipe (61ms)
Then the list response should contain the note (13ms)
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 [ n => n.NoteId == '7abd6d60-c0a1-4424-bf13-a72caaa70e08' ] (0ms)
Diagrams
Details:lines
Retrieving a non-existent note should return not found 14ms🔗
Steps
When a non-existent note is retrieved (12ms)
Then the get response should indicate not found (1ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Retrieving an existing note by id should return the note 95ms🔗
Steps
Given a chef note exists (11ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the note is retrieved by id (72ms)
Then the get response should contain the note (5ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response note id should be 'aacbfe04-b5cf-456d-b37e-0b9cbbb57beb' (0ms)
Get steps response recipe name should be 'Recipe-bc65512658de495c8eb7dc2cba2748c8' (0ms)
Diagrams
Details:lines
Updating a non-existent note should return not found 145ms🔗
Steps
When a non-existent note is updated (142ms)
Then the note update response should indicate not found (1ms)
Patch steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Updating an existing note should return the updated note 73ms🔗
Steps
Given a chef note exists (2ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the note is updated (45ms)
Then the update response should contain the modified note (24ms)
Patch steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Patch steps response note id should be 'feeef16c-fd05-45de-aa0a-5b2f0ffab485' (0ms)
Patch steps response note text should be "Updated: Use unsalted butter for better flavour control." (0ms)
Patch steps response category should be "Ingredients" (0ms)
Patch steps response updated at should not be null (0ms)
Diagrams
Details:lines
Complete Order Lifecycle
/orders - Complete order lifecycle from creation through to completion
An order should progress through all status transitions to completion Happy Path 221ms🔗
Steps
Given a pancake batch has been created (14ms)
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)
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)
And a breakfast order has been placed for the batch (54ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the order progresses through all statuses to completed (47ms)
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)
Then the completed order should be retrievable with all details (57ms)
Get order steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get order steps response order id should be '5fa5add7-6662-4ef4-99bf-60d57db01441' (0ms)
Get order steps response status should be Completed (0ms)
Get order steps response customer name should be 'LifecycleTestCustomer_942288103579178619' (0ms)
And an audit log entry should exist for the order (34ms)
Audit steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Audit steps response should contain [ a => a.Action == AuditLogDefaults.CreatedAction && a.EntityType == AuditLogDefaults.OrderEntityType && a.Details.Contains('LifecycleTestCustomer_942288103579178619') ] (0ms)
And the cow service should have received a milk request (1ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
And the 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
Correlation Id
Cross-cutting - X-Correlation-Id header propagation across API responses
Provided correlation IDs are echoed back
A request with a correlation id should return the same id in the response Happy Path 78ms🔗
Steps
Given a request with a known correlation id (7ms)
When the request is sent to the menu endpoint (57ms)
Then the response should contain the same correlation id (3ms)
Response contains correlation id header should be true (0ms)
First correlation id header value should be '1e349f3e-6944-442a-bbf5-a140db013131' (0ms)
Diagrams
Details:lines
Missing correlation IDs are generated automatically
A request without a correlation id should have one generated in the response 13ms🔗
Steps
When a request without a correlation id is sent to the menu endpoint (4ms)
Then the response should contain a generated correlation id (3ms)
Response contains correlation id header should be true (0ms)
First correlation id header value should not be null or empty (0ms)
Diagrams
Details:lines
Customer Feedback Alert Processing
PubSub → BreakfastProvider → MongoDB + gRPC + HTTP: Customer feedback event consumption and downstream processing
Consuming customer feedback event should trigger downstream processing Happy Path IgnoreIfExternalSut 77ms🔗
Steps
Given a customer feedback received event (4ms)
When the event is published to PubSub (62ms)
Then the feedback ID should be generated (2ms)
Publish steps feedback id should not be Empty (0ms)
And the supplier service should have received the feedback (4ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/ingredients/feedback" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
Details:lines
Customer Preferences Management
/customer-preferences - Managing customer breakfast preferences
Customer preferences support CRUD operations
Saving customer preferences should return the saved preferences Happy Path 23ms🔗
Steps
Given a valid customer preference request (3ms)
When the customer preferences are saved (12ms)
Then the preference response should contain the saved preferences (5ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Put steps response preferred milk type should be "Oat" (0ms)
Put steps response favourite item should be "Blueberry Pancakes" (0ms)
Diagrams
Details:lines
Retrieving existing customer preferences should return the preferences 34ms🔗
Steps
Given customer preferences exist (4ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
When the customer preferences are retrieved (22ms)
Then the preference get response should contain the preferences (5ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response customer id should be '191f8b5d7655429489b7b9886735c061' (0ms)
Get steps response preferred milk type should be "Oat" (0ms)
Get steps response likes extra toppings should be true (0ms)
Diagrams
Details:lines
Non-existent preferences cannot be retrieved
Retrieving non-existent customer preferences should return not found 104ms🔗
Steps
When non-existent customer preferences are retrieved (96ms)
Then the preference get response should indicate not found (1ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Preference requests must pass validation
Saving customer preferences with missing customer name should return bad request 14ms🔗
Steps
Given a customer preference request with missing customer name (5ms)
When the customer preferences are saved (4ms)
Then the preference response should indicate bad request (1ms)
Put steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Customer preferences support CRUD operations
Updating customer preferences should return the updated preferences 128ms🔗
Steps
Given customer preferences exist (105ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
When the customer preferences are updated (14ms)
Then the preference update response should contain the updated values (7ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Put steps response preferred milk type should be "Almond" (0ms)
Put steps response favourite item should be "Belgian Waffles" (0ms)
Diagrams
Details:lines
Daily Specials Idempotency
/daily-specials/orders - Idempotent order creation using Idempotency-Key header
Submitting the same order with different idempotency keys should return different confirmations 153ms🔗
Steps
Given the cinnamon swirl order count is reset (36ms)
And an order request for the same special (2ms)
When the order is submitted with two different idempotency keys (108ms)
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)
Then the responses should have different confirmation ids (1ms)
First confirmation id should not be 'accfe792-18d8-4c96-a61e-cfcdf9dd9b29' (0ms)
Diagrams
Details:lines
Submitting the same order with the same idempotency key should return the same confirmation 22ms🔗
Steps
Given the cinnamon swirl order count is reset (36ms)
And an order request with an idempotency key (2ms)
When the order is submitted twice with the same idempotency key (13ms)
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)
Then both responses should return the same confirmation id (1ms)
First confirmation id should be '79233e77-f000-44a7-aa41-386c5916eb32' (0ms)
Diagrams
Details:lines
Daily Specials Not Found
/daily-specials/orders - Ordering a non-existent daily special
Ordering a non-existent daily special should return not found 76ms🔗
Steps
Given a daily special order request for a non-existent special (4ms)
When the daily special order is submitted (57ms)
Then the daily special response should indicate not found (7ms)
Post steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Daily Specials Ordering
/daily-specials - Ordering daily specials with threshold limits
Valid daily special orders are fulfilled
A valid daily special order should return a confirmation Happy Path 20ms🔗
Steps
Given the cinnamon swirl order count is reset (1ms)
And a valid daily special order request for cinnamon swirl (4ms)
When the daily special order is submitted (3ms)
Then the daily special order response should contain a valid confirmation (4ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response special id should be CinnamonSwirlId (0ms)
Post steps response order confirmation id should not be empty (0ms)
Diagrams
Details:lines
Orders are rejected when the daily limit is reached
Ordering a daily special beyond the threshold should return a conflict response IgnoreIfExternalSut 30ms🔗
Steps
Given the matcha waffles order count is reset (3ms)
And the matcha waffles special has been ordered up to the configured limit (6ms)
Post steps response message status code should be Created (0ms)
When another order is placed for the matcha waffles special (11ms)
Then the response should indicate the daily special is sold out (7ms)
Post steps response message status code should be Conflict (0ms)
Diagrams
Details:lines
Remaining quantity decreases with each order
Remaining quantity should decrease after each order IgnoreIfExternalSut 22ms🔗
Steps
Given the lemon ricotta order count is reset (4ms)
And a daily special order for lemon ricotta of quantity one is placed (5ms)
Post steps response message status code should be Created (0ms)
When the available daily specials are requested (1ms)
Then the lemon ricotta special should have one fewer remaining (9ms)
Response content is valid json should be true (0ms)
Lemon ricotta remaining quantity should be MaxOrdersPerSpecial - 1 (0ms)
Diagrams
Details:lines
Valid daily special orders are fulfilled
The daily specials endpoint should return all available specials 30ms🔗
Steps
When the available daily specials are requested (17ms)
Then the daily specials response should contain all expected specials (11ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response should have count ExpectedSpecialsCount (0ms)
Diagrams
Details:lines
Daily Specials Validation
/daily-specials/orders - Input validation for daily special orders
Daily specials order endpoint is called with invalid fields should return a bad request response 2/2 passed 34ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Quantity0Quantity must be > zeroQuantity must be greater than zero.Bad RequestPassed26ms
2SpecialIdSpecialId is required'Special Id' is required.Bad RequestPassed8ms
Steps
Given a valid daily special order request with "Quantity" set to "0" (4ms)
When the invalid daily special order request is submitted (10ms)
Then the daily special response should contain error "Quantity must be greater than zero." with status "Bad Request" (7ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Quantity must be greater than zero.') ] (0ms)
Diagrams
Details:lines
Degraded Health Check
/health - Health check endpoint reporting degraded status when downstream services are unavailable
Health check should report degraded when multiple downstream services are unavailable SkipUnlessFakesControllable 202ms🔗
Steps
Given the cow service is configured to be unreachable (2ms)
And the supplier service is configured to be unreachable (1ms)
When the health check endpoint is called (186ms)
Then the health check response should indicate a degraded status (3ms)
Health response status code should be OK (0ms)
Health check result status should be Degraded (0ms)
And the cow service dependency should report degraded (2ms)
Health check result results should contain key CowService (0ms)
Cow service health status should be Degraded (0ms)
And the supplier service dependency should report degraded (2ms)
Health check result results should contain key SupplierService (0ms)
Supplier service health status should be Degraded (0ms)
Diagrams
Details:lines
Health check should report degraded when the cow service is unavailable SkipUnlessFakesControllable 219ms🔗
Steps
Given the cow service is configured to be unreachable (0ms)
When the health check endpoint is called (211ms)
Then the health check response should indicate a degraded status (0ms)
Health response status code should be OK (0ms)
Health check result status should be Degraded (0ms)
And the cow service dependency should report degraded (0ms)
Health check result results should contain key CowService (0ms)
Cow service health status should be Degraded (0ms)
Diagrams
Details:lines
Downstream Error Health Check
/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 SkipUnlessFakesControllable 215ms🔗
Steps
Given the kitchen service health check is configured to use a failing endpoint (178ms)
When the health check endpoint is called (27ms)
Then the health check response should indicate a degraded status (0ms)
Health response status code should be OK (0ms)
Health check result status should be Degraded (0ms)
And the kitchen service dependency should report degraded with a status code description (5ms)
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
Equipment Alerts
/graphql - Querying equipment alerts populated by Event Hub consumption
Equipment alerts should contain data ingested via Event Hub consumer Happy Path 76ms🔗
Steps
Given a pancake batch has been created (17ms)
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)
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)
When the equipment alerts are queried via graphql (18ms)
Then the graphql response should contain the equipment alert record (32ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps equipment alerts should contain [ a => a.BatchId == '7eae8b2e-5ad3-4671-b3be-7646b844b6b7' && a.EquipmentName == "Griddle" && a.AlertType == "UsageCycleCompleted" ] (0ms)
Diagrams
Details:lines
Equipment Readings Monitoring
/equipment-readings - Recording and monitoring kitchen equipment readings (ClickHouse)
Recording an equipment reading should return the created record Happy Path 147ms🔗
Steps
Given a valid equipment reading request (3ms)
When the equipment reading is recorded (107ms)
Then the reading response should contain the created record (24ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response equipment id should be 'Oven-5f81d0099129458d9280f7e33675eab5' (0ms)
Post steps response value should be '5m' (0ms)
Post steps response reading id should not be null or empty (0ms)
Diagrams
Details:lines
Deleting a reading should remove it from the list 47ms🔗
Steps
Given an equipment reading record has been created (8ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the reading is deleted (26ms)
Then the reading delete response should indicate no content (1ms)
Delete steps response message status code should be NoContent (0ms)
And the reading should no longer be listed (8ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps list response should not contain [ r => r.ReadingId == '715de419-87b8-473d-b48d-8a149b98ed82' ] (0ms)
Diagrams
Details:lines
Listing readings by equipment should return matching records 119ms🔗
Steps
Given an equipment reading record has been created (38ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the readings are listed by equipment (58ms)
Then the reading list response should contain the record (18ms)
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.ReadingId == '6555adb5-3760-4367-89e4-cfd6080e452d' ] (0ms)
Diagrams
Details:lines
Recording a reading with missing metric should return bad request 17ms🔗
Steps
Given an equipment reading request with a missing metric (1ms)
When the equipment reading is recorded (7ms)
Then the reading post response should indicate bad request (5ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Recording a reading with zero value should return bad request 19ms🔗
Steps
Given an equipment reading request with zero value (2ms)
When the equipment reading is recorded (15ms)
Then the reading post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Feedback Management
/feedback - Submitting and retrieving customer feedback
Feedback can be submitted and retrieved
Submitting feedback should return the created feedback Happy Path 26ms🔗
Steps
Given a valid feedback request (0ms)
When the feedback is submitted (16ms)
Then the feedback response should contain the created feedback (5ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response customer name should be 'CustomerName' (0ms)
Post steps response rating should be 4 (0ms)
Diagrams
Details:lines
Listing feedback for an order should return the feedback 1.7s🔗
Steps
Given a feedback entry exists (1.2s)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the feedback is retrieved by order id (518ms)
Then the feedback list response should contain the feedback (12ms)
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 [ f => f.FeedbackId == '1619ab39-0a72-4970-a82b-e4ef1e25a846' ] (0ms)
Diagrams
Details:lines
Retrieving existing feedback by id should return the feedback 31ms🔗
Steps
Given a feedback entry exists (4ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the feedback is retrieved by id (14ms)
Then the feedback get response should contain the feedback (10ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response feedback id should be 'aff54994-384e-45c6-b100-636da89c1e94' (0ms)
Get steps response customer name should be 'CustomerName' (0ms)
Get steps response rating should be 4 (0ms)
Diagrams
Details:lines
Non-existent feedback cannot be retrieved
Retrieving non-existent feedback should return not found 60ms🔗
Steps
When a non-existent feedback is retrieved (51ms)
Then the feedback get response should indicate not found (7ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Feedback requests must pass validation
Submitting feedback with invalid rating should return bad request 8ms🔗
Steps
Given a feedback request with an invalid rating (2ms)
When the feedback is submitted (4ms)
Then the 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 11ms🔗
Steps
Given a feedback request with missing customer name (3ms)
When the feedback is submitted (4ms)
Then the feedback response should indicate bad request (1ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Goat Milk Downstream Failure
/goat-milk - Handling downstream Goat Service failures
Requesting goat milk when the goat service is unavailable should return a bad gateway response SkipUnlessFakesControllable 126ms🔗
Steps
Given the goat service will return service unavailable (4ms)
When goat milk is requested (106ms)
Then the goat milk response should indicate a bad gateway (10ms)
Goat milk steps response message status code should be BadGateway (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 SkipUnlessFakesControllable 30ms🔗
Steps
Given the goat service will return an invalid response (10ms)
When goat milk is requested (16ms)
Then the goat milk response should indicate a bad gateway (0ms)
Goat milk steps response message status code should be BadGateway (0ms)
Goat milk error response body should contain GoatServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Goat Milk Feature Flag
/goat-milk - Goat milk availability controlled by feature flag
Goat milk is available when the feature flag is enabled
Goat milk endpoint should return fresh goat milk when feature is enabled IgnoreIfExternalSut 264ms🔗
Steps
Given the goat milk feature flag is enabled (172ms)
When goat milk is requested (57ms)
Then the goat milk response should contain fresh goat milk (32ms)
Goat milk steps response message status code should be OK (0ms)
Goat milk steps goat milk response goat milk should be FreshGoatMilk (0ms)
Diagrams
Details:lines
Goat milk is hidden when the feature flag is disabled
Goat milk endpoint should return not found when feature is disabled IgnoreIfExternalSut 212ms🔗
Steps
Given the goat milk feature flag is disabled (174ms)
When goat milk is requested (27ms)
Then the goat milk response should indicate feature disabled (3ms)
Goat milk steps response message status code should be NotFound (0ms)
Goat milk feature disabled response body should contain FeatureDisabled (0ms)
Diagrams
Details:lines
Goat Milk Sourcing
/goat-milk - Retrieving goat milk from the Goat Service
A valid goat milk request should return fresh goat milk Happy Path 7ms🔗
Steps
When goat milk is requested (3ms)
Then the goat milk response should contain fresh goat milk (0ms)
Goat milk steps response message status code should be OK (0ms)
Goat milk steps goat milk response goat milk should be FreshGoatMilk (0ms)
Diagrams
Details:lines
Header Propagation
/milk; /menu - X-Correlation-Id header propagation to downstream services
A request with a correlation id should forward it to the cow service Happy Path SkipUnlessFakesControllable 9ms🔗
Steps
Given a request with a known correlation id (0ms)
When milk is requested with the correlation id (5ms)
Then the cow service should have received the correlation id (1ms)
Requests should not be empty (0ms)
Request headers should contain key CorrelationId (0ms)
Request headers[ custom headers correlation id] should be 'a777c4ba-f3b5-4b36-af73-85a5ae142b60' (0ms)
Diagrams
Details:lines
A request with a correlation id should forward it to the supplier service SkipUnlessFakesControllable 27ms🔗
Steps
Given a request with a known correlation id (0ms)
And the menu cache is cleared (13ms)
When the menu is requested with the correlation id (6ms)
Then the supplier service should have received the correlation id (3ms)
Requests should not be empty (0ms)
Request headers should contain key CorrelationId (0ms)
Request headers[ custom headers correlation id] should be '202118c9-987f-4df0-ada9-a32491eebba9' (0ms)
Diagrams
Details:lines
Health Check
/health - Health check endpoint with dependency status for monitoring
The health check endpoint should return a healthy status with dependency details Happy Path 31ms🔗
Steps
When the health check endpoint is called (7ms)
Then the health check response should indicate healthy with all dependencies (18ms)
Health response status code should be OK (0ms)
Health check result should not be null (0ms)
Health check result status should be Healthy (0ms)
Health check result results should contain key CowService (0ms)
Health check result results should contain key GoatService (0ms)
Health check result results should contain key SupplierService (0ms)
Health check result results should contain key KitchenService (0ms)
Health check result results should contain key CosmosDb (0ms)
Health check result results should contain key Kafka (0ms)
Diagrams
Details:lines
Health Check Detail
/health - Health check response includes detailed entry descriptions and data
The health check response should include description and data for each entry 162ms🔗
Steps
When the health check endpoint is called (124ms)
Then the health check response should contain detailed entries (33ms)
Health response status code should be OK (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check result results should contain key 'CowService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check result results should contain key 'GoatService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check result results should contain key 'SupplierService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check result results should contain key 'KitchenService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Diagrams
Details:lines
Heartbeat
/heartbeat - Heartbeat endpoint confirming the service is running
The heartbeat endpoint should return a running message Happy Path 20ms🔗
Steps
When the heartbeat endpoint is called (7ms)
Then the heartbeat response should indicate the service is running (7ms)
Heartbeat response status code should be OK (0ms)
Result should not be null (0ms)
Result status should be HeartbeatStatus (0ms)
Diagrams
Details:lines
Ingredient Usage Analytics
/ingredient-usage - Recording and summarising ingredient usage (BigQuery)
Recording ingredient usage should return the created record Happy Path 25ms🔗
Steps
Given a valid ingredient usage request (3ms)
When the ingredient usage is recorded (7ms)
Then the usage response should contain the created record (11ms)
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-bcfbbe2fd5634bd58d9982b71a738284' (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 114ms🔗
Steps
Given an ingredient usage record has been created (7ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the usage summary is requested (93ms)
Then the summary should contain aggregated data (10ms)
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-d75d667875a84e18a8b480d7f46e4ec9' ] (0ms)
Diagrams
Details:lines
Listing usage by ingredient should return matching records 589ms🔗
Steps
Given an ingredient usage record has been created (60ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the usage is listed by ingredient name (504ms)
Then the usage list response should contain the record (20ms)
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-d9ee22e7f57f443592d3381a365a949c' ] (0ms)
Diagrams
Details:lines
Recording usage with missing ingredient name should return bad request 495ms🔗
Steps
Given an ingredient usage request with a missing ingredient name (40ms)
When the ingredient usage is recorded (399ms)
Then the usage post response should indicate bad request (4ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Recording usage with zero quantity should return bad request 8ms🔗
Steps
Given an ingredient usage request with zero quantity (4ms)
When the ingredient usage is recorded (1ms)
Then the usage post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Ingredient Waste Tracking
/ingredient-waste - Recording and managing ingredient waste (BigQuery)
Recording ingredient waste should return the created record Happy Path 22ms🔗
Steps
Given a valid ingredient waste request (0ms)
When the waste is recorded (13ms)
Then the waste response should contain the created record (5ms)
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 not be null or empty (0ms)
Post steps response quantity wasted should be '5m' (0ms)
Post steps response waste id should not be null or empty (0ms)
Post steps response reason should be "Expired before use" (0ms)
Diagrams
Details:lines
Deleting a waste record should return no content 63ms🔗
Steps
Given an ingredient waste record has been created (17ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the waste record is deleted (43ms)
Then the delete response should indicate no content (1ms)
Delete steps response message status code should be NoContent (0ms)
Diagrams
Details:lines
Listing waste by recipe should return matching records 556ms🔗
Steps
Given an ingredient waste record has been created (55ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the waste is listed by recipe (476ms)
Then the waste list response should contain the record (19ms)
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 [ w => w.WasteId == '4544d809-3a77-4d39-807a-0fe25ce03b0c' ] (0ms)
Diagrams
Details:lines
Recording waste with missing ingredient name should return bad request 9ms🔗
Steps
Given a waste request with a missing ingredient name (1ms)
When the waste is recorded (5ms)
Then the waste post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Recording waste with missing reason should return bad request 11ms🔗
Steps
Given a waste request with a missing reason (1ms)
When the waste is recorded (7ms)
Then the waste post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Recording waste with zero quantity should return bad request 24ms🔗
Steps
Given a waste request with zero quantity (4ms)
When the waste is recorded (15ms)
Then the waste post response should indicate bad request (1ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Inventory Management
/inventory - Managing ingredient inventory with full CRUD operations
Inventory items support full CRUD operations
Adding a new inventory item should return the created item Happy Path 11ms🔗
Steps
Given a valid inventory item request (0ms)
When the inventory item is submitted (5ms)
Then the inventory response should contain the created item (4ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response name should be 'Name' (0ms)
Post steps response category should be "Dry Goods" (0ms)
Diagrams
Details:lines
Deleting an inventory item should return no content 100ms🔗
Steps
Given an inventory item exists (8ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the inventory item is deleted (87ms)
Then the inventory delete response should indicate no content (2ms)
Delete steps response message status code should be NoContent (0ms)
Diagrams
Details:lines
Listing all inventory items should return all items 133ms🔗
Steps
Given an inventory item exists (28ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When all inventory items are requested (92ms)
Then the inventory list response should contain the item (11ms)
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 [ i => i.Id == '2' ] (0ms)
Diagrams
Details:lines
Non-existent inventory items cannot be retrieved
Retrieving a non-existent inventory item should return not found 7ms🔗
Steps
When a non-existent inventory item is retrieved (4ms)
Then the inventory get response should indicate not found (1ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Inventory items support full CRUD operations
Retrieving an existing inventory item should return the item 1.6s🔗
Steps
Given an inventory item exists (843ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the inventory item is retrieved by id (699ms)
Then the inventory get response should contain the item (23ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (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 88ms🔗
Steps
Given an inventory item exists (18ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the inventory item is updated (62ms)
Then the inventory update response should contain the updated values (5ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Put steps response category should be "Updated Category" (0ms)
Diagrams
Details:lines
Kitchen Service Failure
/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 SkipUnlessFakesControllable 86ms🔗
Steps
Given a pancake batch has been created (14ms)
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)
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)
And a valid order request for the created batch (1ms)
And the kitchen service is configured to return busy (1ms)
When the breakfast order is placed (50ms)
Then the order should still be created successfully despite the kitchen failure (6ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
Diagrams
Details:lines
Menu Availability
/menu - Checking menu item availability from ingredient sources
The menu endpoint should return all menu items with availability status Happy Path MenuAvailability 261ms🔗
Steps
When the menu is requested (53ms)
Then the menu response should contain all menu items (14ms)
Menu steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Menu steps response should contain [ m => m.Name == MenuDefaults.ClassicPancakes ] (0ms)
Menu steps response should contain [ m => m.Name == MenuDefaults.BelgianWaffles ] (0ms)
Menu steps response should contain [ m => m.Name == MenuDefaults.GoatMilkPancakes ] (0ms)
Diagrams
Details:lines
Menu Caching
/menu - Menu response caching behaviour
Menu responses should be cached and returned even when supplier becomes unavailable SkipUnlessFakesControllable MenuCaching 247ms🔗
Steps
Given the menu has been requested and cached (65ms)
Menu steps response message status code should be OK (0ms)
And the supplier service is then made unavailable (4ms)
When the menu is requested again (12ms)
Then the menu response should still return available items (5ms)
Steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Steps response should contain [ m => m.IsAvailable ] (0ms)
Diagrams
Details:lines
Menu Downstream Failure
/menu - Menu behaviour when Supplier Service is unavailable
All menu items should be marked unavailable when the supplier service is down SkipUnlessFakesControllable MenuDownstreamFailure 360ms🔗
Steps
Given the supplier service will return service unavailable (27ms)
When the menu is requested (57ms)
Then the menu response should mark all items as unavailable (15ms)
Menu steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Menu steps response should only contain [ m => m.IsAvailable == false ] (0ms)
Diagrams
Details:lines
Milk Downstream Failure
/milk - Handling downstream Cow Service failures
Requesting milk when the cow service is unavailable should return a bad gateway response SkipUnlessFakesControllable 10ms🔗
Steps
Given the cow service will return service unavailable (1ms)
When milk is requested (4ms)
Then the milk response should indicate a bad gateway (0ms)
Milk steps response message status code should be BadGateway (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 SkipUnlessFakesControllable 21ms🔗
Steps
Given the cow service will return an invalid response (1ms)
When milk is requested (6ms)
Then the milk response should indicate a bad gateway (4ms)
Milk steps response message status code should be BadGateway (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 SkipUnlessFakesControllable 9ms🔗
Steps
Given the cow service will return a timeout (0ms)
When milk is requested (6ms)
Then the milk response should indicate a bad gateway (0ms)
Milk steps response message status code should be BadGateway (0ms)
Milk error response body should contain CowServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Order Cross Field Validation
/orders - Cross-field validation with configurable item limits
An order at the maximum items per order should be accepted IgnoreIfExternalSut 267ms🔗
Steps
Given the maximum items per order is configured to two (157ms)
And a pancake batch has been created (57ms)
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)
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)
And an order request with two items (1ms)
When the order is submitted (44ms)
Then the response should indicate success (2ms)
Order steps response message status code should be Created (0ms)
Diagrams
Details:lines
An order exceeding the maximum items per order should be rejected IgnoreIfExternalSut 133ms🔗
Steps
Given the maximum items per order is configured to two (157ms)
And a pancake batch has been created (57ms)
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)
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)
And an order request with three items (1ms)
When the order is submitted (16ms)
Then the response should indicate a validation error (1ms)
Order steps response message status code should be BadRequest (0ms)
And the error message should reference the item limit (3ms)
Order validation error response body should contain "Items" (0ms)
Diagrams
Details:lines
Order Pagination
/orders - Paginated listing of breakfast orders
Listing orders should return a paginated response Happy Path 135ms🔗
Steps
Given multiple orders have been created (73ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response message status code should be Created (0ms)
Order steps response message status code should be Created (0ms)
When orders are listed with default pagination (50ms)
Then the paginated response should contain the orders (8ms)
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 greater than or equal to '2' (0ms)
And the paginated response should have correct page metadata (0ms)
Response content is valid json should be true (0ms)
List steps response page should be greater than or equal to 1 (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 IgnoreIfNeedsDirectDbAccess IgnoreUnlessInMemoryDb 75ms🔗
Steps
When orders are listed with default pagination (67ms)
Then the paginated response should be empty (5ms)
List steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Diagrams
Details:lines
Listing orders with a small page size should limit results 285ms🔗
Steps
Given multiple orders have been created (244ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response message status code should be Created (0ms)
Order steps response message status code should be Created (0ms)
When orders are listed with page 1 and page size 1 (38ms)
Then the paginated response should have correct page metadata (0ms)
Response content is valid json should be true (0ms)
List steps response page should be greater than or equal to 1 (0ms)
List steps response total count should be greater than or equal to '2' (0ms)
Diagrams
Details:lines
Requesting the second page should return different orders 237ms🔗
Steps
Given multiple orders have been created (81ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response message status code should be Created (0ms)
Order steps response message status code should be Created (0ms)
When orders are listed with page 2 and page size 1 (139ms)
Then the paginated response should have correct page metadata (9ms)
Response content is valid json should be true (0ms)
List steps response page should be greater than or equal to 1 (0ms)
List steps response total count should be greater than or equal to '2' (0ms)
Diagrams
Details:lines
Order Rate Limiting
/orders - Rate limiting on order creation
Exceeding the rate limit should return too many requests IgnoreIfExternalSut 427ms🔗
Steps
Given the rate limit is configured to allow one request per window (157ms)
And a pancake batch has been created (189ms)
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)
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)
And a valid order request (1ms)
When the order is submitted twice in rapid succession (65ms)
Then the first request should succeed (6ms)
First response status code should be Created (0ms)
And the second request should be rate limited (1ms)
Second response status code should be TooManyRequests (0ms)
Diagrams
Details:lines
Order Retrieval
/orders - Retrieving orders by ID
Existing orders can be retrieved
A created order should be retrievable by its ID Happy Path IgnoreIfNeedsEventInfrastructure 110ms🔗
Steps
Given an order has been created (90ms)
Response content is valid json should be true (0ms)
Response content is valid json should be true (0ms)
When the order is retrieved by id (9ms)
Then the order retrieval response should contain the order (6ms)
Get order steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get order steps response order id should be '108a1cc6-e4e0-4455-8ea6-b26cb3978ec0' (0ms)
Diagrams
Details:lines
Non-existent orders return not found
Retrieving a non-existent order should return not found 17ms🔗
Steps
When a non-existent order is retrieved (5ms)
Then the order retrieval response should indicate not found (1ms)
Get order steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Order Status Transition
/orders - Order status transitions following the order lifecycle
Valid status transitions are accepted
A valid status transition should update the order 4/4 passed 174ms🔗
#Input ParametersStatusDuration
From StatusTo Status
1CreatedCancelledPassed24ms
2CreatedPreparingPassed26ms
3PreparingReadyPassed34ms
4ReadyCompletedPassed88ms
Steps
Given an order exists with status "Created" (18ms)
Response content is valid json should be true (0ms)
Response content is valid json should be true (0ms)
When the order status is updated to "Cancelled" (4ms)
Then the order status should be updated successfully to "Cancelled" (0ms)
Patch steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Patch steps response status should be 'Cancelled' (0ms)
Diagrams
Details:lines
Invalid status transitions are rejected
An invalid status transition should return a conflict response 7/7 passed 302ms🔗
#Input ParametersStatusDuration
From StatusTo Status
1CancelledPreparingPassed34ms
2CancelledReadyPassed39ms
3CompletedPreparingPassed61ms
4CreatedCompletedPassed48ms
5CreatedReadyPassed30ms
6PreparingCancelledPassed53ms
7ReadyPreparingPassed34ms
Steps
Given an order exists with status "Cancelled" (27ms)
Response content is valid json should be true (0ms)
Response content is valid json should be true (0ms)
Patch steps response message status code should be OK (0ms)
When the order status is updated to "Preparing" (2ms)
Then the response should indicate an invalid state transition (0ms)
Patch steps response message status code should be Conflict (0ms)
Diagrams
Details:lines
Order Status Via G RPC
/grpc - Retrieving order status via gRPC
Order status via gRPC should return order details Happy Path 60ms🔗
Steps
Given a pancake batch has been created (30ms)
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)
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)
And an order has been created for the batch (13ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When the order status is requested via gRPC (11ms)
Then the gRPC response should contain the order details (3ms)
Grpc steps order status reply should not be null (0ms)
Grpc steps order status reply order id should be orderSteps.Response.OrderId.ToString() (0ms)
Grpc steps order status reply customer name should be 'TestCustomer_5203206899910891560' (0ms)
Grpc steps order status reply status should be Created (0ms)
Diagrams
Details:lines
Order status for non-existent order should return not found 98ms🔗
Steps
When the order status for a non-existent order is requested via gRPC (86ms)
Then the gRPC response should be a not found error (6ms)
Grpc steps rpc exception should not be null (0ms)
Grpc steps rpc exception status code should be NotFound (0ms)
Diagrams
Details:lines
Order Summaries
/graphql - Querying order summary reports via GraphQL
Order summaries should contain ingested order data Happy Path IgnoreIfNeedsDirectDbAccess 1.2s🔗
Steps
Given an order has been created and ingested into the reporting database (69ms)
When the order summaries are queried via graphql (1.1s)
Then the graphql response should contain the ingested order summary (14ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps order summaries should contain [ o => o.OrderId == '237721f2-388b-4d3d-bda4-f16a689b8486' && o.CustomerName == 'TestCustomer_6361274405633543047' && o.ItemCount == 3 && o.TableNumber == 7 ] (0ms)
Diagrams
Details:lines
Order summaries should return an empty list when no orders exist 32ms🔗
Steps
When the order summaries are queried via graphql (18ms)
Then the graphql response should be successful (3ms)
Graph ql steps response message status code should be OK (0ms)
And the order summaries list should be empty or not contain the test order (9ms)
Graph ql steps order summaries should not contain [ o => o.OrderId == 'f2b13e1d-5788-49c8-8ebd-c1022130d916' ] (0ms)
Diagrams
Details:lines
Order Timings Analytics
/order-timings - Recording and summarising kitchen order timings (ClickHouse)
Recording an order timing should return the created record Happy Path 489ms🔗
Steps
Given a valid order timing request (36ms)
When the order timing is recorded (430ms)
Then the timing response should contain the created record (19ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response station should be 'Griddle-e49741c5daa44762a0497c7ae34e0c50' (0ms)
Post steps response prep seconds should be '5m' (0ms)
Post steps response timing id should not be null or empty (0ms)
Diagrams
Details:lines
Getting the timing summary should return aggregated data 96ms🔗
Steps
Given an order timing record has been created (9ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the timing summary is requested (74ms)
Then the summary should contain aggregated data for the station (10ms)
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.Station == 'Griddle-78dfe54d0ab4442cabd0716ff33960cf' && s.TimingCount >= 1 ] (0ms)
Diagrams
Details:lines
Listing timings by station should return matching records 142ms🔗
Steps
Given an order timing record has been created (16ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the timings are listed by station (116ms)
Then the timing list response should contain the record (7ms)
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 [ t => t.TimingId == '3aeead0f-fc66-4e0d-884c-bb7ac8eca9ac' ] (0ms)
Diagrams
Details:lines
Recording a timing with missing station should return bad request 10ms🔗
Steps
Given an order timing request with a missing station (3ms)
When the order timing is recorded (1ms)
Then the timing post response should indicate bad request (3ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Recording a timing with zero prep seconds should return bad request 21ms🔗
Steps
Given an order timing request with zero prep seconds (4ms)
When the order timing is recorded (13ms)
Then the timing post response should indicate bad request (2ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Order Validation
/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 passed 21ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1StatusStatus is required'Status' is required.Bad RequestPassed21ms
Steps
Given a valid status update request with "Status" set to "" (2ms)
When the invalid status update request is submitted (6ms)
Then the status update response should contain error "'Status' is required." with status "Bad Request" (10ms)
Actual results should contain [ r => r.ErrorMessage.Contains(''Status' is required.') ] (0ms)
Diagrams
Details:lines
Orders endpoint is called with invalid fields should return a bad request response 5/5 passed 78ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1CustomerNameCustomer name is required'Customer Name' is required.Bad RequestPassed21ms
2Items[0].BatchIdBatch ID is required'Batch Id' is required.Bad RequestPassed7ms
3Items[0].ItemTypeItem type is required'Item Type' is required.Bad RequestPassed34ms
4Items[0].Quantity0Quantity must be greater than zeroQuantity must be greater than zero.Bad RequestPassed8ms
5ItemsAt least one item is requiredThe Items field is required.Bad RequestPassed5ms
Steps
Given a valid order request with "CustomerName" set to "" (7ms)
When the invalid order request is submitted (4ms)
Then the order response should contain error "'Customer Name' is required." with status "Bad Request" (5ms)
Actual results should contain [ r => r.ErrorMessage.Contains(''Customer Name' is required.') ] (0ms)
Diagrams
Details:lines
Outbox Retry Exhaustion
/orders - Outbox message transitions to failed after exhausting retries
An outbox message should transition to failed after exhausting retries IgnoreIfNeedsEventInfrastructure 1.2s🔗
Steps
Given the outbox processor is configured with a failing dispatcher (172ms)
And a pending outbox message with a test-specific destination (4ms)
Then the outbox message should be in a failed state (1.0s)
Sequence Diagrams
Details:lines
Pancakes Content Negotiation
/pancakes - Content negotiation and unsupported media types
Sending a request with an unsupported content type should return an unsupported media type response 3/3 passed 33ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed21ms
2text/htmlPassed4ms
3text/plainPassed7ms
Steps
Given a pancake request with content type "application/xml" (1ms)
When the pancakes are prepared with the given content type (6ms)
Then the response should indicate unsupported media type (4ms)
Response status code should be UnsupportedMediaType (0ms)
Diagrams
Details:lines
Pancakes Creation
/pancakes - Creating pancakes with ingredients and optional toppings
A valid pancake request should return a fresh batch Happy Path 48ms🔗
Steps
Given a valid pancake recipe with all ingredients (12ms)
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)
When the pancakes are prepared (13ms)
Then the pancakes response should contain a valid batch with all ingredients (6ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response ingredients should contain 'Milk' (0ms)
Pancake steps response ingredients should contain 'Eggs' (0ms)
Pancake steps response ingredients should contain 'Flour' (0ms)
And the 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 pancake request with more toppings than allowed should return a bad request response IgnoreIfExternalSut 25ms🔗
Steps
Given the max toppings per item is the configured limit (0ms)
And a valid pancake recipe with all ingredients (9ms)
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)
And the request has more toppings than the configured limit (2ms)
When the pancakes are prepared (3ms)
Then the pancakes response should indicate too many toppings (6ms)
Pancake steps response message status code should be BadRequest (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 6/6 passed 112ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1EggsEggs is required'Eggs' is required.Bad RequestPassed9ms
2Eggsjavascript:void(0)XSS in eggsEggs contains potentially dangerous content.Bad RequestPassed7ms
3Flour<img onerror=x>XSS in flourFlour contains potentially dangerous content.Bad RequestPassed4ms
4FlourFlour is required'Flour' is required.Bad RequestPassed34ms
5Milk<script>alert</script>XSS in milkMilk contains potentially dangerous content.Bad RequestPassed42ms
6MilkMilk is required'Milk' is required.Bad RequestPassed13ms
Steps
Given a valid pancake request with "Eggs" set to "" (0ms)
When the invalid pancake request is submitted (6ms)
Then the response should contain error "'Eggs' is required." with status "Bad Request" (0ms)
Actual results should contain [ r => r.ErrorMessage.Contains(''Eggs' is required.') ] (0ms)
Diagrams
Details:lines
Recipe Cost Analysis Processing
Kafka → BreakfastProvider → BigQuery + gRPC + HTTP: Recipe cost event consumption and downstream processing
Consuming recipe cost event should trigger downstream processing Happy Path IgnoreIfExternalSut 1.1s🔗
Steps
Given a recipe cost calculated event (40ms)
When the event is published to Kafka (981ms)
Then the calculation ID should be generated (4ms)
Publish steps calculation id should not be Empty (0ms)
And the kitchen service should have received the preparation request (14ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
Details:lines
Recipe Reports
/graphql - Querying recipe reports and aggregations via GraphQL
Recipe reports should contain ingested recipe data Happy Path IgnoreIfNeedsDirectDbAccess 61ms🔗
Steps
Given recipe logs have been ingested into the reporting database (4ms)
When the recipe reports are queried via graphql (28ms)
Then the graphql response should contain the ingested recipe reports (26ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps recipe reports should contain [ r => r.OrderId == '16470a1d-2f9f-4883-adaa-d100791f6b8c' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ] (0ms)
Diagrams
Details:lines
Ingredient usage should aggregate across multiple recipes IgnoreIfNeedsDirectDbAccess 1.5s🔗
Steps
Given multiple recipe logs have been ingested with overlapping ingredients (71ms)
When the ingredient usage is queried via graphql (1.4s)
Then the ingredient usage should reflect aggregated counts (16ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps ingredient usage should contain [ i => i.Ingredient == "Milk" && i.Count >= 2 ] (0ms)
Graph ql steps ingredient usage should contain [ i => i.Ingredient == "Butter" && i.Count >= 1 ] (0ms)
Diagrams
Details:lines
Recipe Reviews Management
/recipe-reviews - Submitting and retrieving recipe reviews (MongoDB)
Submitting a recipe review should return the created review Happy Path 252ms🔗
Steps
Given a valid recipe review request (3ms)
When the recipe review is submitted (225ms)
Then the recipe review response should contain the created review (19ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response recipe name should be 'Recipe-fcb7aede71f44d7597f91300c7b9c638' (0ms)
Post steps response rating should be 5 (0ms)
Post steps response review id should not be null or empty (0ms)
Diagrams
Details:lines
Listing reviews by recipe should return matching reviews 400ms🔗
Steps
Given a recipe review has been created (21ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the reviews are listed by recipe name (352ms)
Then the list response should contain the review (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 [ r => r.ReviewId == 'c0e6438a-d544-44fa-8e5b-571d0a8b5265' ] (0ms)
Diagrams
Details:lines
Retrieving a non-existent review should return not found 62ms🔗
Steps
When a non-existent review is retrieved (60ms)
Then the review get response should indicate not found (1ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Retrieving existing review by id should return the review 33ms🔗
Steps
Given a recipe review has been created (3ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the review is retrieved by id (8ms)
Then the get response should contain the review (20ms)
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 '4ff79c38-98d9-4a14-ab87-3d03887cd157' (0ms)
Get steps response recipe name should be 'Recipe-28af40c8cb204140991184910de2f18e' (0ms)
Diagrams
Details:lines
Submitting a review with an invalid rating should return bad request 13ms🔗
Steps
Given a recipe review request with an invalid rating (3ms)
When the recipe review is submitted (6ms)
Then the review post response should indicate bad request (2ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Submitting a review with missing recipe name should return bad request 8ms🔗
Steps
Given a recipe review request with a missing recipe name (1ms)
When the recipe review is submitted (4ms)
Then the review post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Recipe Summary Via G RPC
/grpc - Retrieving recipe summaries via gRPC
Pancake recipe summary should return correct data Happy Path 171ms🔗
Steps
When a recipe summary is requested for "Pancakes" via gRPC (20ms)
Then the recipe summary should contain 42 total batches (3ms)
Grpc steps recipe summary reply total batches should be '42' (0ms)
And the recipe summary should contain ingredients "Milk, Flour, Eggs" (137ms)
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 Path 12ms🔗
Steps
When a recipe summary is requested for "Waffles" via gRPC (8ms)
Then the recipe summary should contain 28 total batches (0ms)
Grpc steps recipe summary reply total batches should be '28' (0ms)
And the recipe summary should contain ingredients "Milk, Flour, Eggs, Butter" (1ms)
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 13ms🔗
Steps
When a recipe summary is requested for "Unknown" via gRPC (2ms)
Then the recipe summary should contain 0 total batches (0ms)
Grpc steps recipe summary reply total batches should be '0' (0ms)
And the recipe summary should contain no ingredients (4ms)
Grpc steps recipe summary reply common ingredients should be empty (0ms)
Diagrams
Details:lines
Reporting Batch Completions
/graphql - Querying batch completion records populated by Pub/Sub consumption
Batch completions should contain data ingested via pubsub consumer Happy Path 107ms🔗
Steps
Given a pancake batch has been created for batch completions (47ms)
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)
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)
When the batch completions are queried via graphql (43ms)
Then the graphql response should contain the batch completion record (12ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps batch completions should contain [ r => r.BatchId == '2ebfe9f1-6c27-4999-8bf3-e8c775fb47fe' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ] (0ms)
Diagrams
Details:lines
Reporting Event Grid Webhook
/webhooks/eventgrid - Ingredient shipments recorded via EventGrid webhook events
Ingredient shipments should be recorded when delivered via eventgrid webhook Happy Path 114ms🔗
Steps
Given an ingredient delivery event has been received via eventgrid webhook (83ms)
Response status code should be OK (0ms)
When the ingredient shipments are queried via graphql (14ms)
Then the graphql response should contain the ingredient shipment record (11ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps ingredient shipments should contain [ s => s.DeliveryId == '1906480e-9bf5-4b4a-b960-fd4e08eb6213' && s.IngredientName == "Milk" && s.Quantity == 50.0m ] (0ms)
Diagrams
Details:lines
Reservations Management
/reservations - Managing table reservations with full CRUD operations and cancellation
Reservations can be created and retrieved
Creating a reservation should return the confirmed reservation Happy Path 42ms🔗
Steps
Given a valid reservation request (0ms)
When the reservation is submitted (12ms)
Then the reservation response should contain the confirmed booking (6ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response status should be "Confirmed" (0ms)
Post steps response customer name should be 'CustomerName' (0ms)
Diagrams
Details:lines
Reservations can be cancelled once
Cancelling a reservation should return the cancelled reservation 38ms🔗
Steps
Given a reservation exists (16ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the reservation is cancelled (12ms)
Then the cancellation response should indicate the reservation is cancelled (9ms)
Cancel steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Cancel steps response status should be "Cancelled" (0ms)
Diagrams
Details:lines
Cancelling an already cancelled reservation should return a conflict response 411ms🔗
Steps
Given a cancelled reservation exists (329ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Cancel steps response message status code should be OK (0ms)
When the reservation is cancelled again (69ms)
Then the cancellation response should indicate a conflict (5ms)
Cancel steps response message status code should be Conflict (0ms)
Diagrams
Details:lines
Reservations can be deleted
Deleting a reservation should return no content 67ms🔗
Steps
Given a reservation exists (5ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the reservation is deleted (52ms)
Then the reservation delete response should indicate no content (6ms)
Delete response status code should be NoContent (0ms)
Diagrams
Details:lines
Reservations can be created and retrieved
Retrieving an existing reservation should return the reservation 100ms🔗
Steps
Given a reservation exists (41ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the reservation is retrieved by id (28ms)
Then the reservation get response should contain the reservation (8ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
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
Service Time Analysis
Order served events - Service time analysis (Kafka → ClickHouse → gRPC → Kitchen)
Consuming an order served event should trigger downstream processing Happy Path IgnoreIfExternalSut 96ms🔗
Steps
Given an order served event (3ms)
When the order served event is published to Kafka (57ms)
Then the order ID should be generated (7ms)
Publish steps order id should not be Empty (0ms)
And the kitchen service should have received the status request (15ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == $"/status/{orderId}" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
Details:lines
Specifications Async Api
/asyncapi/asyncapi.json - Serving the AsyncAPI specification describing event-driven messaging
The AsyncApi endpoint should return a valid specification Happy Path 346ms🔗
Steps
When the asyncapi endpoint is called (292ms)
Then the response should be valid (9ms)
Async api response status code should be OK (0ms)
Async api response is valid json should be true $"response body (first 500 chars): {_asyncApiJsonString?[..Math.Min(_asyncApiJsonString.Length, 500)]}" (0ms)
And the asyncapi spec is written to disk (36ms)asyncapi.json
Async api json root element get property("asyncapi") should not be null (0ms)
Async api json root element get property("info") should not be null (0ms)
Async api json root element get property("default content type") should not be null (0ms)
Async api json root element get property("channels") should not be null (0ms)
Async api json root element get property("operations") should not be null (0ms)
Async api json root element get property("components") should not be null (0ms)
Diagrams
Details:lines
Specifications Open Api
/swagger/v1/swagger.json - Serving the OpenAPI specification describing all REST endpoints
The OpenApi endpoint should return a valid specification Happy Path 547ms🔗
Steps
When the open api endpoint is called (499ms)
Then the response should be valid (7ms)
Swagger response status code should be OK (0ms)
Open api response is valid json should be true (0ms)
And the response should contain all the endpoints (27ms)
Paths get property( endpoints swagger pancakes path) should not be null (0ms)
Paths get property( endpoints swagger waffles path) should not be null (0ms)
Paths get property( endpoints swagger orders path) should not be null (0ms)
Paths get property( endpoints swagger order by id path) should not be null (0ms)
Paths get property( endpoints swagger toppings path) should not be null (0ms)
Paths get property( endpoints swagger menu path) should not be null (0ms)
Paths get property( endpoints swagger milk path) should not be null (0ms)
Paths get property( endpoints swagger eggs path) should not be null (0ms)
Paths get property( endpoints swagger flour path) should not be null (0ms)
Paths get property( endpoints swagger goat milk path) should not be null (0ms)
Paths get property( endpoints swagger audit logs path) should not be null (0ms)
And the openapi spec is written to disk (8ms)openapi.json
Diagrams
Details:lines
Specifications Open Api Scalar UI
/scalar/v1 - Serving the interactive API documentation UI powered by Scalar
The Scalar UI endpoint should return a valid page Happy Path 435ms🔗
Steps
When the scalar ui endpoint is called (421ms)
Then the response should be a valid scalar page (5ms)
Scalar response status code should be OK (0ms)
Scalar ui response body should contain "<html" (0ms)
Scalar ui response body should contain "scalar" (0ms)
Diagrams
Details:lines
Staff Management
/staff - Managing kitchen staff members with full CRUD operations
Staff members support CRUD operations
Adding a new staff member should return the created member Happy Path 15ms🔗
Steps
Given a valid staff member request (2ms)
When the staff member is submitted (7ms)
Then the staff response should contain the created member (3ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response name should be 'Name' (0ms)
Post steps response role should be "Chef" (0ms)
Diagrams
Details:lines
Staff requests must pass validation
Adding a staff member with an invalid role should return a bad request response 10ms🔗
Steps
Given a staff member request with an invalid role (2ms)
When the staff member is submitted (4ms)
Then the staff response should indicate bad request (1ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Staff members support CRUD operations
Deleting a staff member should return no content 90ms🔗
Steps
Given a staff member exists (10ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the staff member is deleted (71ms)
Then the staff delete response should indicate no content (6ms)
Delete response status code should be NoContent (0ms)
Diagrams
Details:lines
Retrieving an existing staff member should return the member 159ms🔗
Steps
Given a staff member exists (106ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the staff member is retrieved by id (41ms)
Then the staff get response should contain the member (8ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response id should be '1' (0ms)
Get steps response name should be 'Name' (0ms)
Get steps response role should be "Chef" (0ms)
Diagrams
Details:lines
Status Update Not Found
/orders - Updating status of a non-existent order
Updating the status of a non-existent order should return not found 54ms🔗
Steps
When a status update is sent for a non-existent order (47ms)
Then the status update response should indicate not found (1ms)
Patch steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Stream Order Updates Via G RPC
/grpc - Streaming order updates via gRPC server streaming
Streaming order updates should return the current status Happy Path 70ms🔗
Steps
Given a pancake batch has been created (14ms)
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)
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)
And an order has been created for the batch (14ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When order updates are streamed via gRPC (31ms)
Then the streamed response should contain the order status (5ms)
Grpc steps streamed replies should have count 1 (0ms)
Grpc steps streamed replies[0] order id should be orderSteps.Response.OrderId.ToString() (0ms)
Grpc steps streamed replies[0] customer name should be 'TestCustomer_2173381859448366456' (0ms)
Grpc steps streamed replies[0] status should be Created (0ms)
Diagrams
Details:lines
Streaming updates for non-existent order should return not found 17ms🔗
Steps
When order updates for a non-existent order are streamed via gRPC (13ms)
Then the gRPC stream should return a not found error (2ms)
Grpc steps rpc exception should not be null (0ms)
Grpc steps rpc exception status code should be NotFound (0ms)
Diagrams
Details:lines
Telemetry
/orders - Structured logging and telemetry verification
Creating an order should emit a structured log entry Happy Path IgnoreIfExternalSut 1.0s🔗
Steps
Given the application is configured with an in-memory log capture (329ms)
And a pancake batch has been created (226ms)
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)
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)
And a valid order request (2ms)
When the order is submitted (474ms)
Then a structured log entry should have been captured for order creation (7ms)
Log provider entries should contain [ e => e.Message.Contains("created for customer") ] (0ms)
Log provider entries should contain [ e => e.Message.Contains(orderSteps.Request.CustomerName) ] (0ms)
Log provider entries should contain [ e => e.Message.Contains("1 items") ] (0ms)
Diagrams
Details:lines
Toppings Deletion
/toppings - Deleting toppings from the system
Existing toppings can be deleted
Deleting an existing topping should return no content Happy Path 26ms🔗
Steps
Given a known topping exists (1ms)
When the topping is deleted (17ms)
Then the delete response should indicate success (4ms)
Delete steps response message status code should be NoContent (0ms)
Diagrams
Details:lines
Non-existent toppings cannot be deleted
Deleting a non-existent topping should return not found 33ms🔗
Steps
Given a topping id that does not exist (0ms)
When the topping is deleted (1ms)
Then the delete response should indicate not found (1ms)
Delete steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Toppings Feature Flag
/toppings - Raspberry topping availability controlled by feature flag
Raspberry topping is hidden when the feature flag is disabled
Toppings should exclude raspberries when the feature flag is disabled IgnoreIfExternalSut 158ms🔗
Steps
Given the raspberry topping feature flag is disabled (139ms)
When the available toppings are requested (12ms)
Then the toppings response should not include raspberries (4ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response should not contain [ t => t.Name == ToppingDefaults.Raspberries ] (0ms)
Diagrams
Details:lines
Raspberry topping is available when the feature flag is enabled
Toppings should include raspberries when the feature flag is enabled IgnoreIfExternalSut 321ms🔗
Steps
Given the raspberry topping feature flag is enabled (252ms)
When the available toppings are requested (48ms)
Then the toppings response should include raspberries (13ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response should contain [ t => t.Name == ToppingDefaults.Raspberries ] (0ms)
Diagrams
Details:lines
Toppings Management
/toppings - Listing available toppings and adding custom toppings
The toppings endpoint should return all available toppings Happy Path 39ms🔗
Steps
When the available toppings are requested (21ms)
Then the toppings response should contain the default toppings (16ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
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 93ms🔗
Steps
Given a valid topping request (9ms)
When the new topping is submitted (59ms)
Then the topping response should contain the created topping (14ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response name should be Strawberries (0ms)
Post steps response category should be FruitCategory (0ms)
Diagrams
Details:lines
Toppings Update
/toppings - Updating existing toppings
Existing toppings can be updated
Updating an existing topping should return the updated topping Happy Path 144ms🔗
Steps
Given a known blueberry topping exists (4ms)
And a valid update topping request (1ms)
When the topping is updated (54ms)
Then the update response should contain the updated topping (78ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Put steps response topping id should be KnownBlueberryToppingId (0ms)
Put steps response name should be Strawberries (0ms)
Put steps response category should be FruitCategory (0ms)
Diagrams
Details:lines
Update requests must pass validation and XSS checks
Update toppings endpoint is called with invalid or dangerous input 6/6 passed 118ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Category<script>alert('xss')</script>Script tag in categoryCategory contains potentially dangerous content.Bad RequestPassed57ms
2CategoryCategory is required'Category' is required.Bad RequestPassed10ms
3Categoryjavascript:alert(1)Javascript protocolCategory contains potentially dangerous content.Bad RequestPassed32ms
4Name<img src=x onerror=alert(1)>Event handler in nameName contains potentially dangerous content.Bad RequestPassed6ms
5Name<script>alert('xss')</script>Script tag in nameName contains potentially dangerous content.Bad RequestPassed5ms
6NameName is required'Name' is required.Bad RequestPassed5ms
Steps
Given a known topping exists (0ms)
And a valid update topping request with "Category" set to "<script>alert('xss')</script>" (4ms)
When the invalid update topping request is submitted (31ms)
Then the update response should contain error "Category contains potentially dangerous content." with status "Bad Request" (18ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Category contains potentially dangerous content.') ] (0ms)
Diagrams
Details:lines
Non-existent toppings cannot be updated
Updating a non-existent topping should return not found 5ms🔗
Steps
Given a topping id that does not exist (0ms)
And a valid update topping request (0ms)
When the topping is updated (1ms)
Then the update response should indicate not found (1ms)
Put steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Toppings XSS Validation
/toppings - XSS and input validation for toppings
Toppings endpoint is called with invalid or dangerous input 6/6 passed 60ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Category<script>alert('xss')</script>Script tag in categoryCategory contains potentially dangerous content.Bad RequestPassed9ms
2CategoryCategory is required'Category' is required.Bad RequestPassed18ms
3Categoryjavascript:alert(1)Javascript protocolCategory contains potentially dangerous content.Bad RequestPassed4ms
4Name<img src=x onerror=alert(1)>Event handler in nameName contains potentially dangerous content.Bad RequestPassed18ms
5Name<script>alert('xss')</script>Script tag in nameName contains potentially dangerous content.Bad RequestPassed4ms
6NameName is required'Name' is required.Bad RequestPassed5ms
Steps
Given a valid topping request with "Category" set to "<script>alert('xss')</script>" (0ms)
When the invalid topping request is submitted (5ms)
Then the topping response should contain error "Category contains potentially dangerous content." with status "Bad Request" (1ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Category contains potentially dangerous content.') ] (0ms)
Diagrams
Details:lines
Waffles Content Negotiation
/waffles - Content negotiation and unsupported media types
Sending a request with an unsupported content type should return an unsupported media type response 3/3 passed 177ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed16ms
2text/htmlPassed155ms
3text/plainPassed5ms
Steps
Given a waffle request with content type "application/xml" (0ms)
When the waffles are prepared with the given content type (12ms)
Then the waffle response should indicate unsupported media type (0ms)
Response status code should be UnsupportedMediaType (0ms)
Diagrams
Details:lines
Waffles Creation
/waffles - Creating waffles with ingredients including butter
A valid waffle request should return a fresh batch Happy Path 114ms🔗
Steps
Given a valid waffle recipe with all ingredients (14ms)
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)
When the waffles are prepared (68ms)
Then the waffles response should contain a valid batch with all ingredients (18ms)
Waffle steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Waffle steps response ingredients should contain 'Milk' (0ms)
Waffle steps response ingredients should contain 'Eggs' (0ms)
Waffle steps response ingredients should contain 'Flour' (0ms)
Waffle steps response ingredients should contain UnsaltedButter (0ms)
And the cow service should have received a milk request (10ms)
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 IgnoreIfExternalSut 63ms🔗
Steps
Given the max toppings per item is the configured limit (1ms)
And a valid waffle recipe with all ingredients (36ms)
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)
And the waffle request has more toppings than the configured limit (3ms)
When the waffles are prepared (10ms)
Then the waffles response should indicate too many toppings (3ms)
Waffle steps response message status code should be BadRequest (0ms)
Waffle error response body should contain MaxToppingsExceeded (0ms)
Diagrams
Details:lines
Waffles endpoint is called with invalid ingredients should return a bad request response 8/8 passed 222ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Butter<script>alert</script>XSS in butterButter contains potentially dangerous content.Bad RequestPassed132ms
2ButterButter is required'Butter' is required.Bad RequestPassed12ms
3EggsEggs is required'Eggs' is required.Bad RequestPassed5ms
4Eggsjavascript:void(0)XSS in eggsEggs contains potentially dangerous content.Bad RequestPassed29ms
5Flour<img onerror=x>XSS in flourFlour contains potentially dangerous content.Bad RequestPassed11ms
6FlourFlour is required'Flour' is required.Bad RequestPassed7ms
7Milk<script>alert</script>XSS in milkMilk contains potentially dangerous content.Bad RequestPassed7ms
8MilkMilk is required'Milk' is required.Bad RequestPassed15ms
Steps
Given a valid waffle request with "Butter" set to "<script>alert</script>" (22ms)
When the invalid waffle request is submitted (75ms)
Then the waffle response should contain error "Butter contains potentially dangerous content." with status "Bad Request" (29ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Butter contains potentially dangerous content.') ] (0ms)
Diagrams
Details:lines