Breakfast Provider (BDDfy) Test Run Report

Passed: 212 (100%)100%

Test Execution Summary

Passed2026-10-26 ยท 08:16:27โ€“08:16:40 UTC
Scenarios
212
Passed
212
Failed
0
Skipped
0
Features
27
Duration
12s

CI

GitHub Actions
Build
#342
Branch
main
Commit
cf47045
Repository
lemonlion/BreakfastProvider

Filtering

All 212 scenarios, 27 features
Status
Duration โ‰ฅ
Dependencies
Payloads
Apple Cinnamon Muffins
Different muffin recipes should produce the expected batch 3/3 passed 20ms🔗
#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
Passed18ms
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
Passed0ms
Steps
✓Given all ingredients are retrieved for the muffin recipe (11ms)
✓When the muffins are prepared (0ms)
✓Then the response should match the expected batch (6ms)
✓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
This scenario:Payloads
Muffin request with invalid field should return bad request 6/6 passed 124ms ยท 113ms warm-up🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1ApplesApples is required'Apples' is required.Bad RequestPassed1ms
2CinnamonCinnamon is required'Cinnamon' is required.Bad RequestPassed0ms
3Cinnamon<script>alert('xss')</script>XSS in cinnamonCinnamon contains potentially dangerous content.Bad RequestPassed5ms
4EggsEggs is required'Eggs' is required.Bad RequestPassed1ms
5FlourFlour is required'Flour' is required.Bad RequestPassed1ms
6MilkMilk is required'Milk' is required.Bad RequestPassed113ms
Steps
✓Step A muffin request with invalid Apples (0ms)
✓When the muffin validation request is sent (1ms)
✓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
This scenario:Payloads
Valid apple cinnamon muffin request should return a fresh batch 62ms🔗
Steps
✓Given all ingredients are retrieved for apple cinnamon muffins (6ms)
✓When the muffins are prepared (5ms)
✓Then the response should contain a valid batch with all ingredients (42ms)
✓And the cow service should have received a milk request (8ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
This scenario:Payloads
Audit Logs
Audit logs should be filterable by entity id 15ms🔗
Steps
✓Given an order has been created to generate an audit log (0ms)
✓When audit logs are requested filtered by entity id (3ms)
✓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 (11ms)
✓Audit logs should contain [ l => l.EntityId == 'bb22386f-dce3-4fed-ae69-a38e7bf56d6b' ] (0ms)
Diagrams
This scenario:Payloads
Audit logs should be filterable by entity type 2ms🔗
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 (1ms)
✓Audit logs should only contain [ l => l.EntityType == AuditLogDefaults.OrderEntityType ] (0ms)
Diagrams
This scenario:Payloads
Audit logs should be returned in descending timestamp order 29ms🔗
Steps
✓Given an order has been created to generate an audit log (9ms)
✓When audit logs are requested filtered by entity type (4ms)
✓Then the audit logs should be ordered by timestamp descending (16ms)
✓Audit logs should not be null or empty (0ms)
✓Audit logs should be in descending order [ l => l.Timestamp ] (0ms)
Diagrams
This scenario:Payloads
Creating an order should produce a retrievable audit log entry 55ms🔗
Steps
✓Given a pancake batch has been created (8ms)
✓And an order has been created for the batch (5ms)
✓When the audit logs are retrieved (12ms)
✓Then the audit log response should contain the order creation entry (13ms)
✓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_8630699151791899752') ] (0ms)
✓And the downstream services should have received requests (14ms)
✓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
This scenario:Payloads
Filtering audit logs by a non existent entity type should return an empty collection 6ms🔗
Steps
✓When audit logs are requested filtered by a non existent entity type (3ms)
✓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 (2ms)
✓Audit logs should be empty (0ms)
Diagrams
This scenario:Payloads
Chef Notes
Creating a chef note should return the created note 5ms🔗
Steps
✓Given a valid chef note request is prepared (0ms)
✓When the note is submitted (0ms)
✓Then the response should contain the created note (5ms)
✓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-374582a000b84b578335d02495a0a5da' (0ms)
✓Post steps response note text should be "Remember to fold the batter gently to keep it fluffy." (0ms)
✓Post steps response category should be "Technique" (0ms)
✓Post steps response note id should not be null or empty (0ms)
Diagrams
This scenario:Payloads
Creating a note with missing note text should return bad request 3ms🔗
Steps
✓Given a note request with missing note text is prepared (1ms)
✓When the note is submitted (0ms)
✓Then the note response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Creating a note with missing recipe name should return bad request 2ms🔗
Steps
✓Given a note request with missing recipe name is prepared (2ms)
✓When the note is submitted (0ms)
✓Then the note response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Listing notes by recipe should return matching notes 29ms ยท 29ms warm-up🔗
Steps
✓Given a chef note exists (15ms)
✓When the notes are listed by recipe (4ms)
✓Then the list response should contain the note (9ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps list response should contain [ n => n.NoteId == '11cca3af-3f5e-4984-8ff2-37a22823c5a8' ] (0ms)
Diagrams
This scenario:Payloads
Retrieving a non existent note should return not found 2ms🔗
Steps
✓When a non existent note is retrieved (1ms)
✓Then the get response should indicate not found (0ms)
✓Get steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Retrieving an existing note by id should return the note 11ms🔗
Steps
✓Given a chef note exists (0ms)
✓When the note is retrieved by id (4ms)
✓Then the get response should contain the note (7ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps response note id should be 'ce1cc661-1d39-4715-9ce1-967908b465d9' (0ms)
✓Get steps response recipe name should be 'Recipe-b733f2294e1e4519817ab5980c604707' (0ms)
Diagrams
This scenario:Payloads
Updating a non existent note should return not found 5ms🔗
Steps
✓When a non existent note is updated (1ms)
✓Then the update response should indicate not found (3ms)
✓Patch steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Updating an existing note should return the updated note 21ms ยท 21ms warm-up🔗
Steps
✓Given a chef note exists (0ms)
✓When the note is updated (7ms)
✓Then the update response should contain the modified note (13ms)
✓Patch steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Patch steps response note id should be 'b2c81541-cdf5-4831-8ff8-93091623300f' (0ms)
✓Patch steps response note text should be "Updated: Use unsalted butter for better flavour control." (0ms)
✓Patch steps response category should be "Ingredients" (0ms)
✓Patch steps response updated at should not be null (0ms)
Diagrams
This scenario:Payloads
Customer Feedback
Consuming customer feedback event should trigger downstream processing 62ms🔗
Steps
✓Given a customer feedback received event (9ms)
✓When the event is published to pubsub (44ms)
✓Then the feedback id should be generated (3ms)
✓Publish steps feedback id should not be '00000000-0000-0000-0000-000000000000' (0ms)
✓And the supplier service should have received the feedback (4ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/ingredients/feedback" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
This scenario:Payloads
Customer Preferences
Retrieving existing customer preferences should return the preferences 28ms ยท 28ms warm-up🔗
Steps
✓Given customer preferences exist (0ms)
✓When the customer preferences are retrieved (8ms)
✓Then the response should contain the preferences (19ms)
✓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 'c5ba151968404b2cbb449a9f1636aa9c' (0ms)
✓Get steps response preferred milk type should be "Oat" (0ms)
✓Get steps response likes extra toppings should be true (0ms)
Diagrams
This scenario:Payloads
Retrieving non existent customer preferences should return not found 2ms🔗
Steps
✓When non existent customer preferences are retrieved (1ms)
✓Then the get response should indicate not found (1ms)
✓Get steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Saving customer preferences should return the saved preferences 34ms ยท 34ms warm-up🔗
Steps
✓Given a valid customer preference request is prepared (16ms)
✓When the customer preferences are saved (8ms)
✓Then the response should contain the saved preferences (9ms)
✓Put steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Put steps response preferred milk type should be "Oat" (0ms)
✓Put steps response favourite item should be "Blueberry Pancakes" (0ms)
Diagrams
This scenario:Payloads
Saving customer preferences with missing customer name should return bad request 6ms🔗
Steps
✓Given a customer preference request with missing customer name is prepared (2ms)
✓When the customer preferences are saved (0ms)
✓Then the put response should indicate bad request (3ms)
✓Put steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Updating customer preferences should return the updated preferences 11ms🔗
Steps
✓Given customer preferences exist (4ms)
✓When the customer preferences are updated (2ms)
✓Then the response should contain the updated values (4ms)
✓Put steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Put steps response preferred milk type should be "Almond" (0ms)
✓Put steps response favourite item should be "Belgian Waffles" (0ms)
Diagrams
This scenario:Payloads
Daily Specials
Daily special order with invalid field should return bad request 2/2 passed 15ms🔗
#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 RequestPassed14ms
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
This scenario:Payloads
Daily specials endpoint should return all available specials 3ms🔗
Steps
✓When the available daily specials are requested (0ms)
✓Then the daily specials response should contain all expected specials (3ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps response should have count ExpectedSpecialsCount (0ms)
Diagrams
This scenario:Payloads
Ordering daily special beyond threshold should return conflict 9ms🔗
Steps
✓Given the matcha waffles order count is reset (2ms)
✓And the matcha waffles special has been ordered up to the configured limit (2ms)
✓When another order is placed for the matcha waffles special (2ms)
✓Then the response should indicate the daily special is sold out (0ms)
✓Post steps response message status code should be Conflict (0ms)
Diagrams
This scenario:Payloads
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
This scenario:Payloads
Remaining quantity should decrease after each order 46ms🔗
Steps
✓Given the lemon ricotta order count is reset (4ms)
✓And a daily special order for lemon ricotta of quantity one is placed (5ms)
✓When the available daily specials are requested (8ms)
✓Then the lemon ricotta special should have one fewer remaining (28ms)
✓Response content is valid json should be true (0ms)
✓Lemon ricotta remaining quantity should be '9' (0ms)
Diagrams
This scenario:Payloads
Same order with different idempotency keys should return different confirmations 17ms🔗
Steps
✓Given the cinnamon swirl order count is reset (7ms)
✓And an order request for the same special (0ms)
✓When the order is submitted with two different idempotency keys (8ms)
✓Then the responses should have different confirmation ids (1ms)
✓First confirmation id should not be '66c74335-cc84-48aa-b2dc-996061b71dbc' (0ms)
Diagrams
This scenario:Payloads
Same order with same idempotency key should return same confirmation 11ms🔗
Steps
✓Given the cinnamon swirl order count is reset (0ms)
✓And an order request with an idempotency key (4ms)
✓When the order is submitted twice with the same idempotency key (5ms)
✓Then both responses should return the same confirmation id (1ms)
✓First confirmation id should be '54821a04-8942-4909-9746-e9c6a6287fa7' (0ms)
Diagrams
This scenario:Payloads
Valid daily special order should return a confirmation 9ms🔗
Steps
✓Given the cinnamon swirl order count is reset (1ms)
✓And a valid daily special order request for cinnamon swirl (1ms)
✓When the daily special order is submitted (1ms)
✓Then the daily special order response should contain a valid confirmation (4ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Post steps response special id should be 'aaaa0000-0000-0000-0000-000000000001' (0ms)
✓Post steps response order confirmation id should not be empty (0ms)
Diagrams
This scenario:Payloads
Equipment Readings
Deleting a reading should remove it from the list 15ms🔗
Steps
✓Given an equipment reading record has been created (3ms)
✓When the reading is deleted (6ms)
✓Then the delete response should indicate no content (0ms)
✓Delete steps response message status code should be NoContent (0ms)
✓And the reading should no longer be listed (5ms)
Diagrams
This scenario:Payloads
Listing readings by equipment should return matching records 22ms🔗
Steps
✓Given an equipment reading record has been created (6ms)
✓When the readings are listed by equipment (4ms)
✓Then the reading list response should contain the record (11ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps list response should contain [ r => r.ReadingId == '71ae1151-7590-4b1f-8a7c-98accbe77d20' ] (0ms)
Diagrams
This scenario:Payloads
Recording a reading with missing metric should return bad request 2ms🔗
Steps
✓Given an equipment reading request with a missing metric is prepared (1ms)
✓When the equipment reading is recorded (0ms)
✓Then the reading post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recording a reading with zero value should return bad request 10ms🔗
Steps
✓Given an equipment reading request with zero value is prepared (2ms)
✓When the equipment reading is recorded (7ms)
✓Then the reading post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recording an equipment reading should return the created record 11ms🔗
Steps
✓Given a valid equipment reading request is prepared (0ms)
✓When the equipment reading is recorded (0ms)
✓Then the reading response should contain the created record (10ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Post steps response equipment id should be 'Oven-4959d0028df84626bfcfee57e03afc7b' (0ms)
✓Post steps response value should be 180.5m (0ms)
✓Post steps response reading id should not be null or empty (0ms)
Diagrams
This scenario:Payloads
Feedback
Listing feedback for an order should return the feedback 28ms🔗
Steps
✓Given a feedback entry exists (5ms)
✓When the feedback is retrieved by order id (4ms)
✓Then the list response should contain the feedback (18ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps list response should contain [ f => f.FeedbackId == '8febd24e-1d75-4f1c-b222-259584f5a354' ] (0ms)
Diagrams
This scenario:Payloads
Retrieving existing feedback by id should return the feedback 15ms🔗
Steps
✓Given a feedback entry exists (0ms)
✓When the feedback is retrieved by id (3ms)
✓Then the get response should contain the feedback (10ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps response feedback id should be '78df9812-eec7-4db0-ba88-d71c14c1e641' (0ms)
✓Get steps response customer name should be 'Customer-13873acfd2de4a648e69044a5af8c038' (0ms)
✓Get steps response rating should be 4 (0ms)
Diagrams
This scenario:Payloads
Retrieving non existent feedback should return not found 6ms🔗
Steps
✓When a non existent feedback is retrieved (3ms)
✓Then the get response should indicate not found (3ms)
✓Get steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Submitting feedback should return the created feedback 39ms🔗
Steps
✓Given a valid feedback request is prepared (4ms)
✓When the feedback is submitted (0ms)
✓Then the response should contain the created feedback (35ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Post steps response customer name should be 'Customer-d115172081ce4c559b21500c3eb54b9e' (0ms)
✓Post steps response rating should be 4 (0ms)
Diagrams
This scenario:Payloads
Submitting feedback with invalid rating should return bad request 15ms🔗
Steps
✓Given a feedback request with an invalid rating is prepared (2ms)
✓When the feedback is submitted (12ms)
✓Then the post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Submitting feedback with missing customer name should return bad request 3ms🔗
Steps
✓Given a feedback request with missing customer name is prepared (3ms)
✓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
This scenario:Payloads
Grpc
Order status for non existent order should return not found 12ms🔗
Steps
✓When the order status for a non existent order is requested via grpc (10ms)
✓Then the grpc response should be a not found error (1ms)
✓Grpc steps rpc exception should not be null (0ms)
✓Grpc steps rpc exception status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Order status via grpc should return order details 19ms🔗
Steps
✓Given a pancake batch and order have been created (11ms)
✓When the order status is requested via grpc (5ms)
✓Then the grpc response should contain the order details (2ms)
✓Grpc steps order status reply order id should be 'd41a4ed3-cf4c-4252-a2ef-72ebf16b9a84' (0ms)
✓Grpc steps order status reply customer name should be 'TestCustomer_132186564919691309' (0ms)
✓Grpc steps order status reply status should be Created (0ms)
Diagrams
This scenario:Payloads
Pancake recipe summary should return correct data 200ms ยท 57ms warm-up🔗
Steps
✓When a recipe summary is requested for pancakes (18ms)
✓Then the recipe summary should contain pancake data (182ms)
✓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
This scenario:Payloads
Streaming order updates should return the current status 17ms🔗
Steps
✓Given a pancake batch and order have been created (11ms)
✓When order updates are streamed via grpc (1ms)
✓Then the streamed response should contain the order status (3ms)
✓Grpc steps streamed replies should have count 1 (0ms)
✓Grpc steps streamed replies[0] order id should be '5a3975b8-1405-40c9-b2a2-3098b34fad29' (0ms)
✓Grpc steps streamed replies[0] customer name should be 'TestCustomer_145484849319810171' (0ms)
✓Grpc steps streamed replies[0] status should be Created (0ms)
Diagrams
This scenario:Payloads
Streaming updates for non existent order should return not found 40ms ยท 40ms warm-up🔗
Steps
✓When order updates for a non existent order are streamed via grpc (29ms)
✓Then the grpc stream should return a not found error (10ms)
✓Grpc steps rpc exception should not be null (0ms)
✓Grpc steps rpc exception status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Unknown recipe type should return zero batches 4ms🔗
Steps
✓When a recipe summary is requested for an unknown type (2ms)
✓Then the recipe summary should contain zero batches and no ingredients (2ms)
✓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
This scenario:Payloads
Waffle recipe summary should return correct data 12ms🔗
Steps
✓When a recipe summary is requested for waffles (6ms)
✓Then the recipe summary should contain waffle data (6ms)
✓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
This scenario:Payloads
Infrastructure
Creating an order should emit a structured log entry 193ms🔗
Steps
✓Given the application is configured with in memory log capture (157ms)
✓And a pancake batch has been created (5ms)
✓When the order is submitted (21ms)
✓Then a structured log entry should have been captured for order creation (8ms)
✓Log provider entries should contain [ e => e.Message.Contains("created for customer") ] (0ms)
✓Log provider entries should contain [ e => e.Message.Contains('TelemetryTest_2500647874608511499') ] (0ms)
✓Log provider entries should contain [ e => e.Message.Contains("1 items") ] (0ms)
Diagrams
This scenario:Payloads
Health check endpoint should return healthy status with all dependency details 16ms🔗
Steps
✓When the health check endpoint is called (7ms)
✓Then the response should indicate healthy (1ms)
✓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 (7ms)
✓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
This scenario:Payloads
Health check response should include description and data for each entry 22ms🔗
Steps
✓When the health check endpoint is called (9ms)
✓Then each entry should have a status (2ms)
✓And each downstream entry should have a description (3ms)
✓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 (6ms)
Diagrams
This scenario:Payloads
Health check should report degraded when cow service is unavailable 234ms🔗
Steps
✓Given the cow service is configured to be unreachable (221ms)
✓When the health check endpoint is called (2ms)
✓Then the response should indicate degraded status (2ms)
✓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 (7ms)
✓Result results should contain key CowService (0ms)
✓Result results[ health check names cow service] status should be Degraded (0ms)
Diagrams
This scenario:Payloads
Health check should report degraded when downstream service returns non success status 172ms🔗
Steps
✓Given the kitchen service health check is configured to use a failing endpoint (163ms)
✓When the health check endpoint is called (3ms)
✓Then the response should indicate degraded status (1ms)
✓Result should not be null (0ms)
✓Result status should be Degraded (0ms)
✓And the kitchen service should report degraded with status code description (4ms)
✓Result results should contain key KitchenService (0ms)
✓Kitchen entry status should be Degraded (0ms)
✓Kitchen entry description should contain "503" (0ms)
Diagrams
This scenario:Payloads
Health check should report degraded when multiple downstream services are unavailable 98ms🔗
Steps
✓Given the cow service and supplier service are configured to be unreachable (96ms)
✓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 (1ms)
✓Result results should contain key SupplierService (0ms)
✓Result results[ health check names supplier service] status should be Degraded (0ms)
Diagrams
This scenario:Payloads
Heartbeat endpoint should return a running message 22ms🔗
Steps
✓When the heartbeat endpoint is called (20ms)
✓Then the response should indicate the service is running (1ms)
✓Response status code should be OK (0ms)
✓Result should not be null (0ms)
✓Result status should be HeartbeatStatus (0ms)
Diagrams
This scenario:Payloads
Request with correlation id should forward it to cow service 9ms🔗
Steps
✓Given a request with a known correlation id (0ms)
✓When milk is requested from the milk endpoint (8ms)
✓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 'b934d861-feef-4df2-ae06-81b31654f0f2' (0ms)
Diagrams
This scenario:Payloads
Request with correlation id should forward it to supplier service 11ms🔗
Steps
✓Given a request with a known correlation id (0ms)
✓And the menu cache is cleared (3ms)
✓When the menu is requested (2ms)
✓Then the supplier 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 'd2b49dcf-e092-4e6f-8c13-d82548e875a6' (0ms)
Diagrams
This scenario:Payloads
Request with correlation id should return same id in response 11ms🔗
Steps
✓Given a request with a known correlation id (4ms)
✓When the request is sent to the menu endpoint (2ms)
✓Then the response should contain the same correlation id (4ms)
✓Response contains correlation id header should be true (0ms)
✓First value of values should be '18286173-f7a4-4dc6-aa9c-7ba381c6a909' (0ms)
Diagrams
This scenario:Payloads
Request without correlation id should have one generated in response 6ms🔗
Steps
✓When a request without a correlation id is sent to the menu endpoint (2ms)
✓Then the response should contain a generated correlation id (4ms)
✓Response contains correlation id header should be true (0ms)
✓First value of values should not be null or empty (0ms)
Diagrams
This scenario:Payloads
Ingredients
Goat milk endpoint should return fresh goat milk from goat service 11ms🔗
Steps
✓When goat milk is requested (1ms)
✓Then the response should contain fresh goat milk (2ms)
✓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 (7ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/goat-milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
This scenario:Payloads
Goat milk endpoint should return fresh goat milk when feature is enabled 160ms🔗
Steps
✓Given the goat milk feature flag is enabled (125ms)
✓When goat milk is requested (33ms)
✓Then the response should contain fresh goat milk (1ms)
✓Goat milk steps response message status code should be OK (0ms)
✓Goat milk steps goat milk response goat milk should be FreshGoatMilk (0ms)
Diagrams
This scenario:Payloads
Goat milk endpoint should return not found when feature is disabled 173ms🔗
Steps
✓Given the goat milk feature flag is disabled (169ms)
✓When goat milk is requested (0ms)
✓Then the response should indicate feature disabled (4ms)
✓Goat milk steps response message status code should be NotFound (0ms)
✓Body should contain FeatureDisabled (0ms)
Diagrams
This scenario:Payloads
Requesting goat milk when goat service returns invalid response should return bad gateway 4ms🔗
Steps
✓Given the goat service will return an invalid response (3ms)
✓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
This scenario:Payloads
Requesting goat milk when goat service unavailable should return bad gateway 14ms🔗
Steps
✓Given the goat service will return service unavailable (7ms)
✓When goat milk is requested (1ms)
✓Then the goat milk response should indicate a bad gateway (5ms)
✓Goat milk steps response message status code should be BadGateway (0ms)
✓Body should contain GoatServiceUnavailableTitle (0ms)
Diagrams
This scenario:Payloads
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
This scenario:Payloads
Requesting milk when cow service times out should return bad gateway 4ms🔗
Steps
✓Given the cow service will return a timeout (4ms)
✓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
This scenario:Payloads
Requesting milk when cow service unavailable should return bad gateway 8ms🔗
Steps
✓Given the cow service will return service unavailable (0ms)
✓When milk is requested (3ms)
✓Then the milk response should indicate a bad gateway with unavailable message (4ms)
✓Milk steps response message status code should be BadGateway (0ms)
✓Milk error response body should contain CowServiceUnavailableTitle (0ms)
Diagrams
This scenario:Payloads
Ingredient Usage
Getting usage summary should return aggregated data 29ms🔗
Steps
✓Given an ingredient usage record exists (0ms)
✓When the summary is requested (5ms)
✓Then the summary should contain aggregated data (23ms)
✓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-6a5b8ca2033f495f8cff7b4311b4ad93' ] (0ms)
Diagrams
This scenario:Payloads
Listing usage by ingredient should return matching records 48ms ยท 48ms warm-up🔗
Steps
✓Given an ingredient usage record exists (31ms)
✓When the usage is listed by ingredient (5ms)
✓Then the list response should contain the record (11ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps list response should contain [ u => u.IngredientName == 'Flour-6346719d16bc458bac68dfc84c662853' ] (0ms)
Diagrams
This scenario:Payloads
Recording ingredient usage should return the created record 5ms🔗
Steps
✓Given a valid ingredient usage request is prepared (0ms)
✓When the usage is recorded (0ms)
✓Then the response should contain the created record (5ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Post steps response ingredient name should be 'Flour-5fa5464c939b45c98789fcdbefba5661' (0ms)
✓Post steps response quantity used should be 2.5m (0ms)
✓Post steps response usage id should not be null or empty (0ms)
Diagrams
This scenario:Payloads
Recording usage with missing ingredient name should return bad request 4ms🔗
Steps
✓Given a usage request with missing ingredient name is prepared (4ms)
✓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
This scenario:Payloads
Recording usage with zero quantity should return bad request 3ms🔗
Steps
✓Given a usage request with zero quantity is prepared (2ms)
✓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
This scenario:Payloads
Ingredient Waste
Deleting a waste record should return no content 15ms ยท 15ms warm-up🔗
Steps
✓Given an ingredient waste record exists (10ms)
✓When the waste record is deleted (3ms)
✓Then the delete response should indicate no content (1ms)
✓Delete steps response message status code should be NoContent (0ms)
Diagrams
This scenario:Payloads
Listing waste by recipe should return matching records 19ms🔗
Steps
✓Given an ingredient waste record exists (0ms)
✓When the waste is listed by recipe (5ms)
✓Then the list response should contain the waste record (13ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps list response should contain [ w => w.WasteId == '4f93f89a-c0e1-4d27-be67-a96276ec14e5' ] (0ms)
Diagrams
This scenario:Payloads
Recording ingredient waste should return the created record 9ms🔗
Steps
✓Given a valid ingredient waste request is prepared (0ms)
✓When the waste is recorded (0ms)
✓Then the response should contain the created waste record (9ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Post steps response ingredient name should not be null or empty (0ms)
✓Post steps response quantity wasted should be 0.5m (0ms)
✓Post steps response waste id should not be null or empty (0ms)
✓Post steps response reason should be "Expired before use" (0ms)
Diagrams
This scenario:Payloads
Recording waste with missing ingredient name should return bad request 6ms🔗
Steps
✓Given a waste request with missing ingredient name is prepared (5ms)
✓When the waste is recorded (0ms)
✓Then the waste response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recording waste with missing reason should return bad request 1ms🔗
Steps
✓Given a waste request with missing reason is prepared (1ms)
✓When the waste is recorded (0ms)
✓Then the waste response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recording waste with zero quantity should return bad request 5ms🔗
Steps
✓Given a waste request with zero quantity is prepared (5ms)
✓When the waste is recorded (0ms)
✓Then the waste response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Inventory
Adding a new inventory item should return the created item 14ms🔗
Steps
✓Given a valid inventory item request is prepared (3ms)
✓When the inventory item is submitted (2ms)
✓Then the response should contain the created item (8ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Post steps response name should be 'Flour-c371d71128ac4338a4344fa52e0f2ffe' (0ms)
✓Post steps response category should be "Dry Goods" (0ms)
Diagrams
This scenario:Payloads
Deleting an inventory item should return no content 10ms🔗
Steps
✓Given an inventory item exists (0ms)
✓When the inventory item is deleted (4ms)
✓Then the delete response should indicate no content (5ms)
✓Delete steps response message status code should be NoContent (0ms)
Diagrams
This scenario:Payloads
Listing all inventory items should return all items 21ms🔗
Steps
✓Given an inventory item exists (0ms)
✓When all inventory items are requested (3ms)
✓Then the list response should contain the item (18ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps list response should contain [ i => i.Id == '4' ] (0ms)
Diagrams
This scenario:Payloads
Retrieving a non existent inventory item should return not found 3ms🔗
Steps
✓When a non existent inventory item is retrieved (2ms)
✓Then the get response should indicate not found (0ms)
✓Get steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Retrieving an existing inventory item should return the item 57ms ยท 57ms warm-up🔗
Steps
✓Given an inventory item exists (10ms)
✓When the inventory item is retrieved by id (6ms)
✓Then the get response should contain the item (39ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps response id should be '1' (0ms)
✓Get steps response name should be 'Flour-e85d88ddafb84208b8d7e40e925ceb2d' (0ms)
Diagrams
This scenario:Payloads
Updating an inventory item should return the updated item 11ms🔗
Steps
✓Given an inventory item exists (0ms)
✓When the inventory item is updated (4ms)
✓Then the put response should contain the updated values (6ms)
✓Put steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Put steps response category should be "Updated Category" (0ms)
Diagrams
This scenario:Payloads
Menu
Menu endpoint should return all menu items with availability 25ms🔗
Steps
✓When the menu is requested (2ms)
✓Then the menu response should contain all menu items (11ms)
✓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 (5ms)
✓Menu steps response should be in ascending order [ m => m.Name ] (0ms)
✓And the supplier service should have received an availability request (6ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath.Contains("/availability") && r.Method == HttpMethod.Get ] (0ms)
Diagrams
This scenario:Payloads
Menu should return cached results on subsequent requests 10ms🔗
Steps
✓Given the menu has been requested and cached (3ms)
✓And the supplier service is then made unavailable (0ms)
✓When the menu is requested again (1ms)
✓Then the menu response should still return available items (4ms)
✓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
This scenario:Payloads
Requesting menu when supplier service unavailable should mark items as unavailable 30ms🔗
Steps
✓Given the supplier service will return service unavailable (1ms)
✓When the menu is requested (4ms)
✓Then the menu response should mark all items as unavailable (24ms)
✓Menu steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Menu steps response should only contain [ m => m.IsAvailable == false ] (0ms)
Diagrams
This scenario:Payloads
Orders
Creating an order should produce an audit log entry and events 78ms🔗
Steps
✓Given a pancake batch is created and order request is ready (17ms)
✓When the order is submitted (4ms)
✓Then the order should be created successfully (5ms)
✓Order steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Order steps response customer name should be 'TestCustomer_6284045453282370265' (0ms)
✓Order steps response items should have count 1 (0ms)
✓And an order created event should have been published (32ms)
✓And a recipe log should have been published to kafka (16ms)
✓Recipe log messages should contain [ m => m.Message.RecipeType == OrderDefaults.PancakeItemType, "a RecipeLogEvent should have been published for the pancake recipe" ] (0ms)
Diagrams
This scenario:Payloads
Creating an order should write an outbox message that gets processed 6ms🔗
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_6801558310951514790' (0ms)
✓Order steps response items should have count 1 (0ms)
✓And an outbox message should have been written and processed (5ms)
Diagrams
This scenario:Payloads
Creating an order when kitchen service returns error should still create the order 23ms🔗
Steps
✓Given a pancake batch has been created (9ms)
✓And a valid order request for the created batch (3ms)
✓And the kitchen service will return an error (0ms)
✓When the breakfast order is placed (4ms)
✓Then the order should still 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_668830060642120392' (0ms)
✓And the order should be retrievable by its id (2ms)
Diagrams
This scenario:Payloads
Exceeding rate limit should return too many requests 428ms ยท 428ms warm-up🔗
Steps
✓Given the rate limit is configured to allow one request per window (389ms)
✓And a pancake batch has been created (16ms)
✓And a valid order request is prepared (5ms)
✓When the order is submitted twice in rapid succession (15ms)
✓Then the first request should succeed and the second should be rate limited (1ms)
✓First response status code should be Created (0ms)
✓Second response status code should be TooManyRequests (0ms)
Diagrams
This scenario:Payloads
Invalid status transition should return conflict 7/7 passed 19ms ยท 16ms warm-up🔗
#Input ParametersStatusDuration
From StatusTo Status
1CancelledPreparingPassed0ms
2CancelledReadyPassed16ms
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
This scenario:Payloads
Listing orders should return a paginated response 9ms🔗
Steps
✓Given multiple orders have been created (0ms)
✓When the orders are listed (0ms)
✓Then the response should contain a paginated list of orders (9ms)
✓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
This scenario:Payloads
Listing orders when none exist should return an empty page 15ms🔗
Steps
✓When the orders are listed (4ms)
✓Then the response should be an empty page (10ms)
✓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
This scenario:Payloads
Listing orders with small page size should limit results 17ms🔗
Steps
✓Given multiple orders have been created (10ms)
✓When the orders are listed with page size 1 (1ms)
✓Then the response should contain only one item per page (4ms)
✓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
This scenario:Payloads
Order at maximum items per order should be accepted 141ms🔗
Steps
✓Given the max items per order is configured to 2 (138ms)
✓And a pancake batch is created (0ms)
✓And an order request has 2 items (1ms)
✓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
This scenario:Payloads
Order exceeding maximum items per order should be rejected 226ms🔗
Steps
✓Given the max items per order is configured to 2 (204ms)
✓And a pancake batch is created (8ms)
✓And an order request has 3 items (1ms)
✓When the order is submitted (1ms)
✓Then the response should indicate too many items (10ms)
✓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
This scenario:Payloads
Order should progress through all status transitions to completion 52ms🔗
Steps
✓Given a pancake batch has been created (9ms)
✓And a breakfast order has been placed for the batch (6ms)
✓When the order is progressed through the complete lifecycle (6ms)
✓Then the completed order should be retrievable with all details (13ms)
✓And an audit log entry should exist for the order (7ms)
✓And the downstream services should have received requests (9ms)
✓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
This scenario:Payloads
Order status update with invalid field should return bad request 1/1 passed 12ms🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1StatusStatus is required'Status' is required.Bad RequestPassed12ms
Steps
✓Step An order status update request with invalid Status (0ms)
✓When the order status update request is sent (11ms)
✓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
This scenario:Payloads
Order with invalid field should return bad request 5/5 passed 23ms🔗
#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 RequestPassed20ms
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
This scenario:Payloads
Outbox message should transition to failed after exhausting retries 45ms🔗
Steps
✓Given a pending outbox message with a failing dispatcher (10ms)
✓Then the outbox message should transition to failed after exhausting retries (35ms)
Sequence Diagrams
This scenario:Payloads
Previously created order should be retrievable by id 35ms🔗
Steps
✓Given a pancake batch has been created (11ms)
✓And an order has been created for the batch (7ms)
✓When the order is retrieved by id (4ms)
✓Then the retrieved order should match the created order (9ms)
✓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 'ac962fac-e383-4282-9a10-c63f78ad97c9' (0ms)
✓Retrieval steps response customer name should be 'TestCustomer_4732013575363604199' (0ms)
✓Retrieval steps response items should have count 1 (0ms)
✓And the downstream services should have received requests (3ms)
✓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
This scenario:Payloads
Requesting second page should return different orders 5ms🔗
Steps
✓Given multiple orders have been created (0ms)
✓When the second page is requested with page size 1 (1ms)
✓Then the response should be for page 2 (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 1 (0ms)
✓List steps response page should be 2 (0ms)
Diagrams
This scenario:Payloads
Retrieving a non existent order should return not found 3ms🔗
Steps
✓Given a non existent order id (0ms)
✓When the non existent order is retrieved (2ms)
✓Then the response should be not found (0ms)
✓Retrieval steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Updating status of non existent order should return not found 11ms ยท 11ms warm-up🔗
Steps
✓Given a non existent order id (1ms)
✓When the order status is updated to preparing (9ms)
✓Then the response should indicate not found (0ms)
✓Patch steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Valid order should be created and an event published 2ms🔗
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_4334183367310746460' (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 (1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
This scenario:Payloads
Valid status transition should update the order 4/4 passed 11ms🔗
#Input ParametersStatusDuration
From StatusTo Status
1CreatedCancelledPassed0ms
2CreatedPreparingPassed8ms
3PreparingReadyPassed1ms
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
This scenario:Payloads
Order Timings
Getting the timing summary should return aggregated data 26ms🔗
Steps
✓Given an order timing record has been created (4ms)
✓When the timing summary is requested (3ms)
✓Then the summary should contain aggregated data for the station (18ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps summary response should contain [ s => s.Station == 'Griddle-37b49c72b07b4216b273201b619efa78' && s.TimingCount >= 1 ] (0ms)
Diagrams
This scenario:Payloads
Listing timings by station should return matching records 16ms🔗
Steps
✓Given an order timing record has been created (0ms)
✓When the timings are listed by station (4ms)
✓Then the timing list response should contain the record (11ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps list response should contain [ t => t.TimingId == 'b667fde1-9a11-40af-9d2f-6bd1d0c42f1c' ] (0ms)
Diagrams
This scenario:Payloads
Recording a timing with missing station should return bad request 20ms🔗
Steps
✓Given an order timing request with a missing station is prepared (3ms)
✓When the order timing is recorded (16ms)
✓Then the timing post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recording a timing with zero prep seconds should return bad request 4ms🔗
Steps
✓Given an order timing request with zero prep seconds is prepared (3ms)
✓When the order timing is recorded (0ms)
✓Then the timing post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Recording an order timing should return the created record 25ms🔗
Steps
✓Given a valid order timing request is prepared (4ms)
✓When the order timing is recorded (0ms)
✓Then the timing response should contain the created record (20ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Post steps response station should be 'Griddle-ceacac3c3f5049fdaa6d8fd0bc6acc25' (0ms)
✓Post steps response prep seconds should be 42.5m (0ms)
✓Post steps response timing id should not be null or empty (0ms)
Diagrams
This scenario:Payloads
Pancakes
Pancake request with invalid ingredient should return bad request 6/6 passed 13ms🔗
#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 RequestPassed10ms
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
This scenario:Payloads
Pancake request with more toppings than allowed should return bad request 7ms🔗
Steps
✓Given all ingredients are retrieved for pancakes (0ms)
✓And the request has more toppings than the configured limit (3ms)
✓When the pancakes are prepared (0ms)
✓Then the response should indicate too many toppings (3ms)
✓Pancake steps response message status code should be BadRequest (0ms)
✓Body should contain MaxToppingsExceeded (0ms)
Diagrams
This scenario:Payloads
Request with unsupported content type should return unsupported media type 3/3 passed 8ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed0ms
2text/htmlPassed0ms
3text/plainPassed7ms
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
This scenario:Payloads
Valid pancake request with all ingredients should return a fresh batch 15ms🔗
Steps
✓Given all ingredients are retrieved for pancakes (5ms)
✓When the pancakes are prepared (1ms)
✓Then the response should contain a valid batch with all ingredients (6ms)
✓Pancake steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Pancake steps response ingredients should contain '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 (1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
This scenario:Payloads
Recipe Costs
Consuming recipe cost event should trigger downstream processing 90ms🔗
Steps
✓Given a recipe cost calculated event (2ms)
✓When the event is published to kafka (79ms)
✓Then the calculation id should be generated (4ms)
✓Publish steps calculation id should not be '00000000-0000-0000-0000-000000000000' (0ms)
✓And the kitchen service should have received the preparation request (2ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
This scenario:Payloads
Recipe Reviews
Listing reviews by recipe should return matching reviews 19ms🔗
Steps
✓Given a review entry exists (0ms)
✓When the reviews are listed by recipe (3ms)
✓Then the list response should contain the review (15ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps list response should contain [ r => r.ReviewId == '9be9ef10-5ac5-41e6-a92a-e5cf955c1611' ] (0ms)
Diagrams
This scenario:Payloads
Retrieving existing review by id should return the review 20ms🔗
Steps
✓Given a review entry exists (6ms)
✓When the review is retrieved by id (4ms)
✓Then the get response should contain the review (10ms)
✓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 '0dc9ba3f-ec81-4c8b-97f4-fab60b123fc1' (0ms)
✓Get steps response recipe name should be 'Recipe-3f466256582b40aa9b63aa5d353676df' (0ms)
Diagrams
This scenario:Payloads
Retrieving non existent review should return not found 3ms🔗
Steps
✓When a non existent review is retrieved (1ms)
✓Then the get response should indicate not found (1ms)
✓Get steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Submitting a recipe review should return the created review 5ms🔗
Steps
✓Given a valid recipe review request is prepared (0ms)
✓When the review is submitted (0ms)
✓Then the response should contain the created review (5ms)
✓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-b0211ec6de644d948df6ceab9e123cca' (0ms)
✓Post steps response rating should be 5 (0ms)
✓Post steps response review id should not be null or empty (0ms)
Diagrams
This scenario:Payloads
Submitting review with invalid rating should return bad request 2ms🔗
Steps
✓Given a review request with an invalid rating is prepared (2ms)
✓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
This scenario:Payloads
Submitting review with missing recipe name should return bad request 23ms ยท 23ms warm-up🔗
Steps
✓Given a review request with missing recipe name is prepared (7ms)
✓When the review is submitted (14ms)
✓Then the post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Reporting
Batch completions should contain data ingested via pubsub consumer 81ms🔗
Steps
✓Given a pancake batch has been created (47ms)
✓When the batch completions are queried via graphql (13ms)
✓Then the response should contain the batch completion record (21ms)
✓Graph ql steps response message status code should be OK (0ms)
✓Graph ql steps batch completions should contain [ r => r.BatchId == '9a0b48aa-1d50-4fde-b4ee-3bc6ac957ba6' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ] (0ms)
Diagrams
This scenario:Payloads
Equipment alerts should contain data ingested via event hub consumer 67ms🔗
Steps
✓Given a pancake batch has been created (27ms)
✓When the equipment alerts are queried via graphql (19ms)
✓Then the response should contain the equipment alert record (20ms)
✓Graph ql steps response message status code should be OK (0ms)
✓Graph ql steps equipment alerts should contain [ a => a.BatchId == 'f7860b93-50a9-4e19-b156-00f57da2e094' && a.EquipmentName == "Griddle" && a.AlertType == "UsageCycleCompleted" ] (0ms)
Diagrams
This scenario:Payloads
Ingredient shipments should be recorded when delivered via eventgrid webhook 50ms ยท 50ms warm-up🔗
Steps
✓Given an ingredient delivery event has been received via eventgrid webhook (12ms)
✓When the ingredient shipments are queried via graphql (11ms)
✓Then the response should contain the ingredient shipment (26ms)
✓Graph ql steps response message status code should be OK (0ms)
✓Graph ql steps ingredient shipments should contain [ s => s.DeliveryId == '64c966cf-9e60-4782-8841-293eba6c9e30' && s.IngredientName == "Milk" && s.Quantity == 50.0m ] (0ms)
Diagrams
This scenario:Payloads
Ingredient usage should aggregate across multiple recipes 30ms🔗
Steps
✓Given multiple recipe logs have been ingested with overlapping ingredients (8ms)
✓When the ingredient usage is queried via graphql (7ms)
✓Then the ingredient usage should reflect aggregated counts (15ms)
✓Graph ql steps response message status code should be OK (0ms)
✓Graph ql steps ingredient usage should contain [ i => i.Ingredient == "Milk" && i.Count >= 2 ] (0ms)
✓Graph ql steps ingredient usage should contain [ i => i.Ingredient == "Butter" && i.Count >= 1 ] (0ms)
Diagrams
This scenario:Payloads
Order summaries should contain ingested order data 79ms🔗
Steps
✓Given a pancake batch has been created (11ms)
✓And a breakfast order has been placed for the batch (6ms)
✓When the order summaries are queried via graphql (7ms)
✓Then the response should contain the ingested order summary (53ms)
✓Graph ql steps response message status code should be OK (0ms)
✓Graph ql steps order summaries should contain [ o => o.OrderId == 'c7e3506e-61a7-4186-8b2f-f1c8c88f787f' && o.CustomerName == 'TestCustomer_5398123626082013235' && o.ItemCount == 1 && o.TableNumber == 7 ] (0ms)
Diagrams
This scenario:Payloads
Order summaries should return an empty list when no orders exist 7ms🔗
Steps
✓When the order summaries are queried via graphql (0ms)
✓Then the response should not contain the test order (7ms)
✓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
This scenario:Payloads
Recipe reports should contain ingested recipe data 40ms🔗
Steps
✓Given a pancake batch has been created (11ms)
✓When the recipe reports are queried via graphql (13ms)
✓Then the response should contain the ingested recipe reports (14ms)
✓Graph ql steps response message status code should be OK (0ms)
✓Graph ql steps recipe reports should contain [ r => r.OrderId == '1e1441fb-56e0-4b0e-9084-665849744de5' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ] (0ms)
Diagrams
This scenario:Payloads
Reservations
Cancelling a reservation should return the cancelled reservation 12ms ยท 12ms warm-up🔗
Steps
✓Given a reservation exists (0ms)
✓When the reservation is cancelled (4ms)
✓Then the cancellation response should indicate cancelled (8ms)
✓Cancel steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Cancel steps response status should be "Cancelled" (0ms)
Diagrams
This scenario:Payloads
Cancelling an already cancelled reservation should return a conflict response 7ms🔗
Steps
✓Given a cancelled reservation exists (5ms)
✓When the reservation is cancelled (0ms)
✓Then the cancellation response should indicate conflict (1ms)
✓Cancel steps response message status code should be Conflict (0ms)
Diagrams
This scenario:Payloads
Creating a reservation should return the confirmed reservation 18ms ยท 18ms warm-up🔗
Steps
✓Given a valid reservation request is prepared (2ms)
✓When the reservation is submitted (6ms)
✓Then the response should contain the confirmed booking (9ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Post steps response status should be "Confirmed" (0ms)
✓Post steps response customer name should be 'Customer-7bc193dfc166462ebee4a8b4e52bf43f' (0ms)
Diagrams
This scenario:Payloads
Deleting a reservation should return no content 5ms🔗
Steps
✓Given a reservation exists (0ms)
✓When the reservation is deleted (3ms)
✓Then the delete response should indicate no content (2ms)
✓Delete response status code should be NoContent (0ms)
Diagrams
This scenario:Payloads
Retrieving an existing reservation should return the reservation 17ms🔗
Steps
✓Given a reservation exists (3ms)
✓When the reservation is retrieved by id (4ms)
✓Then the get response should contain the reservation (9ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps response id should be '2' (0ms)
✓Get steps response customer name should be 'Customer-9704a55b0ece42b583249ca92e942ec3' (0ms)
✓Get steps response status should be "Confirmed" (0ms)
Diagrams
This scenario:Payloads
Service Times
Consuming an order served event should trigger downstream processing 81ms🔗
Steps
✓Given an order served event (9ms)
✓When the event is published to kafka (58ms)
✓Then the order id should be generated (2ms)
✓Publish steps order id should not be '00000000-0000-0000-0000-000000000000' (0ms)
✓And the kitchen service should have received the status request (10ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == $"/status/{orderId}" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
This scenario:Payloads
Specifications
Grpc server reflection should describe the breakfast service 104ms🔗
Steps
✓When the breakfast service is described through grpc server reflection (88ms)
✓Then the description should be the breakfast proto file (5ms)
✓Reflection steps described files should contain single [ f => f.Name == GrpcContractDefaults.ProtoFileName ] (0ms)
✓Described file package should be Package (0ms)
✓And the description should contain every breakfast method (9ms)
✓Described file service should contain single [ s => s.Name == GrpcContractDefaults.ServiceName ] (0ms)
✓Service method select(m => m name) should contain GetRecipeSummary (0ms)
✓Service method select(m => m name) should contain GetOrderStatus (0ms)
✓Service method select(m => m name) should contain StreamOrderUpdates (0ms)
Diagrams
This scenario:Payloads
Grpc server reflection should list the breakfast service 38ms🔗
Steps
✓When the services are listed through grpc server reflection (36ms)
✓Then the breakfast service should be listed (0ms)
✓Reflection steps listed services should contain ServiceFullName (0ms)
✓And the reflection service should be listed (0ms)
✓Reflection steps listed services should contain ReflectionServiceFullName (0ms)
Diagrams
This scenario:Payloads
The AsyncApi endpoint should return a valid specification 23ms🔗
Steps
✓When the asyncapi endpoint is called (4ms)
✓Then the response status should be ok (2ms)
✓Async api response status code should be OK (0ms)
✓And the response should be valid json (7ms)
✓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 (4ms)
✓Async api json root element get property("asyncapi") should not be null (0ms)
✓Async api json root element get property("info") should not be null (0ms)
✓Async api json root element get property("defaultContentType") should not be null (0ms)
✓Async api json root element get property("channels") should not be null (0ms)
✓Async api json root element get property("operations") should not be null (0ms)
✓Async api json root element get property("components") should not be null (0ms)
✓And the asyncapi spec is written to disk as json (4ms)
Diagrams
This scenario:Payloads
The AsyncApi UI endpoint should return a valid page 9ms🔗
Steps
✓When the asyncapi ui endpoint is called (4ms)
✓Then the response should be a valid asyncapi page (4ms)
✓Document steps response message status code should be OK (0ms)
✓Document steps body should contain "<html" (0ms)
✓Document steps body should contain UiRenderer (0ms)
✓Document steps body should contain Endpoints.AsyncApi.AsyncApiSpec (0ms)
Diagrams
This scenario:Payloads
The GraphQL schema definition endpoint should return the schema definition 18ms🔗
Steps
✓When the graphql schema definition endpoint is called (7ms)
✓Then the response should be a graphql schema definition (2ms)
✓Document steps response message status code should be OK (0ms)
✓Document steps response message content headers content type media type should be GraphQL (0ms)
✓And the schema definition should declare all the reporting queries (6ms)
✓And the graphql schema definition is written to disk (2ms)
Diagrams
This scenario:Payloads
The GraphQL schema endpoint should return a valid specification 60ms🔗
Steps
✓When the graphql schema endpoint is called (1ms)
✓Then the response should be valid (6ms)
✓Document steps response message status code should be OK (0ms)
✓Document steps json should not be null (0ms)
✓And the schema should contain all the reporting queries (34ms)
✓And the reporting queries should be documented (14ms)
✓Graph ql schema documents type description(_document steps json, graph ql schema defaults query type name) should not be null or white space (0ms)
✓Graph ql schema documents undocumented fields(_document steps json, graph ql schema defaults query type name) should be empty (0ms)
✓And the graphql schema is written to disk (3ms)
Diagrams
This scenario:Payloads
The GraphQL UI endpoint should return a valid page 10ms🔗
Steps
✓When the graphql ui endpoint is called (1ms)
✓Then the response should be a valid nitro page (7ms)
✓Document steps response message status code should be OK (0ms)
✓Document steps body should contain "<html" (0ms)
✓Document steps body should contain NitroMarker (0ms)
✓And the page should be served by the service itself (1ms)
✓Document steps response message headers contains( graph ql schema defaults cdn ray header) should be false (0ms)
Diagrams
This scenario:Payloads
The Grpc contract endpoint should return a valid specification 163ms🔗
Steps
✓When the grpc contract endpoint is called (56ms)
✓Then the response should be valid (56ms)
✓Document steps response message status code should be OK (0ms)
✓Document steps descriptor set should not be null (0ms)
✓And the grpc contract should describe the breakfast service (37ms)
✓Document steps descriptor set file select(f => f name) should equal ProtoFileName (0ms)
✓Contract file package should be Package (0ms)
✓Contract file service select(s => s name) should contain ServiceName (0ms)
✓Breakfast service method select(m => m name) should contain GetRecipeSummary (0ms)
✓Breakfast service method select(m => m name) should contain GetOrderStatus (0ms)
✓Breakfast service method select(m => m name) should contain StreamOrderUpdates (0ms)
✓Breakfast service method single(m => m name == grpc contract defaults stream order updates) server streaming should be true (0ms)
✓And every breakfast method should be documented (8ms)
✓Grpc descriptor comments undocumented methods( contract file, grpc contract defaults service name) should be empty (0ms)
✓And the grpc contract is written to disk (4ms)
Diagrams
This scenario:Payloads
The Grpc proto endpoint should return the proto file 4ms🔗
Steps
✓When the grpc proto endpoint is called (1ms)
✓Then the response should be a plain text proto file (1ms)
✓Document steps response message status code should be OK (0ms)
✓Document steps response message content headers content type media type should be MediaTypeNames.Text.Plain (0ms)
✓And the proto file should declare the breakfast service (1ms)
✓Document steps body should contain $"package {GrpcContractDefaults.Package};" (0ms)
✓Document steps body should contain $"service {GrpcContractDefaults.ServiceName}" (0ms)
Diagrams
This scenario:Payloads
The Grpc UI endpoint should return a page describing the service 68ms🔗
Steps
✓When the grpc ui endpoint is called (1ms)
✓Then the response should be a valid grpc documentation page (48ms)
✓Document steps response message status code should be OK (0ms)
✓Document steps response message content headers content type media type should be MediaTypeNames.Text.Html (0ms)
✓Document steps body should contain "<html" (0ms)
✓And the page should describe every breakfast method (8ms)
✓Document steps body should contain ServiceDescription (0ms)
✓Grpc contract page rows row of(_document steps body, grpc contract defaults get recipe summary) should not be null (0ms)
✓Grpc contract page rows row of(_document steps body, grpc contract defaults get order status) should not be null (0ms)
✓Grpc contract page rows row of(_document steps body, grpc contract defaults stream order updates) should contain ServerStreamingKind (0ms)
✓And the page should link to the grpc contract (1ms)
✓Document steps body should contain $"href=\"{GrpcContractDefaults.ContractJsonLink}\"" (0ms)
✓Document steps body should contain $"href=\"{GrpcContractDefaults.ProtoFileLink}\"" (0ms)
✓And the grpc ui page is written to disk (8ms)
Diagrams
This scenario:Payloads
The OpenApi endpoint should return a valid specification 29ms🔗
Steps
✓When the open api endpoint is called (2ms)
✓Then the response status should be ok (1ms)
✓Swagger response status code should be OK (0ms)
✓And the response should be valid json (2ms)
✓Open api response is valid json should be true (0ms)
✓And the response should contain all the endpoints (16ms)
✓And the openapi spec is written to disk as json (5ms)
Diagrams
This scenario:Payloads
The Scalar UI endpoint should return a valid page 39ms🔗
Steps
✓When the scalar ui endpoint is called (2ms)
✓Then the response status should be ok (3ms)
✓Scalar response status code should be OK (0ms)
✓And the response should be valid html (32ms)
✓Scalar ui response body should contain "<html" (0ms)
✓And the response should refer to scalar (1ms)
✓Scalar ui response body should contain "scalar" (0ms)
Diagrams
This scenario:Payloads
Staff
Adding a new staff member should return the created member 24ms🔗
Steps
✓Given a valid staff member request is prepared (5ms)
✓When the staff member is submitted (0ms)
✓Then the response should contain the created member (18ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Post steps response name should be 'Chef-529248876aa34649b5ba9311f6f0fb85' (0ms)
✓Post steps response role should be "Chef" (0ms)
Diagrams
This scenario:Payloads
Adding a staff member with an invalid role should return a bad request response 17ms🔗
Steps
✓Given a staff member request with an invalid role is prepared (3ms)
✓When the staff member is submitted (14ms)
✓Then the post response should indicate bad request (0ms)
✓Post steps response message status code should be BadRequest (0ms)
Diagrams
This scenario:Payloads
Deleting a staff member should return no content 9ms🔗
Steps
✓Given a staff member exists (0ms)
✓When the staff member is deleted (8ms)
✓Then the delete response should indicate no content (0ms)
✓Delete response status code should be NoContent (0ms)
Diagrams
This scenario:Payloads
Retrieving an existing staff member should return the member 22ms🔗
Steps
✓Given a staff member exists (4ms)
✓When the staff member is retrieved by id (5ms)
✓Then the get response should contain the member (13ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps response id should be '2' (0ms)
✓Get steps response name should be 'Chef-88c57cbad9cb45a3a18c8a4b98c18cc7' (0ms)
✓Get steps response role should be "Chef" (0ms)
Diagrams
This scenario:Payloads
Toppings
Adding a new topping should return the created topping 55ms🔗
Steps
✓Given a valid topping request (1ms)
✓When the new topping is submitted (11ms)
✓Then the topping response should contain the created topping (43ms)
✓Post steps response message status code should be Created (0ms)
✓Response content is valid json should be true (0ms)
✓Post steps response name should be Strawberries (0ms)
✓Post steps response category should be FruitCategory (0ms)
Diagrams
This scenario:Payloads
Deleting a non existent topping should return not found 42ms🔗
Steps
✓Given a topping id that does not exist (0ms)
✓When the topping is deleted (2ms)
✓Then the delete response should indicate not found (39ms)
✓Delete steps response message status code should be NotFound (0ms)
Diagrams
This scenario:Payloads
Deleting an existing topping should return no content 5ms🔗
Steps
✓Given a known topping exists (0ms)
✓When the topping is deleted (4ms)
✓Then the delete response should indicate success (0ms)
✓Delete steps response message status code should be NoContent (0ms)
Diagrams
This scenario:Payloads
Topping request with invalid or dangerous input should return bad request 6/6 passed 20ms🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1CategoryCategory is required'Category' is required.Bad RequestPassed0ms
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 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 RequestPassed17ms
Steps
✓Step A topping request with invalid Category (0ms)
✓When the topping request is sent (0ms)
✓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
This scenario:Payloads
Toppings endpoint should return all available toppings 19ms🔗
Steps
✓When the available toppings are requested (2ms)
✓Then the toppings response should contain the default toppings (17ms)
✓Get steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Get steps response should have count ExpectedToppingCount (0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.Raspberries ] (0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.Blueberries ] (0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.MapleSyrup ] (0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.WhippedCream ] (0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.ChocolateChips ] (0ms)
Diagrams
This scenario:Payloads
Toppings should exclude raspberries when feature flag is disabled 161ms🔗
Steps
✓Given the raspberry topping feature flag is disabled (149ms)
✓When toppings are requested (3ms)
✓Then the toppings response should not include raspberries (8ms)
✓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
This scenario:Payloads
Toppings should include raspberries when feature flag is enabled 163ms🔗
Steps
✓Given the raspberry topping feature flag is enabled (159ms)
✓When toppings are requested (0ms)
✓Then the toppings response should include raspberries (3ms)
✓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
This scenario:Payloads
Update topping with invalid or dangerous input should return bad request 6/6 passed 14ms🔗
#Input ParametersStatusDuration
FieldValueReasonExpected ErrorExpected Status
1CategoryCategory is required'Category' is required.Bad RequestPassed10ms
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 RequestPassed0ms
6Name<script>alert('xss')</script>Script tag in nameName contains potentially dangerous content.Bad RequestPassed0ms
Steps
✓Step An update topping request with invalid Category (0ms)
✓When the update topping request is sent (8ms)
✓Then the response should contain error 'Category' is required. (1ms)
✓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
This scenario:Payloads
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
This scenario:Payloads
Updating an existing topping should return the updated topping 32ms🔗
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 (32ms)
✓Put steps response message status code should be OK (0ms)
✓Response content is valid json should be true (0ms)
✓Put steps response topping id should be '11111111-0000-0000-0000-000000000002' (0ms)
✓Put steps response name should be Strawberries (0ms)
✓Put steps response category should be FruitCategory (0ms)
Diagrams
This scenario:Payloads
Waffles
Sending request with unsupported content type should return unsupported media type 3/3 passed 3ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed0ms
2text/htmlPassed0ms
3text/plainPassed3ms
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
This scenario:Payloads
Valid waffle request with all ingredients should return a fresh batch 38ms🔗
Steps
✓Given all ingredients are retrieved for waffles (5ms)
✓When the waffles are prepared (4ms)
✓Then the response should contain a valid batch with all ingredients (26ms)
✓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 (2ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
This scenario:Payloads
Waffle request with invalid ingredient should return bad request 6/6 passed 31ms🔗
#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 RequestPassed28ms
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
This scenario:Payloads
Waffle request with more toppings than allowed should return bad request 15ms🔗
Steps
✓Given all ingredients are retrieved for waffles (0ms)
✓And the request has more toppings than the configured limit (4ms)
✓When the waffles are prepared (5ms)
✓Then the response should indicate too many toppings (5ms)
✓Waffle steps response message status code should be BadRequest (0ms)
✓Body should contain MaxToppingsExceeded (0ms)
Diagrams
This scenario:Payloads