Breakfast Provider (BDDfy) Test Run Report

Features Summary
FeatureScenariosPassedFailedSkippedStepsPassedFailedSkippedDurationAvgLongest
Apple Cinnamon Muffins10100075750052ms5ms26ms
Audit Logs5500323200126ms25ms59ms
Customer Preferences550029290016ms3ms7ms
Daily Specials990050500037ms4ms9ms
Feedback660032320020ms3ms6ms
Grpc7700363600336ms48ms289ms
Infrastructure11110010810800510ms46ms130ms
Ingredients8800424200503ms62ms373ms
Ingredient Usage550028280042ms8ms19ms
Inventory660033330041ms6ms21ms
Menu330024240028ms9ms20ms
Orders33330020420400613ms18ms177ms
Pancakes11110064640025ms2ms8ms
Recipe Reviews660032320017ms2ms5ms
Reporting8800434300132ms16ms29ms
Reservations550029290020ms4ms9ms
Specifications330038380017ms5ms8ms
Staff440023230020ms5ms8ms
Toppings20200012112100674ms33ms335ms
Waffles11110065650052ms4ms24ms

Test Execution Summary

ExecutionContent
Overall status:PassedFeatures: 20
Start Date:2026-05-13 (UTC)Scenarios: 176
Start Time:14:43:44 (UTC)Passed Scenarios: 176
End Time:14:43:52 (UTC)Failed Scenarios: 0
Duration:8sSkipped Scenarios: 0
TTD Version:2.33.74+07ed8f328c6ab301dd90833c9ce1de9781ebdb09
Passed: 176 (100%)100%

Filtering

