Breakfast Provider (LightBDD) Test Run Report

Features Summary
FeatureScenariosPassedFailedSkippedStepsPassedFailedSkippedDurationAvgLongest
Apple Cinnamon Muffins Creation Feature101000787800268ms26ms86ms
Audit Logs Filtering Feature4400373700266ms66ms119ms
Audit Logs Retrieval Feature1100262600196ms196ms196ms
Customer Preferences Management Feature5500505000116ms23ms41ms
Daily Specials Idempotency Feature220018180054ms27ms42ms
Daily Specials Not Found Feature110044007ms7ms7ms
Daily Specials Ordering Feature4400333300208ms52ms121ms
Daily Specials Validation Feature1100330010ms10ms10ms
Feedback Management Feature66005252001s183ms1s
Grpc Order Status Feature220022220096ms48ms66ms
Grpc Recipe Summary Feature3300242400140ms46ms118ms
Grpc Stream Order Updates Feature220024240067ms33ms61ms
Infrastructure Correlation Id Feature2200990019ms9ms11ms
Infrastructure Degraded Health Check Feature2200282800363ms181ms237ms
Infrastructure Downstream Error Health Check Feature1100131300145ms145ms145ms
Infrastructure Header Propagation Feature220013130074ms37ms43ms
Infrastructure Health Check Detail Feature110037370015ms15ms15ms
Infrastructure Health Check Feature110020200057ms57ms57ms
Infrastructure Heartbeat Feature1100880013ms13ms13ms
Infrastructure Telemetry Feature11001616002s2s2s
Ingredient Usage Analytics Feature5500383800764ms152ms646ms
Ingredients Goat Milk Downstream Failure Feature220014140029ms14ms21ms
Ingredients Goat Milk Feature Flag Feature2200141400282ms141ms151ms
Ingredients Goat Milk Sourcing Feature110010100029ms29ms29ms
Ingredients Milk Downstream Failure Feature330021210039ms13ms18ms
Inventory Management Feature6600666600220ms36ms91ms
Menu Availability Feature1100171700100ms100ms100ms
Menu Caching Feature110014140063ms63ms63ms
Menu Downstream Failure Feature1100990051ms51ms51ms
Orders Breakfast Order Feature33009292002s737ms1s
Orders Complete Lifecycle Feature1100616100143ms143ms143ms
Orders Cross Field Validation Feature2200232300360ms180ms186ms
Orders Kitchen Service Failure Feature1100272700208ms208ms208ms
Orders Order Retrieval Feature220034340085ms42ms69ms
Orders Outbox Retry Exhaustion Feature110022001s1s1s
Orders Pagination Feature4400575700411ms102ms138ms
Orders Rate Limiting Feature1100121200168ms168ms168ms
Orders Status Transition Feature11110012612600615ms55ms72ms
Orders Status Update Not Found Feature1100440010ms10ms10ms
Orders Validation Feature22006600189ms94ms134ms
Pancakes Content Negotiation Feature330012120012ms4ms5ms
Pancakes Creation Feature3300595900109ms36ms43ms
Recipe Reviews Management Feature6600454500284ms47ms119ms
Reporting Batch Completions Feature110023230050ms50ms50ms
Reporting Equipment Alerts Feature110023230071ms71ms71ms
Reporting Event Grid Webhook Feature1100111100148ms148ms148ms
Reporting Order Summaries Feature220036360073ms36ms56ms
Reporting Recipe Reports Feature33004848001s623ms1s
Reservations Management Feature55006262002s470ms1s
Specifications Async Api Feature1100202000876ms876ms876ms
Specifications Open Api Feature1100313100782ms782ms782ms
Specifications Open Api Scalar UI Feature11008800346ms346ms346ms
Staff Management Feature4400404000208ms52ms125ms
Toppings Deletion Feature2200880028ms14ms22ms
Toppings Feature Flag Feature2200181800261ms130ms136ms
Toppings Management Feature220024240066ms33ms45ms
Toppings Update Feature330023230067ms22ms41ms
Toppings Xss Validation Feature1100330034ms34ms34ms
Waffles Content Negotiation Feature330012120086ms28ms47ms
Waffles Creation Feature3300636300294ms98ms148ms

Test Execution Summary

ExecutionContent
Overall status:PassedFeatures: 60
Start Date:2026-05-13 (UTC)Scenarios: 151
Start Time:12:45:21 (UTC)Passed Scenarios: 151
End Time:12:45:27 (UTC)Failed Scenarios: 0
Duration:5sSkipped Scenarios: 0
TTD Version:2.33.74+07ed8f328c6ab301dd90833c9ce1de9781ebdb09
Passed: 151 (100%)100%

Filtering

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