Breakfast Provider (ReqNRoll) Test Run Report

Features Summary
FeatureScenariosPassedFailedSkippedStepsPassedFailedSkippedDurationAvgLongest
Apple Cinnamon Muffins Creation10100017617600344ms34ms103ms
Audit Log Filtering4400808000240ms60ms82ms
Audit Log Retrieval11003333002s2s2s
Breakfast Order33009292001s472ms938ms
Chef Notes Management8800959500881ms110ms575ms
Complete Order Lifecycle1100434300156ms156ms156ms
Correlation Id220019190013ms6ms8ms
Customer Feedback Alert Processing110014140039ms39ms39ms
Customer Preferences Management55006161001s280ms1s
Daily Specials Idempotency2200262600201ms100ms175ms
Daily Specials Not Found1100101000448ms448ms448ms
Daily Specials Ordering4400545400105ms26ms42ms
Daily Specials Validation220020200025ms12ms21ms
Degraded Health Check2200404000357ms178ms192ms
Downstream Error Health Check1100171700174ms174ms174ms
Equipment Alerts110018180053ms53ms53ms
Feedback Management6600707000472ms78ms371ms
Goat Milk Downstream Failure220022220018ms9ms11ms
Goat Milk Feature Flag2200222200376ms188ms221ms
Goat Milk Sourcing1100880067ms67ms67ms
Header Propagation220027270055ms27ms44ms
Health Check110015150014ms14ms14ms
Health Check Detail1100353500153ms153ms153ms
Heartbeat1100990018ms18ms18ms
Ingredient Usage Analytics5500626200232ms46ms96ms
Ingredient Waste Tracking66007171001s236ms1s
Inventory Management6600757500528ms88ms236ms
Kitchen Service Failure110025250038ms38ms38ms
Menu Availability1100111100184ms184ms184ms
Menu Caching1100161600396ms396ms396ms
Menu Downstream Failure1100121200222ms222ms222ms
Milk Downstream Failure330033330060ms20ms38ms
Order Cross Field Validation2200202000571ms285ms308ms
Order Pagination4400626200357ms89ms171ms
Order Rate Limiting1100272700328ms328ms328ms
Order Retrieval22002121002s1s1s
Order Status Transition11110015115100630ms57ms83ms
Order Status Via G RPC2200343400100ms50ms59ms
Order Summaries220022220073ms36ms58ms
Order Validation660060600076ms12ms24ms
Outbox Retry Exhaustion110099001s1s1s
Pancakes Content Negotiation330030300021ms7ms11ms
Pancakes Creation880010110100152ms19ms68ms
Recipe Cost Analysis Processing110014140096ms96ms96ms
Recipe Reports3300363600325ms108ms175ms
Recipe Reviews Management6600707000256ms42ms125ms
Recipe Summary Via G RPC3300333300201ms67ms188ms
Reporting Batch Completions11001818001s1s1s
Reporting Event Grid Webhook11001212001s1s1s
Reservations Management5500686800352ms70ms237ms
Specifications Async Api1100171700795ms795ms795ms
Specifications Open Api1100252500453ms453ms453ms
Specifications Open Api Scalar UI11009900381ms381ms381ms
Staff Management4400515100359ms89ms255ms
Status Update Not Found11007700448ms448ms448ms
Stream Order Updates Via G RPC2200343400107ms53ms95ms
Telemetry1100252500333ms333ms333ms
Toppings Deletion220020200027ms13ms19ms
Toppings Feature Flag2200242400412ms206ms252ms
Toppings Management2200272700128ms64ms77ms
Toppings Update880084840098ms12ms35ms
Toppings XSS Validation6600606000214ms35ms148ms
Waffles Content Negotiation330030300043ms14ms36ms
Waffles Creation10100012212200291ms29ms84ms

Test Execution Summary

ExecutionContent
Overall status:PassedFeatures: 64
Start Date:2026-06-23 (UTC)Scenarios: 194
Start Time:09:04:01 (UTC)Passed Scenarios: 194
End Time:09:04:13 (UTC)Failed Scenarios: 0
Duration:11sSkipped Scenarios: 0
Kronikol Version:3.0.43+93bf08d0b1f5375ddbce6ed6f5bbd653d4283376
Passed: 194 (100%)100%

Filtering

