Breakfast Provider (ReqNRoll) Test Run Report

Features Summary
FeatureScenariosPassedFailedSkippedStepsPassedFailedSkippedDurationAvgLongest
Apple Cinnamon Muffins Creation101000909000357ms35ms147ms
Audit Log Filtering4400525200237ms59ms76ms
Audit Log Retrieval11002121001s1s1s
Breakfast Order33005656001s481ms952ms
Complete Order Lifecycle1100292900190ms190ms190ms
Correlation Id2200990049ms24ms37ms
Customer Preferences Management55003333001s225ms839ms
Daily Specials Idempotency220016160060ms30ms36ms
Daily Specials Not Found1100440012ms12ms12ms
Daily Specials Ordering4400262600119ms29ms50ms
Daily Specials Validation22008800102ms51ms92ms
Degraded Health Check2200181800336ms168ms217ms
Downstream Error Health Check11009900481ms481ms481ms
Equipment Alerts11001212001s1s1s
Feedback Management6600363600129ms21ms60ms
Goat Milk Downstream Failure220010100016ms8ms9ms
Goat Milk Feature Flag2200101000420ms210ms265ms
Goat Milk Sourcing1100440029ms29ms29ms
Header Propagation220011110038ms19ms27ms
Health Check110011110015ms15ms15ms
Health Check Detail1100313100412ms412ms412ms
Heartbeat1100550011ms11ms11ms
Ingredient Usage Analytics5500323200979ms195ms726ms
Inventory Management6600414100323ms53ms177ms
Kitchen Service Failure110015150027ms27ms27ms
Menu Availability1100770010ms10ms10ms
Menu Caching1100880041ms41ms41ms
Menu Downstream Failure11006600412ms412ms412ms
Milk Downstream Failure3300151500510ms170ms412ms
Order Cross Field Validation2200101000468ms234ms313ms
Order Pagination44003838002s588ms2s
Order Rate Limiting1100151500256ms256ms256ms
Order Retrieval2200111100103ms51ms62ms
Order Status Transition111100858500512ms46ms89ms
Order Status Via G RPC2200222200190ms95ms130ms
Order Summaries220010100049ms24ms31ms
Order Validation660024240065ms10ms22ms
Outbox Retry Exhaustion110033001s1s1s
Pancakes Content Negotiation330012120021ms7ms13ms
Pancakes Creation880047470088ms11ms32ms
Recipe Reports3300181800130ms43ms74ms
Recipe Reviews Management6600363600305ms50ms157ms
Recipe Summary Via G RPC3300151500206ms68ms153ms
Reservations Management5500383800270ms54ms197ms
Specifications Async Api1100111100227ms227ms227ms
Specifications Open Api1100171700393ms393ms393ms
Specifications Open Api Scalar UI11005500211ms211ms211ms
Staff Management44002727001s272ms1s
Status Update Not Found1100330029ms29ms29ms
Stream Order Updates Via G RPC2200222200112ms56ms75ms
Telemetry1100151500323ms323ms323ms
Toppings Deletion2200880048ms24ms33ms
Toppings Feature Flag2200121200316ms158ms180ms
Toppings Management220017170022ms11ms14ms
Toppings Update8800383800151ms18ms70ms
Toppings XSS Validation6600242400132ms22ms62ms
Waffles Content Negotiation330012120016ms5ms9ms
Waffles Creation101000565600257ms25ms77ms

Test Execution Summary