Status:
Happy Paths:
Duration ≥:
Dependencies:
Details:lines
Apple Cinnamon Muffins
Different muffin recipes should produce the expected batch 3/3 passed 6ms🔗
#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
Passed3ms
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
Passed1ms
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
Passed1ms
Steps
Given all ingredients are retrieved for the muffin recipe (2ms)
When the muffins are prepared (0ms)
Then the response should match the expected batch (1ms)
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
Muffin request with invalid field should return bad request 6/6 passed 28ms🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1ApplesApples is required'Apples' is required.Bad RequestPassed0ms
2CinnamonCinnamon is required'Cinnamon' is required.Bad RequestPassed0ms
3Cinnamon<script>alert('xss')</script>XSS in cinnamonCinnamon contains potentially dangerous content.Bad RequestPassed0ms
4EggsEggs is required'Eggs' is required.Bad RequestPassed0ms
5FlourFlour is required'Flour' is required.Bad RequestPassed0ms
6MilkMilk is required'Milk' is required.Bad RequestPassed26ms
Steps
Step A muffin request with invalid Apples (0ms)
When the muffin validation request is sent (0ms)
Then the response should contain error 'Apples' is required. (0ms)
Actual error message should contain ''Apples' is required.' (0ms)
And the response status should be Bad Request (0ms)
Actual response status should be 'Bad Request' (0ms)
Diagrams
Details:lines
Valid apple cinnamon muffin request should return a fresh batch 17ms🔗
Steps
Given all ingredients are retrieved for apple cinnamon muffins (1ms)
When the muffins are prepared (2ms)
Then the response should contain a valid batch with all ingredients (9ms)
Muffin steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Muffin steps response ingredients should contain '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 (3ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
Details:lines
Audit Logs
Audit logs should be filterable by entity id 2ms🔗
Steps
Given an order has been created to generate an audit log (0ms)
When audit logs are requested filtered by entity id (1ms)
Then the audit log response should be OK (0ms)
Audit log response status code should be OK (0ms)
And the audit logs should contain the specific order entry (1ms)
Audit logs should contain [ l => l.EntityId == '6aaaa3b3-d365-4255-878d-84187d974845' ] (0ms)
Diagrams
Details:lines
Audit logs should be filterable by entity type 5ms🔗
Steps
Given an order has been created to generate an audit log (0ms)
When audit logs are requested filtered by entity type (0ms)
Then the audit log response should be OK (0ms)
Audit log response status code should be OK (0ms)
And the audit logs should only contain order entries (5ms)
Audit logs should only contain [ l => l.EntityType == AuditLogDefaults.OrderEntityType ] (0ms)
Diagrams
Details:lines
Audit logs should be returned in descending timestamp order 59ms🔗
Steps
Given an order has been created to generate an audit log (3ms)
When audit logs are requested filtered by entity type (1ms)
Then the audit logs should be ordered by timestamp descending (54ms)
Audit logs should not be null or empty (0ms)
Audit logs should be in descending order [ l => l.Timestamp ] (0ms)
Diagrams
Details:lines
Creating an order should produce a retrievable audit log entry 56ms🔗
Steps
Given a pancake batch has been created (1ms)
And an order has been created for the batch (1ms)
When the audit logs are retrieved (1ms)
Then the audit log response should contain the order creation entry (7ms)
Audit steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Audit steps response should contain [ a => a.Action == AuditLogDefaults.CreatedAction && a.EntityType == AuditLogDefaults.OrderEntityType && a.Details.Contains('TestCustomer_643923799327133163') ] (0ms)
And the downstream services should have received requests (44ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
Details:lines
Filtering audit logs by a non existent entity type should return an empty collection 2ms🔗
Steps
When audit logs are requested filtered by a non existent entity type (1ms)
Then the audit log response should be OK (0ms)
Audit log response status code should be OK (0ms)
And the audit logs should be empty (0ms)
Audit logs should be empty (0ms)
Diagrams
Details:lines
Customer Preferences
Retrieving existing customer preferences should return the preferences 3ms🔗
Steps
Given customer preferences exist (0ms)
When the customer preferences are retrieved (1ms)
Then the response should contain the preferences (1ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response customer id should be 'a037840c2e624511839f447769558772' (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 1ms🔗
Steps
When non existent customer preferences are retrieved (0ms)
Then the get response should indicate not found (0ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Saving customer preferences should return the saved preferences 7ms🔗
Steps
Given a valid customer preference request is prepared (1ms)
When the customer preferences are saved (3ms)
Then the response should contain the saved preferences (3ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Put steps response preferred milk type should be "Oat" (0ms)
Put steps response favourite item should be "Blueberry Pancakes" (0ms)
Diagrams
(Warning: 72 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Saving customer preferences with missing customer name should return bad request 1ms🔗
Steps
Given a customer preference request with missing customer name is prepared (0ms)
When the customer preferences are saved (0ms)
Then the put 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 3ms🔗
Steps
Given customer preferences exist (1ms)
When the customer preferences are updated (0ms)
Then the response should contain the updated values (1ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Put steps response preferred milk type should be "Almond" (0ms)
Put steps response favourite item should be "Belgian Waffles" (0ms)
Diagrams
Details:lines
Daily Specials
Daily special order with invalid field should return bad request 2/2 passed 9ms🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1Quantity0Quantity must be greater than zeroQuantity must be greater than zero.Bad RequestPassed0ms
2SpecialId
null
Special ID is required'Special Id' is required.Bad RequestPassed9ms
Steps
Step A daily special order request with invalid Quantity (0ms)
When the daily special order request is sent (0ms)
Then the response should contain error Quantity must be greater than zero. (0ms)
Actual error message should be 'Quantity must be greater than zero.' (0ms)
And the response status should be Bad Request (0ms)
Actual response status should be 'Bad Request' (0ms)
Diagrams
Details:lines
Daily specials endpoint should return all available specials 1ms🔗
Steps
When the available daily specials are requested (0ms)
Then the daily specials response should contain all expected specials (1ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response should have count ExpectedSpecialsCount (0ms)
Diagrams
Details:lines
Ordering daily special beyond threshold should return conflict 3ms🔗
Steps
Given the matcha waffles order count is reset (1ms)
And the matcha waffles special has been ordered up to the configured limit (0ms)
When another order is placed for the matcha waffles special (0ms)
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
Ordering non existent daily special should return not found 3ms🔗
Steps
Given a daily special order request for a non existent special (0ms)
When the daily special order is submitted (2ms)
Then the response should indicate not found (0ms)
Post steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Remaining quantity should decrease after each order 9ms🔗
Steps
Given the lemon ricotta order count is reset (0ms)
And a daily special order for lemon ricotta of quantity one is placed (0ms)
When the available daily specials are requested (1ms)
Then the lemon ricotta special should have one fewer remaining (6ms)
Response content is valid json should be true (0ms)
Lemon ricotta remaining quantity should be MaxOrdersPerSpecial - 1 (0ms)
Diagrams
Details:lines
Same order with different idempotency keys should return different confirmations 3ms🔗
Steps
Given the cinnamon swirl order count is reset (1ms)
And an order request for the same special (0ms)
When the order is submitted with two different idempotency keys (1ms)
Then the responses should have different confirmation ids (0ms)
First confirmation id should not be 'd87f6439-2856-456f-84a5-5d7394ed7203' (0ms)
Diagrams
Details:lines
Same order with same idempotency key should return same confirmation 1ms🔗
Steps
Given the cinnamon swirl order count is reset (0ms)
And an order request with an idempotency key (0ms)
When the order is submitted twice with the same idempotency key (1ms)
Then both responses should return the same confirmation id (0ms)
First confirmation id should be 'c23743fc-e6f4-48b6-877c-9d05cddf00a2' (0ms)
Diagrams
Details:lines
Valid daily special order should return a confirmation 3ms🔗
Steps
Given the cinnamon swirl order count is reset (0ms)
And a valid daily special order request for cinnamon swirl (0ms)
When the daily special order is submitted (0ms)
Then the daily special order response should contain a valid confirmation (1ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response special id should be CinnamonSwirlId (0ms)
Post steps response order confirmation id should not be empty (0ms)
Diagrams
Details:lines
Feedback
Listing feedback for an order should return the feedback 6ms🔗
Steps
Given a feedback entry exists (1ms)
When the feedback is retrieved by order id (1ms)
Then the list response should contain the feedback (3ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps list response should contain [ f => f.FeedbackId == '05ebb5dd-6fa9-4d33-a724-9b4e4af759ea' ] (0ms)
Diagrams
Details:lines
Retrieving existing feedback by id should return the feedback 3ms🔗
Steps
Given a feedback entry exists (0ms)
When the feedback is retrieved by id (1ms)
Then the get response should contain the feedback (2ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response feedback id should be '9cd49714-9290-47b6-890a-564d0dde72d9' (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 0ms🔗
Steps
When a non existent feedback is retrieved (0ms)
Then the get response should indicate not found (0ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Submitting feedback should return the created feedback 4ms🔗
Steps
Given a valid feedback request is prepared (0ms)
When the feedback is submitted (0ms)
Then the response should contain the created feedback (3ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response customer name should be 'CustomerName' (0ms)
Post steps response rating should be 4 (0ms)
Diagrams
Details:lines
Submitting feedback with invalid rating should return bad request 4ms🔗
Steps
Given a feedback request with an invalid rating is prepared (0ms)
When the feedback is submitted (3ms)
Then the post 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 0ms🔗
Steps
Given a feedback request with missing customer name is prepared (0ms)
When the feedback is submitted (0ms)
Then the post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Grpc
Order status for non existent order should return not found 2ms🔗
Steps
When the order status for a non existent order is requested via grpc (0ms)
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
Order status via grpc should return order details 5ms🔗
Steps
Given a pancake batch and order have been created (1ms)
When the order status is requested via grpc (3ms)
Then the grpc response should contain the order details (0ms)
Grpc steps order status reply order id should be '0914d8cd-fddb-4866-b366-97cf8e074631' (0ms)
Grpc steps order status reply customer name should be 'TestCustomer_8543596404637729672' (0ms)
Grpc steps order status reply status should be Created (0ms)
Diagrams
Details:lines
Pancake recipe summary should return correct data 289ms🔗
Steps
When a recipe summary is requested for pancakes (128ms)
Then the recipe summary should contain pancake data (161ms)
Grpc steps recipe summary reply recipe type should be "Pancakes" (0ms)
Grpc steps recipe summary reply total batches should be 42 (0ms)
Grpc steps recipe summary reply common ingredients should be equivalent to ["Milk", "Flour", "Eggs"] (0ms)
Diagrams
Details:lines
Streaming order updates should return the current status 3ms🔗
Steps
Given a pancake batch and order have been created (1ms)
When order updates are streamed via grpc (1ms)
Then the streamed response should contain the order status (1ms)
Grpc steps streamed replies should have count 1 (0ms)
Grpc steps streamed replies[0] order id should be 'ae79672e-c150-4bb0-b28c-7e38825c924d' (0ms)
Grpc steps streamed replies[0] customer name should be 'TestCustomer_6101082416145552344' (0ms)
Grpc steps streamed replies[0] status should be Created (0ms)
Diagrams
Details:lines
Streaming updates for non existent order should return not found 25ms🔗
Steps
When order updates for a non existent order are streamed via grpc (25ms)
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
Unknown recipe type should return zero batches 5ms🔗
Steps
When a recipe summary is requested for an unknown type (0ms)
Then the recipe summary should contain zero batches and no ingredients (4ms)
Grpc steps recipe summary reply recipe type should be "Unknown" (0ms)
Grpc steps recipe summary reply total batches should be 0 (0ms)
Grpc steps recipe summary reply common ingredients should be empty (0ms)
Diagrams
Details:lines
Waffle recipe summary should return correct data 3ms🔗
Steps
When a recipe summary is requested for waffles (2ms)
Then the recipe summary should contain waffle data (1ms)
Grpc steps recipe summary reply recipe type should be "Waffles" (0ms)
Grpc steps recipe summary reply total batches should be 28 (0ms)
Grpc steps recipe summary reply common ingredients should be equivalent to ["Milk", "Flour", "Eggs", "Butter"] (0ms)
Diagrams
Details:lines
Infrastructure
Creating an order should emit a structured log entry 116ms🔗
Steps
Given the application is configured with in memory log capture (109ms)
And a pancake batch has been created (1ms)
When the order is submitted (1ms)
Then a structured log entry should have been captured for order creation (4ms)
Log provider entries should contain [ e => e.Message.Contains("created for customer") ] (0ms)
Log provider entries should contain [ e => e.Message.Contains('TelemetryTest_2915029430025427957') ] (0ms)
Log provider entries should contain [ e => e.Message.Contains("1 items") ] (0ms)
Diagrams
Details:lines
Health check endpoint should return healthy status with all dependency details 9ms🔗
Steps
When the health check endpoint is called (2ms)
Then the response should indicate healthy (0ms)
Response status code should be OK (0ms)
Result should not be null (0ms)
Result status should be Healthy (0ms)
And all dependency health checks should be present (5ms)
Result results should contain key CowService (0ms)
Result results should contain key GoatService (0ms)
Result results should contain key SupplierService (0ms)
Result results should contain key KitchenService (0ms)
Result results should contain key CosmosDb (0ms)
Result results should contain key Kafka (0ms)
Diagrams
Details:lines
Health check response should include description and data for each entry 12ms🔗
Steps
When the health check endpoint is called (1ms)
Then each entry should have a status (0ms)
Entry value status should not be null or empty $"health check entry '{entry.Key}' should have a status" (0ms)
Entry value status should not be null or empty $"health check entry '{entry.Key}' should have a status" (0ms)
Entry value status should not be null or empty $"health check entry '{entry.Key}' should have a status" (0ms)
Entry value status should not be null or empty $"health check entry '{entry.Key}' should have a status" (0ms)
Entry value status should not be null or empty $"health check entry '{entry.Key}' should have a status" (0ms)
Entry value status should not be null or empty $"health check entry '{entry.Key}' should have a status" (0ms)
Entry value status should not be null or empty $"health check entry '{entry.Key}' should have a status" (0ms)
Entry value status should not be null or empty $"health check entry '{entry.Key}' should have a status" (0ms)
Entry value status should not be null or empty $"health check entry '{entry.Key}' should have a status" (0ms)
Entry value status should not be null or empty $"health check entry '{entry.Key}' should have a status" (0ms)
And each downstream entry should have a description (9ms)
Result results should contain key 'CowService' (0ms)
Result results[check name] description should not be null or empty $"health check entry '{checkName}' should have a description" (0ms)
Result results should contain key 'GoatService' (0ms)
Result results[check name] description should not be null or empty $"health check entry '{checkName}' should have a description" (0ms)
Result results should contain key 'SupplierService' (0ms)
Result results[check name] description should not be null or empty $"health check entry '{checkName}' should have a description" (0ms)
Result results should contain key 'KitchenService' (0ms)
Result results[check name] description should not be null or empty $"health check entry '{checkName}' should have a description" (0ms)
And each entry should have a data object (0ms)
Entry value data should not be null $"health check entry '{entry.Key}' should have a data object" (0ms)
Entry value data should not be null $"health check entry '{entry.Key}' should have a data object" (0ms)
Entry value data should not be null $"health check entry '{entry.Key}' should have a data object" (0ms)
Entry value data should not be null $"health check entry '{entry.Key}' should have a data object" (0ms)
Entry value data should not be null $"health check entry '{entry.Key}' should have a data object" (0ms)
Entry value data should not be null $"health check entry '{entry.Key}' should have a data object" (0ms)
Entry value data should not be null $"health check entry '{entry.Key}' should have a data object" (0ms)
Entry value data should not be null $"health check entry '{entry.Key}' should have a data object" (0ms)
Entry value data should not be null $"health check entry '{entry.Key}' should have a data object" (0ms)
Entry value data should not be null $"health check entry '{entry.Key}' should have a data object" (0ms)
Diagrams
Details:lines
Health check should report degraded when cow service is unavailable 128ms🔗
Steps
Given the cow service is configured to be unreachable (125ms)
When the health check endpoint is called (1ms)
Then the response should indicate degraded status (0ms)
Response status code should be OK (0ms)
Result should not be null (0ms)
Result status should be Degraded (0ms)
And the cow service dependency should report degraded (0ms)
Result results should contain key CowService (0ms)
Result results[ health check names cow service] status should be Degraded (0ms)
Diagrams
Details:lines
Health check should report degraded when downstream service returns non success status 130ms🔗
Steps
Given the kitchen service health check is configured to use a failing endpoint (127ms)
When the health check endpoint is called (1ms)
Then the response should indicate degraded status (0ms)
Result should not be null (0ms)
Result status should be Degraded (0ms)
And the kitchen service should report degraded with status code description (0ms)
Result results should contain key KitchenService (0ms)
Kitchen entry status should be Degraded (0ms)
Kitchen entry description should contain "503" (0ms)
Diagrams
Details:lines
Health check should report degraded when multiple downstream services are unavailable 100ms🔗
Steps
Given the cow service and supplier service are configured to be unreachable (99ms)
When the health check endpoint is called (0ms)
Then the response should indicate degraded status (0ms)
Response status code should be OK (0ms)
Result should not be null (0ms)
Result status should be Degraded (0ms)
And the cow service dependency should report degraded (0ms)
Result results should contain key CowService (0ms)
Result results[ health check names cow service] status should be Degraded (0ms)
And the supplier service dependency should report degraded (0ms)
Result results should contain key SupplierService (0ms)
Result results[ health check names supplier service] status should be Degraded (0ms)
Diagrams
Details:lines
Heartbeat endpoint should return a running message 1ms🔗
Steps
When the heartbeat endpoint is called (0ms)
Then the response should indicate the service is running (0ms)
Response status code should be OK (0ms)
Result should not be null (0ms)
Result status should be HeartbeatStatus (0ms)
Diagrams
Details:lines
Request with correlation id should forward it to cow service 1ms🔗
Steps
Given a request with a known correlation id (0ms)
When milk is requested from the milk endpoint (0ms)
Then the cow 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 '0cb8e7ba-5ca1-4f64-9ede-f7b0f20e77b3' (0ms)
Diagrams
Details:lines
Request with correlation id should forward it to supplier service 5ms🔗
Steps
Given a request with a known correlation id (0ms)
And the menu cache is cleared (0ms)
When the menu is requested (1ms)
Then the supplier service should have received the correlation id (2ms)
Requests should not be empty (0ms)
Request headers should contain key CorrelationId (0ms)
Request headers[ custom headers correlation id] should be 'e6235606-4723-4d61-b2bc-3f6bc19f6650' (0ms)
Diagrams
Details:lines
Request with correlation id should return same id in response 1ms🔗
Steps
Given a request with a known correlation id (0ms)
When the request is sent to the menu endpoint (0ms)
Then the response should contain the same correlation id (0ms)
Response contains correlation id header should be true (0ms)
First value of values should be '160d329a-dbc1-4a04-989b-28a570d58393' (0ms)
Diagrams
Details:lines
Request without correlation id should have one generated in response 4ms🔗
Steps
When a request without a correlation id is sent to the menu endpoint (3ms)
Then the response should contain a generated correlation id (0ms)
Response contains correlation id header should be true (0ms)
First value of values should not be null or empty (0ms)
Diagrams
Details:lines
Ingredients
Goat milk endpoint should return fresh goat milk from goat service 2ms🔗
Steps
When goat milk is requested (0ms)
Then the response should contain fresh goat milk (0ms)
Goat milk steps response message status code should be OK (0ms)
Goat milk steps goat milk response should not be null (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
Goat milk endpoint should return fresh goat milk when feature is enabled 373ms🔗
Steps
Given the goat milk feature flag is enabled (369ms)
When goat milk is requested (4ms)
Then the response should contain fresh goat milk (0ms)
Goat milk steps response message status code should be OK (0ms)
Goat milk steps goat milk response goat milk should be FreshGoatMilk (0ms)
Diagrams
Details:lines
Goat milk endpoint should return not found when feature is disabled 119ms🔗
Steps
Given the goat milk feature flag is disabled (117ms)
When goat milk is requested (0ms)
Then the response should indicate feature disabled (1ms)
Goat milk steps response message status code should be NotFound (0ms)
Body should contain FeatureDisabled (0ms)
Diagrams
Details:lines
Requesting goat milk when goat service returns invalid response should return bad gateway 0ms🔗
Steps
Given the goat service will return an invalid response (0ms)
When goat milk is requested (0ms)
Then the goat milk response should indicate a bad gateway (0ms)
Goat milk steps response message status code should be BadGateway (0ms)
Body should contain GoatServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Requesting goat milk when goat service unavailable should return bad gateway 1ms🔗
Steps
Given the goat service will return service unavailable (0ms)
When goat milk is requested (0ms)
Then the goat milk response should indicate a bad gateway (0ms)
Goat milk steps response message status code should be BadGateway (0ms)
Body should contain GoatServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Requesting milk when cow service returns invalid response should return bad gateway 0ms🔗
Steps
Given the cow service will return an invalid response (0ms)
When milk is requested (0ms)
Then the milk response should indicate a bad gateway with unavailable message (0ms)
Milk steps response message status code should be BadGateway (0ms)
Milk error response body should contain CowServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Requesting milk when cow service times out should return bad gateway 0ms🔗
Steps
Given the cow service will return a timeout (0ms)
When milk is requested (0ms)
Then the milk response should indicate a bad gateway with unavailable message (0ms)
Milk steps response message status code should be BadGateway (0ms)
Milk error response body should contain CowServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Requesting milk when cow service unavailable should return bad gateway 4ms🔗
Steps
Given the cow service will return service unavailable (0ms)
When milk is requested (0ms)
Then the milk response should indicate a bad gateway with unavailable message (3ms)
Milk steps response message status code should be BadGateway (0ms)
Milk error response body should contain CowServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Ingredient Usage
Getting usage summary should return aggregated data 19ms🔗
Steps
Given an ingredient usage record exists (0ms)
When the summary is requested (1ms)
Then the summary should contain aggregated data (17ms)
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-59d09d11f5034d44a8353638d02ead7c' ] (0ms)
Diagrams
Details:lines
Listing usage by ingredient should return matching records 12ms🔗
Steps
Given an ingredient usage record exists (4ms)
When the usage is listed by ingredient (1ms)
Then the list response should contain the record (6ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps list response should contain [ u => u.IngredientName == 'Flour-d34e48e1fbf2415da1a4adf90b583d09' ] (0ms)
Diagrams
Details:lines
Recording ingredient usage should return the created record 3ms🔗
Steps
Given a valid ingredient usage request is prepared (0ms)
When the usage is recorded (0ms)
Then the response should contain the created record (2ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response ingredient name should be 'Flour-3ebcb1c87af34a28ae9c7557a5c2d0e1' (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
Recording usage with missing ingredient name should return bad request 7ms🔗
Steps
Given a usage request with missing ingredient name is prepared (6ms)
When the usage is recorded (0ms)
Then the post 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 1ms🔗
Steps
Given a usage request with zero quantity is prepared (0ms)
When the usage is recorded (0ms)
Then the post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Inventory
Adding a new inventory item should return the created item 2ms🔗
Steps
Given a valid inventory item request is prepared (0ms)
When the inventory item is submitted (0ms)
Then the response should contain the created item (1ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response name should be 'Name' (0ms)
Post steps response category should be "Dry Goods" (0ms)
Diagrams
Details:lines
Deleting an inventory item should return no content 2ms🔗
Steps
Given an inventory item exists (0ms)
When the inventory item is deleted (1ms)
Then the 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 8ms🔗
Steps
Given an inventory item exists (0ms)
When all inventory items are requested (1ms)
Then the list response should contain the item (6ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps list response should contain [ i => i.Id == '4' ] (0ms)
Diagrams
Details:lines
Retrieving a non existent inventory item should return not found 0ms🔗
Steps
When a non existent inventory item is retrieved (0ms)
Then the 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 21ms🔗
Steps
Given an inventory item exists (17ms)
When the inventory item is retrieved by id (1ms)
Then the get response should contain the item (2ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response id should be '1' (0ms)
Get steps response name should be 'Name' (0ms)
Diagrams
Details:lines
Updating an inventory item should return the updated item 5ms🔗
Steps
Given an inventory item exists (0ms)
When the inventory item is updated (3ms)
Then the put response should contain the updated values (2ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Put steps response category should be "Updated Category" (0ms)
Diagrams
Details:lines
Menu
Menu endpoint should return all menu items with availability 20ms🔗
Steps
When the menu is requested (1ms)
Then the menu response should contain all menu items (13ms)
Menu steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Menu steps response should contain [ m => m.Name == MenuDefaults.ClassicPancakes ] (0ms)
Menu steps response should contain [ m => m.Name == MenuDefaults.BelgianWaffles ] (0ms)
Menu steps response should contain [ m => m.Name == MenuDefaults.GoatMilkPancakes ] (0ms)
And the menu items should be in alphabetical order (4ms)
Menu steps response should be in ascending order [ m => m.Name ] (0ms)
And the supplier service should have received an availability request (1ms)
Requests should contain [ r => r.RequestUri.AbsolutePath.Contains("/availability") && r.Method == HttpMethod.Get ] (0ms)
Diagrams
Details:lines
Menu should return cached results on subsequent requests 3ms🔗
Steps
Given the menu has been requested and cached (1ms)
And the supplier service is then made unavailable (0ms)
When the menu is requested again (0ms)
Then the menu response should still return available items (1ms)
Second menu steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Second menu steps response should contain [ m => m.IsAvailable ] (0ms)
Diagrams
Details:lines
Requesting menu when supplier service unavailable should mark items as unavailable 4ms🔗
Steps
Given the supplier service will return service unavailable (0ms)
When the menu is requested (0ms)
Then the menu response should mark all items as unavailable (3ms)
Menu steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Menu steps response should only contain [ m => m.IsAvailable == false ] (0ms)
Diagrams
Details:lines
Orders
Creating an order should produce an audit log entry and events 58ms🔗
Steps
Given a pancake batch is created and order request is ready (27ms)
When the order is submitted (0ms)
Then the order should be created successfully (3ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response customer name should be 'TestCustomer_8087337191198148419' (0ms)
Order steps response items should have count 1 (0ms)
And an order created event should have been published (11ms)
Order created events should contain [ e => e.CustomerName == 'TestCustomer_8087337191198148419' ] (0ms)
And a recipe log should have been published to kafka (13ms)
Recipe log messages should contain [ m => m.Message.RecipeType == OrderDefaults.PancakeItemType, "a RecipeLogEvent should have been published for the pancake recipe" ] (0ms)
Diagrams
Details:lines
Creating an order should write an outbox message that gets processed 7ms🔗
Steps
Given a pancake batch is created and order request is ready (0ms)
When the order is submitted (0ms)
Then the order should be created successfully (0ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response customer name should be 'TestCustomer_3123971982841789550' (0ms)
Order steps response items should have count 1 (0ms)
And an outbox message should have been written and processed (6ms)
Diagrams
Details:lines
Creating an order when kitchen service returns error should still create the order 10ms🔗
Steps
Given a pancake batch has been created (1ms)
And a valid order request for the created batch (0ms)
And the kitchen service will return an error (2ms)
When the breakfast order is placed (0ms)
Then the order should still be created successfully (4ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response customer name should be 'TestCustomer_5667510612549254082' (0ms)
And the order should be retrievable by its id (1ms)
Diagrams
Details:lines
Exceeding rate limit should return too many requests 177ms🔗
Steps
Given the rate limit is configured to allow one request per window (174ms)
And a pancake batch has been created (1ms)
And a valid order request is prepared (0ms)
When the order is submitted twice in rapid succession (1ms)
Then the first request should succeed and the second should be rate limited (0ms)
First response status code should be Created (0ms)
Second response status code should be TooManyRequests (0ms)
Diagrams
Details:lines
Invalid status transition should return conflict 7/7 passed 31ms🔗
#Input ParametersStatusDuration
From StatusTo Status
1CancelledPreparingPassed0ms
2CancelledReadyPassed29ms
3CompletedPreparingPassed0ms
4CreatedCompletedPassed0ms
5CreatedReadyPassed0ms
6PreparingCancelledPassed0ms
7ReadyPreparingPassed0ms
Steps
Given an order exists with status Cancelled (0ms)
When the order status is updated to Preparing (0ms)
Then the response should indicate a conflict (0ms)
Patch steps response message status code should be Conflict (0ms)
Diagrams
Details:lines
Listing orders should return a paginated response 3ms🔗
Steps
Given multiple orders have been created (0ms)
When the orders are listed (0ms)
Then the response should contain a paginated list of orders (3ms)
List steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
List steps response items should have count greater than or equal to '2' (0ms)
List steps response page should be 1 (0ms)
List steps response total count should be greater than or equal to '2' (0ms)
Diagrams
(Warning: 40 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Listing orders when none exist should return an empty page 4ms🔗
Steps
When the orders are listed (1ms)
Then the response should be an empty page (3ms)
List steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
List steps response items should be empty (0ms)
List steps response total count should be 0 (0ms)
Diagrams
Details:lines
Listing orders with small page size should limit results 4ms🔗
Steps
Given multiple orders have been created (2ms)
When the orders are listed with page size 1 (0ms)
Then the response should contain only one item per page (1ms)
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)
List steps response total pages should be greater than or equal to '2' (0ms)
Diagrams
(Warning: 40 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Order at maximum items per order should be accepted 143ms🔗
Steps
Given the max items per order is configured to 2 (142ms)
And a pancake batch is created (0ms)
And an order request has 2 items (0ms)
When the order is submitted (0ms)
Then the order should be created successfully (0ms)
Order steps response message status code should be Created (0ms)
Diagrams
Details:lines
Order exceeding maximum items per order should be rejected 117ms🔗
Steps
Given the max items per order is configured to 2 (111ms)
And a pancake batch is created (1ms)
And an order request has 3 items (0ms)
When the order is submitted (0ms)
Then the response should indicate too many items (2ms)
Order steps response message status code should be BadRequest (0ms)
Order validation errors should contain [ e => e.Contains("cannot contain more than 2 items") ] (0ms)
Diagrams
Details:lines
Order should progress through all status transitions to completion 13ms🔗
Steps
Given a pancake batch has been created (4ms)
And a breakfast order has been placed for the batch (1ms)
When the order is progressed through the complete lifecycle (1ms)
Then the completed order should be retrievable with all details (3ms)
And an audit log entry should exist for the order (2ms)
And the downstream services should have received requests (1ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
Details:lines
Order status update with invalid field should return bad request 1/1 passed 3ms🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1StatusStatus is required'Status' is required.Bad RequestPassed3ms
Steps
Step An order status update request with invalid Status (0ms)
When the order status update request is sent (3ms)
Then the response should contain error 'Status' is required. (0ms)
Actual error message should be ''Status' is required.' (0ms)
And the response status should be Bad Request (0ms)
Actual response status should be 'Bad Request' (0ms)
Diagrams
Details:lines
Order with invalid field should return bad request 5/5 passed 8ms🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1CustomerNameCustomer name is required'Customer Name' is required.Bad RequestPassed0ms
2Items
null
At least one item is requiredThe Items field is required.Bad RequestPassed0ms
3Items[0].BatchId
null
Batch ID is required'Batch Id' is required.Bad RequestPassed0ms
4Items[0].ItemTypeItem type is required'Item Type' is required.Bad RequestPassed6ms
5Items[0].Quantity0Quantity must be greater than zeroQuantity must be greater than zero.Bad RequestPassed0ms
Steps
Step An order request with invalid CustomerName (0ms)
When the order request is sent (0ms)
Then the response should contain error 'Customer Name' is required. (0ms)
Actual error message should be ''Customer Name' is required.' (0ms)
And the response status should be Bad Request (0ms)
Actual response status should be 'Bad Request' (0ms)
Diagrams
Details:lines
Outbox message should transition to failed after exhausting retries 2ms🔗
Steps
Given a pending outbox message with a failing dispatcher (1ms)
Then the outbox message should transition to failed after exhausting retries (1ms)
Sequence Diagrams
Details:lines
Previously created order should be retrievable by id 10ms🔗
Steps
Given a pancake batch has been created (1ms)
And an order has been created for the batch (1ms)
When the order is retrieved by id (3ms)
Then the retrieved order should match the created order (3ms)
Retrieval steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Retrieval steps response order id should be 'OrderId' (0ms)
Retrieval steps response customer name should be 'TestCustomer_5642525312311938140' (0ms)
Retrieval steps response items should have count 1 (0ms)
And the downstream services should have received requests (1ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
Details:lines
Requesting second page should return different orders 1ms🔗
Steps
Given multiple orders have been created (0ms)
When the second page is requested with page size 1 (0ms)
Then the response should be for page 2 (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)
List steps response page should be 2 (0ms)
Diagrams
(Warning: 40 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Retrieving a non existent order should return not found 1ms🔗
Steps
Given a non existent order id (0ms)
When the non existent order is retrieved (0ms)
Then the response should be not found (0ms)
Retrieval steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Updating status of non existent order should return not found 1ms🔗
Steps
Given a non existent order id (0ms)
When the order status is updated to preparing (0ms)
Then the response should indicate not found (0ms)
Patch steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Valid order should be created and an event published 8ms🔗
Steps
Given a pancake batch is created and order request is ready (0ms)
When the order is submitted (0ms)
Then the order should be created successfully (0ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response customer name should be 'TestCustomer_9182990709909217805' (0ms)
Order steps response items should have count 1 (0ms)
And an order created event should have been published (0ms)
And the kitchen service should have received a preparation request (7ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
Details:lines
Valid status transition should update the order 4/4 passed 4ms🔗
#Input ParametersStatusDuration
From StatusTo Status
1CreatedCancelledPassed0ms
2CreatedPreparingPassed2ms
3PreparingReadyPassed0ms
4ReadyCompletedPassed0ms
Steps
Given an order exists with status Created (0ms)
When the order status is updated to Cancelled (0ms)
Then the response should indicate status Cancelled (0ms)
Patch steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Patch steps response status should be 'Cancelled' (0ms)
Diagrams
Details:lines
Pancakes
Pancake request with invalid ingredient should return bad request 6/6 passed 10ms🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1EggsEggs is required'Eggs' is required.Bad RequestPassed0ms
2Eggsjavascript:void(0)XSS in eggsEggs contains potentially dangerous content.Bad RequestPassed0ms
3FlourFlour is required'Flour' is required.Bad RequestPassed7ms
4Flour<img onerror=x>XSS in flourFlour contains potentially dangerous content.Bad RequestPassed0ms
5MilkMilk is required'Milk' is required.Bad RequestPassed0ms
6Milk<script>alert</script>XSS in milkMilk contains potentially dangerous content.Bad RequestPassed0ms
Steps
Step A pancake request with invalid Eggs (0ms)
When the pancake validation request is sent (0ms)
Then the response should contain error 'Eggs' is required. (0ms)
Actual error message should be ''Eggs' is required.' (0ms)
And the response status should be Bad Request (0ms)
Actual response status should be 'Bad Request' (0ms)
Diagrams
Details:lines
Pancake request with more toppings than allowed should return bad request 8ms🔗
Steps
Given all ingredients are retrieved for pancakes (5ms)
And the request has more toppings than the configured limit (1ms)
When the pancakes are prepared (0ms)
Then the response should indicate too many toppings (0ms)
Pancake steps response message status code should be BadRequest (0ms)
Body should contain MaxToppingsExceeded (0ms)
Diagrams
Details:lines
Request with unsupported content type should return unsupported media type 3/3 passed 2ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed0ms
2text/htmlPassed0ms
3text/plainPassed1ms
Steps
Given a pancake request with an unsupported content type (0ms)
When the request is sent (0ms)
Then the response should indicate unsupported media type (0ms)
Response status code should be UnsupportedMediaType (0ms)
Diagrams
Details:lines
Valid pancake request with all ingredients should return a fresh batch 5ms🔗
Steps
Given all ingredients are retrieved for pancakes (1ms)
When the pancakes are prepared (0ms)
Then the response should contain a valid batch with all ingredients (2ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response ingredients should contain 'Some_Fresh_Milk' (0ms)
Pancake steps response ingredients should contain 'Some_Eggs' (0ms)
Pancake steps response ingredients should contain 'Some_Flour' (0ms)
And the cow service should have received a milk request (0ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
Details:lines
Recipe Reviews
Listing reviews by recipe should return matching reviews 5ms🔗
Steps
Given a review entry exists (0ms)
When the reviews are listed by recipe (1ms)
Then the 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 == '2e7eecd5-4faf-4ea4-84c1-5e15377a930d' ] (0ms)
Diagrams
Details:lines
Retrieving existing review by id should return the review 5ms🔗
Steps
Given a review entry exists (1ms)
When the review is retrieved by id (1ms)
Then the get response should contain the review (2ms)
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 '1e2ec267-2ea3-49d8-b843-7cfbffd20136' (0ms)
Get steps response recipe name should be 'Recipe-fd4ff76edf1246dc8842876110387c25' (0ms)
Diagrams
Details:lines
Retrieving non existent review should return not found 1ms🔗
Steps
When a non existent review is retrieved (0ms)
Then the get response should indicate not found (0ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Submitting a recipe review should return the created review 1ms🔗
Steps
Given a valid recipe review request is prepared (0ms)
When the review is submitted (0ms)
Then the response should contain the created review (1ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response recipe name should be 'Recipe-20c9a6633d154881b2ba547c13cafd96' (0ms)
Post steps response rating should be 5 (0ms)
Post steps response review id should not be null or empty (0ms)
Diagrams
Details:lines
Submitting review with invalid rating should return bad request 0ms🔗
Steps
Given a review request with an invalid rating is prepared (0ms)
When the review is submitted (0ms)
Then the post 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 3ms🔗
Steps
Given a review request with missing recipe name is prepared (0ms)
When the review is submitted (2ms)
Then the post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Reporting
Batch completions should contain data ingested via pubsub consumer 29ms🔗
Steps
Given a pancake batch has been created (1ms)
When the batch completions are queried via graphql (2ms)
Then the response should contain the batch completion record (25ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps batch completions should contain [ r => r.BatchId == 'd513bebd-21b1-4397-ac72-4edf66238312' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ] (0ms)
Diagrams
Details:lines
Equipment alerts should contain data ingested via event hub consumer 18ms🔗
Steps
Given a pancake batch has been created (1ms)
When the equipment alerts are queried via graphql (7ms)
Then the response should contain the equipment alert record (9ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps equipment alerts should contain [ a => a.BatchId == '1da28c2f-b218-4f08-be21-0ae45e39f7d0' && a.EquipmentName == "Griddle" && a.AlertType == "UsageCycleCompleted" ] (0ms)
Diagrams
Details:lines
Ingredient shipments should be recorded when delivered via eventgrid webhook 13ms🔗
Steps
Given an ingredient delivery event has been received via eventgrid webhook (7ms)
When the ingredient shipments are queried via graphql (1ms)
Then the response should contain the ingredient shipment (5ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps ingredient shipments should contain [ s => s.DeliveryId == '7c5dd04e-b5b3-4e7e-aa7d-e2825f411e93' && s.IngredientName == "Milk" && s.Quantity == 50.0m ] (0ms)
Diagrams
Details:lines
Ingredient usage should aggregate across multiple recipes 15ms🔗
Steps
Given multiple recipe logs have been ingested with overlapping ingredients (5ms)
When the ingredient usage is queried via graphql (1ms)
Then the ingredient usage should reflect aggregated counts (8ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps ingredient usage should contain [ i => i.Ingredient == "Milk" && i.Count >= 2 ] (0ms)
Graph ql steps ingredient usage should contain [ i => i.Ingredient == "Butter" && i.Count >= 1 ] (0ms)
Diagrams
Details:lines
Order summaries should contain ingested order data 18ms🔗
Steps
Given a pancake batch has been created (1ms)
And a breakfast order has been placed for the batch (3ms)
When the order summaries are queried via graphql (2ms)
Then the response should contain the ingested order summary (11ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps order summaries should contain [ o => o.OrderId == '4c33b5e5-bf6e-4745-ab8c-e2448ef1b20a' && o.CustomerName == 'TestCustomer_4890923460759038448' && o.ItemCount == 1 && o.TableNumber == 7 ] (0ms)
Diagrams
Details:lines
Order summaries should return an empty list when no orders exist 2ms🔗
Steps
When the order summaries are queried via graphql (0ms)
Then the response should not contain the test order (2ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps order summaries should not contain [ o => o.OrderId == '00000000-0000-0000-0000-000000000000' ] (0ms)
Diagrams
Details:lines
Recipe reports should contain ingested recipe data 11ms🔗
Steps
Given a pancake batch has been created (1ms)
When the recipe reports are queried via graphql (2ms)
Then the response should contain the ingested recipe reports (7ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps recipe reports should contain [ r => r.OrderId == '88176367-bc5a-43d0-a957-e34c4a2506a5' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ] (0ms)
Diagrams
Details:lines
Reservations
Cancelling a reservation should return the cancelled reservation 3ms🔗
Steps
Given a reservation exists (0ms)
When the reservation is cancelled (1ms)
Then the cancellation response should indicate cancelled (1ms)
Cancel steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Cancel steps response status should be "Cancelled" (0ms)
Diagrams
Details:lines
Cancelling an already cancelled reservation should return a conflict response 1ms🔗
Steps
Given a cancelled reservation exists (1ms)
When the reservation is cancelled (0ms)
Then the cancellation response should indicate conflict (0ms)
Cancel steps response message status code should be Conflict (0ms)
Diagrams
Details:lines
Creating a reservation should return the confirmed reservation 9ms🔗
Steps
Given a valid reservation request is prepared (1ms)
When the reservation is submitted (2ms)
Then the response should contain the confirmed booking (5ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response status should be "Confirmed" (0ms)
Post steps response customer name should be 'CustomerName' (0ms)
Diagrams
Details:lines
Deleting a reservation should return no content 1ms🔗
Steps
Given a reservation exists (0ms)
When the reservation is deleted (0ms)
Then the 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 4ms🔗
Steps
Given a reservation exists (1ms)
When the reservation is retrieved by id (1ms)
Then the get response should contain the reservation (1ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response id should be '2' (0ms)
Get steps response customer name should be 'CustomerName' (0ms)
Get steps response status should be "Confirmed" (0ms)
Diagrams
Details:lines
Specifications
The AsyncApi endpoint should return a valid specification 4ms🔗
Steps
When the asyncapi endpoint is called (1ms)
Then the response status should be ok (0ms)
Async api response status code should be OK (0ms)
And the response should be valid json (0ms)
Async api response is valid json should be true $"response body (first 500 chars): {_asyncApiJsonString?[..Math.Min(_asyncApiJsonString.Length, 500)]}" (0ms)
And the asyncapi spec should contain expected top level properties (0ms)
Async api json root element get property("asyncapi") should not be null (0ms)
Async api json root element get property("info") should not be null (0ms)
Async api json root element get property("default content type") should not be null (0ms)
Async api json root element get property("channels") should not be null (0ms)
Async api json root element get property("operations") should not be null (0ms)
Async api json root element get property("components") should not be null (0ms)
And the asyncapi spec is written to disk as json (2ms)
Diagrams
Details:lines
The OpenApi endpoint should return a valid specification 8ms🔗
Steps
When the open api endpoint is called (0ms)
Then the response status should be ok (0ms)
Swagger response status code should be OK (0ms)
And the response should be valid json (1ms)
Open api response is valid json should be true (0ms)
And the response should contain all the endpoints (5ms)
Swagger json root element get property("paths") get property( endpoints swagger pancakes path) should not be null (0ms)
Swagger json root element get property("paths") get property( endpoints swagger waffles path) should not be null (0ms)
Swagger json root element get property("paths") get property( endpoints swagger orders path) should not be null (0ms)
Swagger json root element get property("paths") get property( endpoints swagger order by id path) should not be null (0ms)
Swagger json root element get property("paths") get property( endpoints swagger toppings path) should not be null (0ms)
Swagger json root element get property("paths") get property( endpoints swagger menu path) should not be null (0ms)
Swagger json root element get property("paths") get property( endpoints swagger milk path) should not be null (0ms)
Swagger json root element get property("paths") get property( endpoints swagger eggs path) should not be null (0ms)
Swagger json root element get property("paths") get property( endpoints swagger flour path) should not be null (0ms)
Swagger json root element get property("paths") get property( endpoints swagger goat milk path) should not be null (0ms)
Swagger json root element get property("paths") get property( endpoints swagger audit logs path) should not be null (0ms)
And the openapi spec is written to disk as json (1ms)
Diagrams
Details:lines
The Scalar UI endpoint should return a valid page 4ms🔗
Steps
When the scalar ui endpoint is called (0ms)
Then the response status should be ok (2ms)
Scalar response status code should be OK (0ms)
And the response should be valid html (0ms)
Scalar ui response body should contain "<html" (0ms)
And the response should refer to scalar (0ms)
Scalar ui response body should contain "scalar" (0ms)
Diagrams
Details:lines
Staff
Adding a new staff member should return the created member 5ms🔗
Steps
Given a valid staff member request is prepared (0ms)
When the staff member is submitted (0ms)
Then the response should contain the created member (4ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response name should be 'Name' (0ms)
Post steps response role should be "Chef" (0ms)
Diagrams
Details:lines
Adding a staff member with an invalid role should return a bad request response 8ms🔗
Steps
Given a staff member request with an invalid role is prepared (0ms)
When the staff member is submitted (6ms)
Then the post 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 1ms🔗
Steps
Given a staff member exists (0ms)
When the staff member is deleted (0ms)
Then the 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 4ms🔗
Steps
Given a staff member exists (0ms)
When the staff member is retrieved by id (1ms)
Then the get response should contain the member (2ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response id should be '2' (0ms)
Get steps response name should be 'Name' (0ms)
Get steps response role should be "Chef" (0ms)
Diagrams
Details:lines
Toppings
Adding a new topping should return the created topping 38ms🔗
Steps
Given a valid topping request (0ms)
When the new topping is submitted (2ms)
Then the topping response should contain the created topping (35ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response name should be Strawberries (0ms)
Post steps response category should be FruitCategory (0ms)
Diagrams
Details:lines
Deleting a non existent topping should return not found 0ms🔗
Steps
Given a topping id that does not exist (0ms)
When the topping is deleted (0ms)
Then the delete response should indicate not found (0ms)
Delete steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Deleting an existing topping should return no content 2ms🔗
Steps
Given a known topping exists (0ms)
When the topping is deleted (1ms)
Then the delete response should indicate success (0ms)
Delete steps response message status code should be NoContent (0ms)
Diagrams
Details:lines
Topping request with invalid or dangerous input should return bad request 6/6 passed 13ms🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1CategoryCategory is required'Category' is required.Bad RequestPassed5ms
2Category<script>alert('xss')</script>Script tag in categoryCategory contains potentially dangerous content.Bad RequestPassed0ms
3Categoryjavascript:alert(1)Javascript protocolCategory contains potentially dangerous content.Bad RequestPassed0ms
4NameName is required'Name' is required.Bad RequestPassed0ms
5Name<img src=x onerror=alert(1)>Event handler in nameName contains potentially dangerous content.Bad RequestPassed1ms
6Name<script>alert('xss')</script>Script tag in nameName contains potentially dangerous content.Bad RequestPassed6ms
Steps
Step A topping request with invalid Category (0ms)
When the topping request is sent (5ms)
Then the response should contain error 'Category' is required. (0ms)
Actual error message should be ''Category' is required.' (0ms)
And the response status should be Bad Request (0ms)
Actual response status should be 'Bad Request' (0ms)
Diagrams
Details:lines
Toppings endpoint should return all available toppings 8ms🔗
Steps
When the available toppings are requested (0ms)
Then the toppings response should contain the default toppings (7ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response should have count ExpectedToppingCount (0ms)
Get steps response should contain [ t => t.Name == ToppingDefaults.Raspberries ] (0ms)
Get steps response should contain [ t => t.Name == ToppingDefaults.Blueberries ] (0ms)
Get steps response should contain [ t => t.Name == ToppingDefaults.MapleSyrup ] (0ms)
Get steps response should contain [ t => t.Name == ToppingDefaults.WhippedCream ] (0ms)
Get steps response should contain [ t => t.Name == ToppingDefaults.ChocolateChips ] (0ms)
Diagrams
Details:lines
Toppings should exclude raspberries when feature flag is disabled 335ms🔗
Steps
Given the raspberry topping feature flag is disabled (312ms)
When toppings are requested (1ms)
Then the toppings response should not include raspberries (21ms)
Toppings steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Toppings steps response should not contain [ t => t.Name == ToppingDefaults.Raspberries ] (0ms)
Diagrams
Details:lines
Toppings should include raspberries when feature flag is enabled 227ms🔗
Steps
Given the raspberry topping feature flag is enabled (225ms)
When toppings are requested (0ms)
Then the toppings response should include raspberries (2ms)
Toppings steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Toppings steps response should contain [ t => t.Name == ToppingDefaults.Raspberries ] (0ms)
Diagrams
Details:lines
Update topping with invalid or dangerous input should return bad request 6/6 passed 33ms🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1CategoryCategory is required'Category' is required.Bad RequestPassed24ms
2Category<script>alert('xss')</script>Script tag in categoryCategory contains potentially dangerous content.Bad RequestPassed0ms
3Categoryjavascript:alert(1)Javascript protocolCategory contains potentially dangerous content.Bad RequestPassed1ms
4NameName is required'Name' is required.Bad RequestPassed1ms
5Name<img src=x onerror=alert(1)>Event handler in nameName contains potentially dangerous content.Bad RequestPassed0ms
6Name<script>alert('xss')</script>Script tag in nameName contains potentially dangerous content.Bad RequestPassed5ms
Steps
Step An update topping request with invalid Category (0ms)
When the update topping request is sent (17ms)
Then the response should contain error 'Category' is required. (3ms)
Actual error message should be ''Category' is required.' (0ms)
And the response status should be Bad Request (3ms)
Actual response status should be 'Bad Request' (0ms)
Diagrams
Details:lines
Updating a non existent topping should return not found 6ms🔗
Steps
Given a topping id that does not exist and a valid update request (0ms)
When the topping is updated (5ms)
Then the update response should indicate not found (0ms)
Put steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Updating an existing topping should return the updated topping 7ms🔗
Steps
Given a known topping exists and a valid update request (0ms)
When the topping is updated (0ms)
Then the update response should contain the updated topping (7ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Put steps response topping id should be KnownBlueberryToppingId (0ms)
Put steps response name should be Strawberries (0ms)
Put steps response category should be FruitCategory (0ms)
Diagrams
Details:lines
Waffles
Sending request with unsupported content type should return unsupported media type 3/3 passed 7ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed0ms
2text/htmlPassed0ms
3text/plainPassed6ms
Steps
Given a waffle request with an unsupported content type (0ms)
When the request is sent (0ms)
Then the response should indicate unsupported media type (0ms)
Response status code should be UnsupportedMediaType (0ms)
Diagrams
Details:lines
Valid waffle request with all ingredients should return a fresh batch 12ms🔗
Steps
Given all ingredients are retrieved for waffles (1ms)
When the waffles are prepared (1ms)
Then the response should contain a valid batch with all ingredients (9ms)
Waffle steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Waffle steps response ingredients should contain 'Some_Fresh_Milk' (0ms)
Waffle steps response ingredients should contain 'Some_Eggs' (0ms)
Waffle steps response ingredients should contain 'Some_Flour' (0ms)
Waffle steps response ingredients should contain UnsaltedButter (0ms)
And the cow service should have received a milk request (0ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
Details:lines
Waffle request with invalid ingredient should return bad request 6/6 passed 7ms🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1ButterButter is required'Butter' is required.Bad RequestPassed0ms
2Butter<img onerror=x>XSS in butterButter contains potentially dangerous content.Bad RequestPassed0ms
3EggsEggs is required'Eggs' is required.Bad RequestPassed0ms
4FlourFlour is required'Flour' is required.Bad RequestPassed0ms
5MilkMilk is required'Milk' is required.Bad RequestPassed5ms
6Milk<script>alert</script>XSS in milkMilk contains potentially dangerous content.Bad RequestPassed0ms
Steps
Step A waffle request with invalid Butter (0ms)
When the waffle validation request is sent (0ms)
Then the response should contain error 'Butter' is required. (0ms)
Actual error message should be ''Butter' is required.' (0ms)
And the response status should be Bad Request (0ms)
Actual response status should be 'Bad Request' (0ms)
Diagrams
Details:lines
Waffle request with more toppings than allowed should return bad request 24ms🔗
Steps
Given all ingredients are retrieved for waffles (0ms)
And the request has more toppings than the configured limit (2ms)
When the waffles are prepared (0ms)
Then the response should indicate too many toppings (22ms)
Waffle steps response message status code should be BadRequest (0ms)
Body should contain MaxToppingsExceeded (0ms)
Diagrams
Details:lines