Filters
Status:
Happy Paths:
Duration ≥:
Dependencies:
Details:lines
Apple Cinnamon Muffins Creation
/muffins - Creating apple cinnamon muffins with baking profiles and toppings
A valid apple cinnamon muffin request should return a fresh batch Happy Path 35ms🔗
Steps
Given a valid apple cinnamon muffin recipe with all ingredients (11ms)
Given a valid apple cinnamon muffin recipe with all ingredients (11ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Given a valid apple cinnamon muffin recipe with all ingredients (11ms)
When the muffins are prepared (7ms)
When the muffins are prepared (7ms)
Then the muffin response should contain a valid batch with all ingredients (9ms)
Muffin steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Muffin steps response ingredients should contain 'Milk' (0ms)
Muffin steps response ingredients should contain 'Eggs' (0ms)
Muffin steps response ingredients should contain 'Flour' (0ms)
Muffin steps response ingredients should contain GrannySmithApples (0ms)
Muffin steps response ingredients should contain CeylonCinnamon (0ms)
Muffin steps response toppings should have count 1 (0ms)
Muffin steps response baking temperature should be DefaultTemperature (0ms)
Muffin steps response baking duration should be DefaultDuration (0ms)
When the muffins are prepared (7ms)
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)
Then the muffin response should contain a valid batch with all ingredients (9ms)
Then the muffin response should contain a valid batch with all ingredients (9ms)
And the cow service should have received a milk request for the muffins (1ms)
And the cow service should have received a milk request for the muffins (1ms)
Diagrams
Details:lines
Different muffin recipes should produce the expected batch 3/3 passed 174ms🔗
#Input ParametersStatusDuration
Recipe NameFlourApple VarietyCinnamon TypeTemperatureDurationPan TypeTopping 1Amount 1Topping 2Amount 2Expected Ingredient CountExpected Topping Count
1ClassicPlain FlourGranny SmithCeylon18025StandardStreuselLightIcing GlazeDrizzle52Passed46ms
2Rustic WholesomeWhole WheatHoneycrispCassia17530Cast IronBrown Sugar CrumbHeavyMaple DrizzleLight52Passed24ms
3Spiced DeluxeAlmondPink LadySaigon19020SiliconeCinnamon SugarHeavyCream Cheese SwirlThick52Passed103ms
Steps
Given a muffin recipe "Classic" with the following ingredients: (34ms)
FlourApplesCinnamon
Plain FlourGranny SmithCeylon
Given a muffin recipe "Classic" with the following ingredients: (34ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Given a muffin recipe "Classic" with the following ingredients: (34ms)
FlourApplesCinnamon
Plain FlourGranny SmithCeylon
And with baking at 180 degrees for 25 minutes in a "Standard" pan (0ms)
And with baking at 180 degrees for 25 minutes in a "Standard" pan (0ms)
And the following muffin toppings: (0ms)
And with baking at 180 degrees for 25 minutes in a "Standard" pan (0ms)
When the muffins are prepared (6ms)
And the following muffin toppings: (0ms)
NameAmount
StreuselLight
Icing GlazeDrizzle
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 following muffin toppings: (0ms)
NameAmount
StreuselLight
Icing GlazeDrizzle
And the muffin response should include 2 toppings (0ms)
Muffin steps response toppings should have count '2' (0ms)
When the muffins are prepared (6ms)
And the muffin response should include baking information (0ms)
Muffin steps response baking temperature should be greater than 0 (0ms)
When the muffins are prepared (6ms)
Then the muffin batch should have 5 ingredients (0ms)
Then the muffin batch should have 5 ingredients (0ms)
And the muffin response should include 2 toppings (0ms)
And the muffin response should include 2 toppings (0ms)
And the muffin response should include baking information (0ms)
And the muffin response should include baking information (0ms)
Diagrams
Details:lines
Muffins endpoint called with an invalid field should return a bad request response 6/6 passed 135ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1ApplesApples is required'Apples' is required.Bad RequestPassed7ms
2Cinnamon<script>alert('xss')</script>XSS in cinnamonCinnamon contains potentially dangerous content.Bad RequestPassed101ms
3CinnamonCinnamon is required'Cinnamon' is required.Bad RequestPassed6ms
4EggsEggs is required'Eggs' is required.Bad RequestPassed5ms
5FlourFlour is required'Flour' is required.Bad RequestPassed4ms
6MilkMilk is required'Milk' is required.Bad RequestPassed9ms
Steps
Given a valid muffin request with "Apples" set to "" (1ms)
Given a valid muffin request with "Apples" set to "" (1ms)
Given a valid muffin request with "Apples" set to "" (1ms)
When the invalid muffin request is submitted (3ms)
When the invalid muffin request is submitted (3ms)
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)
When the invalid muffin request is submitted (3ms)
Then the muffin response should contain error "'Apples' is required." with status "Bad Request" (0ms)
Then the muffin response should contain error "'Apples' is required." with status "Bad Request" (0ms)
Diagrams
Details:lines
Audit Log Filtering
/audit-logs - Filtering audit logs by entity type and entity ID
Audit logs should be filterable by entity id 70ms🔗
Steps
Given a pancake batch has been created (11ms)
Given a pancake batch has been created (11ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
Given a pancake batch has been created (11ms)
And an order has been created for the batch (11ms)
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)
And an order has been created for the batch (11ms)
When audit logs are requested filtered by entity id (18ms)
And an order has been created for the batch (11ms)
Then the audit log response should contain the specific order entry (5ms)
Audit log response status code should be OK (0ms)
Audit logs should contain [ l => l.EntityId == 'f843f0d4-f1b2-4377-b716-3d9def34fd95' ] (0ms)
When audit logs are requested filtered by entity id (18ms)
When audit logs are requested filtered by entity id (18ms)
Then the audit log response should contain the specific order entry (5ms)
Then the audit log response should contain the specific order entry (5ms)
Diagrams
Details:lines
Audit logs should be filterable by entity type 63ms🔗
Steps
Given a pancake batch has been created (10ms)
Given a pancake batch has been created (10ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
Given a pancake batch has been created (10ms)
And an order has been created for the batch (14ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
And an order has been created for the batch (14ms)
When audit logs are requested filtered by entity type (26ms)
And an order has been created for the batch (14ms)
Then the audit log response should only contain order entries (9ms)
Audit log response status code should be OK (0ms)
Audit logs should only contain [ l => l.EntityType == AuditLogDefaults.OrderEntityType ] (0ms)
When audit logs are requested filtered by entity type (26ms)
When audit logs are requested filtered by entity type (26ms)
Then the audit log response should only contain order entries (9ms)
Then the audit log response should only contain order entries (9ms)
Diagrams
Details:lines
Audit logs should be returned in descending timestamp order 82ms🔗
Steps
Given a pancake batch has been created (40ms)
Given a pancake batch has been created (40ms)
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)
Given a pancake batch has been created (40ms)
And an order has been created for the batch (17ms)
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)
And an order has been created for the batch (17ms)
When audit logs are requested filtered by entity type (10ms)
And an order has been created for the batch (17ms)
Then the audit logs should be ordered by timestamp descending (11ms)
Audit logs should not be null or empty (0ms)
Audit logs should be in descending order [ l => l.Timestamp ] (0ms)
When audit logs are requested filtered by entity type (10ms)
When audit logs are requested filtered by entity type (10ms)
Then the audit logs should be ordered by timestamp descending (11ms)
Then the audit logs should be ordered by timestamp descending (11ms)
Diagrams
Details:lines
Filtering audit logs by a non-existent entity type should return an empty collection 24ms🔗
Steps
When audit logs are requested filtered by a non-existent entity type (14ms)
When audit logs are requested filtered by a non-existent entity type (14ms)
When audit logs are requested filtered by a non-existent entity type (14ms)
Then the audit log response should be an empty collection (7ms)
Audit log response status code should be OK (0ms)
Audit logs from different time range should be empty (0ms)
Then the audit log response should be an empty collection (7ms)
Then the audit log response should be an empty collection (7ms)
Diagrams
Details:lines
Audit Log Retrieval
/audit-logs - Retrieving audit log entries for order operations
Creating an order should produce a retrievable audit log entry Happy Path 2.3s🔗
Steps
Given a pancake batch has been created (1.1s)
Given a pancake batch has been created (1.1s)
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)
Given a pancake batch has been created (1.1s)
And an order has been created for the batch (995ms)
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)
And an order has been created for the batch (995ms)
When the audit logs are retrieved (76ms)
And an order has been created for the batch (995ms)
Then the audit log response should contain the order creation entry (26ms)
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_6173861030124180143') ] (0ms)
When the audit logs are retrieved (76ms)
And the cow service should have received a milk request (13ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
When the audit logs are retrieved (76ms)
And the kitchen service should have received a preparation request (8ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Then the audit log response should contain the order creation entry (26ms)
Then the audit log response should contain the order creation entry (26ms)
And the cow service should have received a milk request (13ms)
And the cow service should have received a milk request (13ms)
And the kitchen service should have received a preparation request (8ms)
And the kitchen service should have received a preparation request (8ms)
Diagrams
Details:lines
Breakfast Order
/orders - Creating and managing breakfast orders with event publishing
Creating an order publishes events and notifies the kitchen
A valid order should be created and an event published Happy Path 938ms🔗
Steps
Given a pancake batch has been created (14ms)
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)
Given a pancake batch has been created (14ms)
And a valid order request for the created batch (0ms)
And a valid order request for the created batch (0ms)
When the breakfast order is placed (15ms)
And a valid order request for the created batch (0ms)
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_7921202431654281036' (0ms)
Order steps response items should have count 1 (0ms)
When the breakfast order is placed (15ms)
And an order created event should have been published (902ms)
Event store should not be null (0ms)
When the breakfast order is placed (15ms)
And the kitchen service should have received a preparation request (1ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Then the order response should contain a complete order (0ms)
Then the order response should contain a complete order (0ms)
And an order created event should have been published (902ms)
And an order created event should have been published (902ms)
And the kitchen service should have received a preparation request (1ms)
And the kitchen service should have received a preparation request (1ms)
Diagrams
Details:lines
Creating an order produces audit and recipe logs
Creating an order should produce an audit log entry and events 364ms🔗
Steps
Given a pancake batch has been created (12ms)
Given a pancake batch has been created (12ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
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)
Given a pancake batch has been created (12ms)
And a valid order request for the created batch (0ms)
And a valid order request for the created batch (0ms)
When the breakfast order is placed (10ms)
And a valid order request for the created batch (0ms)
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_2666527466411395120' (0ms)
Order steps response items should have count 1 (0ms)
When the breakfast order is placed (10ms)
And an order created event should have been published (320ms)
Event store should not be null (0ms)
When the breakfast order is placed (10ms)
And a recipe log should have been published to kafka (15ms)
Kafka store should not be null (0ms)
Then the order response should contain a complete order (0ms)
Then the order response should contain a complete order (0ms)
And an order created event should have been published (320ms)
And an order created event should have been published (320ms)
And a recipe log should have been published to kafka (15ms)
And a recipe log should have been published to kafka (15ms)
Diagrams
Details:lines
Creating an order writes an outbox message for reliable delivery
Creating an order should write an outbox message that gets processed 116ms🔗
Steps
Given a pancake batch has been created (21ms)
Given a pancake batch has been created (21ms)
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)
Given a pancake batch has been created (21ms)
And a valid order request for the created batch (1ms)
And a valid order request for the created batch (1ms)
When the breakfast order is placed (12ms)
And a valid order request for the created batch (1ms)
Then the order response should contain a complete order (6ms)
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_4732177002199637461' (0ms)
Order steps response items should have count 1 (0ms)
When the breakfast order is placed (12ms)
And an outbox message should have been written for the order created event (45ms)
Outbox messages should contain [ m => m.EventType == 'OrderCreatedEvent', $"an outbox message should exist for event type '{eventType}'" ] (0ms)
When the breakfast order is placed (12ms)
And the outbox message should have been processed (23ms)
Then the order response should contain a complete order (6ms)
Then the order response should contain a complete order (6ms)
And an outbox message should have been written for the order created event (45ms)
And an outbox message should have been written for the order created event (45ms)
And the outbox message should have been processed (23ms)
And the outbox message should have been processed (23ms)
Diagrams
Details:lines
Chef Notes Management
/chef-notes - Creating, retrieving, and updating chef notes (MongoDB)
Creating a chef note should return the created note Happy Path 21ms🔗
Steps
Given a valid chef note request (0ms)
Given a valid chef note request (0ms)
Given a valid chef note request (0ms)
When the note is submitted (7ms)
When the note is submitted (7ms)
Then the response should contain the created note (11ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response recipe name should be 'Recipe-cabc4661f7a74d939070e008d59226f3' (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)
When the note is submitted (7ms)
Then the response should contain the created note (11ms)
Then the response should contain the created note (11ms)
Diagrams
Details:lines
Creating a note with missing note text should return bad request 7ms🔗
Steps
Given a note request with missing note text (1ms)
Given a note request with missing note text (1ms)
Given a note request with missing note text (1ms)
When the note is submitted (3ms)
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)
When the note is submitted (3ms)
Then the note response should indicate bad request (0ms)
Then the note response should indicate bad request (0ms)
Diagrams
Details:lines
Creating a note with missing recipe name should return bad request 47ms🔗
Steps
Given a note request with a missing recipe name (1ms)
Given a note request with a missing recipe name (1ms)
Given a note request with a missing recipe name (1ms)
When the note is submitted (29ms)
When the note is submitted (29ms)
Then the note response should indicate bad request (2ms)
Post steps response message status code should be BadRequest (0ms)
When the note is submitted (29ms)
Then the note response should indicate bad request (2ms)
Then the note response should indicate bad request (2ms)
Diagrams
Details:lines
Listing notes by recipe should return matching notes 575ms🔗
Steps
Given a chef note exists (216ms)
Given a chef note exists (216ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a chef note exists (216ms)
When the notes are listed by recipe (325ms)
When the notes are listed by recipe (325ms)
Then the list response should contain the note (17ms)
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 == '9248792a-2752-4eb4-9772-d8603838bcbd' ] (0ms)
When the notes are listed by recipe (325ms)
Then the list response should contain the note (17ms)
Then the list response should contain the note (17ms)
Diagrams
Details:lines
Retrieving a non-existent note should return not found 21ms🔗
Steps
When a non-existent note is retrieved (13ms)
When a non-existent note is retrieved (13ms)
When a non-existent note is retrieved (13ms)
Then the get response should indicate not found (3ms)
Get steps response message status code should be NotFound (0ms)
Then the get response should indicate not found (3ms)
Then the get response should indicate not found (3ms)
Diagrams
Details:lines
Retrieving an existing note by id should return the note 81ms🔗
Steps
Given a chef note exists (10ms)
Given a chef note exists (10ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a chef note exists (10ms)
When the note is retrieved by id (57ms)
When the note is retrieved by id (57ms)
Then the get response should contain the note (10ms)
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 '47da0870-d64b-44d3-be13-1f6bd95fac63' (0ms)
Get steps response recipe name should be 'Recipe-ad87f3f8ed2e4b128837601ac7a08faf' (0ms)
When the note is retrieved by id (57ms)
Then the get response should contain the note (10ms)
Then the get response should contain the note (10ms)
Diagrams
Details:lines
Updating a non-existent note should return not found 82ms🔗
Steps
When a non-existent note is updated (79ms)
When a non-existent note is updated (79ms)
When a non-existent note is updated (79ms)
Then the note update response should indicate not found (1ms)
Patch steps response message status code should be NotFound (0ms)
Then the note update response should indicate not found (1ms)
Then the note update response should indicate not found (1ms)
Diagrams
Details:lines
Updating an existing note should return the updated note 44ms🔗
Steps
Given a chef note exists (5ms)
Given a chef note exists (5ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a chef note exists (5ms)
When the note is updated (22ms)
When the note is updated (22ms)
Then the update response should contain the modified note (13ms)
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 '7e607ff2-523c-479a-8b3c-babd3f52bb71' (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)
When the note is updated (22ms)
Then the update response should contain the modified note (13ms)
Then the update response should contain the modified note (13ms)
Diagrams
Details:lines
Complete Order Lifecycle
/orders - Complete order lifecycle from creation through to completion
An order should progress through all status transitions to completion Happy Path 156ms🔗
Steps
Given a pancake batch has been created (21ms)
Given a pancake batch has been created (21ms)
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)
Given a pancake batch has been created (21ms)
And a breakfast order has been placed for the batch (25ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
And a breakfast order has been placed for the batch (25ms)
When the order progresses through all statuses to completed (34ms)
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)
And a breakfast order has been placed for the batch (25ms)
Then the completed order should be retrievable with all details (10ms)
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 '9c5768c9-addd-4c15-b512-47ae3535e75f' (0ms)
Get order steps response status should be Completed (0ms)
Get order steps response customer name should be 'LifecycleTestCustomer_7994029807799751507' (0ms)
When the order progresses through all statuses to completed (34ms)
And an audit log entry should exist for the order (45ms)
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_7994029807799751507') ] (0ms)
When the order progresses through all statuses to completed (34ms)
And the cow service should have received a milk request (2ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Then the completed order should be retrievable with all details (10ms)
And the kitchen service should have received a preparation request (3ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Then the completed order should be retrievable with all details (10ms)
And an audit log entry should exist for the order (45ms)
And an audit log entry should exist for the order (45ms)
And the cow service should have received a milk request (2ms)
And the cow service should have received a milk request (2ms)
And the kitchen service should have received a preparation request (3ms)
And the kitchen service should have received a preparation request (3ms)
Diagrams
Details:lines
Correlation Id
Cross-cutting - X-Correlation-Id header propagation across API responses
Provided correlation IDs are echoed back
A request with a correlation id should return the same id in the response Happy Path 8ms🔗
Steps
Given a request with a known correlation id (0ms)
Given a request with a known correlation id (0ms)
Given a request with a known correlation id (0ms)
When the request is sent to the menu endpoint (3ms)
When the request is sent to the menu endpoint (3ms)
Then the response should contain the same correlation id (1ms)
Response contains correlation id header should be true (0ms)
First correlation id header value should be '06bc176a-e89e-4a26-a0b2-ac8b8f51f7c8' (0ms)
When the request is sent to the menu endpoint (3ms)
Then the response should contain the same correlation id (1ms)
Then the response should contain the same correlation id (1ms)
Diagrams
Details:lines
Missing correlation IDs are generated automatically
A request without a correlation id should have one generated in the response 5ms🔗
Steps
When a request without a correlation id is sent to the menu endpoint (2ms)
When a request without a correlation id is sent to the menu endpoint (2ms)
When a request without a correlation id is sent to the menu endpoint (2ms)
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)
Then the response should contain a generated correlation id (1ms)
Then the response should contain a generated correlation id (1ms)
Diagrams
Details:lines
Customer Feedback Alert Processing
PubSub → BreakfastProvider → MongoDB + gRPC + HTTP: Customer feedback event consumption and downstream processing
Consuming customer feedback event should trigger downstream processing Happy Path IgnoreIfExternalSut 39ms🔗
Steps
Given a customer feedback received event (2ms)
Given a customer feedback received event (2ms)
Given a customer feedback received event (2ms)
When the event is published to PubSub (28ms)
When the event is published to PubSub (28ms)
Then the feedback ID should be generated (2ms)
Publish steps feedback id should not be Empty (0ms)
When the event is published to PubSub (28ms)
And the supplier service should have received the feedback (2ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/ingredients/feedback" && r.Method == HttpMethod.Post ] (0ms)
Then the feedback ID should be generated (2ms)
Then the feedback ID should be generated (2ms)
And the supplier service should have received the feedback (2ms)
And the supplier service should have received the feedback (2ms)
Diagrams
Details:lines
Customer Preferences Management
/customer-preferences - Managing customer breakfast preferences
Customer preferences support CRUD operations
Saving customer preferences should return the saved preferences Happy Path 15ms🔗
Steps
Given a valid customer preference request (1ms)
Given a valid customer preference request (1ms)
Given a valid customer preference request (1ms)
When the customer preferences are saved (9ms)
When the customer preferences are saved (9ms)
Then the preference response should contain the saved preferences (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 "Oat" (0ms)
Put steps response favourite item should be "Blueberry Pancakes" (0ms)
When the customer preferences are saved (9ms)
Then the preference response should contain the saved preferences (3ms)
Then the preference response should contain the saved preferences (3ms)
Diagrams
Details:lines
Retrieving existing customer preferences should return the preferences 21ms🔗
Steps
Given customer preferences exist (5ms)
Given customer preferences exist (5ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Given customer preferences exist (5ms)
When the customer preferences are retrieved (8ms)
When the customer preferences are retrieved (8ms)
Then the preference get response should contain the preferences (5ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response customer id should be '073a9175ebc24979bdb2f3cac5de1ee9' (0ms)
Get steps response preferred milk type should be "Oat" (0ms)
Get steps response likes extra toppings should be true (0ms)
When the customer preferences are retrieved (8ms)
Then the preference get response should contain the preferences (5ms)
Then the preference get response should contain the preferences (5ms)
Diagrams
Details:lines
Non-existent preferences cannot be retrieved
Retrieving non-existent customer preferences should return not found 1.3s🔗
Steps
When non-existent customer preferences are retrieved (1.2s)
When non-existent customer preferences are retrieved (1.2s)
When non-existent customer preferences are retrieved (1.2s)
Then the preference get response should indicate not found (2ms)
Get steps response message status code should be NotFound (0ms)
Then the preference get response should indicate not found (2ms)
Then the preference get response should indicate not found (2ms)
Diagrams
Details:lines
Preference requests must pass validation
Saving customer preferences with missing customer name should return bad request 6ms🔗
Steps
Given a customer preference request with missing customer name (1ms)
Given a customer preference request with missing customer name (1ms)
Given a customer preference request with missing customer name (1ms)
When the customer preferences are saved (1ms)
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)
When the customer preferences are saved (1ms)
Then the preference response should indicate bad request (1ms)
Then the preference response should indicate bad request (1ms)
Diagrams
Details:lines
Customer preferences support CRUD operations
Updating customer preferences should return the updated preferences 109ms🔗
Steps
Given customer preferences exist (90ms)
Given customer preferences exist (90ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Given customer preferences exist (90ms)
When the customer preferences are updated (12ms)
When the customer preferences are updated (12ms)
Then the preference update response should contain the updated values (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 "Almond" (0ms)
Put steps response favourite item should be "Belgian Waffles" (0ms)
When the customer preferences are updated (12ms)
Then the preference update response should contain the updated values (4ms)
Then the preference update response should contain the updated values (4ms)
Diagrams
Details:lines
Daily Specials Idempotency
/daily-specials/orders - Idempotent order creation using Idempotency-Key header
Submitting the same order with different idempotency keys should return different confirmations 175ms🔗
Background Steps
Given the cinnamon swirl order count is reset (49ms)
Given the cinnamon swirl order count is reset (49ms)
Given the cinnamon swirl order count is reset (49ms)
And an order request for the same special (1ms)
Steps
And an order request for the same special (1ms)
When the order is submitted with two different idempotency keys (113ms)
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)
And an order request for the same special (1ms)
Then the responses should have different confirmation ids (5ms)
First confirmation id should not be '8d16d354-2b8c-4956-b276-724b8ff06848' (0ms)
When the order is submitted with two different idempotency keys (113ms)
When the order is submitted with two different idempotency keys (113ms)
Then the responses should have different confirmation ids (5ms)
Then the responses should have different confirmation ids (5ms)
Diagrams
Details:lines
Submitting the same order with the same idempotency key should return the same confirmation 25ms🔗
Background Steps
Given the cinnamon swirl order count is reset (49ms)
Given the cinnamon swirl order count is reset (49ms)
Given the cinnamon swirl order count is reset (49ms)
And an order request for the same special (1ms)
Steps
And an order request with an idempotency key (7ms)
When the order is submitted twice with the same idempotency key (12ms)
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)
And an order request with an idempotency key (7ms)
Then both responses should return the same confirmation id (2ms)
First confirmation id should be '6a82cd20-11b6-44c3-83df-7dc5c5b6ee21' (0ms)
When the order is submitted twice with the same idempotency key (12ms)
When the order is submitted twice with the same idempotency key (12ms)
Then both responses should return the same confirmation id (1ms)
Then both responses should return the same confirmation id (1ms)
Diagrams
Details:lines
Daily Specials Not Found
/daily-specials/orders - Ordering a non-existent daily special
Ordering a non-existent daily special should return not found 448ms🔗
Steps
Given a daily special order request for a non-existent special (39ms)
Given a daily special order request for a non-existent special (39ms)
Given a daily special order request for a non-existent special (39ms)
When the daily special order is submitted (319ms)
When the daily special order is submitted (319ms)
Then the daily special response should indicate not found (14ms)
Post steps response message status code should be NotFound (0ms)
When the daily special order is submitted (319ms)
Then the daily special response should indicate not found (14ms)
Then the daily special response should indicate not found (14ms)
Diagrams
Details:lines
Daily Specials Ordering
/daily-specials - Ordering daily specials with threshold limits
Valid daily special orders are fulfilled
A valid daily special order should return a confirmation Happy Path 42ms🔗
Steps
Given the cinnamon swirl order count is reset (18ms)
Given the cinnamon swirl order count is reset (18ms)
Given the cinnamon swirl order count is reset (18ms)
And a valid daily special order request for cinnamon swirl (13ms)
And a valid daily special order request for cinnamon swirl (13ms)
When the daily special order is submitted (1ms)
And a valid daily special order request for cinnamon swirl (13ms)
Then the daily special order response should contain a valid confirmation (4ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response special id should be CinnamonSwirlId (0ms)
Post steps response order confirmation id should not be empty (0ms)
When the daily special order is submitted (1ms)
When the daily special order is submitted (1ms)
Then the daily special order response should contain a valid confirmation (4ms)
Then the daily special order response should contain a valid confirmation (4ms)
Diagrams
Details:lines
Orders are rejected when the daily limit is reached
Ordering a daily special beyond the threshold should return a conflict response IgnoreIfExternalSut 16ms🔗
Steps
Given the matcha waffles order count is reset (3ms)
Given the matcha waffles order count is reset (3ms)
Given the matcha waffles order count is reset (3ms)
And the matcha waffles special has been ordered up to the configured limit (4ms)
Post steps response message status code should be Created (0ms)
And the matcha waffles special has been ordered up to the configured limit (4ms)
When another order is placed for the matcha waffles special (4ms)
And the matcha waffles special has been ordered up to the configured limit (4ms)
Then the response should indicate the daily special is sold out (1ms)
Post steps response message status code should be Conflict (0ms)
When another order is placed for the matcha waffles special (4ms)
When another order is placed for the matcha waffles special (4ms)
Then the response should indicate the daily special is sold out (1ms)
Then the response should indicate the daily special is sold out (1ms)
Diagrams
Details:lines
Remaining quantity decreases with each order
Remaining quantity should decrease after each order IgnoreIfExternalSut 19ms🔗
Steps
Given the lemon ricotta order count is reset (2ms)
Given the lemon ricotta order count is reset (2ms)
Given the lemon ricotta order count is reset (2ms)
And a daily special order for lemon ricotta of quantity one is placed (4ms)
Post steps response message status code should be Created (0ms)
And a daily special order for lemon ricotta of quantity one is placed (4ms)
When the available daily specials are requested (1ms)
And a daily special order for lemon ricotta of quantity one is placed (4ms)
Then the lemon ricotta special should have one fewer remaining (8ms)
Response content is valid json should be true (0ms)
Lemon ricotta remaining quantity should be MaxOrdersPerSpecial - 1 (0ms)
When the available daily specials are requested (1ms)
When the available daily specials are requested (1ms)
Then the lemon ricotta special should have one fewer remaining (8ms)
Then the lemon ricotta special should have one fewer remaining (8ms)
Diagrams
Details:lines
Valid daily special orders are fulfilled
The daily specials endpoint should return all available specials 27ms🔗
Steps
When the available daily specials are requested (17ms)
When the available daily specials are requested (17ms)
When the available daily specials are requested (17ms)
Then the daily specials response should contain all expected specials (8ms)
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)
Then the daily specials response should contain all expected specials (8ms)
Then the daily specials response should contain all expected specials (8ms)
Diagrams
Details:lines
Daily Specials Validation
/daily-specials/orders - Input validation for daily special orders
Daily specials order endpoint is called with invalid fields should return a bad request response 2/2 passed 25ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Quantity0Quantity must be > zeroQuantity must be greater than zero.Bad RequestPassed21ms
2SpecialIdSpecialId is required'Special Id' is required.Bad RequestPassed3ms
Steps
Given a valid daily special order request with "Quantity" set to "0" (3ms)
Given a valid daily special order request with "Quantity" set to "0" (3ms)
Given a valid daily special order request with "Quantity" set to "0" (3ms)
When the invalid daily special order request is submitted (7ms)
When the invalid daily special order request is submitted (7ms)
Then the daily special response should contain error "Quantity must be greater than zero." with status "Bad Request" (4ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Quantity must be greater than zero.') ] (0ms)
When the invalid daily special order request is submitted (7ms)
Then the daily special response should contain error "Quantity must be greater than zero." with status "Bad Request" (4ms)
Then the daily special response should contain error "Quantity must be greater than zero." with status "Bad Request" (4ms)
Diagrams
Details:lines
Degraded Health Check
/health - Health check endpoint reporting degraded status when downstream services are unavailable
Health check should report degraded when multiple downstream services are unavailable SkipUnlessFakesControllable 165ms🔗
Steps
Given the cow service is configured to be unreachable (0ms)
Given the cow service is configured to be unreachable (0ms)
Given the cow service is configured to be unreachable (0ms)
And the supplier service is configured to be unreachable (0ms)
And the supplier service is configured to be unreachable (0ms)
When the health check endpoint is called (149ms)
And the supplier service is configured to be unreachable (0ms)
Then the health check response should indicate a degraded status (3ms)
Health response status code should be OK (0ms)
Health check result status should be Degraded (0ms)
When the health check endpoint is called (149ms)
And the cow service dependency should report degraded (1ms)
Health check result results should contain key CowService (0ms)
Cow service health status should be Degraded (0ms)
When the health check endpoint is called (149ms)
And the supplier service dependency should report degraded (3ms)
Health check result results should contain key SupplierService (0ms)
Supplier service health status should be Degraded (0ms)
Then the health check response should indicate a degraded status (3ms)
Then the health check response should indicate a degraded status (3ms)
And the cow service dependency should report degraded (1ms)
And the cow service dependency should report degraded (1ms)
And the supplier service dependency should report degraded (3ms)
And the supplier service dependency should report degraded (3ms)
Diagrams
Details:lines
Health check should report degraded when the cow service is unavailable SkipUnlessFakesControllable 192ms🔗
Steps
Given the cow service is configured to be unreachable (0ms)
Given the cow service is configured to be unreachable (0ms)
Given the cow service is configured to be unreachable (0ms)
When the health check endpoint is called (188ms)
When the health check endpoint is called (188ms)
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)
When the health check endpoint is called (188ms)
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)
Then the health check response should indicate a degraded status (0ms)
Then the health check response should indicate a degraded status (0ms)
And the cow service dependency should report degraded (0ms)
And the cow service dependency should report degraded (0ms)
Diagrams
Details:lines
Downstream Error Health Check
/health - Health check reports degraded when a downstream service returns a non-success HTTP status
Health check should report degraded when a downstream service returns a non-success status SkipUnlessFakesControllable 174ms🔗
Steps
Given the kitchen service health check is configured to use a failing endpoint (137ms)
Given the kitchen service health check is configured to use a failing endpoint (137ms)
Given the kitchen service health check is configured to use a failing endpoint (137ms)
When the health check endpoint is called (24ms)
When the health check endpoint is called (24ms)
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)
When the health check endpoint is called (24ms)
And the kitchen service dependency should report degraded with a status code description (5ms)
Health check result results should contain key KitchenService (0ms)
Kitchen service health status should be Degraded (0ms)
Kitchen service health description should contain "503" (0ms)
Then the health check response should indicate a degraded status (0ms)
Then the health check response should indicate a degraded status (0ms)
And the kitchen service dependency should report degraded with a status code description (5ms)
And the kitchen service dependency should report degraded with a status code description (5ms)
Diagrams
Details:lines
Equipment Alerts
/graphql - Querying equipment alerts populated by Event Hub consumption
Equipment alerts should contain data ingested via Event Hub consumer Happy Path 53ms🔗
Steps
Given a pancake batch has been created (13ms)
Given a pancake batch has been created (13ms)
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)
Given a pancake batch has been created (13ms)
When the equipment alerts are queried via graphql (21ms)
When the equipment alerts are queried via graphql (21ms)
Then the graphql response should contain the equipment alert record (13ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps equipment alerts should contain [ a => a.BatchId == 'bfed44c0-ef58-453b-ab5c-4ef8d023cf61' && a.EquipmentName == "Griddle" && a.AlertType == "UsageCycleCompleted" ] (0ms)
When the equipment alerts are queried via graphql (21ms)
Then the graphql response should contain the equipment alert record (13ms)
Then the graphql response should contain the equipment alert record (13ms)
Diagrams
Details:lines
Feedback Management
/feedback - Submitting and retrieving customer feedback
Feedback can be submitted and retrieved
Submitting feedback should return the created feedback Happy Path 31ms🔗
Steps
Given a valid feedback request (16ms)
Given a valid feedback request (16ms)
Given a valid feedback request (16ms)
When the feedback is submitted (8ms)
When the feedback is submitted (8ms)
Then the feedback response should contain the created feedback (4ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response customer name should be 'CustomerName' (0ms)
Post steps response rating should be 4 (0ms)
When the feedback is submitted (8ms)
Then the feedback response should contain the created feedback (4ms)
Then the feedback response should contain the created feedback (4ms)
Diagrams
Details:lines
Listing feedback for an order should return the feedback 371ms🔗
Steps
Given a feedback entry exists (202ms)
Given a feedback entry exists (202ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a feedback entry exists (202ms)
When the feedback is retrieved by order id (150ms)
When the feedback is retrieved by order id (150ms)
Then the feedback list response should contain the feedback (12ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps list response should contain [ f => f.FeedbackId == 'f16f1e1f-9987-4712-a906-0712302ebc9b' ] (0ms)
When the feedback is retrieved by order id (150ms)
Then the feedback list response should contain the feedback (12ms)
Then the feedback list response should contain the feedback (12ms)
Diagrams
Details:lines
Retrieving existing feedback by id should return the feedback 26ms🔗
Steps
Given a feedback entry exists (8ms)
Given a feedback entry exists (8ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a feedback entry exists (8ms)
When the feedback is retrieved by id (9ms)
When the feedback is retrieved by id (9ms)
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 '288a92c4-6125-48d3-a096-4a049f9fe905' (0ms)
Get steps response customer name should be 'CustomerName' (0ms)
Get steps response rating should be 4 (0ms)
When the feedback is retrieved by id (9ms)
Then the feedback get response should contain the feedback (6ms)
Then the feedback get response should contain the feedback (6ms)
Diagrams
Details:lines
Non-existent feedback cannot be retrieved
Retrieving non-existent feedback should return not found 27ms🔗
Steps
When a non-existent feedback is retrieved (24ms)
When a non-existent feedback is retrieved (24ms)
When a non-existent feedback is retrieved (24ms)
Then the feedback get response should indicate not found (1ms)
Get steps response message status code should be NotFound (0ms)
Then the feedback get response should indicate not found (1ms)
Then the feedback get response should indicate not found (1ms)
Diagrams
Details:lines
Feedback requests must pass validation
Submitting feedback with invalid rating should return bad request 4ms🔗
Steps
Given a feedback request with an invalid rating (0ms)
Given a feedback request with an invalid rating (0ms)
Given a feedback request with an invalid rating (0ms)
When the feedback is submitted (2ms)
When the feedback is submitted (2ms)
Then the feedback response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
When the feedback is submitted (2ms)
Then the feedback response should indicate bad request (0ms)
Then the feedback response should indicate bad request (0ms)
Diagrams
Details:lines
Submitting feedback with missing customer name should return bad request 11ms🔗
Steps
Given a feedback request with missing customer name (3ms)
Given a feedback request with missing customer name (3ms)
Given a feedback request with missing customer name (3ms)
When the feedback is submitted (5ms)
When the feedback is submitted (5ms)
Then the feedback response should indicate bad request (1ms)
Post steps response message status code should be BadRequest (0ms)
When the feedback is submitted (5ms)
Then the feedback response should indicate bad request (1ms)
Then the feedback response should indicate bad request (1ms)
Diagrams
Details:lines
Goat Milk Downstream Failure
/goat-milk - Handling downstream Goat Service failures
Requesting goat milk when the goat service is unavailable should return a bad gateway response SkipUnlessFakesControllable 11ms🔗
Steps
Given the goat service will return service unavailable (1ms)
Given the goat service will return service unavailable (1ms)
Given the goat service will return service unavailable (1ms)
When goat milk is requested (3ms)
When goat milk is requested (3ms)
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)
When goat milk is requested (3ms)
Then the goat milk response should indicate a bad gateway (2ms)
Then the goat milk response should indicate a bad gateway (2ms)
Diagrams
Details:lines
Requesting goat milk when the goat service returns an invalid response should return a bad gateway response SkipUnlessFakesControllable 7ms🔗
Steps
Given the goat service will return an invalid response (0ms)
Given the goat service will return an invalid response (0ms)
Given the goat service will return an invalid response (0ms)
When goat milk is requested (3ms)
When goat milk is requested (3ms)
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)
When goat milk is requested (3ms)
Then the goat milk response should indicate a bad gateway (0ms)
Then the goat milk response should indicate a bad gateway (0ms)
Diagrams
Details:lines
Goat Milk Feature Flag
/goat-milk - Goat milk availability controlled by feature flag
Goat milk is available when the feature flag is enabled
Goat milk endpoint should return fresh goat milk when feature is enabled IgnoreIfExternalSut 154ms🔗
Steps
Given the goat milk feature flag is enabled (124ms)
Given the goat milk feature flag is enabled (124ms)
Given the goat milk feature flag is enabled (124ms)
When goat milk is requested (26ms)
When goat milk is requested (26ms)
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)
When goat milk is requested (26ms)
Then the goat milk response should contain fresh goat milk (0ms)
Then the goat milk response should contain fresh goat milk (0ms)
Diagrams
Details:lines
Goat milk is hidden when the feature flag is disabled
Goat milk endpoint should return not found when feature is disabled IgnoreIfExternalSut 221ms🔗
Steps
Given the goat milk feature flag is disabled (107ms)
Given the goat milk feature flag is disabled (107ms)
Given the goat milk feature flag is disabled (107ms)
When goat milk is requested (22ms)
When goat milk is requested (22ms)
Then the goat milk response should indicate feature disabled (67ms)
Goat milk steps response message status code should be NotFound (0ms)
Goat milk feature disabled response body should contain FeatureDisabled (0ms)
When goat milk is requested (22ms)
Then the goat milk response should indicate feature disabled (67ms)
Then the goat milk response should indicate feature disabled (67ms)
Diagrams
Details:lines
Goat Milk Sourcing
/goat-milk - Retrieving goat milk from the Goat Service
A valid goat milk request should return fresh goat milk Happy Path 67ms🔗
Steps
When goat milk is requested (58ms)
When goat milk is requested (58ms)
When goat milk is requested (58ms)
Then the goat milk response should contain fresh goat milk (4ms)
Goat milk steps response message status code should be OK (0ms)
Goat milk steps goat milk response goat milk should be FreshGoatMilk (0ms)
Then the goat milk response should contain fresh goat milk (4ms)
Then the goat milk response should contain fresh goat milk (4ms)
Diagrams
Details:lines
Header Propagation
/milk; /menu - X-Correlation-Id header propagation to downstream services
A request with a correlation id should forward it to the cow service Happy Path SkipUnlessFakesControllable 11ms🔗
Steps
Given a request with a known correlation id (0ms)
Given a request with a known correlation id (0ms)
Given a request with a known correlation id (0ms)
When milk is requested with the correlation id (7ms)
When milk is requested with the correlation id (7ms)
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 'aedd3fb5-95ec-42f7-bc63-01aad49d5f31' (0ms)
When milk is requested with the correlation id (7ms)
Then the cow service should have received the correlation id (1ms)
Then the cow service should have received the correlation id (1ms)
Diagrams
Details:lines
A request with a correlation id should forward it to the supplier service SkipUnlessFakesControllable 44ms🔗
Steps
Given a request with a known correlation id (1ms)
Given a request with a known correlation id (1ms)
Given a request with a known correlation id (1ms)
And the menu cache is cleared (8ms)
And the menu cache is cleared (8ms)
When the menu is requested with the correlation id (20ms)
And the menu cache is cleared (8ms)
Then the supplier service should have received the correlation id (10ms)
Requests should not be empty (0ms)
Request headers should contain key CorrelationId (0ms)
Request headers[ custom headers correlation id] should be 'c8b34ec9-761c-4782-86f9-e78bca3f9c9b' (0ms)
When the menu is requested with the correlation id (20ms)
When the menu is requested with the correlation id (20ms)
Then the supplier service should have received the correlation id (10ms)
Then the supplier service should have received the correlation id (10ms)
Diagrams
Details:lines
Health Check
/health - Health check endpoint with dependency status for monitoring
The health check endpoint should return a healthy status with dependency details Happy Path 14ms🔗
Steps
When the health check endpoint is called (5ms)
When the health check endpoint is called (5ms)
When the health check endpoint is called (5ms)
Then the health check response should indicate healthy with all dependencies (7ms)
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)
Then the health check response should indicate healthy with all dependencies (6ms)
Then the health check response should indicate healthy with all dependencies (6ms)
Diagrams
Details:lines
Health Check Detail
/health - Health check response includes detailed entry descriptions and data
The health check response should include description and data for each entry 153ms🔗
Steps
When the health check endpoint is called (97ms)
When the health check endpoint is called (97ms)
When the health check endpoint is called (97ms)
Then the health check response should contain detailed entries (49ms)
Health response status code should be OK (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check result results should contain key 'CowService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check result results should contain key 'GoatService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check result results should contain key 'SupplierService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check result results should contain key 'KitchenService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Then the health check response should contain detailed entries (49ms)
Then the health check response should contain detailed entries (49ms)
Diagrams
Details:lines
Heartbeat
/heartbeat - Heartbeat endpoint confirming the service is running
The heartbeat endpoint should return a running message Happy Path 18ms🔗
Steps
When the heartbeat endpoint is called (10ms)
When the heartbeat endpoint is called (10ms)
When the heartbeat endpoint is called (10ms)
Then the heartbeat response should indicate the service is running (4ms)
Heartbeat response status code should be OK (0ms)
Result should not be null (0ms)
Result status should be HeartbeatStatus (0ms)
Then the heartbeat response should indicate the service is running (4ms)
Then the heartbeat response should indicate the service is running (4ms)
Diagrams
Details:lines
Ingredient Usage Analytics
/ingredient-usage - Recording and summarising ingredient usage (BigQuery)
Recording ingredient usage should return the created record Happy Path 12ms🔗
Steps
Given a valid ingredient usage request (0ms)
Given a valid ingredient usage request (0ms)
Given a valid ingredient usage request (0ms)
When the ingredient usage is recorded (4ms)
When the ingredient usage is recorded (4ms)
Then the usage response should contain the created record (5ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response ingredient name should be 'Flour-a7fe767fddd04e48a4dcc55b1a5bd1dc' (0ms)
Post steps response quantity used should be '5m' (0ms)
Post steps response usage id should not be null or empty (0ms)
When the ingredient usage is recorded (4ms)
Then the usage response should contain the created record (5ms)
Then the usage response should contain the created record (5ms)
Diagrams
Details:lines
Getting usage summary should return aggregated data 64ms🔗
Steps
Given an ingredient usage record has been created (2ms)
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)
Given an ingredient usage record has been created (2ms)
When the usage summary is requested (51ms)
When the usage summary is requested (51ms)
Then the summary should contain aggregated data (8ms)
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-b3a97324c01e43db8011d759c829b728' ] (0ms)
When the usage summary is requested (51ms)
Then the summary should contain aggregated data (8ms)
Then the summary should contain aggregated data (8ms)
Diagrams
Details:lines
Listing usage by ingredient should return matching records 96ms🔗
Steps
Given an ingredient usage record has been created (47ms)
Given an ingredient usage record has been created (47ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given an ingredient usage record has been created (47ms)
When the usage is listed by ingredient name (37ms)
When the usage is listed by ingredient name (37ms)
Then the usage list response should contain the record (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 [ u => u.IngredientName == 'Flour-3c9c20c4c72d4c61bf24720ad9530cdc' ] (0ms)
When the usage is listed by ingredient name (37ms)
Then the usage list response should contain the record (8ms)
Then the usage list response should contain the record (8ms)
Diagrams
Details:lines
Recording usage with missing ingredient name should return bad request 53ms🔗
Steps
Given an ingredient usage request with a missing ingredient name (3ms)
Given an ingredient usage request with a missing ingredient name (3ms)
Given an ingredient usage request with a missing ingredient name (3ms)
When the ingredient usage is recorded (43ms)
When the ingredient usage is recorded (43ms)
Then the usage post response should indicate bad request (2ms)
Post steps response message status code should be BadRequest (0ms)
When the ingredient usage is recorded (43ms)
Then the usage post response should indicate bad request (2ms)
Then the usage post response should indicate bad request (2ms)
Diagrams
Details:lines
Recording usage with zero quantity should return bad request 5ms🔗
Steps
Given an ingredient usage request with zero quantity (1ms)
Given an ingredient usage request with zero quantity (1ms)
Given an ingredient usage request with zero quantity (1ms)
When the ingredient usage is recorded (1ms)
When the ingredient usage is recorded (1ms)
Then the usage post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
When the ingredient usage is recorded (1ms)
Then the usage post response should indicate bad request (0ms)
Then the usage post response should indicate bad request (0ms)
Diagrams
Details:lines
Ingredient Waste Tracking
/ingredient-waste - Recording and managing ingredient waste (BigQuery)
Recording ingredient waste should return the created record Happy Path 16ms🔗
Steps
Given a valid ingredient waste request (0ms)
Given a valid ingredient waste request (0ms)
Given a valid ingredient waste request (0ms)
When the waste is recorded (3ms)
When the waste is recorded (3ms)
Then the waste response should contain the created record (10ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response ingredient name should not be null or empty (0ms)
Post steps response quantity wasted should be '5m' (0ms)
Post steps response waste id should not be null or empty (0ms)
Post steps response reason should be "Expired before use" (0ms)
When the waste is recorded (3ms)
Then the waste response should contain the created record (10ms)
Then the waste response should contain the created record (10ms)
Diagrams
Details:lines
Deleting a waste record should return no content 60ms🔗
Steps
Given an ingredient waste record has been created (6ms)
Given an ingredient waste record has been created (6ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given an ingredient waste record has been created (6ms)
When the waste record is deleted (49ms)
When the waste record is deleted (49ms)
Then the delete response should indicate no content (1ms)
Delete steps response message status code should be NoContent (0ms)
When the waste record is deleted (49ms)
Then the delete response should indicate no content (1ms)
Then the delete response should indicate no content (1ms)
Diagrams
Details:lines
Listing waste by recipe should return matching records 1.3s🔗
Steps
Given an ingredient waste record has been created (358ms)
Given an ingredient waste record has been created (358ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given an ingredient waste record has been created (358ms)
When the waste is listed by recipe (877ms)
When the waste is listed by recipe (877ms)
Then the waste list response should contain the record (15ms)
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 == '478c71ed-a62e-4aa5-b83a-f7952dd34551' ] (0ms)
When the waste is listed by recipe (877ms)
Then the waste list response should contain the record (15ms)
Then the waste list response should contain the record (15ms)
Diagrams
Details:lines
Recording waste with missing ingredient name should return bad request 11ms🔗
Steps
Given a waste request with a missing ingredient name (4ms)
Given a waste request with a missing ingredient name (4ms)
Given a waste request with a missing ingredient name (4ms)
When the waste is recorded (4ms)
When the waste is recorded (4ms)
Then the waste post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
When the waste is recorded (4ms)
Then the waste post response should indicate bad request (0ms)
Then the waste post response should indicate bad request (0ms)
Diagrams
Details:lines
Recording waste with missing reason should return bad request 33ms🔗
Steps
Given a waste request with a missing reason (24ms)
Given a waste request with a missing reason (24ms)
Given a waste request with a missing reason (24ms)
When the waste is recorded (6ms)
When the waste is recorded (6ms)
Then the waste post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
When the waste is recorded (6ms)
Then the waste post response should indicate bad request (0ms)
Then the waste post response should indicate bad request (0ms)
Diagrams
Details:lines
Recording waste with zero quantity should return bad request 40ms🔗
Steps
Given a waste request with zero quantity (22ms)
Given a waste request with zero quantity (22ms)
Given a waste request with zero quantity (22ms)
When the waste is recorded (14ms)
When the waste is recorded (14ms)
Then the waste post response should indicate bad request (1ms)
Post steps response message status code should be BadRequest (0ms)
When the waste is recorded (14ms)
Then the waste post response should indicate bad request (1ms)
Then the waste post response should indicate bad request (1ms)
Diagrams
Details:lines
Inventory Management
/inventory - Managing ingredient inventory with full CRUD operations
Inventory items support full CRUD operations
Adding a new inventory item should return the created item Happy Path 56ms🔗
Steps
Given a valid inventory item request (1ms)
Given a valid inventory item request (1ms)
Given a valid inventory item request (1ms)
When the inventory item is submitted (9ms)
When the inventory item is submitted (9ms)
Then the inventory response should contain the created item (43ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response name should be 'Name' (0ms)
Post steps response category should be "Dry Goods" (0ms)
When the inventory item is submitted (9ms)
Then the inventory response should contain the created item (43ms)
Then the inventory response should contain the created item (43ms)
Diagrams
Details:lines
Deleting an inventory item should return no content 42ms🔗
Steps
Given an inventory item exists (5ms)
Given an inventory item exists (5ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given an inventory item exists (5ms)
When the inventory item is deleted (34ms)
When the inventory item is deleted (34ms)
Then the inventory delete response should indicate no content (1ms)
Delete steps response message status code should be NoContent (0ms)
When the inventory item is deleted (34ms)
Then the inventory delete response should indicate no content (1ms)
Then the inventory delete response should indicate no content (1ms)
Diagrams
Details:lines
Listing all inventory items should return all items 113ms🔗
Steps
Given an inventory item exists (20ms)
Given an inventory item exists (20ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given an inventory item exists (20ms)
When all inventory items are requested (82ms)
When all inventory items are requested (82ms)
Then the inventory list response should contain the item (7ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps list response should contain [ i => i.Id == '2' ] (0ms)
When all inventory items are requested (82ms)
Then the inventory list response should contain the item (7ms)
Then the inventory list response should contain the item (7ms)
Diagrams
Details:lines
Non-existent inventory items cannot be retrieved
Retrieving a non-existent inventory item should return not found 17ms🔗
Steps
When a non-existent inventory item is retrieved (11ms)
When a non-existent inventory item is retrieved (11ms)
When a non-existent inventory item is retrieved (11ms)
Then the inventory get response should indicate not found (4ms)
Get steps response message status code should be NotFound (0ms)
Then the inventory get response should indicate not found (4ms)
Then the inventory get response should indicate not found (4ms)
Diagrams
Details:lines
Inventory items support full CRUD operations
Retrieving an existing inventory item should return the item 236ms🔗
Steps
Given an inventory item exists (173ms)
Given an inventory item exists (173ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given an inventory item exists (173ms)
When the inventory item is retrieved by id (45ms)
When the inventory item is retrieved by id (45ms)
Then the inventory get response should contain the item (12ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response id should be '1' (0ms)
Get steps response name should be 'Name' (0ms)
When the inventory item is retrieved by id (45ms)
Then the inventory get response should contain the item (12ms)
Then the inventory get response should contain the item (12ms)
Diagrams
Details:lines
Updating an inventory item should return the updated item 62ms🔗
Steps
Given an inventory item exists (7ms)
Given an inventory item exists (7ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given an inventory item exists (7ms)
When the inventory item is updated (43ms)
When the inventory item is updated (43ms)
Then the inventory update response should contain the updated values (8ms)
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)
When the inventory item is updated (43ms)
Then the inventory update response should contain the updated values (8ms)
Then the inventory update response should contain the updated values (8ms)
Diagrams
Details:lines
Kitchen Service Failure
/orders - Creating orders when the Kitchen Service returns an error
Creating an order when the kitchen service returns an error should still create the order SkipUnlessFakesControllable 38ms🔗
Steps
Given a pancake batch has been created (14ms)
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)
Given a pancake batch has been created (14ms)
And a valid order request for the created batch (1ms)
And a valid order request for the created batch (1ms)
And the kitchen service is configured to return busy (1ms)
And a valid order request for the created batch (1ms)
When the breakfast order is placed (12ms)
And the kitchen service is configured to return busy (1ms)
Then the order should still be created successfully despite the kitchen failure (3ms)
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)
And the kitchen service is configured to return busy (1ms)
When the breakfast order is placed (12ms)
When the breakfast order is placed (12ms)
Then the order should still be created successfully despite the kitchen failure (3ms)
Then the order should still be created successfully despite the kitchen failure (3ms)
Diagrams
Details:lines
Menu Availability
/menu - Checking menu item availability from ingredient sources
The menu endpoint should return all menu items with availability status Happy Path MenuAvailability 184ms🔗
Steps
When the menu is requested (31ms)
When the menu is requested (31ms)
When the menu is requested (31ms)
Then the menu response should contain all menu items (7ms)
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)
Then the menu response should contain all menu items (7ms)
Then the menu response should contain all menu items (7ms)
Diagrams
Details:lines
Menu Caching
/menu - Menu response caching behaviour
Menu responses should be cached and returned even when supplier becomes unavailable SkipUnlessFakesControllable MenuCaching 396ms🔗
Steps
Given the menu has been requested and cached (109ms)
Given the menu has been requested and cached (109ms)
Menu steps response message status code should be OK (0ms)
Given the menu has been requested and cached (109ms)
And the supplier service is then made unavailable (2ms)
And the supplier service is then made unavailable (2ms)
When the menu is requested again (14ms)
And the supplier service is then made unavailable (2ms)
Then the menu response should still return available items (22ms)
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)
When the menu is requested again (14ms)
When the menu is requested again (14ms)
Then the menu response should still return available items (22ms)
Then the menu response should still return available items (22ms)
Diagrams
Details:lines
Menu Downstream Failure
/menu - Menu behaviour when Supplier Service is unavailable
All menu items should be marked unavailable when the supplier service is down SkipUnlessFakesControllable MenuDownstreamFailure 222ms🔗
Steps
Given the supplier service will return service unavailable (20ms)
Given the supplier service will return service unavailable (20ms)
Given the supplier service will return service unavailable (20ms)
When the menu is requested (32ms)
When the menu is requested (32ms)
Then the menu response should mark all items as unavailable (6ms)
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)
When the menu is requested (32ms)
Then the menu response should mark all items as unavailable (6ms)
Then the menu response should mark all items as unavailable (6ms)
Diagrams
Details:lines
Milk Downstream Failure
/milk - Handling downstream Cow Service failures
Requesting milk when the cow service is unavailable should return a bad gateway response SkipUnlessFakesControllable 10ms🔗
Steps
Given the cow service will return service unavailable (2ms)
Given the cow service will return service unavailable (2ms)
Given the cow service will return service unavailable (2ms)
When milk is requested (4ms)
When milk is requested (4ms)
Then the milk response should indicate a bad gateway (0ms)
Milk steps response message status code should be BadGateway (0ms)
Milk error response body should contain CowServiceUnavailableTitle (0ms)
When milk is requested (4ms)
Then the milk response should indicate a bad gateway (0ms)
Then the milk response should indicate a bad gateway (0ms)
Diagrams
Details:lines
Requesting milk when the cow service returns an invalid response should return a bad gateway response SkipUnlessFakesControllable 38ms🔗
Steps
Given the cow service will return an invalid response (2ms)
Given the cow service will return an invalid response (2ms)
Given the cow service will return an invalid response (2ms)
When milk is requested (20ms)
When milk is requested (20ms)
Then the milk response should indicate a bad gateway (9ms)
Milk steps response message status code should be BadGateway (0ms)
Milk error response body should contain CowServiceUnavailableTitle (0ms)
When milk is requested (20ms)
Then the milk response should indicate a bad gateway (9ms)
Then the milk response should indicate a bad gateway (9ms)
Diagrams
Details:lines
Requesting milk when the cow service times out should return a bad gateway response SkipUnlessFakesControllable 12ms🔗
Steps
Given the cow service will return a timeout (3ms)
Given the cow service will return a timeout (3ms)
Given the cow service will return a timeout (3ms)
When milk is requested (4ms)
When milk is requested (4ms)
Then the milk response should indicate a bad gateway (0ms)
Milk steps response message status code should be BadGateway (0ms)
Milk error response body should contain CowServiceUnavailableTitle (0ms)
When milk is requested (4ms)
Then the milk response should indicate a bad gateway (0ms)
Then the milk response should indicate a bad gateway (0ms)
Diagrams
Details:lines
Order Cross Field Validation
/orders - Cross-field validation with configurable item limits
An order at the maximum items per order should be accepted IgnoreIfExternalSut 263ms🔗
Background Steps
Given the maximum items per order is configured to two (126ms)
Given the maximum items per order is configured to two (126ms)
Given the maximum items per order is configured to two (126ms)
And a pancake batch has been created (92ms)
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 pancake batch has been created (92ms)
And an order request with two items (1ms)
And a pancake batch has been created (92ms)
When the order is submitted (32ms)
Steps
And an order request with two items (1ms)
Then the response should indicate success (3ms)
Order steps response message status code should be Created (0ms)
And an order request with two items (1ms)
When the order is submitted (32ms)
When the order is submitted (32ms)
Then the response should indicate success (3ms)
Then the response should indicate success (3ms)
Diagrams
Details:lines
An order exceeding the maximum items per order should be rejected IgnoreIfExternalSut 308ms🔗
Background Steps
Given the maximum items per order is configured to two (126ms)
Given the maximum items per order is configured to two (126ms)
Given the maximum items per order is configured to two (126ms)
And a pancake batch has been created (92ms)
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 pancake batch has been created (92ms)
And an order request with two items (1ms)
And a pancake batch has been created (92ms)
When the order is submitted (32ms)
Steps
And an order request with three items (2ms)
Then the response should indicate a validation error (1ms)
Order steps response message status code should be BadRequest (0ms)
And an order request with three items (2ms)
And the error message should reference the item limit (2ms)
Order validation error response body should contain "Items" (0ms)
When the order is submitted (24ms)
When the order is submitted (24ms)
Then the response should indicate a validation error (1ms)
Then the response should indicate a validation error (1ms)
And the error message should reference the item limit (2ms)
And the error message should reference the item limit (2ms)
Diagrams
Details:lines
Order Pagination
/orders - Paginated listing of breakfast orders
Listing orders should return a paginated response Happy Path 85ms🔗
Steps
Given multiple orders have been created (44ms)
Given multiple orders have been created (44ms)
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)
Given multiple orders have been created (44ms)
When orders are listed with default pagination (13ms)
When orders are listed with default pagination (13ms)
Then the paginated response should contain the orders (21ms)
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)
When orders are listed with default pagination (13ms)
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)
Then the paginated response should contain the orders (21ms)
Then the paginated response should contain the orders (21ms)
And the paginated response should have correct page metadata (0ms)
And the paginated response should have correct page metadata (0ms)
Diagrams
Details:lines
Listing orders when none exist should return an empty page IgnoreIfNeedsDirectDbAccess IgnoreUnlessInMemoryDb 29ms🔗
Steps
When orders are listed with default pagination (23ms)
When orders are listed with default pagination (23ms)
When orders are listed with default pagination (23ms)
Then the paginated response should be empty (2ms)
List steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Then the paginated response should be empty (2ms)
Then the paginated response should be empty (2ms)
Diagrams
Details:lines
Listing orders with a small page size should limit results 71ms🔗
Steps
Given multiple orders have been created (44ms)
Given multiple orders have been created (44ms)
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)
Given multiple orders have been created (44ms)
When orders are listed with page 1 and page size 1 (12ms)
When orders are listed with page 1 and page size 1 (12ms)
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)
When orders are listed with page 1 and page size 1 (12ms)
Then the paginated response should have correct page metadata (0ms)
Then the paginated response should have correct page metadata (0ms)
Diagrams
Details:lines
Requesting the second page should return different orders 171ms🔗
Steps
Given multiple orders have been created (52ms)
Given multiple orders have been created (52ms)
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)
Given multiple orders have been created (52ms)
When orders are listed with page 2 and page size 1 (61ms)
When orders are listed with page 2 and page size 1 (61ms)
Then the paginated response should have correct page metadata (17ms)
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)
When orders are listed with page 2 and page size 1 (61ms)
Then the paginated response should have correct page metadata (17ms)
Then the paginated response should have correct page metadata (17ms)
Diagrams
Details:lines
Order Rate Limiting
/orders - Rate limiting on order creation
Exceeding the rate limit should return too many requests IgnoreIfExternalSut 328ms🔗
Steps
Given the rate limit is configured to allow one request per window (156ms)
Given the rate limit is configured to allow one request per window (156ms)
Given the rate limit is configured to allow one request per window (156ms)
And a pancake batch has been created (108ms)
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 pancake batch has been created (108ms)
And a valid order request (0ms)
And a pancake batch has been created (108ms)
When the order is submitted twice in rapid succession (53ms)
And a valid order request (0ms)
Then the first request should succeed (2ms)
First response status code should be Created (0ms)
And a valid order request (0ms)
And the second request should be rate limited (1ms)
Second response status code should be TooManyRequests (0ms)
When the order is submitted twice in rapid succession (53ms)
When the order is submitted twice in rapid succession (53ms)
Then the first request should succeed (2ms)
Then the first request should succeed (2ms)
And the second request should be rate limited (1ms)
And the second request should be rate limited (1ms)
Diagrams
Details:lines
Order Retrieval
/orders - Retrieving orders by ID
Existing orders can be retrieved
A created order should be retrievable by its ID Happy Path IgnoreIfNeedsEventInfrastructure 1.7s🔗
Steps
Given an order has been created (1.7s)
Given an order has been created (1.7s)
Response content is valid json should be true (0ms)
Response content is valid json should be true (0ms)
Given an order has been created (1.7s)
When the order is retrieved by id (18ms)
When the order is retrieved by id (18ms)
Then the order retrieval response should contain the order (9ms)
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 'd649606e-c014-4b66-b3a3-6612d0e3e471' (0ms)
When the order is retrieved by id (18ms)
Then the order retrieval response should contain the order (9ms)
Then the order retrieval response should contain the order (9ms)
Diagrams
Details:lines
Non-existent orders return not found
Retrieving a non-existent order should return not found 448ms🔗
Steps
When a non-existent order is retrieved (365ms)
When a non-existent order is retrieved (365ms)
When a non-existent order is retrieved (365ms)
Then the order retrieval response should indicate not found (13ms)
Get order steps response message status code should be NotFound (0ms)
Then the order retrieval response should indicate not found (13ms)
Then the order retrieval response should indicate not found (13ms)
Diagrams
Details:lines
Order Status Transition
/orders - Order status transitions following the order lifecycle
Valid status transitions are accepted
A valid status transition should update the order 4/4 passed 189ms🔗
#Input ParametersStatusDuration
From StatusTo Status
1CreatedCancelledPassed51ms
2CreatedPreparingPassed34ms
3PreparingReadyPassed38ms
4ReadyCompletedPassed65ms
Steps
Given an order exists with status "Created" (44ms)
Given an order exists with status "Created" (44ms)
Response content is valid json should be true (0ms)
Response content is valid json should be true (0ms)
Given an order exists with status "Created" (44ms)
When the order status is updated to "Cancelled" (4ms)
When the order status is updated to "Cancelled" (4ms)
Then the order status should be updated successfully to "Cancelled" (0ms)
Patch steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Patch steps response status should be 'Cancelled' (0ms)
When the order status is updated to "Cancelled" (4ms)
Then the order status should be updated successfully to "Cancelled" (0ms)
Then the order status should be updated successfully to "Cancelled" (0ms)
Diagrams
Details:lines
Invalid status transitions are rejected
An invalid status transition should return a conflict response 7/7 passed 440ms🔗
#Input ParametersStatusDuration
From StatusTo Status
1CancelledPreparingPassed56ms
2CancelledReadyPassed47ms
3CompletedPreparingPassed83ms
4CreatedCompletedPassed59ms
5CreatedReadyPassed48ms
6PreparingCancelledPassed61ms
7ReadyPreparingPassed83ms
Steps
Given an order exists with status "Cancelled" (50ms)
Given an order exists with status "Cancelled" (50ms)
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)
Given an order exists with status "Cancelled" (50ms)
When the order status is updated to "Preparing" (3ms)
When the order status is updated to "Preparing" (3ms)
Then the response should indicate an invalid state transition (0ms)
Patch steps response message status code should be Conflict (0ms)
When the order status is updated to "Preparing" (3ms)
Then the response should indicate an invalid state transition (0ms)
Then the response should indicate an invalid state transition (0ms)
Diagrams
Details:lines
Order Status Via G RPC
/grpc - Retrieving order status via gRPC
Order status via gRPC should return order details Happy Path 40ms🔗
Steps
Given a pancake batch has been created (10ms)
Given a pancake batch has been created (10ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
Given a pancake batch has been created (10ms)
And an order has been created for the batch (9ms)
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)
And an order has been created for the batch (9ms)
When the order status is requested via gRPC (11ms)
And an order has been created for the batch (9ms)
Then the gRPC response should contain the order details (6ms)
Grpc steps order status reply should not be null (0ms)
Grpc steps order status reply order id should be orderSteps.Response.OrderId.ToString() (0ms)
Grpc steps order status reply customer name should be 'TestCustomer_6647511200972737615' (0ms)
Grpc steps order status reply status should be Created (0ms)
When the order status is requested via gRPC (11ms)
When the order status is requested via gRPC (11ms)
Then the gRPC response should contain the order details (6ms)
Then the gRPC response should contain the order details (6ms)
Diagrams
Details:lines
Order status for non-existent order should return not found 59ms🔗
Steps
When the order status for a non-existent order is requested via gRPC (54ms)
When the order status for a non-existent order is requested via gRPC (54ms)
When the order status for a non-existent order is requested via gRPC (54ms)
Then the gRPC response should be a not found error (2ms)
Grpc steps rpc exception should not be null (0ms)
Grpc steps rpc exception status code should be NotFound (0ms)
Then the gRPC response should be a not found error (2ms)
Then the gRPC response should be a not found error (2ms)
Diagrams
Details:lines
Order Summaries
/graphql - Querying order summary reports via GraphQL
Order summaries should contain ingested order data Happy Path IgnoreIfNeedsDirectDbAccess 58ms🔗
Steps
Given an order has been created and ingested into the reporting database (6ms)
Given an order has been created and ingested into the reporting database (6ms)
Given an order has been created and ingested into the reporting database (6ms)
When the order summaries are queried via graphql (32ms)
When the order summaries are queried via graphql (32ms)
Then the graphql response should contain the ingested order summary (14ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps order summaries should contain [ o => o.OrderId == '02046c37-d7d7-4efe-9458-f2827b1997a9' && o.CustomerName == 'TestCustomer_7784774984484537274' && o.ItemCount == 3 && o.TableNumber == 7 ] (0ms)
When the order summaries are queried via graphql (32ms)
Then the graphql response should contain the ingested order summary (14ms)
Then the graphql response should contain the ingested order summary (14ms)
Diagrams
Details:lines
Order summaries should return an empty list when no orders exist 15ms🔗
Steps
When the order summaries are queried via graphql (7ms)
When the order summaries are queried via graphql (7ms)
When the order summaries are queried via graphql (7ms)
Then the graphql response should be successful (1ms)
Graph ql steps response message status code should be OK (0ms)
Then the graphql response should be successful (1ms)
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 == '02312882-0028-46a4-97ee-3e314dfc2f69' ] (0ms)
Then the graphql response should be successful (1ms)
And the order summaries list should be empty or not contain the test order (3ms)
And the order summaries list should be empty or not contain the test order (3ms)
Diagrams
Details:lines
Order Validation
/orders - Input validation for order creation and status updates
Order status update endpoint is called with invalid fields should return a bad request response 1/1 passed 20ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1StatusStatus is required'Status' is required.Bad RequestPassed20ms
Steps
Given a valid status update request with "Status" set to "" (3ms)
Given a valid status update request with "Status" set to "" (3ms)
Given a valid status update request with "Status" set to "" (3ms)
When the invalid status update request is submitted (8ms)
When the invalid status update request is submitted (8ms)
Then the status update response should contain error "'Status' is required." with status "Bad Request" (6ms)
Actual results should contain [ r => r.ErrorMessage.Contains(''Status' is required.') ] (0ms)
When the invalid status update request is submitted (8ms)
Then the status update response should contain error "'Status' is required." with status "Bad Request" (6ms)
Then the status update response should contain error "'Status' is required." with status "Bad Request" (6ms)
Diagrams
Details:lines
Orders endpoint is called with invalid fields should return a bad request response 5/5 passed 56ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1CustomerNameCustomer name is required'Customer Name' is required.Bad RequestPassed24ms
2Items[0].BatchIdBatch ID is required'Batch Id' is required.Bad RequestPassed8ms
3Items[0].ItemTypeItem type is required'Item Type' is required.Bad RequestPassed9ms
4Items[0].Quantity0Quantity must be greater than zeroQuantity must be greater than zero.Bad RequestPassed8ms
5ItemsAt least one item is requiredThe Items field is required.Bad RequestPassed5ms
Steps
Given a valid order request with "CustomerName" set to "" (6ms)
Given a valid order request with "CustomerName" set to "" (6ms)
Given a valid order request with "CustomerName" set to "" (6ms)
When the invalid order request is submitted (5ms)
When the invalid order request is submitted (5ms)
Then the order response should contain error "'Customer Name' is required." with status "Bad Request" (7ms)
Actual results should contain [ r => r.ErrorMessage.Contains(''Customer Name' is required.') ] (0ms)
When the invalid order request is submitted (5ms)
Then the order response should contain error "'Customer Name' is required." with status "Bad Request" (7ms)
Then the order response should contain error "'Customer Name' is required." with status "Bad Request" (7ms)
Diagrams
Details:lines
Outbox Retry Exhaustion
/orders - Outbox message transitions to failed after exhausting retries
An outbox message should transition to failed after exhausting retries IgnoreIfNeedsEventInfrastructure 1.2s🔗
Steps
Given the outbox processor is configured with a failing dispatcher (174ms)
Given the outbox processor is configured with a failing dispatcher (174ms)
Given the outbox processor is configured with a failing dispatcher (174ms)
And a pending outbox message with a test-specific destination (7ms)
And a pending outbox message with a test-specific destination (7ms)
Then the outbox message should be in a failed state (1.0s)
And a pending outbox message with a test-specific destination (7ms)
Then the outbox message should be in a failed state (1.0s)
Then the outbox message should be in a failed state (1.0s)
Sequence Diagrams
Details:lines
Pancakes Content Negotiation
/pancakes - Content negotiation and unsupported media types
Sending a request with an unsupported content type should return an unsupported media type response 3/3 passed 21ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed11ms
2text/htmlPassed4ms
3text/plainPassed5ms
Steps
Given a pancake request with content type "application/xml" (1ms)
Given a pancake request with content type "application/xml" (1ms)
Given a pancake request with content type "application/xml" (1ms)
When the pancakes are prepared with the given content type (5ms)
When the pancakes are prepared with the given content type (5ms)
Then the response should indicate unsupported media type (1ms)
Response status code should be UnsupportedMediaType (0ms)
When the pancakes are prepared with the given content type (5ms)
Then the response should indicate unsupported media type (1ms)
Then the response should indicate unsupported media type (1ms)
Diagrams
Details:lines
Pancakes Creation
/pancakes - Creating pancakes with ingredients and optional toppings
A valid pancake request should return a fresh batch Happy Path 25ms🔗
Steps
Given a valid pancake recipe with all ingredients (6ms)
Given a valid pancake recipe with all ingredients (6ms)
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)
Given a valid pancake recipe with all ingredients (6ms)
When the pancakes are prepared (10ms)
When the pancakes are prepared (10ms)
Then the pancakes response should contain a valid batch with all ingredients (4ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response ingredients should contain 'Milk' (0ms)
Pancake steps response ingredients should contain 'Eggs' (0ms)
Pancake steps response ingredients should contain 'Flour' (0ms)
When the pancakes are prepared (10ms)
And the cow service should have received a milk request (1ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Then the pancakes response should contain a valid batch with all ingredients (4ms)
Then the pancakes response should contain a valid batch with all ingredients (4ms)
And the cow service should have received a milk request (1ms)
And the cow service should have received a milk request (1ms)
Diagrams
Details:lines
A pancake request with more toppings than allowed should return a bad request response IgnoreIfExternalSut 30ms🔗
Steps
Given the max toppings per item is the configured limit (0ms)
Given the max toppings per item is the configured limit (0ms)
Given the max toppings per item is the configured limit (0ms)
And a valid pancake recipe with all ingredients (11ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
And a valid pancake recipe with all ingredients (11ms)
And the request has more toppings than the configured limit (5ms)
And a valid pancake recipe with all ingredients (11ms)
When the pancakes are prepared (6ms)
And the request has more toppings than the configured limit (5ms)
Then the pancakes response should indicate too many toppings (3ms)
Pancake steps response message status code should be BadRequest (0ms)
Pancake error response body should contain MaxToppingsExceeded (0ms)
And the request has more toppings than the configured limit (5ms)
When the pancakes are prepared (6ms)
When the pancakes are prepared (6ms)
Then the pancakes response should indicate too many toppings (3ms)
Then the pancakes response should indicate too many toppings (3ms)
Diagrams
Details:lines
Pancakes endpoint is called with invalid ingredients should return a bad request response 6/6 passed 96ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1EggsEggs is required'Eggs' is required.Bad RequestPassed6ms
2Eggsjavascript:void(0)XSS in eggsEggs contains potentially dangerous content.Bad RequestPassed5ms
3Flour<img onerror=x>XSS in flourFlour contains potentially dangerous content.Bad RequestPassed5ms
4FlourFlour is required'Flour' is required.Bad RequestPassed4ms
5Milk<script>alert</script>XSS in milkMilk contains potentially dangerous content.Bad RequestPassed68ms
6MilkMilk is required'Milk' is required.Bad RequestPassed6ms
Steps
Given a valid pancake request with "Eggs" set to "" (0ms)
Given a valid pancake request with "Eggs" set to "" (0ms)
Given a valid pancake request with "Eggs" set to "" (0ms)
When the invalid pancake request is submitted (1ms)
When the invalid pancake request is submitted (1ms)
Then the response should contain error "'Eggs' is required." with status "Bad Request" (1ms)
Actual results should contain [ r => r.ErrorMessage.Contains(''Eggs' is required.') ] (0ms)
When the invalid pancake request is submitted (1ms)
Then the response should contain error "'Eggs' is required." with status "Bad Request" (1ms)
Then the response should contain error "'Eggs' is required." with status "Bad Request" (1ms)
Diagrams
Details:lines
Recipe Cost Analysis Processing
Kafka → BreakfastProvider → BigQuery + gRPC + HTTP: Recipe cost event consumption and downstream processing
Consuming recipe cost event should trigger downstream processing Happy Path IgnoreIfExternalSut 96ms🔗
Steps
Given a recipe cost calculated event (9ms)
Given a recipe cost calculated event (9ms)
Given a recipe cost calculated event (9ms)
When the event is published to Kafka (73ms)
When the event is published to Kafka (73ms)
Then the calculation ID should be generated (4ms)
Publish steps calculation id should not be Empty (0ms)
When the event is published to Kafka (73ms)
And the kitchen service should have received the preparation request (4ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Then the calculation ID should be generated (4ms)
Then the calculation ID should be generated (4ms)
And the kitchen service should have received the preparation request (4ms)
And the kitchen service should have received the preparation request (4ms)
Diagrams
Details:lines
Recipe Reports
/graphql - Querying recipe reports and aggregations via GraphQL
Recipe reports should contain ingested recipe data Happy Path IgnoreIfNeedsDirectDbAccess 80ms🔗
Steps
Given recipe logs have been ingested into the reporting database (7ms)
Given recipe logs have been ingested into the reporting database (7ms)
Given recipe logs have been ingested into the reporting database (7ms)
When the recipe reports are queried via graphql (58ms)
When the recipe reports are queried via graphql (58ms)
Then the graphql response should contain the ingested recipe reports (12ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps recipe reports should contain [ r => r.OrderId == 'bf1440bb-bd82-4ad2-87bb-d5e5d7263830' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ] (0ms)
When the recipe reports are queried via graphql (58ms)
Then the graphql response should contain the ingested recipe reports (12ms)
Then the graphql response should contain the ingested recipe reports (12ms)
Diagrams
Details:lines
Ingredient usage should aggregate across multiple recipes IgnoreIfNeedsDirectDbAccess 69ms🔗
Steps
Given multiple recipe logs have been ingested with overlapping ingredients (6ms)
Given multiple recipe logs have been ingested with overlapping ingredients (6ms)
Given multiple recipe logs have been ingested with overlapping ingredients (6ms)
When the ingredient usage is queried via graphql (36ms)
When the ingredient usage is queried via graphql (36ms)
Then the ingredient usage should reflect aggregated counts (19ms)
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)
When the ingredient usage is queried via graphql (36ms)
Then the ingredient usage should reflect aggregated counts (19ms)
Then the ingredient usage should reflect aggregated counts (19ms)
Diagrams
Details:lines
Recipe Reviews Management
/recipe-reviews - Submitting and retrieving recipe reviews (MongoDB)
Submitting a recipe review should return the created review Happy Path 125ms🔗
Steps
Given a valid recipe review request (5ms)
Given a valid recipe review request (5ms)
Given a valid recipe review request (5ms)
When the recipe review is submitted (99ms)
When the recipe review is submitted (99ms)
Then the recipe review response should contain the created review (16ms)
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-4e45aef4898e46a0bbb4570df64dc923' (0ms)
Post steps response rating should be 5 (0ms)
Post steps response review id should not be null or empty (0ms)
When the recipe review is submitted (99ms)
Then the recipe review response should contain the created review (16ms)
Then the recipe review response should contain the created review (16ms)
Diagrams
Details:lines
Listing reviews by recipe should return matching reviews 60ms🔗
Steps
Given a recipe review has been created (14ms)
Given a recipe review has been created (14ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a recipe review has been created (14ms)
When the reviews are listed by recipe name (36ms)
When the reviews are listed by recipe name (35ms)
Then the list response should contain the review (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 [ r => r.ReviewId == 'fc8a2cdf-e794-47ac-8d98-15c309f663b1' ] (0ms)
When the reviews are listed by recipe name (35ms)
Then the list response should contain the review (8ms)
Then the list response should contain the review (8ms)
Diagrams
Details:lines
Retrieving a non-existent review should return not found 29ms🔗
Steps
When a non-existent review is retrieved (26ms)
When a non-existent review is retrieved (26ms)
When a non-existent review is retrieved (26ms)
Then the review get response should indicate not found (1ms)
Get steps response message status code should be NotFound (0ms)
Then the review get response should indicate not found (1ms)
Then the review get response should indicate not found (1ms)
Diagrams
Details:lines
Retrieving existing review by id should return the review 17ms🔗
Steps
Given a recipe review has been created (4ms)
Given a recipe review has been created (4ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a recipe review has been created (4ms)
When the review is retrieved by id (6ms)
When the review is retrieved by id (6ms)
Then the get response should contain the review (6ms)
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 '4b76ed6a-1b59-4cd4-8122-c54e07d3f6c8' (0ms)
Get steps response recipe name should be 'Recipe-9925a88cf64b43e08ed69342a411af79' (0ms)
When the review is retrieved by id (6ms)
Then the get response should contain the review (6ms)
Then the get response should contain the review (6ms)
Diagrams
Details:lines
Submitting a review with an invalid rating should return bad request 16ms🔗
Steps
Given a recipe review request with an invalid rating (3ms)
Given a recipe review request with an invalid rating (3ms)
Given a recipe review request with an invalid rating (3ms)
When the recipe review is submitted (7ms)
When the recipe review is submitted (7ms)
Then the review post response should indicate bad request (2ms)
Post steps response message status code should be BadRequest (0ms)
When the recipe review is submitted (7ms)
Then the review post response should indicate bad request (2ms)
Then the review post response should indicate bad request (2ms)
Diagrams
Details:lines
Submitting a review with missing recipe name should return bad request 6ms🔗
Steps
Given a recipe review request with a missing recipe name (1ms)
Given a recipe review request with a missing recipe name (1ms)
Given a recipe review request with a missing recipe name (1ms)
When the recipe review is submitted (3ms)
When the recipe review is submitted (3ms)
Then the review post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
When the recipe review is submitted (3ms)
Then the review post response should indicate bad request (0ms)
Then the review post response should indicate bad request (0ms)
Diagrams
Details:lines
Recipe Summary Via G RPC
/grpc - Retrieving recipe summaries via gRPC
Pancake recipe summary should return correct data Happy Path 188ms🔗
Steps
When a recipe summary is requested for "Pancakes" via gRPC (68ms)
When a recipe summary is requested for "Pancakes" via gRPC (68ms)
When a recipe summary is requested for "Pancakes" via gRPC (68ms)
Then the recipe summary should contain 42 total batches (6ms)
Grpc steps recipe summary reply total batches should be '42' (0ms)
Then the recipe summary should contain 42 total batches (6ms)
And the recipe summary should contain ingredients "Milk, Flour, Eggs" (107ms)
Grpc steps recipe summary reply common ingredients should be equivalent to '[ "Milk", "Flour", "Eggs" ]' (0ms)
Then the recipe summary should contain 42 total batches (6ms)
And the recipe summary should contain ingredients "Milk, Flour, Eggs" (107ms)
And the recipe summary should contain ingredients "Milk, Flour, Eggs" (107ms)
Diagrams
Details:lines
Waffle recipe summary should return correct data Happy Path 7ms🔗
Steps
When a recipe summary is requested for "Waffles" via gRPC (4ms)
When a recipe summary is requested for "Waffles" via gRPC (4ms)
When a recipe summary is requested for "Waffles" via gRPC (4ms)
Then the recipe summary should contain 28 total batches (0ms)
Grpc steps recipe summary reply total batches should be '28' (0ms)
Then the recipe summary should contain 28 total batches (0ms)
And the recipe summary should contain ingredients "Milk, Flour, Eggs, Butter" (1ms)
Grpc steps recipe summary reply common ingredients should be equivalent to '[ "Milk", "Flour", "Eggs", "Butter" ]' (0ms)
Then the recipe summary should contain 28 total batches (0ms)
And the recipe summary should contain ingredients "Milk, Flour, Eggs, Butter" (1ms)
And the recipe summary should contain ingredients "Milk, Flour, Eggs, Butter" (1ms)
Diagrams
Details:lines
Unknown recipe type should return zero batches 5ms🔗
Steps
When a recipe summary is requested for "Unknown" via gRPC (2ms)
When a recipe summary is requested for "Unknown" via gRPC (2ms)
When a recipe summary is requested for "Unknown" via gRPC (2ms)
Then the recipe summary should contain 0 total batches (0ms)
Grpc steps recipe summary reply total batches should be '0' (0ms)
Then the recipe summary should contain 0 total batches (0ms)
And the recipe summary should contain no ingredients (1ms)
Grpc steps recipe summary reply common ingredients should be empty (0ms)
Then the recipe summary should contain 0 total batches (0ms)
And the recipe summary should contain no ingredients (1ms)
And the recipe summary should contain no ingredients (1ms)
Diagrams
Details:lines
Reporting Batch Completions
/graphql - Querying batch completion records populated by Pub/Sub consumption
Batch completions should contain data ingested via pubsub consumer Happy Path 1.4s🔗
Steps
Given a pancake batch has been created for batch completions (525ms)
Given a pancake batch has been created for batch completions (525ms)
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)
Given a pancake batch has been created for batch completions (525ms)
When the batch completions are queried via graphql (785ms)
When the batch completions are queried via graphql (785ms)
Then the graphql response should contain the batch completion record (45ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps batch completions should contain [ r => r.BatchId == '1f66aae9-b32b-4e36-8462-b0e02363704e' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ] (0ms)
When the batch completions are queried via graphql (785ms)
Then the graphql response should contain the batch completion record (45ms)
Then the graphql response should contain the batch completion record (45ms)
Diagrams
Details:lines
Reporting Event Grid Webhook
/webhooks/eventgrid - Ingredient shipments recorded via EventGrid webhook events
Ingredient shipments should be recorded when delivered via eventgrid webhook Happy Path 1.1s🔗
Steps
Given an ingredient delivery event has been received via eventgrid webhook (78ms)
Given an ingredient delivery event has been received via eventgrid webhook (78ms)
Response status code should be OK (0ms)
Given an ingredient delivery event has been received via eventgrid webhook (78ms)
When the ingredient shipments are queried via graphql (992ms)
When the ingredient shipments are queried via graphql (992ms)
Then the graphql response should contain the ingredient shipment record (45ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps ingredient shipments should contain [ s => s.DeliveryId == 'd400a335-d2fd-4110-a3ef-e642fc82ce14' && s.IngredientName == "Milk" && s.Quantity == 50.0m ] (0ms)
When the ingredient shipments are queried via graphql (992ms)
Then the graphql response should contain the ingredient shipment record (45ms)
Then the graphql response should contain the ingredient shipment record (45ms)
Diagrams
Details:lines
Reservations Management
/reservations - Managing table reservations with full CRUD operations and cancellation
Reservations can be created and retrieved
Creating a reservation should return the confirmed reservation Happy Path 11ms🔗
Steps
Given a valid reservation request (0ms)
Given a valid reservation request (0ms)
Given a valid reservation request (0ms)
When the reservation is submitted (5ms)
When the reservation is submitted (5ms)
Then the reservation response should contain the confirmed booking (3ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response status should be "Confirmed" (0ms)
Post steps response customer name should be 'CustomerName' (0ms)
When the reservation is submitted (5ms)
Then the reservation response should contain the confirmed booking (3ms)
Then the reservation response should contain the confirmed booking (3ms)
Diagrams
Details:lines
Reservations can be cancelled once
Cancelling a reservation should return the cancelled reservation 29ms🔗
Steps
Given a reservation exists (16ms)
Given a reservation exists (16ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a reservation exists (16ms)
When the reservation is cancelled (5ms)
When the reservation is cancelled (5ms)
Then the cancellation response should indicate the reservation is cancelled (4ms)
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)
When the reservation is cancelled (5ms)
Then the cancellation response should indicate the reservation is cancelled (4ms)
Then the cancellation response should indicate the reservation is cancelled (4ms)
Diagrams
Details:lines
Cancelling an already cancelled reservation should return a conflict response 237ms🔗
Steps
Given a cancelled reservation exists (227ms)
Given a cancelled reservation exists (227ms)
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)
Given a cancelled reservation exists (227ms)
When the reservation is cancelled again (4ms)
When the reservation is cancelled again (4ms)
Then the cancellation response should indicate a conflict (2ms)
Cancel steps response message status code should be Conflict (0ms)
When the reservation is cancelled again (4ms)
Then the cancellation response should indicate a conflict (2ms)
Then the cancellation response should indicate a conflict (2ms)
Diagrams
Details:lines
Reservations can be deleted
Deleting a reservation should return no content 30ms🔗
Steps
Given a reservation exists (4ms)
Given a reservation exists (4ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a reservation exists (4ms)
When the reservation is deleted (23ms)
When the reservation is deleted (23ms)
Then the reservation delete response should indicate no content (1ms)
Delete response status code should be NoContent (0ms)
When the reservation is deleted (23ms)
Then the reservation delete response should indicate no content (1ms)
Then the reservation delete response should indicate no content (1ms)
Diagrams
Details:lines
Reservations can be created and retrieved
Retrieving an existing reservation should return the reservation 43ms🔗
Steps
Given a reservation exists (10ms)
Given a reservation exists (10ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a reservation exists (10ms)
When the reservation is retrieved by id (22ms)
When the reservation is retrieved by id (22ms)
Then the reservation get response should contain the reservation (8ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response id should be '2' (0ms)
Get steps response customer name should be 'CustomerName' (0ms)
Get steps response status should be "Confirmed" (0ms)
When the reservation is retrieved by id (22ms)
Then the reservation get response should contain the reservation (8ms)
Then the reservation get response should contain the reservation (8ms)
Diagrams
Details:lines
Specifications Async Api
/asyncapi/asyncapi.json - Serving the AsyncAPI specification describing event-driven messaging
The AsyncApi endpoint should return a valid specification Happy Path 795ms🔗
Steps
When the asyncapi endpoint is called (778ms)
When the asyncapi endpoint is called (778ms)
When the asyncapi endpoint is called (778ms)
Then the response should be valid (0ms)
Async api response status code should be OK (0ms)
Async api response is valid json should be true $"response body (first 500 chars): {_asyncApiJsonString?[..Math.Min(_asyncApiJsonString.Length, 500)]}" (0ms)
Then the response should be valid (0ms)
And the asyncapi spec is written to disk (9ms)asyncapi.json
Async api json root element get property("asyncapi") should not be null (0ms)
Async api json root element get property("info") should not be null (0ms)
Async api json root element get property("default content type") should not be null (0ms)
Async api json root element get property("channels") should not be null (0ms)
Async api json root element get property("operations") should not be null (0ms)
Async api json root element get property("components") should not be null (0ms)
Then the response should be valid (0ms)
And the asyncapi spec is written to disk (9ms)
And the asyncapi spec is written to disk (9ms)
Diagrams
Details:lines
Specifications Open Api
/swagger/v1/swagger.json - Serving the OpenAPI specification describing all REST endpoints
The OpenApi endpoint should return a valid specification Happy Path 453ms🔗
Steps
When the open api endpoint is called (420ms)
When the open api endpoint is called (420ms)
When the open api endpoint is called (420ms)
Then the response should be valid (6ms)
Swagger response status code should be OK (0ms)
Open api response is valid json should be true (0ms)
Then the response should be valid (6ms)
And the response should contain all the endpoints (8ms)
Paths get property( endpoints swagger pancakes path) should not be null (0ms)
Paths get property( endpoints swagger waffles path) should not be null (0ms)
Paths get property( endpoints swagger orders path) should not be null (0ms)
Paths get property( endpoints swagger order by id path) should not be null (0ms)
Paths get property( endpoints swagger toppings path) should not be null (0ms)
Paths get property( endpoints swagger menu path) should not be null (0ms)
Paths get property( endpoints swagger milk path) should not be null (0ms)
Paths get property( endpoints swagger eggs path) should not be null (0ms)
Paths get property( endpoints swagger flour path) should not be null (0ms)
Paths get property( endpoints swagger goat milk path) should not be null (0ms)
Paths get property( endpoints swagger audit logs path) should not be null (0ms)
Then the response should be valid (6ms)
And the openapi spec is written to disk (13ms)openapi.json
And the response should contain all the endpoints (8ms)
And the response should contain all the endpoints (8ms)
And the openapi spec is written to disk (13ms)
And the openapi spec is written to disk (13ms)
Diagrams
Details:lines
Specifications Open Api Scalar UI
/scalar/v1 - Serving the interactive API documentation UI powered by Scalar
The Scalar UI endpoint should return a valid page Happy Path 381ms🔗
Steps
When the scalar ui endpoint is called (370ms)
When the scalar ui endpoint is called (370ms)
When the scalar ui endpoint is called (370ms)
Then the response should be a valid scalar page (6ms)
Scalar response status code should be OK (0ms)
Scalar ui response body should contain "<html" (0ms)
Scalar ui response body should contain "scalar" (0ms)
Then the response should be a valid scalar page (6ms)
Then the response should be a valid scalar page (6ms)
Diagrams
Details:lines
Staff Management
/staff - Managing kitchen staff members with full CRUD operations
Staff members support CRUD operations
Adding a new staff member should return the created member Happy Path 21ms🔗
Steps
Given a valid staff member request (4ms)
Given a valid staff member request (4ms)
Given a valid staff member request (4ms)
When the staff member is submitted (6ms)
When the staff member is submitted (6ms)
Then the staff response should contain the created member (7ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response name should be 'Name' (0ms)
Post steps response role should be "Chef" (0ms)
When the staff member is submitted (6ms)
Then the staff response should contain the created member (7ms)
Then the staff response should contain the created member (7ms)
Diagrams
Details:lines
Staff requests must pass validation
Adding a staff member with an invalid role should return a bad request response 10ms🔗
Steps
Given a staff member request with an invalid role (1ms)
Given a staff member request with an invalid role (1ms)
Given a staff member request with an invalid role (1ms)
When the staff member is submitted (2ms)
When the staff member is submitted (2ms)
Then the staff response should indicate bad request (4ms)
Post steps response message status code should be BadRequest (0ms)
When the staff member is submitted (2ms)
Then the staff response should indicate bad request (4ms)
Then the staff response should indicate bad request (4ms)
Diagrams
Details:lines
Staff members support CRUD operations
Deleting a staff member should return no content 71ms🔗
Steps
Given a staff member exists (4ms)
Given a staff member exists (4ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a staff member exists (4ms)
When the staff member is deleted (64ms)
When the staff member is deleted (64ms)
Then the staff delete response should indicate no content (1ms)
Delete response status code should be NoContent (0ms)
When the staff member is deleted (64ms)
Then the staff delete response should indicate no content (1ms)
Then the staff delete response should indicate no content (1ms)
Diagrams
Details:lines
Retrieving an existing staff member should return the member 255ms🔗
Steps
Given a staff member exists (101ms)
Given a staff member exists (101ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Given a staff member exists (101ms)
When the staff member is retrieved by id (136ms)
When the staff member is retrieved by id (136ms)
Then the staff get response should contain the member (13ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response id should be '1' (0ms)
Get steps response name should be 'Name' (0ms)
Get steps response role should be "Chef" (0ms)
When the staff member is retrieved by id (136ms)
Then the staff get response should contain the member (13ms)
Then the staff get response should contain the member (13ms)
Diagrams
Details:lines
Status Update Not Found
/orders - Updating status of a non-existent order
Updating the status of a non-existent order should return not found 448ms🔗
Steps
When a status update is sent for a non-existent order (364ms)
When a status update is sent for a non-existent order (364ms)
When a status update is sent for a non-existent order (364ms)
Then the status update response should indicate not found (15ms)
Patch steps response message status code should be NotFound (0ms)
Then the status update response should indicate not found (15ms)
Then the status update response should indicate not found (15ms)
Diagrams
Details:lines
Stream Order Updates Via G RPC
/grpc - Streaming order updates via gRPC server streaming
Streaming order updates should return the current status Happy Path 95ms🔗
Steps
Given a pancake batch has been created (15ms)
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)
Given a pancake batch has been created (15ms)
And an order has been created for the batch (22ms)
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)
And an order has been created for the batch (22ms)
When order updates are streamed via gRPC (46ms)
And an order has been created for the batch (22ms)
Then the streamed response should contain the order status (5ms)
Grpc steps streamed replies should have count 1 (0ms)
Grpc steps streamed replies[0] order id should be orderSteps.Response.OrderId.ToString() (0ms)
Grpc steps streamed replies[0] customer name should be 'TestCustomer_7551195367013064688' (0ms)
Grpc steps streamed replies[0] status should be Created (0ms)
When order updates are streamed via gRPC (46ms)
When order updates are streamed via gRPC (46ms)
Then the streamed response should contain the order status (5ms)
Then the streamed response should contain the order status (5ms)
Diagrams
Details:lines
Streaming updates for non-existent order should return not found 12ms🔗
Steps
When order updates for a non-existent order are streamed via gRPC (8ms)
When order updates for a non-existent order are streamed via gRPC (8ms)
When order updates for a non-existent order are streamed via gRPC (8ms)
Then the gRPC stream should return a not found error (1ms)
Grpc steps rpc exception should not be null (0ms)
Grpc steps rpc exception status code should be NotFound (0ms)
Then the gRPC stream should return a not found error (1ms)
Then the gRPC stream should return a not found error (1ms)
Diagrams
Details:lines
Telemetry
/orders - Structured logging and telemetry verification
Creating an order should emit a structured log entry Happy Path IgnoreIfExternalSut 333ms🔗
Steps
Given the application is configured with an in-memory log capture (162ms)
Given the application is configured with an in-memory log capture (162ms)
Given the application is configured with an in-memory log capture (162ms)
And a pancake batch has been created (104ms)
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 pancake batch has been created (104ms)
And a valid order request (1ms)
And a pancake batch has been created (104ms)
When the order is submitted (41ms)
And a valid order request (1ms)
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)
And a valid order request (1ms)
When the order is submitted (41ms)
When the order is submitted (41ms)
Then a structured log entry should have been captured for order creation (5ms)
Then a structured log entry should have been captured for order creation (5ms)
Diagrams
Details:lines
Toppings Deletion
/toppings - Deleting toppings from the system
Existing toppings can be deleted
Deleting an existing topping should return no content Happy Path 19ms🔗
Steps
Given a known topping exists (0ms)
Given a known topping exists (0ms)
Given a known topping exists (0ms)
When the topping is deleted (13ms)
When the topping is deleted (13ms)
Then the delete response should indicate success (1ms)
Delete steps response message status code should be NoContent (0ms)
When the topping is deleted (13ms)
Then the delete response should indicate success (1ms)
Then the delete response should indicate success (1ms)
Diagrams
Details:lines
Non-existent toppings cannot be deleted
Deleting a non-existent topping should return not found 8ms🔗
Steps
Given a topping id that does not exist (0ms)
Given a topping id that does not exist (0ms)
Given a topping id that does not exist (0ms)
When the topping is deleted (4ms)
When the topping is deleted (4ms)
Then the delete response should indicate not found (1ms)
Delete steps response message status code should be NotFound (0ms)
When the topping is deleted (4ms)
Then the delete response should indicate not found (1ms)
Then the delete response should indicate not found (1ms)
Diagrams
Details:lines
Toppings Feature Flag
/toppings - Raspberry topping availability controlled by feature flag
Raspberry topping is hidden when the feature flag is disabled
Toppings should exclude raspberries when the feature flag is disabled IgnoreIfExternalSut 252ms🔗
Steps
Given the raspberry topping feature flag is disabled (217ms)
Given the raspberry topping feature flag is disabled (217ms)
Given the raspberry topping feature flag is disabled (217ms)
When the available toppings are requested (25ms)
When the available toppings are requested (25ms)
Then the toppings response should not include raspberries (6ms)
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)
When the available toppings are requested (25ms)
Then the toppings response should not include raspberries (6ms)
Then the toppings response should not include raspberries (6ms)
Diagrams
Details:lines
Raspberry topping is available when the feature flag is enabled
Toppings should include raspberries when the feature flag is enabled IgnoreIfExternalSut 159ms🔗
Steps
Given the raspberry topping feature flag is enabled (119ms)
Given the raspberry topping feature flag is enabled (119ms)
Given the raspberry topping feature flag is enabled (119ms)
When the available toppings are requested (29ms)
When the available toppings are requested (29ms)
Then the toppings response should include raspberries (4ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response should contain [ t => t.Name == ToppingDefaults.Raspberries ] (0ms)
When the available toppings are requested (29ms)
Then the toppings response should include raspberries (4ms)
Then the toppings response should include raspberries (4ms)
Diagrams
Details:lines
Toppings Management
/toppings - Listing available toppings and adding custom toppings
The toppings endpoint should return all available toppings Happy Path 77ms🔗
Steps
When the available toppings are requested (39ms)
When the available toppings are requested (39ms)
When the available toppings are requested (39ms)
Then the toppings response should contain the default toppings (25ms)
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)
Then the toppings response should contain the default toppings (25ms)
Then the toppings response should contain the default toppings (25ms)
Diagrams
Details:lines
Adding a new topping should return the created topping 51ms🔗
Steps
Given a valid topping request (1ms)
Given a valid topping request (1ms)
Given a valid topping request (1ms)
When the new topping is submitted (29ms)
When the new topping is submitted (29ms)
Then the topping response should contain the created topping (15ms)
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)
When the new topping is submitted (29ms)
Then the topping response should contain the created topping (15ms)
Then the topping response should contain the created topping (15ms)
Diagrams
Details:lines
Toppings Update
/toppings - Updating existing toppings
Existing toppings can be updated
Updating an existing topping should return the updated topping Happy Path 27ms🔗
Steps
Given a known blueberry topping exists (0ms)
Given a known blueberry topping exists (0ms)
Given a known blueberry topping exists (0ms)
And a valid update topping request (0ms)
And a valid update topping request (0ms)
When the topping is updated (16ms)
And a valid update topping request (0ms)
Then the update response should contain the updated topping (5ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Put steps response topping id should be KnownBlueberryToppingId (0ms)
Put steps response name should be Strawberries (0ms)
Put steps response category should be FruitCategory (0ms)
When the topping is updated (16ms)
When the topping is updated (16ms)
Then the update response should contain the updated topping (5ms)
Then the update response should contain the updated topping (5ms)
Diagrams
Details:lines
Update requests must pass validation and XSS checks
Update toppings endpoint is called with invalid or dangerous input 6/6 passed 64ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Category<script>alert('xss')</script>Script tag in categoryCategory contains potentially dangerous content.Bad RequestPassed35ms
2CategoryCategory is required'Category' is required.Bad RequestPassed9ms
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 RequestPassed5ms
5Name<script>alert('xss')</script>Script tag in nameName contains potentially dangerous content.Bad RequestPassed5ms
6NameName is required'Name' is required.Bad RequestPassed4ms
Background Steps
Given a known topping exists (0ms)
Given a known topping exists (0ms)
Given a known topping exists (0ms)
And a valid update topping request with "Category" set to "<script>alert('xss')</script>" (1ms)
Steps
And a valid update topping request with "Category" set to "<script>alert('xss')</script>" (1ms)
When the invalid update topping request is submitted (5ms)
And a valid update topping request with "Category" set to "<script>alert('xss')</script>" (1ms)
Then the update response should contain error "Category contains potentially dangerous content." with status "Bad Request" (25ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Category contains potentially dangerous content.') ] (0ms)
When the invalid update topping request is submitted (5ms)
When the invalid update topping request is submitted (5ms)
Then the update response should contain error "Category contains potentially dangerous content." with status "Bad Request" (25ms)
Then the update response should contain error "Category contains potentially dangerous content." with status "Bad Request" (25ms)
Diagrams
Details:lines
Non-existent toppings cannot be updated
Updating a non-existent topping should return not found 6ms🔗
Steps
Given a topping id that does not exist (0ms)
Given a topping id that does not exist (0ms)
Given a topping id that does not exist (0ms)
And a valid update topping request (0ms)
And a valid update topping request (0ms)
When the topping is updated (1ms)
And a valid update topping request (0ms)
Then the update response should indicate not found (1ms)
Put steps response message status code should be NotFound (0ms)
When the topping is updated (1ms)
When the topping is updated (1ms)
Then the update response should indicate not found (1ms)
Then the update response should indicate not found (1ms)
Diagrams
Details:lines
Toppings XSS Validation
/toppings - XSS and input validation for toppings
Toppings endpoint is called with invalid or dangerous input 6/6 passed 214ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Category<script>alert('xss')</script>Script tag in categoryCategory contains potentially dangerous content.Bad RequestPassed13ms
2CategoryCategory is required'Category' is required.Bad RequestPassed148ms
3Categoryjavascript:alert(1)Javascript protocolCategory contains potentially dangerous content.Bad RequestPassed7ms
4Name<img src=x onerror=alert(1)>Event handler in nameName contains potentially dangerous content.Bad RequestPassed24ms
5Name<script>alert('xss')</script>Script tag in nameName contains potentially dangerous content.Bad RequestPassed7ms
6NameName is required'Name' is required.Bad RequestPassed13ms
Steps
Given a valid topping request with "Category" set to "<script>alert('xss')</script>" (0ms)
Given a valid topping request with "Category" set to "<script>alert('xss')</script>" (0ms)
Given a valid topping request with "Category" set to "<script>alert('xss')</script>" (0ms)
When the invalid topping request is submitted (10ms)
When the invalid topping request is submitted (10ms)
Then the topping response should contain error "Category contains potentially dangerous content." with status "Bad Request" (0ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Category contains potentially dangerous content.') ] (0ms)
When the invalid topping request is submitted (10ms)
Then the topping response should contain error "Category contains potentially dangerous content." with status "Bad Request" (0ms)
Then the topping response should contain error "Category contains potentially dangerous content." with status "Bad Request" (0ms)
Diagrams
Details:lines
Waffles Content Negotiation
/waffles - Content negotiation and unsupported media types
Sending a request with an unsupported content type should return an unsupported media type response 3/3 passed 43ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed3ms
2text/htmlPassed36ms
3text/plainPassed4ms
Steps
Given a waffle request with content type "application/xml" (0ms)
Given a waffle request with content type "application/xml" (0ms)
Given a waffle request with content type "application/xml" (0ms)
When the waffles are prepared with the given content type (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)
When the waffles are prepared with the given content type (0ms)
Then the waffle response should indicate unsupported media type (0ms)
Then the waffle response should indicate unsupported media type (0ms)
Diagrams
Details:lines
Waffles Creation
/waffles - Creating waffles with ingredients including butter
A valid waffle request should return a fresh batch Happy Path 84ms🔗
Steps
Given a valid waffle recipe with all ingredients (7ms)
Given a valid waffle 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)
Given a valid waffle recipe with all ingredients (7ms)
When the waffles are prepared (39ms)
When the waffles are prepared (39ms)
Then the waffles response should contain a valid batch with all ingredients (23ms)
Waffle steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Waffle steps response ingredients should contain 'Milk' (0ms)
Waffle steps response ingredients should contain 'Eggs' (0ms)
Waffle steps response ingredients should contain 'Flour' (0ms)
Waffle steps response ingredients should contain UnsaltedButter (0ms)
When the waffles are prepared (39ms)
And the cow service should have received a milk request (1ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Then the waffles response should contain a valid batch with all ingredients (23ms)
Then the waffles response should contain a valid batch with all ingredients (23ms)
And the cow service should have received a milk request (1ms)
And the cow service should have received a milk request (1ms)
Diagrams
Details:lines
A waffle request with more toppings than allowed should return a bad request response IgnoreIfExternalSut 46ms🔗
Steps
Given the max toppings per item is the configured limit (3ms)
Given the max toppings per item is the configured limit (3ms)
Given the max toppings per item is the configured limit (3ms)
And a valid waffle recipe with all ingredients (14ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
And a valid waffle recipe with all ingredients (14ms)
And the waffle request has more toppings than the configured limit (10ms)
And a valid waffle recipe with all ingredients (14ms)
When the waffles are prepared (8ms)
And the waffle request has more toppings than the configured limit (10ms)
Then the waffles response should indicate too many toppings (4ms)
Waffle steps response message status code should be BadRequest (0ms)
Waffle error response body should contain MaxToppingsExceeded (0ms)
And the waffle request has more toppings than the configured limit (10ms)
When the waffles are prepared (8ms)
When the waffles are prepared (8ms)
Then the waffles response should indicate too many toppings (4ms)
Then the waffles response should indicate too many toppings (4ms)
Diagrams
Details:lines
Waffles endpoint is called with invalid ingredients should return a bad request response 8/8 passed 160ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Butter<script>alert</script>XSS in butterButter contains potentially dangerous content.Bad RequestPassed66ms
2ButterButter is required'Butter' is required.Bad RequestPassed12ms
3EggsEggs is required'Eggs' is required.Bad RequestPassed7ms
4Eggsjavascript:void(0)XSS in eggsEggs contains potentially dangerous content.Bad RequestPassed23ms
5Flour<img onerror=x>XSS in flourFlour contains potentially dangerous content.Bad RequestPassed10ms
6FlourFlour is required'Flour' is required.Bad RequestPassed14ms
7Milk<script>alert</script>XSS in milkMilk contains potentially dangerous content.Bad RequestPassed13ms
8MilkMilk is required'Milk' is required.Bad RequestPassed10ms
Steps
Given a valid waffle request with "Butter" set to "<script>alert</script>" (6ms)
Given a valid waffle request with "Butter" set to "<script>alert</script>" (6ms)
Given a valid waffle request with "Butter" set to "<script>alert</script>" (6ms)
When the invalid waffle request is submitted (46ms)
When the invalid waffle request is submitted (46ms)
Then the waffle response should contain error "Butter contains potentially dangerous content." with status "Bad Request" (8ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Butter contains potentially dangerous content.') ] (0ms)
When the invalid waffle request is submitted (46ms)
Then the waffle response should contain error "Butter contains potentially dangerous content." with status "Bad Request" (8ms)
Then the waffle response should contain error "Butter contains potentially dangerous content." with status "Bad Request" (8ms)
Diagrams
Details:lines