ExecutionContent
Overall status:PassedFeatures: 58
Start Date:2026-05-13 (UTC)Scenarios: 176
Start Time:14:48:52 (UTC)Passed Scenarios: 176
End Time:14:49:01 (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 Creation
/muffins - Creating apple cinnamon muffins with baking profiles and toppings
A valid apple cinnamon muffin request should return a fresh batch Happy Path 21ms🔗
Steps
Given a valid apple cinnamon muffin recipe with all ingredients (9ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
When the muffins are prepared (5ms)
Then the muffin response should contain a valid batch with all ingredients (3ms)
Muffin steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Muffin steps response ingredients should contain 'Milk' (0ms)
Muffin steps response ingredients should contain 'Eggs' (0ms)
Muffin steps response ingredients should contain 'Flour' (0ms)
Muffin steps response ingredients should contain GrannySmithApples (0ms)
Muffin steps response ingredients should contain CeylonCinnamon (0ms)
Muffin steps response toppings should have count 1 (0ms)
Muffin steps response baking temperature should be DefaultTemperature (0ms)
Muffin steps response baking duration should be DefaultDuration (0ms)
And the cow service should have received a milk request for the muffins (1ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
Details:lines
Different muffin recipes should produce the expected batch 3/3 passed 143ms🔗
#Input ParametersStatusDuration
Recipe NameFlourApple VarietyCinnamon TypeTemperatureDurationPan TypeTopping 1Amount 1Topping 2Amount 2Expected Ingredient CountExpected Topping Count
1ClassicPlain FlourGranny SmithCeylon18025StandardStreuselLightIcing GlazeDrizzle52Passed43ms
2Rustic WholesomeWhole WheatHoneycrispCassia17530Cast IronBrown Sugar CrumbHeavyMaple DrizzleLight52Passed25ms
3Spiced DeluxeAlmondPink LadySaigon19020SiliconeCinnamon SugarHeavyCream Cheese SwirlThick52Passed74ms
Steps
Given a muffin recipe "Classic" with the following ingredients: (10ms)
FlourApplesCinnamon
Plain FlourGranny SmithCeylon
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
And with baking at 180 degrees for 25 minutes in a "Standard" pan (0ms)
And the following muffin toppings: (0ms)
NameAmount
StreuselLight
Icing GlazeDrizzle
When the muffins are prepared (28ms)
Then the muffin batch should have 5 ingredients (0ms)
Muffin steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Muffin steps response ingredients should have count '5' (0ms)
And the muffin response should include 2 toppings (0ms)
Muffin steps response toppings should have count '2' (0ms)
And the muffin response should include baking information (0ms)
Muffin steps response baking temperature should be greater than 0 (0ms)
Diagrams
Details:lines
Muffins endpoint called with an invalid field should return a bad request response 6/6 passed 192ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1ApplesApples is required'Apples' is required.Bad RequestPassed10ms
2Cinnamon<script>alert('xss')</script>XSS in cinnamonCinnamon contains potentially dangerous content.Bad RequestPassed147ms
3CinnamonCinnamon is required'Cinnamon' is required.Bad RequestPassed3ms
4EggsEggs is required'Eggs' is required.Bad RequestPassed4ms
5FlourFlour is required'Flour' is required.Bad RequestPassed13ms
6MilkMilk is required'Milk' is required.Bad RequestPassed12ms
Steps
Given a valid muffin request with "Apples" set to "" (1ms)
When the invalid muffin request is submitted (5ms)
Then the muffin response should contain error "'Apples' is required." with status "Bad Request" (0ms)
Response body should contain ''Apples' is required.' (0ms)
Muffin steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Audit Log Filtering
/audit-logs - Filtering audit logs by entity type and entity ID
Audit logs should be filterable by entity id 76ms🔗
Steps
Given a pancake batch has been created (20ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And an order has been created for the batch (31ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When audit logs are requested filtered by entity id (16ms)
Then the audit log response should contain the specific order entry (4ms)
Audit log response status code should be OK (0ms)
Audit logs should contain [ l => l.EntityId == '1225c540-fc34-42ec-bd50-f571f2f7ad3b' ] (0ms)
Diagrams
Details:lines
Audit logs should be filterable by entity type 64ms🔗
Steps
Given a pancake batch has been created (11ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And an order has been created for the batch (9ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When audit logs are requested filtered by entity type (38ms)
Then the audit log response should only contain order entries (3ms)
Audit log response status code should be OK (0ms)
Audit logs should only contain [ l => l.EntityType == AuditLogDefaults.OrderEntityType ] (0ms)
Diagrams
Details:lines
Audit logs should be returned in descending timestamp order 75ms🔗
Steps
Given a pancake batch has been created (13ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And an order has been created for the batch (10ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When audit logs are requested filtered by entity type (37ms)
Then the audit logs should be ordered by timestamp descending (8ms)
Audit logs should not be null or empty (0ms)
Audit logs should be in descending order [ l => l.Timestamp ] (0ms)
Diagrams
Details:lines
Filtering audit logs by a non-existent entity type should return an empty collection 21ms🔗
Steps
When audit logs are requested filtered by a non-existent entity type (17ms)
Then the audit log response should be an empty collection (2ms)
Audit log response status code should be OK (0ms)
Audit logs from different time range should be empty (0ms)
Diagrams
Details:lines
Audit Log Retrieval
/audit-logs - Retrieving audit log entries for order operations
Creating an order should produce a retrievable audit log entry Happy Path 1.4s🔗
Steps
Given a pancake batch has been created (29ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And an order has been created for the batch (1.2s)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When the audit logs are retrieved (120ms)
Then the audit log response should contain the order creation entry (29ms)
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_5087308258725742595') ] (0ms)
And the cow service should have received a milk request (15ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
And the kitchen service should have received a preparation request (8ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
(Warning: 30 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Breakfast Order
/orders - Creating and managing breakfast orders with event publishing
Creating an order publishes events and notifies the kitchen
A valid order should be created and an event published Happy Path 952ms🔗
Steps
Given a pancake batch has been created (24ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And a valid order request for the created batch (2ms)
When the breakfast order is placed (15ms)
Then the order response should contain a complete order (3ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response customer name should be 'TestCustomer_4149930143794899280' (0ms)
Order steps response items should have count 1 (0ms)
And an order created event should have been published (904ms)
Event store should not be null (0ms)
And the kitchen service should have received a preparation request (0ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
Details:lines
Creating an order produces audit and recipe logs
Creating an order should produce an audit log entry and events 375ms🔗
Steps
Given a pancake batch has been created (23ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And a valid order request for the created batch (0ms)
When the breakfast order is placed (8ms)
Then the order response should contain a complete order (0ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response customer name should be 'TestCustomer_8955333127263298112' (0ms)
Order steps response items should have count 1 (0ms)
And an order created event should have been published (305ms)
Event store should not be null (0ms)
And a recipe log should have been published to kafka (32ms)
Kafka store should not be null (0ms)
Diagrams
Details:lines
Creating an order writes an outbox message for reliable delivery
Creating an order should write an outbox message that gets processed 117ms🔗
Steps
Given a pancake batch has been created (17ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And a valid order request for the created batch (3ms)
When the breakfast order is placed (19ms)
Then the order response should contain a complete order (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_9019933390544792711' (0ms)
Order steps response items should have count 1 (0ms)
And an outbox message should have been written for the order created event (42ms)
Outbox messages should contain [ m => m.EventType == 'OrderCreatedEvent', $"an outbox message should exist for event type '{eventType}'" ] (0ms)
And the outbox message should have been processed (22ms)
Diagrams
Details:lines
Complete Order Lifecycle
/orders - Complete order lifecycle from creation through to completion
An order should progress through all status transitions to completion Happy Path 190ms🔗
Steps
Given a pancake batch has been created (25ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And a breakfast order has been placed for the batch (21ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the order progresses through all statuses to completed (47ms)
Patch steps response message status code should be OK (0ms)
Patch steps response message status code should be OK (0ms)
Patch steps response message status code should be OK (0ms)
Then the completed order should be retrievable with all details (39ms)
Get order steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get order steps response order id should be 'e5804843-c0ec-4c70-afc5-3754e060bea6' (0ms)
Get order steps response status should be Completed (0ms)
Get order steps response customer name should be 'LifecycleTestCustomer_987755649001087723' (0ms)
And an audit log entry should exist for the order (42ms)
Audit steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Audit steps response should contain [ a => a.Action == AuditLogDefaults.CreatedAction && a.EntityType == AuditLogDefaults.OrderEntityType && a.Details.Contains('LifecycleTestCustomer_987755649001087723') ] (0ms)
And the cow service should have received a milk request (3ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
And the kitchen service should have received a preparation request (1ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ] (0ms)
Diagrams
(Warning: 36 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Correlation Id
Cross-cutting - X-Correlation-Id header propagation across API responses
Provided correlation IDs are echoed back
A request with a correlation id should return the same id in the response Happy Path 37ms🔗
Steps
Given a request with a known correlation id (0ms)
When the request is sent to the menu endpoint (28ms)
Then the response should contain the same correlation id (3ms)
Response contains correlation id header should be true (0ms)
First correlation id header value should be '023c0fff-af9e-4d07-b256-b00932c43422' (0ms)
Diagrams
Details:lines
Missing correlation IDs are generated automatically
A request without a correlation id should have one generated in the response 11ms🔗
Steps
When a request without a correlation id is sent to the menu endpoint (6ms)
Then the response should contain a generated correlation id (4ms)
Response contains correlation id header should be true (0ms)
First correlation id header value should not be null or empty (0ms)
Diagrams
Details:lines
Customer Preferences Management
/customer-preferences - Managing customer breakfast preferences
Customer preferences support CRUD operations
Saving customer preferences should return the saved preferences Happy Path 9ms🔗
Steps
Given a valid customer preference request (0ms)
When the customer preferences are saved (6ms)
Then the preference response should contain the saved preferences (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 "Oat" (0ms)
Put steps response favourite item should be "Blueberry Pancakes" (0ms)
Diagrams
Details:lines
Retrieving existing customer preferences should return the preferences 66ms🔗
Steps
Given customer preferences exist (7ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
When the customer preferences are retrieved (54ms)
Then the preference get response should contain the preferences (2ms)
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 '4aa27e86e2f645939c442e6b31c88c9e' (0ms)
Get steps response preferred milk type should be "Oat" (0ms)
Get steps response likes extra toppings should be true (0ms)
Diagrams
Details:lines
Non-existent preferences cannot be retrieved
Retrieving non-existent customer preferences should return not found 839ms🔗
Steps
When non-existent customer preferences are retrieved (835ms)
Then the preference get response should indicate not found (1ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
(Warning: 68 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Preference requests must pass validation
Saving customer preferences with missing customer name should return bad request 5ms🔗
Steps
Given a customer preference request with missing customer name (0ms)
When the customer preferences are saved (2ms)
Then the preference response should indicate bad request (0ms)
Put steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Customer preferences support CRUD operations
Updating customer preferences should return the updated preferences 205ms🔗
Steps
Given customer preferences exist (183ms)
Put steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
When the customer preferences are updated (14ms)
Then the preference update 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 preferred milk type should be "Almond" (0ms)
Put steps response favourite item should be "Belgian Waffles" (0ms)
Diagrams
Details:lines
Daily Specials Idempotency
/daily-specials/orders - Idempotent order creation using Idempotency-Key header
Submitting the same order with different idempotency keys should return different confirmations 36ms🔗
Background
Given the cinnamon swirl order count is reset (1ms)
Steps
And an order request for the same special (2ms)
When the order is submitted with two different idempotency keys (27ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Then the responses should have different confirmation ids (1ms)
First confirmation id should not be '48db32fc-02af-4784-aa25-5ac1c277c4e8' (0ms)
Diagrams
Details:lines
Submitting the same order with the same idempotency key should return the same confirmation 24ms🔗
Background
Given the cinnamon swirl order count is reset (1ms)
Steps
And an order request with an idempotency key (0ms)
When the order is submitted twice with the same idempotency key (14ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Then both responses should return the same confirmation id (3ms)
First confirmation id should be '3f090a35-0e34-4a9e-ac43-dcc2d08fa68a' (0ms)
Diagrams
Details:lines
Daily Specials Not Found
/daily-specials/orders - Ordering a non-existent daily special
Ordering a non-existent daily special should return not found 12ms🔗
Steps
Given a daily special order request for a non-existent special (6ms)
When the daily special order is submitted (1ms)
Then the daily special response should indicate not found (0ms)
Post steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Daily Specials Ordering
/daily-specials - Ordering daily specials with threshold limits
Valid daily special orders are fulfilled
A valid daily special order should return a confirmation Happy Path 50ms🔗
Steps
Given the cinnamon swirl order count is reset (16ms)
And a valid daily special order request for cinnamon swirl (0ms)
When the daily special order is submitted (17ms)
Then the daily special order response should contain a valid confirmation (10ms)
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
Orders are rejected when the daily limit is reached
Ordering a daily special beyond the threshold should return a conflict response IgnoreIfExternalSut 10ms🔗
Steps
Given the matcha waffles order count is reset (2ms)
And the matcha waffles special has been ordered up to the configured limit (3ms)
Post steps response message status code should be Created (0ms)
When another order is placed for the matcha waffles special (2ms)
Then the response should indicate the daily special is sold out (0ms)
Post steps response message status code should be Conflict (0ms)
Diagrams
Details:lines
Remaining quantity decreases with each order
Remaining quantity should decrease after each order IgnoreIfExternalSut 24ms🔗
Steps
Given the lemon ricotta order count is reset (4ms)
And a daily special order for lemon ricotta of quantity one is placed (8ms)
Post steps response message status code should be Created (0ms)
When the available daily specials are requested (0ms)
Then the lemon ricotta special should have one fewer remaining (1ms)
Response content is valid json should be true (0ms)
Lemon ricotta remaining quantity should be MaxOrdersPerSpecial - 1 (0ms)
Diagrams
Details:lines
Valid daily special orders are fulfilled
The daily specials endpoint should return all available specials 33ms🔗
Steps
When the available daily specials are requested (22ms)
Then the daily specials response should contain all expected specials (10ms)
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
Daily Specials Validation
/daily-specials/orders - Input validation for daily special orders
Daily specials order endpoint is called with invalid fields should return a bad request response 2/2 passed 102ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Quantity0Quantity must be > zeroQuantity must be greater than zero.Bad RequestPassed92ms
2SpecialIdSpecialId is required'Special Id' is required.Bad RequestPassed9ms
Steps
Given a valid daily special order request with "Quantity" set to "0" (20ms)
When the invalid daily special order request is submitted (41ms)
Then the daily special response should contain error "Quantity must be greater than zero." with status "Bad Request" (26ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Quantity must be greater than zero.') ] (0ms)
Diagrams
Details:lines
Degraded Health Check
/health - Health check endpoint reporting degraded status when downstream services are unavailable
Health check should report degraded when multiple downstream services are unavailable SkipUnlessFakesControllable 118ms🔗
Background
Given the cow service is configured to be unreachable (8ms)
Steps
And the supplier service is configured to be unreachable (0ms)
When the health check endpoint is called (101ms)
Then the health check response should indicate a degraded status (0ms)
Health response status code should be OK (0ms)
Health check result status should be Degraded (0ms)
And the cow service dependency should report degraded (1ms)
Health check result results should contain key CowService (0ms)
Cow service health status should be Degraded (0ms)
And the supplier service dependency should report degraded (1ms)
Health check result results should contain key SupplierService (0ms)
Supplier service health status should be Degraded (0ms)
Diagrams
Details:lines
Health check should report degraded when the cow service is unavailable SkipUnlessFakesControllable 217ms🔗
Background
Given the cow service is configured to be unreachable (8ms)
Steps
When the health check endpoint is called (213ms)
Then the health check response should indicate a degraded status (1ms)
Health response status code should be OK (0ms)
Health check result status should be Degraded (0ms)
And the cow service dependency should report degraded (0ms)
Health check result results should contain key CowService (0ms)
Cow service health status should be Degraded (0ms)
Diagrams
Details:lines
Downstream Error Health Check
/health - Health check reports degraded when a downstream service returns a non-success HTTP status
Health check should report degraded when a downstream service returns a non-success status SkipUnlessFakesControllable 481ms🔗
Steps
Given the kitchen service health check is configured to use a failing endpoint (448ms)
When the health check endpoint is called (24ms)
Then the health check response should indicate a degraded status (2ms)
Health response status code should be OK (0ms)
Health check result status should be Degraded (0ms)
And the kitchen service dependency should report degraded with a status code description (1ms)
Health check result results should contain key KitchenService (0ms)
Kitchen service health status should be Degraded (0ms)
Kitchen service health description should contain "503" (0ms)
Diagrams
Details:lines
Equipment Alerts
/graphql - Querying equipment alerts populated by Event Hub consumption
Equipment alerts should contain data ingested via Event Hub consumer Happy Path 1.8s🔗
Steps
Given a pancake batch has been created (371ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
When the equipment alerts are queried via graphql (1.4s)
Then the graphql response should contain the equipment alert record (25ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps equipment alerts should contain [ a => a.BatchId == 'c90ec8dd-78b2-46c3-ba42-a1808cf74909' && a.EquipmentName == "Griddle" && a.AlertType == "UsageCycleCompleted" ] (0ms)
Diagrams
Details:lines
Feedback Management
/feedback - Submitting and retrieving customer feedback
Feedback can be submitted and retrieved
Submitting feedback should return the created feedback Happy Path 11ms🔗
Steps
Given a valid feedback request (0ms)
When the feedback is submitted (7ms)
Then the feedback response should contain the created feedback (1ms)
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
Listing feedback for an order should return the feedback 60ms🔗
Steps
Given a feedback entry exists (30ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the feedback is retrieved by order id (21ms)
Then the feedback list response should contain the feedback (5ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps list response should contain [ f => f.FeedbackId == '46bd731b-4d28-4409-8a90-b757c4998423' ] (0ms)
Diagrams
Details:lines
Retrieving existing feedback by id should return the feedback 20ms🔗
Steps
Given a feedback entry exists (5ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the feedback is retrieved by id (11ms)
Then the feedback 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 '5f161554-efb2-455a-b2b1-167c85f66155' (0ms)
Get steps response customer name should be 'CustomerName' (0ms)
Get steps response rating should be 4 (0ms)
Diagrams
Details:lines
Non-existent feedback cannot be retrieved
Retrieving non-existent feedback should return not found 21ms🔗
Steps
When a non-existent feedback is retrieved (19ms)
Then the feedback get response should indicate not found (0ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Feedback requests must pass validation
Submitting feedback with invalid rating should return bad request 6ms🔗
Steps
Given a feedback request with an invalid rating (0ms)
When the feedback is submitted (4ms)
Then the feedback response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Submitting feedback with missing customer name should return bad request 8ms🔗
Steps
Given a feedback request with missing customer name (2ms)
When the feedback is submitted (3ms)
Then the feedback response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Goat Milk Downstream Failure
/goat-milk - Handling downstream Goat Service failures
Requesting goat milk when the goat service is unavailable should return a bad gateway response SkipUnlessFakesControllable 9ms🔗
Steps
Given the goat service will return service unavailable (0ms)
When goat milk is requested (4ms)
Then the goat milk response should indicate a bad gateway (1ms)
Goat milk steps response message status code should be BadGateway (0ms)
Goat milk error response body should contain GoatServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Requesting goat milk when the goat service returns an invalid response should return a bad gateway response SkipUnlessFakesControllable 6ms🔗
Steps
Given the goat service will return an invalid response (0ms)
When goat milk is requested (4ms)
Then the goat milk response should indicate a bad gateway (0ms)
Goat milk steps response message status code should be BadGateway (0ms)
Goat milk error response body should contain GoatServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Goat Milk Feature Flag
/goat-milk - Goat milk availability controlled by feature flag
Goat milk is available when the feature flag is enabled
Goat milk endpoint should return fresh goat milk when feature is enabled IgnoreIfExternalSut 265ms🔗
Steps
Given the goat milk feature flag is enabled (229ms)
When goat milk is requested (33ms)
Then the goat milk response should contain fresh goat milk (0ms)
Goat milk steps response message status code should be OK (0ms)
Goat milk steps goat milk response goat milk should be FreshGoatMilk (0ms)
Diagrams
Details:lines
Goat milk is hidden when the feature flag is disabled
Goat milk endpoint should return not found when feature is disabled IgnoreIfExternalSut 155ms🔗
Steps
Given the goat milk feature flag is disabled (131ms)
When goat milk is requested (18ms)
Then the goat milk response should indicate feature disabled (1ms)
Goat milk steps response message status code should be NotFound (0ms)
Goat milk feature disabled response body should contain FeatureDisabled (0ms)
Diagrams
Details:lines
Goat Milk Sourcing
/goat-milk - Retrieving goat milk from the Goat Service
A valid goat milk request should return fresh goat milk Happy Path 29ms🔗
Steps
When goat milk is requested (25ms)
Then the goat milk response should contain fresh goat milk (1ms)
Goat milk steps response message status code should be OK (0ms)
Goat milk steps goat milk response goat milk should be FreshGoatMilk (0ms)
Diagrams
Details:lines
Header Propagation
/milk; /menu - X-Correlation-Id header propagation to downstream services
A request with a correlation id should forward it to the cow service Happy Path SkipUnlessFakesControllable 11ms🔗
Background
Given a request with a known correlation id (0ms)
Steps
When milk is requested with the correlation id (7ms)
Then the cow service should have received the correlation id (1ms)
Requests should not be empty (0ms)
Request headers should contain key CorrelationId (0ms)
Request headers[ custom headers correlation id] should be '112bad74-b74f-4e30-b61a-1500c866cddd' (0ms)
Diagrams
Details:lines
A request with a correlation id should forward it to the supplier service SkipUnlessFakesControllable 27ms🔗
Background
Given a request with a known correlation id (0ms)
Steps
And the menu cache is cleared (6ms)
When the menu is requested with the correlation id (10ms)
Then the supplier service should have received the correlation id (7ms)
Requests should not be empty (0ms)
Request headers should contain key CorrelationId (0ms)
Request headers[ custom headers correlation id] should be '6bc7999a-5d46-4f38-b195-d8ed6f847658' (0ms)
Diagrams
Details:lines
Health Check
/health - Health check endpoint with dependency status for monitoring
The health check endpoint should return a healthy status with dependency details Happy Path 15ms🔗
Steps
When the health check endpoint is called (10ms)
Then the health check response should indicate healthy with all dependencies (2ms)
Health response status code should be OK (0ms)
Health check result should not be null (0ms)
Health check result status should be Healthy (0ms)
Health check result results should contain key CowService (0ms)
Health check result results should contain key GoatService (0ms)
Health check result results should contain key SupplierService (0ms)
Health check result results should contain key KitchenService (0ms)
Health check result results should contain key CosmosDb (0ms)
Health check result results should contain key Kafka (0ms)
Diagrams
Details:lines
Health Check Detail
/health - Health check response includes detailed entry descriptions and data
The health check response should include description and data for each entry 412ms🔗
Steps
When the health check endpoint is called (278ms)
Then the health check response should contain detailed entries (83ms)
Health response status code should be OK (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check entry status should not be null or empty $"'{entry.Key}' should have a status" (0ms)
Health check result results should contain key 'CowService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check result results should contain key 'GoatService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check result results should contain key 'SupplierService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check result results should contain key 'KitchenService' (0ms)
Health check description should not be null or empty $"'{checkName}' should have a description" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Health check entry data should not be null $"'{entry.Key}' should have a data object" (0ms)
Diagrams
Details:lines
Heartbeat
/heartbeat - Heartbeat endpoint confirming the service is running
The heartbeat endpoint should return a running message Happy Path 11ms🔗
Steps
When the heartbeat endpoint is called (6ms)
Then the heartbeat response should indicate the service is running (2ms)
Heartbeat response status code should be OK (0ms)
Result should not be null (0ms)
Result status should be HeartbeatStatus (0ms)
Diagrams
Details:lines
Ingredient Usage Analytics
/ingredient-usage - Recording and summarising ingredient usage (BigQuery)
Recording ingredient usage should return the created record Happy Path 20ms🔗
Steps
Given a valid ingredient usage request (0ms)
When the ingredient usage is recorded (3ms)
Then the usage response should contain the created record (3ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response ingredient name should be 'Flour-2d9a52c56d284e1f8fe57553d9f0b342' (0ms)
Post steps response quantity used should be '5m' (0ms)
Post steps response usage id should not be null or empty (0ms)
Diagrams
Details:lines
Getting usage summary should return aggregated data 97ms🔗
Steps
Given an ingredient usage record has been created (3ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the usage summary is requested (74ms)
Then the summary should contain aggregated data (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.IngredientName == 'Flour-360d85ab65be476a8ef37e1ddae90f46' ] (0ms)
Diagrams
Details:lines
Listing usage by ingredient should return matching records 726ms🔗
Steps
Given an ingredient usage record has been created (90ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the usage is listed by ingredient name (629ms)
Then the usage list response should contain the record (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 [ u => u.IngredientName == 'Flour-b9be93c0ea4f4d45a1ff20050785def4' ] (0ms)
Diagrams
Details:lines
Recording usage with missing ingredient name should return bad request 121ms🔗
Steps
Given an ingredient usage request with a missing ingredient name (1ms)
When the ingredient usage is recorded (112ms)
Then the usage post response should indicate bad request (2ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Recording usage with zero quantity should return bad request 13ms🔗
Steps
Given an ingredient usage request with zero quantity (0ms)
When the ingredient usage is recorded (11ms)
Then the usage post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Inventory Management
/inventory - Managing ingredient inventory with full CRUD operations
Inventory items support full CRUD operations
Adding a new inventory item should return the created item Happy Path 10ms🔗
Steps
Given a valid inventory item request (0ms)
When the inventory item is submitted (5ms)
Then the inventory 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 22ms🔗
Steps
Given an inventory item exists (3ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the inventory item is deleted (15ms)
Then the inventory delete response should indicate no content (0ms)
Delete steps response message status code should be NoContent (0ms)
Diagrams
Details:lines
Listing all inventory items should return all items 76ms🔗
Steps
Given an inventory item exists (16ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When all inventory items are requested (53ms)
Then the inventory list response should contain the item (4ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps list response should contain [ i => i.Id == '2' ] (0ms)
Diagrams
Details:lines
Non-existent inventory items cannot be retrieved
Retrieving a non-existent inventory item should return not found 6ms🔗
Steps
When a non-existent inventory item is retrieved (3ms)
Then the inventory get response should indicate not found (1ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Inventory items support full CRUD operations
Retrieving an existing inventory item should return the item 177ms🔗
Steps
Given an inventory item exists (124ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the inventory item is retrieved by id (37ms)
Then the inventory get response should contain the item (4ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response id should be '1' (0ms)
Get steps response name should be 'Name' (0ms)
Diagrams
Details:lines
Updating an inventory item should return the updated item 29ms🔗
Steps
Given an inventory item exists (3ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the inventory item is updated (22ms)
Then the inventory update response should contain the updated values (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
Kitchen Service Failure
/orders - Creating orders when the Kitchen Service returns an error
Creating an order when the kitchen service returns an error should still create the order SkipUnlessFakesControllable 27ms🔗
Steps
Given a pancake batch has been created (9ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And a valid order request for the created batch (0ms)
And the kitchen service is configured to return busy (0ms)
When the breakfast order is placed (11ms)
Then the order should still be created successfully despite the kitchen failure (1ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
Diagrams
Details:lines
Menu Availability
/menu - Checking menu item availability from ingredient sources
The menu endpoint should return all menu items with availability status Happy Path 10ms🔗
Steps
When the menu is requested (1ms)
Then the menu response should contain all menu items (6ms)
Menu steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Menu steps response should contain [ m => m.Name == MenuDefaults.ClassicPancakes ] (0ms)
Menu steps response should contain [ m => m.Name == MenuDefaults.BelgianWaffles ] (0ms)
Menu steps response should contain [ m => m.Name == MenuDefaults.GoatMilkPancakes ] (0ms)
Diagrams
Details:lines
Menu Caching
/menu - Menu response caching behaviour
Menu responses should be cached and returned even when supplier becomes unavailable SkipUnlessFakesControllable 41ms🔗
Steps
Given the menu has been requested and cached (6ms)
Menu steps response message status code should be OK (0ms)
And the supplier service is then made unavailable (1ms)
When the menu is requested again (2ms)
Then the menu response should still return available items (1ms)
Steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Steps response should contain [ m => m.IsAvailable ] (0ms)
Diagrams
Details:lines
Menu Downstream Failure
/menu - Menu behaviour when Supplier Service is unavailable
All menu items should be marked unavailable when the supplier service is down SkipUnlessFakesControllable 412ms🔗
Steps
Given the supplier service will return service unavailable (222ms)
When the menu is requested (102ms)
Then the menu response should mark all items as unavailable (38ms)
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
Milk Downstream Failure
/milk - Handling downstream Cow Service failures
Requesting milk when the cow service is unavailable should return a bad gateway response SkipUnlessFakesControllable 36ms🔗
Steps
Given the cow service will return service unavailable (5ms)
When milk is requested (28ms)
Then the milk response should indicate a bad gateway (0ms)
Milk steps response message status code should be BadGateway (0ms)
Milk error response body should contain CowServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Requesting milk when the cow service returns an invalid response should return a bad gateway response SkipUnlessFakesControllable 412ms🔗
Steps
Given the cow service will return an invalid response (33ms)
When milk is requested (246ms)
Then the milk response should indicate a bad gateway (63ms)
Milk steps response message status code should be BadGateway (0ms)
Milk error response body should contain CowServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Requesting milk when the cow service times out should return a bad gateway response SkipUnlessFakesControllable 61ms🔗
Steps
Given the cow service will return a timeout (5ms)
When milk is requested (52ms)
Then the milk response should indicate a bad gateway (0ms)
Milk steps response message status code should be BadGateway (0ms)
Milk error response body should contain CowServiceUnavailableTitle (0ms)
Diagrams
Details:lines
Order Cross Field Validation
/orders - Cross-field validation with configurable item limits
An order at the maximum items per order should be accepted IgnoreIfExternalSut 313ms🔗
Background
Given the maximum items per order is configured to two (221ms)
And a pancake batch has been created (62ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
Steps
And an order request with two items (1ms)
When the order is submitted (23ms)
Then the response should indicate success (1ms)
Order steps response message status code should be Created (0ms)
Diagrams
Details:lines
An order exceeding the maximum items per order should be rejected IgnoreIfExternalSut 155ms🔗
Background
Given the maximum items per order is configured to two (221ms)
And a pancake batch has been created (62ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
Steps
And an order request with three items (1ms)
When the order is submitted (11ms)
Then the response should indicate a validation error (0ms)
Order steps response message status code should be BadRequest (0ms)
And the error message should reference the item limit (1ms)
Order validation error response body should contain "Items" (0ms)
Diagrams
Details:lines
Order Pagination
/orders - Paginated listing of breakfast orders
Listing orders should return a paginated response Happy Path 98ms🔗
Steps
Given multiple orders have been created (79ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response message status code should be Created (0ms)
Order steps response message status code should be Created (0ms)
When orders are listed with default pagination (10ms)
Then the paginated response should contain the orders (7ms)
List steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
List steps response items should have count greater than or equal to '2' (0ms)
And the paginated response should have correct page metadata (0ms)
Response content is valid json should be true (0ms)
List steps response page should be greater than or equal to 1 (0ms)
List steps response total count should be greater than or equal to '2' (0ms)
Diagrams
(Warning: 39 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Listing orders when none exist should return an empty page IgnoreIfNeedsDirectDbAccess IgnoreUnlessInMemoryDb 16ms🔗
Steps
When orders are listed with default pagination (11ms)
Then the paginated response should be empty (2ms)
List steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Diagrams
Details:lines
Listing orders with a small page size should limit results 51ms🔗
Steps
Given multiple orders have been created (27ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response message status code should be Created (0ms)
Order steps response message status code should be Created (0ms)
When orders are listed with page 1 and page size 1 (21ms)
Then the paginated response should have correct page metadata (0ms)
Response content is valid json should be true (0ms)
List steps response page should be greater than or equal to 1 (0ms)
List steps response total count should be greater than or equal to '2' (0ms)
Diagrams
(Warning: 39 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Requesting the second page should return different orders 2.2s🔗
Steps
Given multiple orders have been created (2.1s)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response message status code should be Created (0ms)
Order steps response message status code should be Created (0ms)
When orders are listed with page 2 and page size 1 (39ms)
Then the paginated response should have correct page metadata (9ms)
Response content is valid json should be true (0ms)
List steps response page should be greater than or equal to 1 (0ms)
List steps response total count should be greater than or equal to '2' (0ms)
Diagrams
(Warning: 40 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Order Rate Limiting
/orders - Rate limiting on order creation
Exceeding the rate limit should return too many requests IgnoreIfExternalSut 256ms🔗
Steps
Given the rate limit is configured to allow one request per window (153ms)
And a pancake batch has been created (58ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And a valid order request (0ms)
When the order is submitted twice in rapid succession (37ms)
Then the first request should succeed (1ms)
First response status code should be Created (0ms)
And the second request should be rate limited (0ms)
Second response status code should be TooManyRequests (0ms)
Diagrams
(Warning: 30 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Order Retrieval
/orders - Retrieving orders by ID
Existing orders can be retrieved
A created order should be retrievable by its ID Happy Path IgnoreIfNeedsEventInfrastructure 41ms🔗
Steps
Given an order has been created (32ms)
Response content is valid json should be true (0ms)
Response content is valid json should be true (0ms)
When the order is retrieved by id (3ms)
Then the order retrieval response should contain the order (3ms)
Get order steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get order steps response order id should be 'bd9643a9-1fbf-4230-b687-11b3b0524ecc' (0ms)
Diagrams
Details:lines
Non-existent orders return not found
Retrieving a non-existent order should return not found 62ms🔗
Steps
When a non-existent order is retrieved (58ms)
Then the order retrieval response should indicate not found (1ms)
Get order steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Order Status Transition
/orders - Order status transitions following the order lifecycle
Valid status transitions are accepted
A valid status transition should update the order 4/4 passed 165ms🔗
#Input ParametersStatusDuration
From StatusTo Status
1CreatedCancelledPassed43ms
2CreatedPreparingPassed50ms
3PreparingReadyPassed28ms
4ReadyCompletedPassed42ms
Steps
Given an order exists with status "Created" (35ms)
Response content is valid json should be true (0ms)
Response content is valid json should be true (0ms)
When the order status is updated to "Cancelled" (6ms)
Then the order status should be updated successfully to "Cancelled" (0ms)
Patch steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Patch steps response status should be 'Cancelled' (0ms)
Diagrams
Details:lines
Invalid status transitions are rejected
An invalid status transition should return a conflict response 7/7 passed 347ms🔗
#Input ParametersStatusDuration
From StatusTo Status
1CancelledPreparingPassed42ms
2CancelledReadyPassed53ms
3CompletedPreparingPassed53ms
4CreatedCompletedPassed89ms
5CreatedReadyPassed47ms
6PreparingCancelledPassed32ms
7ReadyPreparingPassed28ms
Steps
Given an order exists with status "Cancelled" (39ms)
Response content is valid json should be true (0ms)
Response content is valid json should be true (0ms)
Patch steps response message status code should be OK (0ms)
When the order status is updated to "Preparing" (1ms)
Then the response should indicate an invalid state transition (0ms)
Patch steps response message status code should be Conflict (0ms)
Diagrams
Details:lines
Order Status Via G RPC
/grpc - Retrieving order status via gRPC
Order status via gRPC should return order details Happy Path 130ms🔗
Steps
Given a pancake batch has been created (45ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And an order has been created for the batch (61ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When the order status is requested via gRPC (20ms)
Then the gRPC response should contain the order details (1ms)
Grpc steps order status reply should not be null (0ms)
Grpc steps order status reply order id should be orderSteps.Response.OrderId.ToString() (0ms)
Grpc steps order status reply customer name should be 'TestCustomer_4093842508475643706' (0ms)
Grpc steps order status reply status should be Created (0ms)
Diagrams
(Warning: 31 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Order status for non-existent order should return not found 59ms🔗
Steps
When the order status for a non-existent order is requested via gRPC (47ms)
Then the gRPC response should be 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
Details:lines
Order Summaries
/graphql - Querying order summary reports via GraphQL
Order summaries should contain ingested order data Happy Path IgnoreIfNeedsDirectDbAccess 31ms🔗
Steps
Given an order has been created and ingested into the reporting database (3ms)
When the order summaries are queried via graphql (16ms)
Then the graphql response should contain the ingested order summary (8ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps order summaries should contain [ o => o.OrderId == '4b801808-9ab4-4a58-8cae-43e1f1b32960' && o.CustomerName == 'TestCustomer_4857168459066677736' && o.ItemCount == 3 && o.TableNumber == 7 ] (0ms)
Diagrams
Details:lines
Order summaries should return an empty list when no orders exist 17ms🔗
Steps
When the order summaries are queried via graphql (10ms)
Then the graphql response should be successful (0ms)
Graph ql steps response message status code should be OK (0ms)
And the order summaries list should be empty or not contain the test order (5ms)
Graph ql steps order summaries should not contain [ o => o.OrderId == 'b484d44f-156d-424b-b1f8-82a85360fa94' ] (0ms)
Diagrams
Details:lines
Order Validation
/orders - Input validation for order creation and status updates
Order status update endpoint is called with invalid fields should return a bad request response 1/1 passed 22ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1StatusStatus is required'Status' is required.Bad RequestPassed22ms
Steps
Given a valid status update request with "Status" set to "" (1ms)
When the invalid status update request is submitted (7ms)
Then the status update response should contain error "'Status' is required." with status "Bad Request" (10ms)
Actual results should contain [ r => r.ErrorMessage.Contains(''Status' is required.') ] (0ms)
Diagrams
Details:lines
Orders endpoint is called with invalid fields should return a bad request response 5/5 passed 43ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1CustomerNameCustomer name is required'Customer Name' is required.Bad RequestPassed16ms
2Items[0].BatchIdBatch ID is required'Batch Id' is required.Bad RequestPassed6ms
3Items[0].ItemTypeItem type is required'Item Type' is required.Bad RequestPassed9ms
4Items[0].Quantity0Quantity must be greater than zeroQuantity must be greater than zero.Bad RequestPassed6ms
5ItemsAt least one item is requiredThe Items field is required.Bad RequestPassed4ms
Steps
Given a valid order request with "CustomerName" set to "" (5ms)
When the invalid order request is submitted (3ms)
Then the order response should contain error "'Customer Name' is required." with status "Bad Request" (4ms)
Actual results should contain [ r => r.ErrorMessage.Contains(''Customer Name' is required.') ] (0ms)
Diagrams
Details:lines
Outbox Retry Exhaustion
/orders - Outbox message transitions to failed after exhausting retries
An outbox message should transition to failed after exhausting retries IgnoreIfNeedsEventInfrastructure 1.2s🔗
Steps
Given the outbox processor is configured with a failing dispatcher (137ms)
And a pending outbox message with a test-specific destination (6ms)
Then the outbox message should be in a failed state (1.0s)
Sequence Diagrams
Details:lines
Pancakes Content Negotiation
/pancakes - Content negotiation and unsupported media types
Sending a request with an unsupported content type should return an unsupported media type response 3/3 passed 21ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed13ms
2text/htmlPassed3ms
3text/plainPassed4ms
Steps
Given a pancake request with content type "application/xml" (0ms)
When the pancakes are prepared with the given content type (5ms)
Then the response should indicate unsupported media type (1ms)
Response status code should be UnsupportedMediaType (0ms)
Diagrams
Details:lines
Pancakes Creation
/pancakes - Creating pancakes with ingredients and optional toppings
A valid pancake request should return a fresh batch Happy Path 20ms🔗
Steps
Given a valid pancake recipe with all ingredients (4ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
When the pancakes are prepared (8ms)
Then the pancakes 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 'Milk' (0ms)
Pancake steps response ingredients should contain 'Eggs' (0ms)
Pancake steps response ingredients should contain 'Flour' (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
A pancake request with more toppings than allowed should return a bad request response IgnoreIfExternalSut 16ms🔗
Steps
Given the max toppings per item is the configured limit (0ms)
And a valid pancake recipe with all ingredients (6ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
And the request has more toppings than the configured limit (2ms)
When the pancakes are prepared (2ms)
Then the pancakes response should indicate too many toppings (1ms)
Pancake steps response message status code should be BadRequest (0ms)
Pancake error response body should contain MaxToppingsExceeded (0ms)
Diagrams
Details:lines
Pancakes endpoint is called with invalid ingredients should return a bad request response 6/6 passed 52ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1EggsEggs is required'Eggs' is required.Bad RequestPassed3ms
2Eggsjavascript:void(0)XSS in eggsEggs contains potentially dangerous content.Bad RequestPassed4ms
3Flour<img onerror=x>XSS in flourFlour contains potentially dangerous content.Bad RequestPassed3ms
4FlourFlour is required'Flour' is required.Bad RequestPassed3ms
5Milk<script>alert</script>XSS in milkMilk contains potentially dangerous content.Bad RequestPassed32ms
6MilkMilk is required'Milk' is required.Bad RequestPassed4ms
Steps
Given a valid pancake request with "Eggs" set to "" (0ms)
When the invalid pancake request is submitted (1ms)
Then the response should contain error "'Eggs' is required." with status "Bad Request" (1ms)
Actual results should contain [ r => r.ErrorMessage.Contains(''Eggs' is required.') ] (0ms)
Diagrams
Details:lines
Recipe Reports
/graphql - Querying recipe reports and aggregations via GraphQL
Recipe reports should contain ingested recipe data Happy Path IgnoreIfNeedsDirectDbAccess 22ms🔗
Steps
Given recipe logs have been ingested into the reporting database (2ms)
When the recipe reports are queried via graphql (10ms)
Then the graphql response should contain the ingested recipe reports (7ms)
Graph ql steps response message status code should be OK (0ms)
Graph ql steps recipe reports should contain [ r => r.OrderId == '28de65e4-2e7f-4182-ba7d-c9d8ec73d451' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ] (0ms)
Diagrams
Details:lines
Ingredient usage should aggregate across multiple recipes IgnoreIfNeedsDirectDbAccess 34ms🔗
Steps
Given multiple recipe logs have been ingested with overlapping ingredients (3ms)
When the ingredient usage is queried via graphql (16ms)
Then the ingredient usage should reflect aggregated counts (10ms)
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
Recipe Reviews Management
/recipe-reviews - Submitting and retrieving recipe reviews (MongoDB)
Submitting a recipe review should return the created review Happy Path 86ms🔗
Steps
Given a valid recipe review request (1ms)
When the recipe review is submitted (74ms)
Then the recipe review response should contain the created review (7ms)
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-91f209c670f4499680fd0f13b16107b8' (0ms)
Post steps response rating should be 5 (0ms)
Post steps response review id should not be null or empty (0ms)
Diagrams
Details:lines
Listing reviews by recipe should return matching reviews 157ms🔗
Steps
Given a recipe review has been created (5ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the reviews are listed by recipe name (145ms)
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 == '2961cf3d-5a72-40ea-af9a-6d8a8ab9631d' ] (0ms)
Diagrams
Details:lines
Retrieving a non-existent review should return not found 24ms🔗
Steps
When a non-existent review is retrieved (22ms)
Then the review get response should indicate not found (0ms)
Get steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Retrieving existing review by id should return the review 14ms🔗
Steps
Given a recipe review has been created (4ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the review is retrieved by id (4ms)
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 '3d19adfb-8632-4d96-a44e-75c97d25788b' (0ms)
Get steps response recipe name should be 'Recipe-2aa60219bcc3446eb8bbc1924a392c3a' (0ms)
Diagrams
Details:lines
Submitting a review with an invalid rating should return bad request 10ms🔗
Steps
Given a recipe review request with an invalid rating (6ms)
When the recipe review is submitted (2ms)
Then the review post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Submitting a review with missing recipe name should return bad request 11ms🔗
Steps
Given a recipe review request with a missing recipe name (3ms)
When the recipe review is submitted (3ms)
Then the review post response should indicate bad request (0ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Recipe Summary Via G RPC
/grpc - Retrieving recipe summaries via gRPC
Pancake recipe summary should return correct data Happy Path 153ms🔗
Steps
When a recipe summary is requested for "Pancakes" via gRPC (16ms)
Then the recipe summary should contain 42 total batches (1ms)
Grpc steps recipe summary reply total batches should be '42' (0ms)
And the recipe summary should contain ingredients "Milk, Flour, Eggs" (130ms)
Grpc steps recipe summary reply common ingredients should be equivalent to '[ "Milk", "Flour", "Eggs" ]' (0ms)
Diagrams
Details:lines
Waffle recipe summary should return correct data Happy Path 19ms🔗
Steps
When a recipe summary is requested for "Waffles" via gRPC (12ms)
Then the recipe summary should contain 28 total batches (0ms)
Grpc steps recipe summary reply total batches should be '28' (0ms)
And the recipe summary should contain ingredients "Milk, Flour, Eggs, Butter" (4ms)
Grpc steps recipe summary reply common ingredients should be equivalent to '[ "Milk", "Flour", "Eggs", "Butter" ]' (0ms)
Diagrams
Details:lines
Unknown recipe type should return zero batches 32ms🔗
Steps
When a recipe summary is requested for "Unknown" via gRPC (20ms)
Then the recipe summary should contain 0 total batches (0ms)
Grpc steps recipe summary reply total batches should be '0' (0ms)
And the recipe summary should contain no ingredients (8ms)
Grpc steps recipe summary reply common ingredients should be empty (0ms)
Diagrams
Details:lines
Reservations Management
/reservations - Managing table reservations with full CRUD operations and cancellation
Reservations can be created and retrieved
Creating a reservation should return the confirmed reservation Happy Path 8ms🔗
Steps
Given a valid reservation request (0ms)
When the reservation is submitted (4ms)
Then the reservation response should contain the confirmed booking (1ms)
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
Reservations can be cancelled once
Cancelling a reservation should return the cancelled reservation 12ms🔗
Steps
Given a reservation exists (4ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the reservation is cancelled (4ms)
Then the cancellation response should indicate the reservation is cancelled (2ms)
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 197ms🔗
Steps
Given a cancelled reservation exists (178ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Cancel steps response message status code should be OK (0ms)
When the reservation is cancelled again (7ms)
Then the cancellation response should indicate a conflict (1ms)
Cancel steps response message status code should be Conflict (0ms)
Diagrams
Details:lines
Reservations can be deleted
Deleting a reservation should return no content 27ms🔗
Steps
Given a reservation exists (13ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the reservation is deleted (12ms)
Then the reservation delete response should indicate no content (1ms)
Delete response status code should be NoContent (0ms)
Diagrams
Details:lines
Reservations can be created and retrieved
Retrieving an existing reservation should return the reservation 24ms🔗
Steps
Given a reservation exists (8ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the reservation is retrieved by id (11ms)
Then the reservation get response should contain the reservation (3ms)
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 Async Api
/asyncapi/asyncapi.json - Serving the AsyncAPI specification describing event-driven messaging
The AsyncApi endpoint should return a valid specification Happy Path 227ms🔗
Steps
When the asyncapi endpoint is called (170ms)
Then the response should be valid (4ms)
Async api response status code should be OK (0ms)
Async api response is valid json should be true $"response body (first 500 chars): {_asyncApiJsonString?[..Math.Min(_asyncApiJsonString.Length, 500)]}" (0ms)
And the asyncapi spec is written to disk (44ms)asyncapi.json
Async api json root element get property("asyncapi") should not be null (0ms)
Async api json root element get property("info") should not be null (0ms)
Async api json root element get property("default content type") should not be null (0ms)
Async api json root element get property("channels") should not be null (0ms)
Async api json root element get property("operations") should not be null (0ms)
Async api json root element get property("components") should not be null (0ms)
Diagrams
Details:lines
Specifications Open Api
/swagger/v1/swagger.json - Serving the OpenAPI specification describing all REST endpoints
The OpenApi endpoint should return a valid specification Happy Path 393ms🔗
Steps
When the open api endpoint is called (383ms)
Then the response should be valid (2ms)
Swagger response status code should be OK (0ms)
Open api response is valid json should be true (0ms)
And the response should contain all the endpoints (1ms)
Paths get property( endpoints swagger pancakes path) should not be null (0ms)
Paths get property( endpoints swagger waffles path) should not be null (0ms)
Paths get property( endpoints swagger orders path) should not be null (0ms)
Paths get property( endpoints swagger order by id path) should not be null (0ms)
Paths get property( endpoints swagger toppings path) should not be null (0ms)
Paths get property( endpoints swagger menu path) should not be null (0ms)
Paths get property( endpoints swagger milk path) should not be null (0ms)
Paths get property( endpoints swagger eggs path) should not be null (0ms)
Paths get property( endpoints swagger flour path) should not be null (0ms)
Paths get property( endpoints swagger goat milk path) should not be null (0ms)
Paths get property( endpoints swagger audit logs path) should not be null (0ms)
And the openapi spec is written to disk (2ms)openapi.json
Diagrams
Details:lines
Specifications Open Api Scalar UI
/scalar/v1 - Serving the interactive API documentation UI powered by Scalar
The Scalar UI endpoint should return a valid page Happy Path 211ms🔗
Steps
When the scalar ui endpoint is called (206ms)
Then the response should be a valid scalar page (1ms)
Scalar response status code should be OK (0ms)
Scalar ui response body should contain "<html" (0ms)
Scalar ui response body should contain "scalar" (0ms)
Diagrams
Details:lines
Staff Management
/staff - Managing kitchen staff members with full CRUD operations
Staff members support CRUD operations
Adding a new staff member should return the created member Happy Path 15ms🔗
Steps
Given a valid staff member request (2ms)
When the staff member is submitted (10ms)
Then the staff response should contain the created member (2ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response name should be 'Name' (0ms)
Post steps response role should be "Chef" (0ms)
Diagrams
Details:lines
Staff requests must pass validation
Adding a staff member with an invalid role should return a bad request response 19ms🔗
Steps
Given a staff member request with an invalid role (0ms)
When the staff member is submitted (16ms)
Then the staff response should indicate bad request (1ms)
Post steps response message status code should be BadRequest (0ms)
Diagrams
Details:lines
Staff members support CRUD operations
Deleting a staff member should return no content 45ms🔗
Steps
Given a staff member exists (3ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the staff member is deleted (39ms)
Then the staff delete response should indicate no content (0ms)
Delete response status code should be NoContent (0ms)
Diagrams
Details:lines
Retrieving an existing staff member should return the member 1.0s🔗
Steps
Given a staff member exists (424ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
When the staff member is retrieved by id (566ms)
Then the staff get response should contain the member (13ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response id should be '1' (0ms)
Get steps response name should be 'Name' (0ms)
Get steps response role should be "Chef" (0ms)
Diagrams
Details:lines
Status Update Not Found
/orders - Updating status of a non-existent order
Updating the status of a non-existent order should return not found 29ms🔗
Steps
When a status update is sent for a non-existent order (23ms)
Then the status update response should indicate not found (0ms)
Patch steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Stream Order Updates Via G RPC
/grpc - Streaming order updates via gRPC server streaming
Streaming order updates should return the current status Happy Path 75ms🔗
Steps
Given a pancake batch has been created (10ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And an order has been created for the batch (10ms)
Order steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Order steps response order id should not be empty (0ms)
When order updates are streamed via gRPC (48ms)
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 orderSteps.Response.OrderId.ToString() (0ms)
Grpc steps streamed replies[0] customer name should be 'TestCustomer_3877867903006277200' (0ms)
Grpc steps streamed replies[0] status should be Created (0ms)
Diagrams
(Warning: 31 spans. This might indicate a problem/recursive loop in your test.)Details:lines
Streaming updates for non-existent order should return not found 37ms🔗
Steps
When order updates for a non-existent order are streamed via gRPC (31ms)
Then the gRPC stream should return a not found error (4ms)
Grpc steps rpc exception should not be null (0ms)
Grpc steps rpc exception status code should be NotFound (0ms)
Diagrams
Details:lines
Telemetry
/orders - Structured logging and telemetry verification
Creating an order should emit a structured log entry Happy Path IgnoreIfExternalSut 323ms🔗
Steps
Given the application is configured with an in-memory log capture (113ms)
And a pancake batch has been created (117ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
Pancake steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Pancake steps response should not be null (0ms)
Pancake steps response batch id should not be empty (0ms)
And a valid order request (1ms)
When the order is submitted (68ms)
Then a structured log entry should have been captured for order creation (10ms)
Log provider entries should contain [ e => e.Message.Contains("created for customer") ] (0ms)
Log provider entries should contain [ e => e.Message.Contains(orderSteps.Request.CustomerName) ] (0ms)
Log provider entries should contain [ e => e.Message.Contains("1 items") ] (0ms)
Diagrams
Details:lines
Toppings Deletion
/toppings - Deleting toppings from the system
Existing toppings can be deleted
Deleting an existing topping should return no content Happy Path 33ms🔗
Steps
Given a known topping exists (1ms)
When the topping is deleted (17ms)
Then the delete response should indicate success (4ms)
Delete steps response message status code should be NoContent (0ms)
Diagrams
Details:lines
Non-existent toppings cannot be deleted
Deleting a non-existent topping should return not found 14ms🔗
Steps
Given a topping id that does not exist (9ms)
When the topping is deleted (3ms)
Then the delete response should indicate not found (1ms)
Delete steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Toppings Feature Flag
/toppings - Raspberry topping availability controlled by feature flag
Raspberry topping is hidden when the feature flag is disabled
Toppings should exclude raspberries when the feature flag is disabled IgnoreIfExternalSut 135ms🔗
Steps
Given the raspberry topping feature flag is disabled (114ms)
When the available toppings are requested (13ms)
Then the toppings response should not include raspberries (5ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response should not contain [ t => t.Name == ToppingDefaults.Raspberries ] (0ms)
Diagrams
Details:lines
Raspberry topping is available when the feature flag is enabled
Toppings should include raspberries when the feature flag is enabled IgnoreIfExternalSut 180ms🔗
Steps
Given the raspberry topping feature flag is enabled (135ms)
When the available toppings are requested (35ms)
Then the toppings response should include raspberries (7ms)
Get steps response message status code should be OK (0ms)
Response content is valid json should be true (0ms)
Get steps response should contain [ t => t.Name == ToppingDefaults.Raspberries ] (0ms)
Diagrams
Details:lines
Toppings Management
/toppings - Listing available toppings and adding custom toppings
The toppings endpoint should return all available toppings Happy Path 8ms🔗
Steps
When the available toppings are requested (2ms)
Then the toppings response should contain the default toppings (4ms)
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
Adding a new topping should return the created topping 14ms🔗
Steps
Given a valid topping request (0ms)
When the new topping is submitted (8ms)
Then the topping response should contain the created topping (2ms)
Post steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Post steps response name should be Strawberries (0ms)
Post steps response category should be FruitCategory (0ms)
Diagrams
Details:lines
Toppings Update
/toppings - Updating existing toppings
Existing toppings can be updated
Updating an existing topping should return the updated topping Happy Path 70ms🔗
Steps
Given a known blueberry topping exists (0ms)
And a valid update topping request (1ms)
When the topping is updated (59ms)
Then the update response should contain the updated topping (4ms)
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
Update requests must pass validation and XSS checks
Update toppings endpoint is called with invalid or dangerous input 6/6 passed 66ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Category<script>alert('xss')</script>Script tag in categoryCategory contains potentially dangerous content.Bad RequestPassed15ms
2CategoryCategory is required'Category' is required.Bad RequestPassed8ms
3Categoryjavascript:alert(1)Javascript protocolCategory contains potentially dangerous content.Bad RequestPassed8ms
4Name<img src=x onerror=alert(1)>Event handler in nameName contains potentially dangerous content.Bad RequestPassed10ms
5Name<script>alert('xss')</script>Script tag in nameName contains potentially dangerous content.Bad RequestPassed7ms
6NameName is required'Name' is required.Bad RequestPassed14ms
Background
Given a known topping exists (0ms)
Steps
And a valid update topping request with "Category" set to "<script>alert('xss')</script>" (2ms)
When the invalid update topping request is submitted (6ms)
Then the update response should contain error "Category contains potentially dangerous content." with status "Bad Request" (4ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Category contains potentially dangerous content.') ] (0ms)
Diagrams
Details:lines
Non-existent toppings cannot be updated
Updating a non-existent topping should return not found 14ms🔗
Steps
Given a topping id that does not exist (0ms)
And a valid update topping request (0ms)
When the topping is updated (4ms)
Then the update response should indicate not found (1ms)
Put steps response message status code should be NotFound (0ms)
Diagrams
Details:lines
Toppings XSS Validation
/toppings - XSS and input validation for toppings
Toppings endpoint is called with invalid or dangerous input 6/6 passed 132ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Category<script>alert('xss')</script>Script tag in categoryCategory contains potentially dangerous content.Bad RequestPassed6ms
2CategoryCategory is required'Category' is required.Bad RequestPassed62ms
3Categoryjavascript:alert(1)Javascript protocolCategory contains potentially dangerous content.Bad RequestPassed9ms
4Name<img src=x onerror=alert(1)>Event handler in nameName contains potentially dangerous content.Bad RequestPassed20ms
5Name<script>alert('xss')</script>Script tag in nameName contains potentially dangerous content.Bad RequestPassed14ms
6NameName is required'Name' is required.Bad RequestPassed18ms
Steps
Given a valid topping request with "Category" set to "<script>alert('xss')</script>" (0ms)
When the invalid topping request is submitted (4ms)
Then the topping response should contain error "Category contains potentially dangerous content." with status "Bad Request" (0ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Category contains potentially dangerous content.') ] (0ms)
Diagrams
Details:lines
Waffles Content Negotiation
/waffles - Content negotiation and unsupported media types
Sending a request with an unsupported content type should return an unsupported media type response 3/3 passed 16ms🔗
#Input ParametersStatusDuration
Content Type
1application/xmlPassed2ms
2text/htmlPassed9ms
3text/plainPassed4ms
Steps
Given a waffle request with content type "application/xml" (0ms)
When the waffles are prepared with the given content type (0ms)
Then the waffle response should indicate unsupported media type (0ms)
Response status code should be UnsupportedMediaType (0ms)
Diagrams
Details:lines
Waffles Creation
/waffles - Creating waffles with ingredients including butter
A valid waffle request should return a fresh batch Happy Path 38ms🔗
Steps
Given a valid waffle recipe with all ingredients (5ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
When the waffles are prepared (25ms)
Then the waffles response should contain a valid batch with all ingredients (4ms)
Waffle steps response message status code should be Created (0ms)
Response content is valid json should be true (0ms)
Waffle steps response ingredients should contain 'Milk' (0ms)
Waffle steps response ingredients should contain 'Eggs' (0ms)
Waffle steps response ingredients should contain 'Flour' (0ms)
Waffle steps response ingredients should contain UnsaltedButter (0ms)
And the cow service should have received a milk request (1ms)
Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ] (0ms)
Diagrams
Details:lines
A waffle request with more toppings than allowed should return a bad request response IgnoreIfExternalSut 17ms🔗
Steps
Given the max toppings per item is the configured limit (0ms)
And a valid waffle recipe with all ingredients (7ms)
Milk steps response message status code should be OK (0ms)
Eggs steps response message status code should be OK (0ms)
Flour steps response message status code should be OK (0ms)
And the waffle request has more toppings than the configured limit (1ms)
When the waffles are prepared (4ms)
Then the waffles response should indicate too many toppings (1ms)
Waffle steps response message status code should be BadRequest (0ms)
Waffle error response body should contain MaxToppingsExceeded (0ms)
Diagrams
Details:lines
Waffles endpoint is called with invalid ingredients should return a bad request response 8/8 passed 200ms🔗
#Input ParametersStatusDuration
FieldValueReasonError MessageResponse Status
1Butter<script>alert</script>XSS in butterButter contains potentially dangerous content.Bad RequestPassed67ms
2ButterButter is required'Butter' is required.Bad RequestPassed4ms
3EggsEggs is required'Eggs' is required.Bad RequestPassed5ms
4Eggsjavascript:void(0)XSS in eggsEggs contains potentially dangerous content.Bad RequestPassed6ms
5Flour<img onerror=x>XSS in flourFlour contains potentially dangerous content.Bad RequestPassed77ms
6FlourFlour is required'Flour' is required.Bad RequestPassed3ms
7Milk<script>alert</script>XSS in milkMilk contains potentially dangerous content.Bad RequestPassed9ms
8MilkMilk is required'Milk' is required.Bad RequestPassed25ms
Steps
Given a valid waffle request with "Butter" set to "<script>alert</script>" (7ms)
When the invalid waffle request is submitted (34ms)
Then the waffle response should contain error "Butter contains potentially dangerous content." with status "Bad Request" (23ms)
Actual results should contain [ r => r.ErrorMessage.Contains('Butter contains potentially dangerous content.') ] (0ms)
Diagrams
Details:lines