Breakfast Provider (ReqNRoll) Test Run Report

Passed: 214 (100%)100%

Test Execution Summary

Passed2026-10-25 ยท 07:55:43โ€“07:55:51 UTC
Scenarios
214
Passed
214
Failed
0
Skipped
0
Features
73
Duration
7s

CI

GitHub Actions
Build
#340
Branch
main
Commit
d2ce0e2
Repository
lemonlion/BreakfastProvider

Filtering

All 214 scenarios, 73 features
Status
Duration โ‰ฅ
Happy paths
Tags
Dependencies
Payloads
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 17ms🔗
Steps
✓Given a valid apple cinnamon muffin recipe with all ingredients (5ms)
✓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 (3ms)
✓Then the muffin response should contain a valid batch with all ingredients (5ms)
✓And the cow service should have received a milk request for the muffins (1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
This scenario:Payloads
Different muffin recipes should produce the expected batch 3/3 passed 80ms🔗
#Input ParametersStatusDuration
Recipe NameFlourApple VarietyCinnamon TypeTemperatureDurationPan TypeTopping 1Amount 1Topping 2Amount 2Expected Ingredient CountExpected Topping Count
1ClassicPlain FlourGranny SmithCeylon18025StandardStreuselLightIcing GlazeDrizzle52Passed10ms
2Rustic WholesomeWhole WheatHoneycrispCassia17530Cast IronBrown Sugar CrumbHeavyMaple DrizzleLight52Passed16ms
3Spiced DeluxeAlmondPink LadySaigon19020SiliconeCinnamon SugarHeavyCream Cheese SwirlThick52Passed53ms
Steps
✓Given a muffin recipe "Classic" with the following ingredients: (3ms)
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 (3ms)
✓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
This scenario:Payloads
Muffins endpoint called with an invalid field should return a bad request response 6/6 passed 59ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1ApplesApples is required'Apples' is required.Bad RequestPassed4ms
2Cinnamon<script>alert('xss')</script>XSS in cinnamonCinnamon contains potentially dangerous content.Bad RequestPassed41ms
3CinnamonCinnamon is required'Cinnamon' is required.Bad RequestPassed2ms
4EggsEggs is required'Eggs' is required.Bad RequestPassed3ms
5FlourFlour is required'Flour' is required.Bad RequestPassed2ms
6MilkMilk is required'Milk' is required.Bad RequestPassed4ms
Steps
✓Given a valid muffin request with "Apples" set to "" (1ms)
✓When the invalid muffin request is submitted (1ms)
✓Then the muffin response should contain error "'Apples' is required." with status "Bad Request" (0ms)
✓Response body should contain ''Apples' is required.' (0ms)
✓Muffin steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Audit Log Filtering
/audit-logs - Filtering audit logs by entity type and entity ID
Audit logs should be filterable by entity id 75ms🔗
Steps
✓Given a pancake batch has been created (45ms)
✓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 id (12ms)
✓Then the audit log response should contain the specific order entry (2ms)
✓Audit log response status code should be OK (0ms)
✓Audit logs should contain [ l => l.EntityId == '0a6f2910-1c47-4c7e-b931-6e66971a679a' ] (0ms)
Diagrams
This scenario:Payloads
Audit logs should be filterable by entity type 38ms🔗
Steps
✓Given a pancake batch has been created (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)
✓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 (7ms)
✓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 (17ms)
✓Then the audit log response should only contain order entries (2ms)
✓Audit log response status code should be OK (0ms)
✓Audit logs should only contain [ l => l.EntityType == AuditLogDefaults.OrderEntityType ] (0ms)
Diagrams
This scenario:Payloads
Audit logs should be returned in descending timestamp order 39ms🔗
Steps
✓Given a pancake batch has been created (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)
✓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 (8ms)
✓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 (12ms)
✓Then the audit logs should be ordered by timestamp descending (5ms)
✓Audit logs should not be null or empty (0ms)
✓Audit logs should be in descending order [ l => l.Timestamp ] (0ms)
Diagrams
This scenario:Payloads
Filtering audit logs by a non-existent entity type should return an empty collection 13ms🔗
Steps
✓When audit logs are requested filtered by a non-existent entity type (9ms)
✓Then the audit log response should be an empty collection (3ms)
✓Audit log response status code should be OK (0ms)
✓Audit logs from different time range should be empty (0ms)
Diagrams
This scenario:Payloads
Audit Log Retrieval
/audit-logs - Retrieving audit log entries for order operations
Creating an order should produce a retrievable audit log entry Happy Path 44ms🔗
Steps
✓Given a pancake batch has been created (8ms)
✓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 the audit logs are retrieved (12ms)
✓Then the audit log response should contain the order creation entry (6ms)
✓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_5247014944498696013') ] (0ms)
✓And the cow service should have received a milk request (0ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (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
This scenario:Payloads
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 1.0s🔗
Steps
✓Given a pancake batch has been created (73ms)
✓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 (25ms)
✓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_2705647304167416692' (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 (1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
This scenario:Payloads
Creating an order produces audit and recipe logs
Creating an order should produce an audit log entry and events 1.3s🔗
Steps
✓Given a pancake batch has been created (32ms)
✓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 (7ms)
✓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_2544236666757486765' (0ms)
✓Order steps response items should have count 1 (0ms)
✓And an order created event should have been published (1.2s)
✓Event store should not be null (0ms)
✓And a recipe log should have been published to kafka (11ms)
✓Kafka store should not be null (0ms)
Diagrams
This scenario:Payloads
Creating an order writes an outbox message for reliable delivery
Creating an order should write an outbox message that gets processed 164ms🔗
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)
✓When the breakfast order is placed (9ms)
✓Then the order response should contain a complete order (3ms)
✓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_1802603264943119683' (0ms)
✓Order steps response items should have count 1 (0ms)
✓And an outbox message should have been written for the order created event (33ms)
✓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 (97ms)
Diagrams
This scenario:Payloads
Chef Notes Management
/chef-notes - Creating, retrieving, and updating chef notes (MongoDB)
Creating a chef note should return the created note Happy Path 9ms🔗
Steps
✓Given a valid chef note request (0ms)
✓When the note is submitted (4ms)
✓Then the response should contain the created note (2ms)
✓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-cce7f65ee14344a7a3b7f1f2c9ac7f61' (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
This scenario:Payloads
Creating a note with missing note text should return bad request 5ms🔗
Steps
✓Given a note request with missing note text (2ms)
✓When the note is submitted (2ms)
✓Then the note response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Creating a note with missing recipe name should return bad request 5ms🔗
Steps
✓Given a note request with a missing recipe name (0ms)
✓When the note is submitted (3ms)
✓Then the note response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Listing notes by recipe should return matching notes 59ms🔗
Steps
✓Given a chef note exists (28ms)
✓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 (23ms)
✓Then the list response should contain the note (6ms)
✓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 == '4179b0d0-c182-4b8a-aac1-cd1b7930b7d7' ] (0ms)
Diagrams
This scenario:Payloads
Retrieving a non-existent note should return not found 6ms🔗
Steps
✓When a non-existent note is retrieved (4ms)
✓Then the get response should indicate not found (0ms)
✓Get steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Retrieving an existing note by id should return the note 24ms🔗
Steps
✓Given a chef note exists (6ms)
✓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 (13ms)
✓Then the get response should contain the note (3ms)
✓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 'd18b0e24-e188-458c-8196-a6ceb9449b42' (0ms)
✓Get steps response recipe name should be 'Recipe-14336a57ecb843968b62903c4c57b9d2' (0ms)
Diagrams
This scenario:Payloads
Updating a non-existent note should return not found 34ms🔗
Steps
✓When a non-existent note is updated (32ms)
✓Then the note update response should indicate not found (0ms)
✓Patch steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Updating an existing note should return the updated note 21ms🔗
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 (14ms)
✓Then the update response should contain the modified note (4ms)
✓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 'f5777ec5-ef1c-4731-850e-10596e674a6f' (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
This scenario:Payloads
Complete Order Lifecycle
/orders - Complete order lifecycle from creation through to completion
An order should progress through all status transitions to completion Happy Path 1.3s ยท 1.1s warm-up🔗
Steps
✓Given a pancake batch has been created (782ms)
✓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 (375ms)
✓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 (17ms)
✓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 (17ms)
✓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 '8fc17ae8-3f33-4b24-8c3f-e22bd9dacfb4' (0ms)
✓Get order steps response status should be Completed (0ms)
✓Get order steps response customer name should be 'LifecycleTestCustomer_5401343397907759860' (0ms)
✓And an audit log entry should exist for the order (35ms)
✓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_5401343397907759860') ] (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 (3ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
This scenario:Payloads
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 104ms ยท 96ms warm-up🔗
Steps
✓Given a request with a known correlation id (1ms)
✓When the request is sent to the menu endpoint (98ms)
✓Then the response should contain the same correlation id (2ms)
✓Response contains correlation id header should be true (0ms)
✓First correlation id header value should be '3c6d4537-adda-44d6-9b60-805e89b329c1' (0ms)
Diagrams
This scenario:Payloads
Missing correlation IDs are generated automatically
A request without a correlation id should have one generated in the response 6ms🔗
Steps
✓When a request without a correlation id is sent to the menu endpoint (4ms)
✓Then the response should contain a generated correlation id (1ms)
✓Response contains correlation id header should be true (0ms)
✓First correlation id header value should not be null or empty (0ms)
Diagrams
This scenario:Payloads
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 36ms🔗
Steps
✓Given a customer feedback received event (2ms)
✓When the event is published to PubSub (27ms)
✓Then the feedback ID should be generated (2ms)
✓Publish steps feedback id should not be '00000000-0000-0000-0000-000000000000' (0ms)
✓And the supplier service should have received the feedback (2ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/ingredients/feedback" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
This scenario:Payloads
Customer Preferences Management
/customer-preferences - Managing customer breakfast preferences
Customer preferences support CRUD operations
Saving customer preferences should return the saved preferences Happy Path 17ms🔗
Steps
✓Given a valid customer preference request (2ms)
✓When the customer preferences are saved (8ms)
✓Then the preference response should contain the saved preferences (4ms)
✓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
This scenario:Payloads
Retrieving existing customer preferences should return the preferences 104ms🔗
Steps
✓Given customer preferences exist (3ms)
✓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 (93ms)
✓Then the preference get response should contain the preferences (6ms)
✓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 '1dc536d5148a4536815c1684cb6853de' (0ms)
✓Get steps response preferred milk type should be "Oat" (0ms)
✓Get steps response likes extra toppings should be true (0ms)
Diagrams
This scenario:Payloads
Non-existent preferences cannot be retrieved
Retrieving non-existent customer preferences should return not found 36ms🔗
Steps
✓When non-existent customer preferences are retrieved (31ms)
✓Then the preference get response should indicate not found (1ms)
✓Get steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Preference requests must pass validation
Saving customer preferences with missing customer name should return bad request 4ms🔗
Steps
✓Given a customer preference request with missing customer name (0ms)
✓When the customer preferences are saved (1ms)
✓Then the preference response should indicate bad request (1ms)
✓Put steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Customer preferences support CRUD operations
Updating customer preferences should return the updated preferences 69ms🔗
Steps
✓Given customer preferences exist (55ms)
✓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 (8ms)
✓Then the preference update response should contain the updated values (3ms)
✓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
This scenario:Payloads
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 23ms🔗
Steps
✓Given the cinnamon swirl order count is reset (0ms)
✓And an order request for the same special (1ms)
✓When the order is submitted with two different idempotency keys (16ms)
✓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 'c73d3c0f-358a-4f02-b911-28b2d2862fa1' (0ms)
Diagrams
This scenario:Payloads
Submitting the same order with the same idempotency key should return the same confirmation 11ms🔗
Steps
✓Given the cinnamon swirl order count is reset (0ms)
✓And an order request with an idempotency key (0ms)
✓When the order is submitted twice with the same idempotency key (7ms)
✓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 'fee38bc0-1a55-4a7b-bee3-f2ab4f57f57e' (0ms)
Diagrams
This scenario:Payloads
Daily Specials Not Found
/daily-specials/orders - Ordering a non-existent daily special
Ordering a non-existent daily special should return not found 7ms🔗
Steps
✓Given a daily special order request for a non-existent special (0ms)
✓When the daily special order is submitted (3ms)
✓Then the daily special response should indicate not found (1ms)
✓Post steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
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 78ms🔗
Steps
✓Given the cinnamon swirl order count is reset (15ms)
✓And a valid daily special order request for cinnamon swirl (1ms)
✓When the daily special order is submitted (53ms)
✓Then the daily special order response should contain a valid confirmation (6ms)
✓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 'aaaa0000-0000-0000-0000-000000000001' (0ms)
✓Post steps response order confirmation id should not be empty (0ms)
Diagrams
This scenario:Payloads
Orders are rejected when the daily limit is reached
Ordering a daily special beyond the threshold should return a conflict response IgnoreIfExternalSut 14ms🔗
Steps
✓Given the matcha waffles order count is reset (4ms)
✓And the matcha waffles special has been ordered up to the configured limit (3ms)
✓Post steps response message status code should be Created (0ms)
✓When another order is placed for the matcha waffles special (3ms)
✓Then the response should indicate the daily special is sold out (0ms)
✓Post steps response message status code should be Conflict (0ms)
Diagrams
This scenario:Payloads
Remaining quantity decreases with each order
Remaining quantity should decrease after each order IgnoreIfExternalSut 10ms🔗
Steps
✓Given the lemon ricotta order count is reset (2ms)
✓And a daily special order for lemon ricotta of quantity one is placed (2ms)
✓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 (3ms)
✓Response content is valid json should be true (0ms)
✓Lemon ricotta remaining quantity should be '9' (0ms)
Diagrams
This scenario:Payloads
Valid daily special orders are fulfilled
The daily specials endpoint should return all available specials 10ms🔗
Steps
✓When the available daily specials are requested (6ms)
✓Then the daily specials response should contain all expected specials (3ms)
✓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
This scenario:Payloads
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 27ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Quantity0Quantity must be > zeroQuantity must be greater than zero.Bad RequestPassed14ms
2SpecialIdSpecialId is required'Special Id' is required.Bad RequestPassed12ms
Steps
✓Given a valid daily special order request with "Quantity" set to "0" (2ms)
✓When the invalid daily special order request is submitted (6ms)
✓Then the daily special response should contain error "Quantity must be greater than zero." with status "Bad Request" (2ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Quantity must be greater than zero.') ] (0ms)
Diagrams
This scenario:Payloads
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 182ms🔗
Steps
✓Given the cow service is configured to be unreachable (0ms)
✓And the supplier service is configured to be unreachable (0ms)
✓When the health check endpoint is called (150ms)
✓Then the health check response should indicate a degraded status (10ms)
✓Health response status code should be OK (0ms)
✓Health check result status should be Degraded (0ms)
✓And the cow service dependency should report degraded (12ms)
✓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 (1ms)
✓Health check result results should contain key SupplierService (0ms)
✓Supplier service health status should be Degraded (0ms)
Diagrams
This scenario:Payloads
Health check should report degraded when the cow service is unavailable SkipUnlessFakesControllable 75ms🔗
Steps
✓Given the cow service is configured to be unreachable (0ms)
✓When the health check endpoint is called (73ms)
✓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
This scenario:Payloads
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 72ms🔗
Steps
✓Given the kitchen service health check is configured to use a failing endpoint (56ms)
✓When the health check endpoint is called (12ms)
✓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 (1ms)
✓Health check result results should contain key KitchenService (0ms)
✓Kitchen service health status should be Degraded (0ms)
✓Kitchen service health description should contain "503" (0ms)
Diagrams
This scenario:Payloads
Equipment Alerts
/graphql - Querying equipment alerts populated by Event Hub consumption
Equipment alerts should contain data ingested via Event Hub consumer Happy Path 1.1s ยท 1.0s warm-up🔗
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)
✓When the equipment alerts are queried via graphql (1.0s)
✓Then the graphql response should contain the equipment alert record (8ms)
✓Graph ql steps response message status code should be OK (0ms)
✓Graph ql steps equipment alerts should contain [ a => a.BatchId == 'ce5da2ef-12cd-4c8b-b02d-8cbbd76652f6' && a.EquipmentName == "Griddle" && a.AlertType == "UsageCycleCompleted" ] (0ms)
Diagrams
This scenario:Payloads
Equipment Readings Monitoring
/equipment-readings - Recording and monitoring kitchen equipment readings (ClickHouse)
Recording an equipment reading should return the created record Happy Path 39ms🔗
Steps
✓Given a valid equipment reading request (1ms)
✓When the equipment reading is recorded (28ms)
✓Then the reading response should contain the created record (6ms)
✓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-89836cc9398c492aa2c4f89ebe4a02a3' (0ms)
✓Post steps response value should be 180.5m (0ms)
✓Post steps response reading id should not be null or empty (0ms)
Diagrams
This scenario:Payloads
Deleting a reading should remove it from the list 31ms🔗
Steps
✓Given an equipment reading record has been created (4ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓When the reading is deleted (17ms)
✓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 (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 not contain [ r => r.ReadingId == 'dcab02e9-fda3-453a-884b-924190126d74' ] (0ms)
Diagrams
This scenario:Payloads
Listing readings by equipment should return matching records 52ms🔗
Steps
✓Given an equipment reading record has been created (12ms)
✓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 (31ms)
✓Then the reading list response should contain the record (5ms)
✓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 == '105029bd-fb66-46ea-a749-06f8038d0534' ] (0ms)
Diagrams
This scenario:Payloads
Recording a reading with missing metric should return bad request 7ms🔗
Steps
✓Given an equipment reading request with a missing metric (0ms)
✓When the equipment reading is recorded (4ms)
✓Then the reading post response should indicate bad request (1ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recording a reading with zero value should return bad request 7ms🔗
Steps
✓Given an equipment reading request with zero value (1ms)
✓When the equipment reading is recorded (4ms)
✓Then the reading post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Feedback Management
/feedback - Submitting and retrieving customer feedback
Feedback can be submitted and retrieved
Submitting feedback should return the created feedback Happy Path 72ms🔗
Steps
✓Given a valid feedback request (0ms)
✓When the feedback is submitted (64ms)
✓Then the feedback response should contain the created feedback (6ms)
✓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 'Customer-c7c5fc35368c4df49bb17010a8c00360' (0ms)
✓Post steps response rating should be 4 (0ms)
Diagrams
This scenario:Payloads
Listing feedback for an order should return the feedback 708ms ยท 499ms warm-up🔗
Steps
✓Given a feedback entry exists (515ms)
✓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 (181ms)
✓Then the feedback list response should contain the feedback (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 contain [ f => f.FeedbackId == 'eddc76ef-0bcb-4f61-8571-25319fc79d6d' ] (0ms)
Diagrams
This scenario:Payloads
Retrieving existing feedback by id should return the feedback 20ms🔗
Steps
✓Given a feedback entry exists (3ms)
✓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 (8ms)
✓Then the feedback get response should contain the feedback (6ms)
✓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 '90086ea1-f0c6-4bec-8310-8cbe868dcc5c' (0ms)
✓Get steps response customer name should be 'Customer-225633474dde434c8e3db214bd035605' (0ms)
✓Get steps response rating should be 4 (0ms)
Diagrams
This scenario:Payloads
Non-existent feedback cannot be retrieved
Retrieving non-existent feedback should return not found 27ms🔗
Steps
✓When a non-existent feedback is retrieved (23ms)
✓Then the feedback get response should indicate not found (3ms)
✓Get steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Feedback requests must pass validation
Submitting feedback with invalid rating should return bad request 10ms🔗
Steps
✓Given a feedback request with an invalid rating (1ms)
✓When the feedback is submitted (7ms)
✓Then the feedback response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Submitting feedback with missing customer name should return bad request 23ms🔗
Steps
✓Given a feedback request with missing customer name (2ms)
✓When the feedback is submitted (18ms)
✓Then the feedback response should indicate bad request (1ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
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 29ms🔗
Steps
✓Given the goat service will return service unavailable (1ms)
✓When goat milk is requested (23ms)
✓Then the goat milk response should indicate a bad gateway (2ms)
✓Goat milk steps response message status code should be BadGateway (0ms)
✓Goat milk error response body should contain GoatServiceUnavailableTitle (0ms)
Diagrams
This scenario:Payloads
Requesting goat milk when the goat service returns an invalid response should return a bad gateway response SkipUnlessFakesControllable 11ms🔗
Steps
✓Given the goat service will return an invalid response (3ms)
✓When goat milk is requested (6ms)
✓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
This scenario:Payloads
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 66ms🔗
Steps
✓Given the goat milk feature flag is enabled (51ms)
✓When goat milk is requested (13ms)
✓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
This scenario:Payloads
Goat milk is hidden when the feature flag is disabled
Goat milk endpoint should return not found when feature is disabled IgnoreIfExternalSut 70ms🔗
Steps
✓Given the goat milk feature flag is disabled (48ms)
✓When goat milk is requested (17ms)
✓Then the goat milk response should indicate feature disabled (1ms)
✓Goat milk steps response message status code should be NotFound (0ms)
✓Goat milk feature disabled response body should contain FeatureDisabled (0ms)
Diagrams
This scenario:Payloads
Goat Milk Sourcing
/goat-milk - Retrieving goat milk from the Goat Service
A valid goat milk request should return fresh goat milk Happy Path 11ms🔗
Steps
✓When goat milk is requested (8ms)
✓Then the goat milk response should contain fresh goat milk (1ms)
✓Goat milk steps response message status code should be OK (0ms)
✓Goat milk steps goat milk response goat milk should be FreshGoatMilk (0ms)
Diagrams
This scenario:Payloads
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 6ms🔗
Steps
✓Given a request with a known correlation id (0ms)
✓When milk is requested with the correlation id (4ms)
✓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 '7411c8c2-c6d2-49ff-a927-8ade568e918e' (0ms)
Diagrams
This scenario:Payloads
A request with a correlation id should forward it to the supplier service SkipUnlessFakesControllable 14ms🔗
Steps
✓Given a request with a known correlation id (0ms)
✓And the menu cache is cleared (3ms)
✓When the menu is requested with the correlation id (5ms)
✓Then the supplier service should have received the correlation id (2ms)
✓Requests should not be empty (0ms)
✓Request headers should contain key CorrelationId (0ms)
✓Request headers[ custom headers correlation id] should be '53dda38b-7bb3-412e-a71c-35d90f98f12e' (0ms)
Diagrams
This scenario:Payloads
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 12ms🔗
Steps
✓When the health check endpoint is called (6ms)
✓Then the health check response should indicate healthy with all dependencies (4ms)
✓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
This scenario:Payloads
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 23ms🔗
Steps
✓When the health check endpoint is called (13ms)
✓Then the health check response should contain detailed entries (6ms)
Diagrams
This scenario:Payloads
Heartbeat
/heartbeat - Heartbeat endpoint confirming the service is running
The heartbeat endpoint should return a running message Happy Path 12ms🔗
Steps
✓When the heartbeat endpoint is called (6ms)
✓Then the heartbeat response should indicate the service is running (3ms)
✓Heartbeat response status code should be OK (0ms)
✓Result should not be null (0ms)
✓Result status should be HeartbeatStatus (0ms)
Diagrams
This scenario:Payloads
Ingredient Usage Analytics
/ingredient-usage - Recording and summarising ingredient usage (BigQuery)
Recording ingredient usage should return the created record Happy Path 10ms🔗
Steps
✓Given a valid ingredient usage request (1ms)
✓When the ingredient usage is recorded (4ms)
✓Then the usage response should contain the created record (3ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Post steps response ingredient name should be 'Flour-c7ab38e085e84f2c92c3e15140acda95' (0ms)
✓Post steps response quantity used should be 2.5m (0ms)
✓Post steps response usage id should not be null or empty (0ms)
Diagrams
This scenario:Payloads
Getting usage summary should return aggregated data 126ms🔗
Steps
✓Given an ingredient usage record has been created (2ms)
✓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 (115ms)
✓Then the summary should contain aggregated data (7ms)
✓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-265d5c53818f4d7a82d5ba97d8b32ffe' ] (0ms)
Diagrams
This scenario:Payloads
Listing usage by ingredient should return matching records 452ms🔗
Steps
✓Given an ingredient usage record has been created (85ms)
✓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 (357ms)
✓Then the usage list response should contain the record (5ms)
✓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-8dce386716cd48d9930885318444c70d' ] (0ms)
Diagrams
This scenario:Payloads
Recording usage with missing ingredient name should return bad request 79ms ยท 60ms warm-up🔗
Steps
✓Given an ingredient usage request with a missing ingredient name (3ms)
✓When the ingredient usage is recorded (69ms)
✓Then the usage post response should indicate bad request (1ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recording usage with zero quantity should return bad request 6ms🔗
Steps
✓Given an ingredient usage request with zero quantity (0ms)
✓When the ingredient usage is recorded (3ms)
✓Then the usage post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Ingredient Waste Tracking
/ingredient-waste - Recording and managing ingredient waste (BigQuery)
Recording ingredient waste should return the created record Happy Path 6ms🔗
Steps
✓Given a valid ingredient waste request (0ms)
✓When the waste is recorded (2ms)
✓Then the waste response should contain the created record (2ms)
✓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 0.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
This scenario:Payloads
Deleting a waste record should return no content 27ms🔗
Steps
✓Given an ingredient waste record 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 waste record is deleted (21ms)
✓Then the delete response should indicate no content (1ms)
✓Delete steps response message status code should be NoContent (0ms)
Diagrams
This scenario:Payloads
Listing waste by recipe should return matching records 60ms🔗
Steps
✓Given an ingredient waste record has been created (31ms)
✓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 (20ms)
✓Then the waste list response should contain the record (6ms)
✓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 == 'eb4b9eb2-28ad-4ac9-ba2f-f47a6a90adb0' ] (0ms)
Diagrams
This scenario:Payloads
Recording waste with missing ingredient name should return bad request 4ms🔗
Steps
✓Given a waste request with a missing ingredient name (1ms)
✓When the waste is recorded (1ms)
✓Then the waste post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recording waste with missing reason should return bad request 3ms🔗
Steps
✓Given a waste request with a missing reason (0ms)
✓When the waste is recorded (1ms)
✓Then the waste post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recording waste with zero quantity should return bad request 10ms🔗
Steps
✓Given a waste request with zero quantity (2ms)
✓When the waste is recorded (4ms)
✓Then the waste post response should indicate bad request (2ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
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 8ms🔗
Steps
✓Given a valid inventory item request (0ms)
✓When the inventory item is submitted (4ms)
✓Then the inventory response should contain the created item (2ms)
✓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 'Flour-362cb3591de44a3a8254a93d9e76e3eb' (0ms)
✓Post steps response category should be "Dry Goods" (0ms)
Diagrams
This scenario:Payloads
Deleting an inventory item should return no content 28ms🔗
Steps
✓Given an inventory item exists (2ms)
✓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 (23ms)
✓Then the inventory delete response should indicate no content (0ms)
✓Delete steps response message status code should be NoContent (0ms)
Diagrams
This scenario:Payloads
Listing all inventory items should return all items 38ms🔗
Steps
✓Given an inventory item exists (6ms)
✓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 (22ms)
✓Then the inventory list response should contain the item (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 contain [ i => i.Id == '2' ] (0ms)
Diagrams
This scenario:Payloads
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 (5ms)
✓Then the inventory get response should indicate not found (1ms)
✓Get steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Inventory items support full CRUD operations
Retrieving an existing inventory item should return the item 302ms ยท 284ms warm-up🔗
Steps
✓Given an inventory item exists (70ms)
✓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 (225ms)
✓Then the inventory get response should contain the item (4ms)
✓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 'Flour-218603b9b50948d5bc7ab2bb3382cace' (0ms)
Diagrams
This scenario:Payloads
Updating an inventory item should return the updated item 28ms🔗
Steps
✓Given an inventory item exists (1ms)
✓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 (22ms)
✓Then the inventory update response should contain the updated values (3ms)
✓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
This scenario:Payloads
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 1.3s ยท 1.2s warm-up🔗
Steps
✓Given a pancake batch has been created (780ms)
✓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 (3ms)
✓And the kitchen service is configured to return busy (3ms)
✓When the breakfast order is placed (514ms)
✓Then the order should still be created successfully despite the kitchen failure (4ms)
✓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
This scenario:Payloads
Menu Availability
/menu - Checking menu item availability from ingredient sources
The menu endpoint should return all menu items with availability status Happy Path MenuAvailability 155ms🔗
Steps
✓When the menu is requested (19ms)
✓Then the menu response should contain all menu items (5ms)
✓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
This scenario:Payloads
Menu Caching
/menu - Menu response caching behaviour
Menu responses should be cached and returned even when supplier becomes unavailable SkipUnlessFakesControllable MenuCaching 218ms🔗
Steps
✓Given the menu has been requested and cached (31ms)
✓Menu steps response message status code should be OK (0ms)
✓And the supplier service is then made unavailable (1ms)
✓When the menu is requested again (4ms)
✓Then the menu response should still return available items (6ms)
✓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
This scenario:Payloads
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 119ms🔗
Steps
✓Given the supplier service will return service unavailable (15ms)
✓When the menu is requested (30ms)
✓Then the menu response should mark all items as unavailable (5ms)
✓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
This scenario:Payloads
Milk Downstream Failure
/milk - Handling downstream Cow Service failures
Requesting milk when the cow service is unavailable should return a bad gateway response SkipUnlessFakesControllable 6ms🔗
Steps
✓Given the cow service will return service unavailable (0ms)
✓When milk is requested (3ms)
✓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
This scenario:Payloads
Requesting milk when the cow service returns an invalid response should return a bad gateway response SkipUnlessFakesControllable 308ms ยท 186ms warm-up🔗
Steps
✓Given the cow service will return an invalid response (35ms)
✓When milk is requested (201ms)
✓Then the milk response should indicate a bad gateway (22ms)
✓Milk steps response message status code should be BadGateway (0ms)
✓Milk error response body should contain CowServiceUnavailableTitle (0ms)
Diagrams
This scenario:Payloads
Requesting milk when the cow service times out should return a bad gateway response SkipUnlessFakesControllable 24ms🔗
Steps
✓Given the cow service will return a timeout (5ms)
✓When milk is requested (16ms)
✓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
This scenario:Payloads
Order Cross Field Validation
/orders - Cross-field validation with configurable item limits
An order at the maximum items per order should be accepted IgnoreIfExternalSut 155ms🔗
Steps
✓Given the maximum items per order is configured to two (80ms)
✓And a pancake batch has been created (46ms)
✓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 (21ms)
✓Then the response should indicate success (2ms)
✓Order steps response message status code should be Created (0ms)
Diagrams
This scenario:Payloads
An order exceeding the maximum items per order should be rejected IgnoreIfExternalSut 119ms🔗
Steps
✓Given the maximum items per order is configured to two (80ms)
✓And a pancake batch has been created (46ms)
✓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 (11ms)
✓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 (1ms)
✓Order validation error response body should contain "Items" (0ms)
Diagrams
This scenario:Payloads
Order Pagination
/orders - Paginated listing of breakfast orders
Listing orders should return a paginated response Happy Path 36ms🔗
Steps
✓Given multiple orders have been created (21ms)
✓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 (8ms)
✓Then the paginated response should contain the orders (5ms)
✓List steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓List steps response items should have count 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
This scenario:Payloads
Listing orders when none exist should return an empty page IgnoreIfNeedsDirectDbAccess IgnoreUnlessInMemoryDb 13ms🔗
Steps
✓When orders are listed with default pagination (8ms)
✓Then the paginated response should be empty (1ms)
✓List steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
Diagrams
This scenario:Payloads
Listing orders with a small page size should limit results 101ms🔗
Steps
✓Given multiple orders have been created (89ms)
✓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 (10ms)
✓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
This scenario:Payloads
Requesting the second page should return different orders 98ms🔗
Steps
✓Given multiple orders have been created (63ms)
✓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 (25ms)
✓Then the paginated response should have correct page metadata (6ms)
✓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
This scenario:Payloads
Order Rate Limiting
/orders - Rate limiting on order creation
Exceeding the rate limit should return too many requests IgnoreIfExternalSut 126ms🔗
Steps
✓Given the rate limit is configured to allow one request per window (54ms)
✓And a pancake batch has been created (35ms)
✓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 (27ms)
✓Then the first request should succeed (1ms)
✓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
This scenario:Payloads
Order Retrieval
/orders - Retrieving orders by ID
Existing orders can be retrieved
A created order should be retrievable by its ID Happy Path IgnoreIfNeedsEventInfrastructure 30ms🔗
Steps
✓Given an order has been created (23ms)
✓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 (2ms)
✓Then the order retrieval response should contain the order (2ms)
✓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 '0d2dc7e8-3831-466d-9a6c-d4f63c386fbd' (0ms)
Diagrams
This scenario:Payloads
Non-existent orders return not found
Retrieving a non-existent order should return not found 6ms🔗
Steps
✓When a non-existent order is retrieved (3ms)
✓Then the order retrieval response should indicate not found (1ms)
✓Get order steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
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 118ms🔗
#Input ParametersStatusDuration
From StatusTo Status
1CreatedCancelledPassed22ms
2CreatedPreparingPassed26ms
3PreparingReadyPassed39ms
4ReadyCompletedPassed29ms
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" (2ms)
✓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
This scenario:Payloads
Invalid status transitions are rejected
An invalid status transition should return a conflict response 7/7 passed 578ms🔗
#Input ParametersStatusDuration
From StatusTo Status
1CancelledPreparingPassed135ms
2CancelledReadyPassed33ms
3CompletedPreparingPassed145ms
4CreatedCompletedPassed64ms
5CreatedReadyPassed20ms
6PreparingCancelledPassed34ms
7ReadyPreparingPassed144ms
Steps
✓Given an order exists with status "Cancelled" (130ms)
✓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" (1ms)
✓Then the response should indicate an invalid state transition (0ms)
✓Patch steps response message status code should be Conflict (0ms)
Diagrams
This scenario:Payloads
Order Status Via G RPC
/grpc - Retrieving order status via gRPC
Order status via gRPC should return order details Happy Path 26ms🔗
Steps
✓Given a pancake batch has been created (8ms)
✓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 order status is requested via gRPC (3ms)
✓Then the gRPC response should contain the order details (2ms)
✓Grpc steps order status reply should not be null (0ms)
✓Grpc steps order status reply order id should be '11f48d22-a835-43f7-ba65-5858ab21592d' (0ms)
✓Grpc steps order status reply customer name should be 'TestCustomer_8997350915935323216' (0ms)
✓Grpc steps order status reply status should be Created (0ms)
Diagrams
This scenario:Payloads
Order status for non-existent order should return not found 12ms🔗
Steps
✓When the order status for a non-existent order is requested via gRPC (9ms)
✓Then the gRPC response should be a not found error (1ms)
✓Grpc steps rpc exception should not be null (0ms)
✓Grpc steps rpc exception status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Order Summaries
/graphql - Querying order summary reports via GraphQL
Order summaries should contain ingested order data Happy Path IgnoreIfNeedsDirectDbAccess 28ms🔗
Steps
✓Given an order has been created and ingested into the reporting database (3ms)
✓When the order summaries are queried via graphql (12ms)
✓Then the graphql response should contain the ingested order summary (9ms)
✓Graph ql steps response message status code should be OK (0ms)
✓Graph ql steps order summaries should contain [ o => o.OrderId == '3b2cb058-0deb-4957-a770-ac997b8a7d83' && o.CustomerName == 'TestCustomer_3572690070906207147' && o.ItemCount == 3 && o.TableNumber == 7 ] (0ms)
Diagrams
This scenario:Payloads
Order summaries should return an empty list when no orders exist 19ms🔗
Steps
✓When the order summaries are queried via graphql (13ms)
✓Then the graphql response should be successful (1ms)
✓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 (3ms)
✓Graph ql steps order summaries should not contain [ o => o.OrderId == '846ab63d-89ab-4581-b8a6-d79a35a25cf0' ] (0ms)
Diagrams
This scenario:Payloads
Order Timings Analytics
/order-timings - Recording and summarising kitchen order timings (ClickHouse)
Recording an order timing should return the created record Happy Path 178ms ยท 163ms warm-up🔗
Steps
✓Given a valid order timing request (2ms)
✓When the order timing is recorded (167ms)
✓Then the timing response should contain the created record (6ms)
✓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-c42480294c294e258d3640b0ff2b9120' (0ms)
✓Post steps response prep seconds should be 42.5m (0ms)
✓Post steps response timing id should not be null or empty (0ms)
Diagrams
This scenario:Payloads
Getting the timing summary should return aggregated data 39ms🔗
Steps
✓Given an order timing record 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 timing summary is requested (28ms)
✓Then the summary should contain aggregated data for the station (5ms)
✓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-ebe5a6c9cb23460cb5adf739b8f32434' && s.TimingCount >= 1 ] (0ms)
Diagrams
This scenario:Payloads
Listing timings by station should return matching records 159ms🔗
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 timings are listed by station (144ms)
✓Then the timing list response should contain the record (5ms)
✓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 == '1e4330d5-3757-4933-9c9e-d13705e94142' ] (0ms)
Diagrams
This scenario:Payloads
Recording a timing with missing station should return bad request 3ms🔗
Steps
✓Given an order timing request with a missing station (0ms)
✓When the order timing is recorded (1ms)
✓Then the timing post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recording a timing with zero prep seconds should return bad request 8ms🔗
Steps
✓Given an order timing request with zero prep seconds (0ms)
✓When the order timing is recorded (5ms)
✓Then the timing post response should indicate bad request (1ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
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 9ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1StatusStatus is required'Status' is required.Bad RequestPassed9ms
Steps
✓Given a valid status update request with "Status" set to "" (1ms)
✓When the invalid status update request is submitted (4ms)
✓Then the status update response should contain error "'Status' is required." with status "Bad Request" (2ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Status' is required.') ] (0ms)
Diagrams
This scenario:Payloads
Orders endpoint is called with invalid fields should return a bad request response 5/5 passed 41ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1CustomerNameCustomer name is required'Customer Name' is required.Bad RequestPassed26ms
2Items[0].BatchIdBatch ID is required'Batch Id' is required.Bad RequestPassed3ms
3Items[0].ItemTypeItem type is required'Item Type' is required.Bad RequestPassed4ms
4Items[0].Quantity0Quantity must be greater than zeroQuantity must be greater than zero.Bad RequestPassed3ms
5ItemsAt least one item is requiredThe Items field is required.Bad RequestPassed3ms
Steps
✓Given a valid order request with "CustomerName" set to "" (3ms)
✓When the invalid order request is submitted (11ms)
✓Then the order response should contain error "'Customer Name' is required." with status "Bad Request" (6ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Customer Name' is required.') ] (0ms)
Diagrams
This scenario:Payloads
Outbox Retry Exhaustion
/orders - Outbox message transitions to failed after exhausting retries
An outbox message should transition to failed after exhausting retries IgnoreIfNeedsEventInfrastructure 730ms🔗
Steps
✓Given the outbox processor is configured with a failing dispatcher (163ms)
✓And a pending outbox message with a test-specific destination (2ms)
✓Then the outbox message should be in a failed state (561ms)
Sequence Diagrams
This scenario:Payloads
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 17ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed9ms
2text/htmlPassed2ms
3text/plainPassed5ms
Steps
✓Given a pancake request with content type "application/xml" (0ms)
✓When the pancakes are prepared with the given content type (4ms)
✓Then the response should indicate unsupported media type (2ms)
✓Response status code should be UnsupportedMediaType (0ms)
Diagrams
This scenario:Payloads
Pancakes Creation
/pancakes - Creating pancakes with ingredients and optional toppings
A valid pancake request should return a fresh batch Happy Path 19ms🔗
Steps
✓Given a valid pancake recipe with all ingredients (7ms)
✓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 (5ms)
✓Then the pancakes response should contain a valid batch with all ingredients (3ms)
✓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 'Some_Fresh_Milk' (0ms)
✓Pancake steps response ingredients should contain 'Some_Eggs' (0ms)
✓Pancake steps response ingredients should contain 'Some_Flour' (0ms)
✓And the cow service should have received a milk request (0ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
This scenario:Payloads
A pancake request with more toppings than allowed should return a bad request response IgnoreIfExternalSut 41ms🔗
Steps
✓Given the max toppings per item is the configured limit (0ms)
✓And a valid pancake recipe with all ingredients (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)
✓And the request has more toppings than the configured limit (2ms)
✓When the pancakes are prepared (2ms)
✓Then the pancakes response should indicate too many toppings (1ms)
✓Pancake steps response message status code should be BadRequest (0ms)
✓Pancake error response body should contain MaxToppingsExceeded (0ms)
Diagrams
This scenario:Payloads
Pancakes endpoint is called with invalid ingredients should return a bad request response 6/6 passed 36ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1EggsEggs is required'Eggs' is required.Bad RequestPassed5ms
2Eggsjavascript:void(0)XSS in eggsEggs contains potentially dangerous content.Bad RequestPassed4ms
3Flour<img onerror=x>XSS in flourFlour contains potentially dangerous content.Bad RequestPassed3ms
4FlourFlour is required'Flour' is required.Bad RequestPassed5ms
5Milk<script>alert</script>XSS in milkMilk contains potentially dangerous content.Bad RequestPassed13ms
6MilkMilk is required'Milk' is required.Bad RequestPassed5ms
Steps
✓Given a valid pancake request with "Eggs" set to "" (0ms)
✓When the invalid pancake request is submitted (3ms)
✓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
This scenario:Payloads
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 28ms🔗
Steps
✓Given a recipe cost calculated event (2ms)
✓When the event is published to Kafka (18ms)
✓Then the calculation ID should be generated (2ms)
✓Publish steps calculation id should not be '00000000-0000-0000-0000-000000000000' (0ms)
✓And the kitchen service should have received the preparation request (1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
This scenario:Payloads
Recipe Reports
/graphql - Querying recipe reports and aggregations via GraphQL
Recipe reports should contain ingested recipe data Happy Path IgnoreIfNeedsDirectDbAccess 19ms🔗
Steps
✓Given recipe logs have been ingested into the reporting database (2ms)
✓When the recipe reports are queried via graphql (8ms)
✓Then the graphql response should contain the ingested recipe reports (7ms)
✓Graph ql steps response message status code should be OK (0ms)
✓Graph ql steps recipe reports should contain [ r => r.OrderId == '59749e02-2578-4b7a-9f10-160bd82989ec' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ] (0ms)
Diagrams
This scenario:Payloads
Ingredient usage should aggregate across multiple recipes IgnoreIfNeedsDirectDbAccess 28ms🔗
Steps
✓Given multiple recipe logs have been ingested with overlapping ingredients (4ms)
✓When the ingredient usage is queried via graphql (15ms)
✓Then the ingredient usage should reflect aggregated counts (6ms)
✓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
This scenario:Payloads
Recipe Reviews Management
/recipe-reviews - Submitting and retrieving recipe reviews (MongoDB)
Submitting a recipe review should return the created review Happy Path 126ms ยท 99ms warm-up🔗
Steps
✓Given a valid recipe review request (2ms)
✓When the recipe review is submitted (109ms)
✓Then the recipe review response should contain the created review (9ms)
✓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-a415dfff246a42339d947d4afe7ae4e9' (0ms)
✓Post steps response rating should be 5 (0ms)
✓Post steps response review id should not be null or empty (0ms)
Diagrams
This scenario:Payloads
Listing reviews by recipe should return matching reviews 138ms🔗
Steps
✓Given a recipe review 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 reviews are listed by recipe name (122ms)
✓Then the list response should contain the review (5ms)
✓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 == '616441eb-1bc6-4807-ac1f-203431ba4f6b' ] (0ms)
Diagrams
This scenario:Payloads
Retrieving a non-existent review should return not found 23ms🔗
Steps
✓When a non-existent review is retrieved (22ms)
✓Then the review get response should indicate not found (1ms)
✓Get steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Retrieving existing review by id should return the review 10ms🔗
Steps
✓Given a recipe review has been created (1ms)
✓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 (3ms)
✓Then the get response should contain the review (4ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps response review id should be 'b0f23973-4cff-4a93-a588-2d3841e97fa6' (0ms)
✓Get steps response recipe name should be 'Recipe-0fde95378d5e4231bd70fe9ea7ee6319' (0ms)
Diagrams
This scenario:Payloads
Submitting a review with an invalid rating should return bad request 88ms🔗
Steps
✓Given a recipe review request with an invalid rating (2ms)
✓When the recipe review is submitted (82ms)
✓Then the review post response should indicate bad request (1ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Submitting a review with missing recipe name should return bad request 5ms🔗
Steps
✓Given a recipe review request with a missing recipe name (2ms)
✓When the recipe review is submitted (1ms)
✓Then the review post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recipe Summary Via G RPC
/grpc - Retrieving recipe summaries via gRPC
Pancake recipe summary should return correct data Happy Path 137ms ยท 54ms warm-up🔗
Steps
✓When a recipe summary is requested for "Pancakes" via gRPC (69ms)
✓Then the recipe summary should contain 42 total batches (13ms)
✓Grpc steps recipe summary reply total batches should be '42' (0ms)
✓And the recipe summary should contain ingredients "Milk, Flour, Eggs" (47ms)
✓Grpc steps recipe summary reply common ingredients should be equivalent to '[ "Milk", "Flour", "Eggs" ]' (0ms)
Diagrams
This scenario:Payloads
Waffle recipe summary should return correct data Happy Path 4ms🔗
Steps
✓When a recipe summary is requested for "Waffles" via gRPC (1ms)
✓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" (2ms)
✓Grpc steps recipe summary reply common ingredients should be equivalent to '[ "Milk", "Flour", "Eggs", "Butter" ]' (0ms)
Diagrams
This scenario:Payloads
Unknown recipe type should return zero batches 7ms🔗
Steps
✓When a recipe summary is requested for "Unknown" via gRPC (3ms)
✓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 (2ms)
✓Grpc steps recipe summary reply common ingredients should be empty (0ms)
Diagrams
This scenario:Payloads
Reporting Batch Completions
/graphql - Querying batch completion records populated by Pub/Sub consumption
Batch completions should contain data ingested via pubsub consumer Happy Path 114ms🔗
Steps
✓Given a pancake batch has been created for batch completions (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)
✓When the batch completions are queried via graphql (14ms)
✓Then the graphql response should contain the batch completion record (81ms)
✓Graph ql steps response message status code should be OK (0ms)
✓Graph ql steps batch completions should contain [ r => r.BatchId == '4ae9c98f-5557-4d0b-a869-f2af1f6226de' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ] (0ms)
Diagrams
This scenario:Payloads
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 66ms🔗
Steps
✓Given an ingredient delivery event has been received via eventgrid webhook (44ms)
✓Response status code should be OK (0ms)
✓When the ingredient shipments are queried via graphql (10ms)
✓Then the graphql response should contain the ingredient shipment record (8ms)
✓Graph ql steps response message status code should be OK (0ms)
✓Graph ql steps ingredient shipments should contain [ s => s.DeliveryId == '82356a72-f710-47d1-8c9f-edd7d3157b56' && s.IngredientName == "Milk" && s.Quantity == 50.0m ] (0ms)
Diagrams
This scenario:Payloads
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 9ms🔗
Steps
✓Given a valid reservation request (0ms)
✓When the reservation is submitted (5ms)
✓Then the reservation response should contain the confirmed booking (2ms)
✓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 'Customer-498d987429e14ee595637ef9ede4958f' (0ms)
Diagrams
This scenario:Payloads
Reservations can be cancelled once
Cancelling a reservation should return the cancelled reservation 14ms🔗
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 cancelled (4ms)
✓Then the cancellation response should indicate the reservation is cancelled (3ms)
✓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
This scenario:Payloads
Cancelling an already cancelled reservation should return a conflict response 105ms ยท 62ms warm-up🔗
Steps
✓Given a cancelled reservation exists (95ms)
✓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 (5ms)
✓Then the cancellation response should indicate a conflict (1ms)
✓Cancel steps response message status code should be Conflict (0ms)
Diagrams
This scenario:Payloads
Reservations can be deleted
Deleting a reservation should return no content 18ms🔗
Steps
✓Given a reservation exists (3ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓When the reservation is deleted (12ms)
✓Then the reservation delete response should indicate no content (1ms)
✓Delete response status code should be NoContent (0ms)
Diagrams
This scenario:Payloads
Reservations can be created and retrieved
Retrieving an existing reservation should return the reservation 28ms🔗
Steps
✓Given a reservation exists (9ms)
✓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 (12ms)
✓Then the reservation get response should contain the reservation (4ms)
✓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 'Customer-46bc3b8a51e44a87818cafb4cfaa00d7' (0ms)
✓Get steps response status should be "Confirmed" (0ms)
Diagrams
This scenario:Payloads
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 31ms🔗
Steps
✓Given an order served event (2ms)
✓When the order served event is published to Kafka (20ms)
✓Then the order ID should be generated (2ms)
✓Publish steps order id should not be '00000000-0000-0000-0000-000000000000' (0ms)
✓And the kitchen service should have received the status request (4ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == $"/status/{orderId}" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
This scenario:Payloads
Specifications Async Api
/asyncapi/v1.json - Serving the AsyncAPI specification describing event-driven messaging
The AsyncApi endpoint should return a valid specification Happy Path 132ms🔗
Steps
✓When the asyncapi endpoint is called (125ms)
✓Then the response should be valid (0ms)
✓Context format should not be null "the scenario should have fetched a specification document" (0ms)
✓Context document response message status code should be OK (0ms)
✓Response is valid json should be true $"response body (first 500 chars): {context.Document.Body?[..Math.Min(context.Document.Body.Length, 500)]}" (0ms)
✓And the asyncapi spec is written to disk (4ms)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("defaultContentType") 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
This scenario:Payloads
Specifications Async Api UI
/asyncapi - Serving the AsyncAPI documentation UI
The AsyncApi UI endpoint should return a valid page Happy Path 9ms🔗
Steps
✓When the asyncapi ui endpoint is called (5ms)
✓Then the response should be a valid asyncapi page (1ms)
✓Context document response message status code should be OK (0ms)
✓Context document body should contain "<html" (0ms)
✓Context document body should contain UiRenderer (0ms)
✓Context document body should contain Endpoints.AsyncApi.AsyncApiSpec (0ms)
Diagrams
This scenario:Payloads
Specifications Graph QL Schema
/graphql/schema.json; /graphql/schema.graphql - Serving the GraphQL schema as introspection JSON and as a schema definition
The GraphQL schema definition endpoint should return the schema definition Happy Path 65ms🔗
Steps
✓When the graphql schema definition endpoint is called (53ms)
✓Then the response should be a graphql schema definition (1ms)
✓Context document response message status code should be OK (0ms)
✓Context document response message content headers content type media type should be GraphQL (0ms)
✓And the schema definition should declare all the reporting queries (3ms)
✓And the graphql schema definition is written to disk (2ms)schema.graphql
Diagrams
This scenario:Payloads
The GraphQL schema endpoint should return a valid specification Happy Path 106ms🔗
Steps
✓When the graphql schema endpoint is called (84ms)
✓Then the response should be valid (0ms)
✓Context format should not be null "the scenario should have fetched a specification document" (0ms)
✓Context document response message status code should be OK (0ms)
✓Response is valid json should be true $"response body (first 500 chars): {context.Document.Body?[..Math.Min(context.Document.Body.Length, 500)]}" (0ms)
✓And the schema should contain all the reporting queries (11ms)
✓And the reporting queries should be documented (5ms)
✓Graph ql schema documents type description(context document json, graph ql schema defaults query type name) should not be null or white space (0ms)
✓Graph ql schema documents undocumented fields(context document json, graph ql schema defaults query type name) should be empty (0ms)
✓And the graphql schema is written to disk (3ms)graphql.json
Diagrams
This scenario:Payloads
Specifications Graph QL UI
/graphql/ - Serving the Nitro GraphQL IDE
The GraphQL UI endpoint should return a valid page Happy Path 35ms🔗
Steps
✓When the graphql ui endpoint is called (28ms)
✓Then the response should be a valid nitro page (2ms)
✓Context document response message status code should be OK (0ms)
✓Context document body should contain "<html" (0ms)
✓Context document body should contain NitroMarker (0ms)
✓And the page should be served by the service itself (2ms)
✓Context document response message headers contains( graph ql schema defaults cdn ray header) should be false (0ms)
Diagrams
This scenario:Payloads
Specifications Grpc Contract
/grpc/v1.json; /grpc/protos/breakfast.proto - Serving the gRPC contract as a descriptor set and as its proto file
The Grpc contract endpoint should return a valid specification Happy Path 48ms🔗
Steps
✓When the grpc contract endpoint is called (12ms)
✓Then the response should be valid (15ms)
✓Context format should not be null "the scenario should have fetched a specification document" (0ms)
✓Context document response message status code should be OK (0ms)
✓Context document descriptor set should not be null (0ms)
✓And the grpc contract should describe the breakfast service (12ms)
✓Context document descriptor set file select(f => f name) should equal ProtoFileName (0ms)
✓Contract file package should be Package (0ms)
✓Contract file service select(s => s name) should contain ServiceName (0ms)
✓Breakfast service method select(m => m name) should contain GetRecipeSummary (0ms)
✓Breakfast service method select(m => m name) should contain GetOrderStatus (0ms)
✓Breakfast service method select(m => m name) should contain StreamOrderUpdates (0ms)
✓Breakfast service method single(m => m name == grpc contract defaults stream order updates) server streaming should be true (0ms)
✓And every breakfast method should be documented (2ms)
✓Grpc descriptor comments undocumented methods( contract file, grpc contract defaults service name) should be empty (0ms)
✓And the grpc contract is written to disk (2ms)grpc.json
Diagrams
This scenario:Payloads
The Grpc proto endpoint should return the proto file Happy Path 8ms🔗
Steps
✓When the grpc proto endpoint is called (5ms)
✓Then the response should be a plain text proto file (1ms)
✓Context document response message status code should be OK (0ms)
✓Context document response message content headers content type media type should be MediaTypeNames.Text.Plain (0ms)
✓And the proto file should declare the breakfast service (1ms)
✓Context document body should contain $"package {GrpcContractDefaults.Package};" (0ms)
✓Context document body should contain $"service {GrpcContractDefaults.ServiceName}" (0ms)
Diagrams
This scenario:Payloads
Specifications Grpc Reflection
gRPC server reflection - Letting gRPC tools discover the breakfast service
Grpc server reflection should describe the breakfast service Happy Path 307ms🔗
Steps
✓When the breakfast service is described through grpc server reflection (244ms)
✓Then the description should be the breakfast proto file (18ms)
✓Reflection steps described files should contain single [ f => f.Name == GrpcContractDefaults.ProtoFileName ] (0ms)
✓Described file package should be Package (0ms)
✓And the description should contain every breakfast method (6ms)
✓Described file service should contain single [ s => s.Name == GrpcContractDefaults.ServiceName ] (0ms)
✓Service method select(m => m name) should contain GetRecipeSummary (0ms)
✓Service method select(m => m name) should contain GetOrderStatus (0ms)
✓Service method select(m => m name) should contain StreamOrderUpdates (0ms)
Diagrams
This scenario:Payloads
Grpc server reflection should list the breakfast service Happy Path 45ms🔗
Steps
✓When the services are listed through grpc server reflection (38ms)
✓Then the breakfast service should be listed (1ms)
✓Reflection steps listed services should contain ServiceFullName (0ms)
✓And the reflection service should be listed (1ms)
✓Reflection steps listed services should contain ReflectionServiceFullName (0ms)
Diagrams
This scenario:Payloads
Specifications Grpc UI
/grpc/ - Serving the gRPC documentation page
The Grpc UI endpoint should return a page describing the service Happy Path 90ms🔗
Steps
✓When the grpc ui endpoint is called (49ms)
✓Then the response should be a valid grpc documentation page (1ms)
✓Context document response message status code should be OK (0ms)
✓Context document response message content headers content type media type should be MediaTypeNames.Text.Html (0ms)
✓Context document body should contain "<html" (0ms)
✓And the page should describe every breakfast method (2ms)
✓Context document body should contain ServiceDescription (0ms)
✓Grpc contract page rows row of(context document body, grpc contract defaults get recipe summary) should not be null (0ms)
✓Grpc contract page rows row of(context document body, grpc contract defaults get order status) should not be null (0ms)
✓Grpc contract page rows row of(context document body, grpc contract defaults stream order updates) should contain ServerStreamingKind (0ms)
✓And the page should link to the grpc contract (1ms)
✓Context document body should contain $"href=\"{GrpcContractDefaults.ContractJsonLink}\"" (0ms)
✓Context document body should contain $"href=\"{GrpcContractDefaults.ProtoFileLink}\"" (0ms)
✓And the grpc ui page is written to disk (29ms)grpc.html
Diagrams
This scenario:Payloads
Specifications Open Api
/openapi/v1.json - Serving the OpenAPI specification describing all REST endpoints
The OpenApi endpoint should return a valid specification Happy Path 334ms🔗
Steps
✓When the open api endpoint is called (238ms)
✓Then the response should be valid (1ms)
✓Context format should not be null "the scenario should have fetched a specification document" (0ms)
✓Context document response message status code should be OK (0ms)
✓Response is valid json should be true $"response body (first 500 chars): {context.Document.Body?[..Math.Min(context.Document.Body.Length, 500)]}" (0ms)
✓And the response should contain all the endpoints (3ms)
✓And the openapi spec is written to disk (3ms)openapi.json
Diagrams
This scenario:Payloads
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 118ms🔗
Steps
✓When the scalar ui endpoint is called (114ms)
✓Then the response should be a valid scalar page (2ms)
✓Context document response message status code should be OK (0ms)
✓Scalar ui response body should contain "<html" (0ms)
✓Scalar ui response body should contain "scalar" (0ms)
Diagrams
This scenario:Payloads
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 11ms🔗
Steps
✓Given a valid staff member request (1ms)
✓When the staff member is submitted (6ms)
✓Then the staff response should contain the created member (2ms)
✓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 'Chef-7042c07636f549d9b7e4ee197a2d1ba2' (0ms)
✓Post steps response role should be "Chef" (0ms)
Diagrams
This scenario:Payloads
Staff requests must pass validation
Adding a staff member with an invalid role should return a bad request response 16ms🔗
Steps
✓Given a staff member request with an invalid role (1ms)
✓When the staff member is submitted (12ms)
✓Then the staff response should indicate bad request (1ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Staff members support CRUD operations
Deleting a staff member should return no content 22ms🔗
Steps
✓Given a staff member exists (3ms)
✓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 (17ms)
✓Then the staff delete response should indicate no content (0ms)
✓Delete response status code should be NoContent (0ms)
Diagrams
This scenario:Payloads
Retrieving an existing staff member should return the member 88ms🔗
Steps
✓Given a staff member exists (48ms)
✓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 (30ms)
✓Then the staff get response should contain the member (5ms)
✓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 'Chef-02a1e5aee7514c4994b67841d6788190' (0ms)
✓Get steps response role should be "Chef" (0ms)
Diagrams
This scenario:Payloads
Status Update Not Found
/orders - Updating status of a non-existent order
Updating the status of a non-existent order should return not found 72ms ยท 63ms warm-up🔗
Steps
✓When a status update is sent for a non-existent order (68ms)
✓Then the status update response should indicate not found (1ms)
✓Patch steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Stream Order Updates Via G RPC
/grpc - Streaming order updates via gRPC server streaming
Streaming order updates should return the current status Happy Path 875ms ยท 809ms warm-up🔗
Steps
✓Given a pancake batch has been created (254ms)
✓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 (573ms)
✓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 (37ms)
✓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 'f7f9b994-0a3b-46b5-a89e-d8ef44a79722' (0ms)
✓Grpc steps streamed replies[0] customer name should be 'TestCustomer_6124984044811950857' (0ms)
✓Grpc steps streamed replies[0] status should be Created (0ms)
Diagrams
This scenario:Payloads
Streaming updates for non-existent order should return not found 70ms🔗
Steps
✓When order updates for a non-existent order are streamed via gRPC (45ms)
✓Then the gRPC stream should return a not found error (24ms)
✓Grpc steps rpc exception should not be null (0ms)
✓Grpc steps rpc exception status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Telemetry
/orders - Structured logging and telemetry verification
Creating an order should emit a structured log entry Happy Path IgnoreIfExternalSut 237ms🔗
Steps
✓Given the application is configured with an in-memory log capture (143ms)
✓And a pancake batch has been created (69ms)
✓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 (0ms)
✓When the order is submitted (16ms)
✓Then a structured log entry should have been captured for order creation (5ms)
✓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
This scenario:Payloads
Toppings Deletion
/toppings - Deleting toppings from the system
Existing toppings can be deleted
Deleting an existing topping should return no content Happy Path 11ms🔗
Steps
✓Given a known topping exists (0ms)
✓When the topping is deleted (7ms)
✓Then the delete response should indicate success (2ms)
✓Delete steps response message status code should be NoContent (0ms)
Diagrams
This scenario:Payloads
Non-existent toppings cannot be deleted
Deleting a non-existent topping should return not found 4ms🔗
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
This scenario:Payloads
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 55ms🔗
Steps
✓Given the raspberry topping feature flag is disabled (44ms)
✓When the available toppings are requested (7ms)
✓Then the toppings response should not include raspberries (2ms)
✓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
This scenario:Payloads
Raspberry topping is available when the feature flag is enabled
Toppings should include raspberries when the feature flag is enabled IgnoreIfExternalSut 73ms🔗
Steps
✓Given the raspberry topping feature flag is enabled (55ms)
✓When the available toppings are requested (11ms)
✓Then the toppings response should include raspberries (3ms)
✓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
This scenario:Payloads
Toppings Management
/toppings - Listing available toppings and adding custom toppings
The toppings endpoint should return all available toppings Happy Path 18ms🔗
Steps
✓When the available toppings are requested (8ms)
✓Then the toppings response should contain the default toppings (9ms)
✓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
This scenario:Payloads
Adding a new topping should return the created topping 18ms🔗
Steps
✓Given a valid topping request (0ms)
✓When the new topping is submitted (11ms)
✓Then the topping response should contain the created topping (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 Strawberries (0ms)
✓Post steps response category should be FruitCategory (0ms)
Diagrams
This scenario:Payloads
Toppings Update
/toppings - Updating existing toppings
Existing toppings can be updated
Updating an existing topping should return the updated topping Happy Path 48ms🔗
Steps
✓Given a known blueberry topping exists (2ms)
✓And a valid update topping request (0ms)
✓When the topping is updated (36ms)
✓Then the update response should contain the updated topping (7ms)
✓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 '11111111-0000-0000-0000-000000000002' (0ms)
✓Put steps response name should be Strawberries (0ms)
✓Put steps response category should be FruitCategory (0ms)
Diagrams
This scenario:Payloads
Update requests must pass validation and XSS checks
Update toppings endpoint is called with invalid or dangerous input 6/6 passed 131ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Category<script>alert('xss')</script>Script tag in categoryCategory contains potentially dangerous content.Bad RequestPassed43ms
2CategoryCategory is required'Category' is required.Bad RequestPassed7ms
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 RequestPassed64ms
5Name<script>alert('xss')</script>Script tag in nameName contains potentially dangerous content.Bad RequestPassed5ms
6NameName is required'Name' is required.Bad RequestPassed6ms
Steps
✓Given a known topping exists (4ms)
✓And a valid update topping request with "Category" set to "<script>alert('xss')</script>" (7ms)
✓When the invalid update topping request is submitted (18ms)
✓Then the update response should contain error "Category contains potentially dangerous content." with status "Bad Request" (11ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Category contains potentially dangerous content.') ] (0ms)
Diagrams
This scenario:Payloads
Non-existent toppings cannot be updated
Updating a non-existent topping should return not found 11ms🔗
Steps
✓Given a topping id that does not exist (3ms)
✓And a valid update topping request (0ms)
✓When the topping is updated (5ms)
✓Then the update response should indicate not found (1ms)
✓Put steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Toppings XSS Validation
/toppings - XSS and input validation for toppings
Toppings endpoint is called with invalid or dangerous input 6/6 passed 73ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Category<script>alert('xss')</script>Script tag in categoryCategory contains potentially dangerous content.Bad RequestPassed4ms
2CategoryCategory is required'Category' is required.Bad RequestPassed40ms
3Categoryjavascript:alert(1)Javascript protocolCategory contains potentially dangerous content.Bad RequestPassed5ms
4Name<img src=x onerror=alert(1)>Event handler in nameName contains potentially dangerous content.Bad RequestPassed8ms
5Name<script>alert('xss')</script>Script tag in nameName contains potentially dangerous content.Bad RequestPassed6ms
6NameName is required'Name' is required.Bad RequestPassed7ms
Steps
✓Given a valid topping request with "Category" set to "<script>alert('xss')</script>" (0ms)
✓When the invalid topping request is submitted (2ms)
✓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
This scenario:Payloads
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 9ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed2ms
2text/htmlPassed5ms
3text/plainPassed1ms
Steps
✓Given a waffle request with content type "application/xml" (0ms)
✓When the waffles are prepared with the given content type (0ms)
✓Then the waffle response should indicate unsupported media type (0ms)
✓Response status code should be UnsupportedMediaType (0ms)
Diagrams
This scenario:Payloads
Waffles Creation
/waffles - Creating waffles with ingredients including butter
A valid waffle request should return a fresh batch Happy Path 38ms🔗
Steps
✓Given a valid waffle recipe with all ingredients (16ms)
✓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 (13ms)
✓Then the waffles response should contain a valid batch with all ingredients (5ms)
✓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 'Some_Fresh_Milk' (0ms)
✓Waffle steps response ingredients should contain 'Some_Eggs' (0ms)
✓Waffle steps response ingredients should contain 'Some_Flour' (0ms)
✓Waffle steps response ingredients should contain UnsaltedButter (0ms)
✓And the cow service should have received a milk request (0ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
This scenario:Payloads
A waffle request with more toppings than allowed should return a bad request response IgnoreIfExternalSut 18ms🔗
Steps
✓Given the max toppings per item is the configured limit (0ms)
✓And a valid waffle recipe with all ingredients (8ms)
✓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 (1ms)
✓When the waffles are prepared (4ms)
✓Then the waffles response should indicate too many toppings (2ms)
✓Waffle steps response message status code should be BadRequest (0ms)
✓Waffle error response body should contain MaxToppingsExceeded (0ms)
Diagrams
This scenario:Payloads
Waffles endpoint is called with invalid ingredients should return a bad request response 8/8 passed 89ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Butter<script>alert</script>XSS in butterButter contains potentially dangerous content.Bad RequestPassed38ms
2ButterButter is required'Butter' is required.Bad RequestPassed4ms
3EggsEggs is required'Eggs' is required.Bad RequestPassed8ms
4Eggsjavascript:void(0)XSS in eggsEggs contains potentially dangerous content.Bad RequestPassed7ms
5Flour<img onerror=x>XSS in flourFlour contains potentially dangerous content.Bad RequestPassed8ms
6FlourFlour is required'Flour' is required.Bad RequestPassed5ms
7Milk<script>alert</script>XSS in milkMilk contains potentially dangerous content.Bad RequestPassed8ms
8MilkMilk is required'Milk' is required.Bad RequestPassed7ms
Steps
✓Given a valid waffle request with "Butter" set to "<script>alert</script>" (8ms)
✓When the invalid waffle request is submitted (23ms)
✓Then the waffle response should contain error "Butter contains potentially dangerous content." with status "Bad Request" (3ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Butter contains potentially dangerous content.') ] (0ms)
Diagrams
This scenario:Payloads