Space-separated words use implicit AND. Press / to focus the search bar. Operators &&||!! activate advanced mode; without them, legacy tag expressions (@a and @b or not @c) are also supported. dep:, duration: and is: always narrow the search: they combine with the rest of it by AND, and can be negated with !! or not. Inside a group that !! or not negates, one is read as text, and the search bar is marked.
Status
Duration โฅseconds
Happy paths
Tags
Dependencies
All 214 scenarios, 73 featuresAll 214 scenarios
featuresscenarios
Payloads
No scenarios match the filters.
Scenarios
Steps
Duration
Feature
Total
Passed
Failed
Skipped
Total
Passed
Failed
Skipped
Total
Avg
Longest
10
10
0
0
90
90
0
0
157ms
15ms
53ms
4
4
0
0
52
52
0
0
166ms
41ms
75ms
1
1
0
0
21
21
0
0
44ms
44ms
44ms
3
3
0
0
56
56
0
0
2s
821ms
1s
8
8
0
0
51
51
0
0
167ms
20ms
59ms
1
1
0
0
29
29
0
0
1s
1s
1s
2
2
0
0
9
9
0
0
110ms
55ms
104ms
1
1
0
0
6
6
0
0
36ms
36ms
36ms
5
5
0
0
33
33
0
0
231ms
46ms
104ms
2
2
0
0
18
18
0
0
34ms
17ms
23ms
1
1
0
0
4
4
0
0
7ms
7ms
7ms
4
4
0
0
26
26
0
0
114ms
28ms
78ms
2
2
0
0
8
8
0
0
27ms
13ms
14ms
2
2
0
0
20
20
0
0
258ms
129ms
182ms
1
1
0
0
9
9
0
0
72ms
72ms
72ms
1
1
0
0
12
12
0
0
1s
1s
1s
5
5
0
0
34
34
0
0
138ms
27ms
52ms
6
6
0
0
36
36
0
0
862ms
143ms
708ms
2
2
0
0
10
10
0
0
40ms
20ms
29ms
2
2
0
0
10
10
0
0
137ms
68ms
70ms
1
1
0
0
4
4
0
0
11ms
11ms
11ms
2
2
0
0
13
13
0
0
20ms
10ms
14ms
1
1
0
0
11
11
0
0
12ms
12ms
12ms
1
1
0
0
33
33
0
0
23ms
23ms
23ms
1
1
0
0
5
5
0
0
12ms
12ms
12ms
5
5
0
0
32
32
0
0
676ms
135ms
452ms
6
6
0
0
35
35
0
0
112ms
18ms
60ms
6
6
0
0
41
41
0
0
414ms
69ms
302ms
1
1
0
0
15
15
0
0
1s
1s
1s
1
1
0
0
7
7
0
0
155ms
155ms
155ms
1
1
0
0
8
8
0
0
218ms
218ms
218ms
1
1
0
0
6
6
0
0
119ms
119ms
119ms
3
3
0
0
15
15
0
0
339ms
113ms
308ms
2
2
0
0
28
28
0
0
274ms
137ms
155ms
4
4
0
0
38
38
0
0
249ms
62ms
101ms
1
1
0
0
15
15
0
0
126ms
126ms
126ms
2
2
0
0
11
11
0
0
36ms
18ms
30ms
11
11
0
0
85
85
0
0
696ms
63ms
145ms
2
2
0
0
22
22
0
0
39ms
19ms
26ms
2
2
0
0
10
10
0
0
48ms
24ms
28ms
5
5
0
0
32
32
0
0
389ms
77ms
178ms
6
6
0
0
24
24
0
0
50ms
8ms
26ms
1
1
0
0
3
3
0
0
730ms
730ms
730ms
3
3
0
0
12
12
0
0
17ms
5ms
9ms
8
8
0
0
47
47
0
0
97ms
12ms
41ms
1
1
0
0
6
6
0
0
28ms
28ms
28ms
3
3
0
0
18
18
0
0
112ms
37ms
63ms
6
6
0
0
36
36
0
0
393ms
65ms
138ms
3
3
0
0
15
15
0
0
149ms
49ms
137ms
1
1
0
0
12
12
0
0
114ms
114ms
114ms
1
1
0
0
6
6
0
0
66ms
66ms
66ms
5
5
0
0
38
38
0
0
176ms
35ms
105ms
1
1
0
0
6
6
0
0
31ms
31ms
31ms
1
1
0
0
12
12
0
0
132ms
132ms
132ms
1
1
0
0
6
6
0
0
9ms
9ms
9ms
2
2
0
0
31
31
0
0
171ms
85ms
106ms
1
1
0
0
7
7
0
0
35ms
35ms
35ms
2
2
0
0
23
23
0
0
56ms
28ms
48ms
2
2
0
0
14
14
0
0
352ms
176ms
307ms
1
1
0
0
14
14
0
0
90ms
90ms
90ms
1
1
0
0
18
18
0
0
334ms
334ms
334ms
1
1
0
0
5
5
0
0
118ms
118ms
118ms
4
4
0
0
27
27
0
0
139ms
34ms
88ms
1
1
0
0
3
3
0
0
72ms
72ms
72ms
2
2
0
0
22
22
0
0
946ms
473ms
875ms
1
1
0
0
15
15
0
0
237ms
237ms
237ms
2
2
0
0
8
8
0
0
16ms
8ms
11ms
2
2
0
0
12
12
0
0
129ms
64ms
73ms
2
2
0
0
17
17
0
0
36ms
18ms
18ms
8
8
0
0
44
44
0
0
191ms
23ms
64ms
6
6
0
0
24
24
0
0
73ms
12ms
40ms
3
3
0
0
12
12
0
0
9ms
3ms
5ms
10
10
0
0
56
56
0
0
146ms
14ms
38ms
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 Path17ms🔗Steps✓Givena valid apple cinnamon muffin 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)
✓Whenthe muffins are prepared(3ms)
✓Thenthe muffin response should contain a valid batch with all ingredients(5ms)✓Andthe 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
This scenario:Payloads
Different muffin recipes should produce the expected batch 3/3 passed80ms🔗
Steps✓Givena muffin recipe "Classic" with the following ingredients:(3ms)
Flour
Apples
Cinnamon
Plain Flour
Granny Smith
Ceylon
✓Milk steps response message status code should be OK(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Andwith baking at 180 degrees for 25 minutes in a "Standard" pan(0ms)
✓Andthe following muffin toppings:(0ms)
Name
Amount
Streusel
Light
Icing Glaze
Drizzle
✓Whenthe muffins are prepared(3ms)
✓Thenthe 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)
✓Andthe muffin response should include 2 toppings(0ms)
✓Muffin steps response toppings should have count '2'(0ms)
✓Andthe muffin response should include baking information(0ms)
✓Muffin steps response baking temperature should be greater than 0(0ms)
Steps✓Givena muffin recipe "Rustic Wholesome" with the following ingredients:(6ms)
Flour
Apples
Cinnamon
Whole Wheat
Honeycrisp
Cassia
✓Milk steps response message status code should be OK(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Andwith baking at 175 degrees for 30 minutes in a "Cast Iron" pan(1ms)
✓Andthe following muffin toppings:(0ms)
Name
Amount
Brown Sugar Crumb
Heavy
Maple Drizzle
Light
✓Whenthe muffins are prepared(4ms)
✓Thenthe 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)
✓Andthe muffin response should include 2 toppings(0ms)
✓Muffin steps response toppings should have count '2'(0ms)
✓Andthe muffin response should include baking information(0ms)
✓Muffin steps response baking temperature should be greater than 0(0ms)
Steps✓Givena muffin recipe "Spiced Deluxe" with the following ingredients:(10ms)
Flour
Apples
Cinnamon
Almond
Pink Lady
Saigon
✓Milk steps response message status code should be OK(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Andwith baking at 190 degrees for 20 minutes in a "Silicone" pan(1ms)
✓Andthe following muffin toppings:(1ms)
Name
Amount
Cinnamon Sugar
Heavy
Cream Cheese Swirl
Thick
✓Whenthe muffins are prepared(22ms)
✓Thenthe muffin batch should have 5 ingredients(6ms)
✓Muffin steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Muffin steps response ingredients should have count '5'(0ms)
✓Andthe muffin response should include 2 toppings(2ms)
✓Muffin steps response toppings should have count '2'(0ms)
✓Andthe muffin response should include baking information(1ms)
✓Muffin steps response baking temperature should be greater than 0(0ms)
Diagrams
This scenario:Payloads
Muffins endpoint called with an invalid field should return a bad request response 6/6 passed59ms🔗
#
Input Parameters
Status
Duration
Field
Value
Reason
Error Message
Response Status
1
Apples
Apples is required
'Apples' is required.
Bad Request
Passed
4ms
2
Cinnamon
<script>alert('xss')</script>
XSS in cinnamon
Cinnamon contains potentially dangerous content.
Bad Request
Passed
41ms
3
Cinnamon
Cinnamon is required
'Cinnamon' is required.
Bad Request
Passed
2ms
4
Eggs
Eggs is required
'Eggs' is required.
Bad Request
Passed
3ms
5
Flour
Flour is required
'Flour' is required.
Bad Request
Passed
2ms
6
Milk
Milk is required
'Milk' is required.
Bad Request
Passed
4ms
Steps
✓Givena valid muffin request with "Apples" set to ""(1ms)
✓Whenthe invalid muffin request is submitted(1ms)
✓Thenthe 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)
Steps
✓Givena valid muffin request with "Cinnamon" set to "<script>alert('xss')</script>"(4ms)
✓Whenthe invalid muffin request is submitted(31ms)
✓Thenthe muffin response should contain error "Cinnamon contains potentially dangerous content." with status "Bad Request"(3ms)
✓Response body should contain 'Cinnamon contains potentially dangerous content.'(0ms)
✓Muffin steps response message status code should be BadRequest(0ms)
Steps
✓Givena valid muffin request with "Cinnamon" set to ""(0ms)
✓Whenthe invalid muffin request is submitted(1ms)
✓Thenthe muffin response should contain error "'Cinnamon' is required." with status "Bad Request"(0ms)
✓Response body should contain ''Cinnamon' is required.'(0ms)
✓Muffin steps response message status code should be BadRequest(0ms)
Steps
✓Givena valid muffin request with "Eggs" set to ""(0ms)
✓Whenthe invalid muffin request is submitted(1ms)
✓Thenthe muffin response should contain error "'Eggs' is required." with status "Bad Request"(0ms)
✓Response body should contain ''Eggs' is required.'(0ms)
✓Muffin steps response message status code should be BadRequest(0ms)
Steps
✓Givena valid muffin request with "Flour" set to ""(0ms)
✓Whenthe invalid muffin request is submitted(1ms)
✓Thenthe muffin response should contain error "'Flour' is required." with status "Bad Request"(0ms)
✓Response body should contain ''Flour' is required.'(0ms)
✓Muffin steps response message status code should be BadRequest(0ms)
Steps
✓Givena valid muffin request with "Milk" set to ""(0ms)
✓Whenthe invalid muffin request is submitted(3ms)
✓Thenthe muffin response should contain error "'Milk' is required." with status "Bad Request"(0ms)
✓Response body should contain ''Milk' is required.'(0ms)
✓Muffin steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Audit Log Filtering
/audit-logs - Filtering audit logs by entity type and entity ID
Audit logs should be filterable by entity id 75ms🔗Steps✓Givena 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)
✓Andan order has been created for the batch(12ms)
✓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)
✓Whenaudit logs are requested filtered by entity id(12ms)
✓Thenthe audit log response should contain the specific order entry(2ms)
✓Audit log response status code should be OK(0ms)
✓Audit logs should contain [ l => l.EntityId == '0a6f2910-1c47-4c7e-b931-6e66971a679a' ](0ms)
Diagrams
This scenario:Payloads
Audit logs should be filterable by entity type 38ms🔗Steps✓Givena 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)
✓Andan order has been created for the batch(7ms)
✓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)
✓Whenaudit logs are requested filtered by entity type(17ms)
✓Thenthe audit log response should only contain order entries(2ms)
✓Audit log response status code should be OK(0ms)
✓Audit logs should only contain [ l => l.EntityType == AuditLogDefaults.OrderEntityType ](0ms)
Diagrams
This scenario:Payloads
Audit logs should be returned in descending timestamp order 39ms🔗Steps✓Givena 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)
✓Andan order has been created for the batch(8ms)
✓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)
✓Whenaudit logs are requested filtered by entity type(12ms)
✓Thenthe audit logs should be ordered by timestamp descending(5ms)
✓Audit logs should not be null or empty(0ms)
✓Audit logs should be in descending order [ l => l.Timestamp ](0ms)
Diagrams
This scenario:Payloads
Filtering audit logs by a non-existent entity type should return an empty collection 13ms🔗Steps
✓Whenaudit logs are requested filtered by a non-existent entity type(9ms)
✓Thenthe audit log response should be an empty collection(3ms)
✓Audit log response status code should be OK(0ms)
✓Audit logs from different time range should be empty(0ms)
Diagrams
This scenario:Payloads
Audit Log Retrieval
/audit-logs - Retrieving audit log entries for order operations
Creating an order should produce a retrievable audit log entry Happy Path44ms🔗Steps✓Givena pancake batch has been created(8ms)
✓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)
✓Andan order has been created for the batch(12ms)
✓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)
✓Whenthe audit logs are retrieved(12ms)
✓Thenthe audit log response should contain the order creation entry(6ms)
✓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_5247014944498696013') ](0ms)
✓Andthe cow service should have received a milk request(0ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ](0ms)
✓Andthe kitchen service should have received a preparation request(0ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ](0ms)
Diagrams
This scenario:Payloads
Breakfast Order
/orders - Creating and managing breakfast orders with event publishing
Creating an order publishes events and notifies the kitchenA valid order should be created and an event published Happy Path1.0s🔗Steps✓Givena pancake batch has been created(73ms)
✓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)
✓Anda valid order request for the created batch(0ms)
✓Whenthe breakfast order is placed(25ms)
✓Thenthe 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_2705647304167416692'(0ms)
✓Order steps response items should have count 1(0ms)
✓Andan order created event should have been published(900ms)
✓Event store should not be null(0ms)
✓Andthe kitchen service should have received a preparation request(1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ](0ms)
Diagrams
This scenario:Payloads
Creating an order produces audit and recipe logsCreating an order should produce an audit log entry and events 1.3s🔗Steps✓Givena pancake batch has been created(32ms)
✓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)
✓Anda valid order request for the created batch(0ms)
✓Whenthe breakfast order is placed(7ms)
✓Thenthe 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_2544236666757486765'(0ms)
✓Order steps response items should have count 1(0ms)
✓Andan order created event should have been published(1.2s)
✓Event store should not be null(0ms)
✓Anda recipe log should have been published to kafka(11ms)
✓Kafka store should not be null(0ms)
Diagrams
This scenario:Payloads
Creating an order writes an outbox message for reliable deliveryCreating an order should write an outbox message that gets processed 164ms🔗Steps✓Givena pancake batch has been created(14ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour steps response message status code should be OK(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓Anda valid order request for the created batch(1ms)
✓Whenthe breakfast order is placed(9ms)
✓Thenthe 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_1802603264943119683'(0ms)
✓Order steps response items should have count 1(0ms)
✓Andan outbox message should have been written for the order created event(33ms)
✓Outbox messages should contain [ m => m.EventType == 'OrderCreatedEvent', $"an outbox message should exist for event type '{eventType}'" ](0ms)
✓Andthe outbox message should have been processed(97ms)
Diagrams
This scenario:Payloads
Chef Notes Management
/chef-notes - Creating, retrieving, and updating chef notes (MongoDB)
Creating a chef note should return the created note Happy Path9ms🔗Steps
✓Givena valid chef note request(0ms)
✓Whenthe note is submitted(4ms)
✓Thenthe response should contain the created note(2ms)
✓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-cce7f65ee14344a7a3b7f1f2c9ac7f61'(0ms)
✓Post steps response note text should be "Remember to fold the batter gently to keep it fluffy."(0ms)
✓Post steps response category should be "Technique"(0ms)
✓Post steps response note id should not be null or empty(0ms)
Diagrams
This scenario:Payloads
Creating a note with missing note text should return bad request 5ms🔗Steps
✓Givena note request with missing note text(2ms)
✓Whenthe note is submitted(2ms)
✓Thenthe note response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Creating a note with missing recipe name should return bad request 5ms🔗Steps
✓Givena note request with a missing recipe name(0ms)
✓Whenthe note is submitted(3ms)
✓Thenthe note response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Listing notes by recipe should return matching notes 59ms🔗Steps✓Givena chef note exists(28ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe notes are listed by recipe(23ms)
✓Thenthe list response should contain the note(6ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps list response should contain [ n => n.NoteId == '4179b0d0-c182-4b8a-aac1-cd1b7930b7d7' ](0ms)
Diagrams
This scenario:Payloads
Retrieving a non-existent note should return not found 6ms🔗Steps
✓Whena non-existent note is retrieved(4ms)
✓Thenthe get response should indicate not found(0ms)
✓Get steps response message status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Retrieving an existing note by id should return the note 24ms🔗Steps✓Givena chef note exists(6ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe note is retrieved by id(13ms)
✓Thenthe get response should contain the note(3ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps response note id should be 'd18b0e24-e188-458c-8196-a6ceb9449b42'(0ms)
✓Get steps response recipe name should be 'Recipe-14336a57ecb843968b62903c4c57b9d2'(0ms)
Diagrams
This scenario:Payloads
Updating a non-existent note should return not found 34ms🔗Steps
✓Whena non-existent note is updated(32ms)
✓Thenthe note update response should indicate not found(0ms)
✓Patch steps response message status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Updating an existing note should return the updated note 21ms🔗Steps✓Givena chef note exists(2ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe note is updated(14ms)
✓Thenthe update response should contain the modified note(4ms)
✓Patch steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Patch steps response note id should be 'f5777ec5-ef1c-4731-850e-10596e674a6f'(0ms)
✓Patch steps response note text should be "Updated: Use unsalted butter for better flavour control."(0ms)
✓Patch steps response category should be "Ingredients"(0ms)
✓Patch steps response updated at should not be null(0ms)
Diagrams
This scenario:Payloads
Complete Order Lifecycle
/orders - Complete order lifecycle from creation through to completion
An order should progress through all status transitions to completion Happy Path1.3s ยท 1.1s warm-up🔗Steps✓Givena pancake batch has been created(782ms)
✓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)
✓Anda breakfast order has been placed for the batch(375ms)
✓Order steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe order progresses through all statuses to completed(17ms)
✓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)
✓Thenthe completed order should be retrievable with all details(17ms)
✓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 '8fc17ae8-3f33-4b24-8c3f-e22bd9dacfb4'(0ms)
✓Get order steps response status should be Completed(0ms)
✓Get order steps response customer name should be 'LifecycleTestCustomer_5401343397907759860'(0ms)
✓Andan audit log entry should exist for the order(35ms)
✓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_5401343397907759860') ](0ms)
✓Andthe cow service should have received a milk request(3ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ](0ms)
✓Andthe kitchen service should have received a preparation request(3ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ](0ms)
Diagrams
This scenario:Payloads
Correlation Id
Cross-cutting - X-Correlation-Id header propagation across API responses
Provided correlation IDs are echoed backA request with a correlation id should return the same id in the response Happy Path104ms ยท 96ms warm-up🔗Steps
✓Givena request with a known correlation id(1ms)
✓Whenthe request is sent to the menu endpoint(98ms)
✓Thenthe response should contain the same correlation id(2ms)
✓Response contains correlation id header should be true(0ms)
✓First correlation id header value should be '3c6d4537-adda-44d6-9b60-805e89b329c1'(0ms)
Diagrams
This scenario:Payloads
Missing correlation IDs are generated automaticallyA request without a correlation id should have one generated in the response 6ms🔗Steps
✓Whena request without a correlation id is sent to the menu endpoint(4ms)
✓Thenthe response should contain a generated correlation id(1ms)
✓Response contains correlation id header should be true(0ms)
✓First correlation id header value should not be null or empty(0ms)
Customer preferences support CRUD operationsSaving customer preferences should return the saved preferences Happy Path17ms🔗Steps
✓Givena valid customer preference request(2ms)
✓Whenthe customer preferences are saved(8ms)
✓Thenthe preference response should contain the saved preferences(4ms)
✓Put steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Put steps response preferred milk type should be "Oat"(0ms)
✓Put steps response favourite item should be "Blueberry Pancakes"(0ms)
Diagrams
This scenario:Payloads
Retrieving existing customer preferences should return the preferences 104ms🔗Steps✓Givencustomer preferences exist(3ms)
✓Put steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe customer preferences are retrieved(93ms)
✓Thenthe preference get response should contain the preferences(6ms)
✓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 '1dc536d5148a4536815c1684cb6853de'(0ms)
✓Get steps response preferred milk type should be "Oat"(0ms)
✓Get steps response likes extra toppings should be true(0ms)
Diagrams
This scenario:Payloads
Non-existent preferences cannot be retrievedRetrieving non-existent customer preferences should return not found 36ms🔗Steps
✓Whennon-existent customer preferences are retrieved(31ms)
✓Thenthe preference get response should indicate not found(1ms)
✓Get steps response message status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Preference requests must pass validationSaving customer preferences with missing customer name should return bad request 4ms🔗Steps
✓Givena customer preference request with missing customer name(0ms)
✓Whenthe customer preferences are saved(1ms)
✓Thenthe preference response should indicate bad request(1ms)
✓Put steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Customer preferences support CRUD operationsUpdating customer preferences should return the updated preferences 69ms🔗Steps✓Givencustomer preferences exist(55ms)
✓Put steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe customer preferences are updated(8ms)
✓Thenthe preference update response should contain the updated values(3ms)
✓Put steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Put steps response preferred milk type should be "Almond"(0ms)
✓Put steps response favourite item should be "Belgian Waffles"(0ms)
Diagrams
This scenario:Payloads
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 23ms🔗Steps
✓Giventhe cinnamon swirl order count is reset(0ms)
✓Andan order request for the same special(1ms)
✓Whenthe order is submitted with two different idempotency keys(16ms)
✓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)
✓Thenthe responses should have different confirmation ids(1ms)
✓First confirmation id should not be 'c73d3c0f-358a-4f02-b911-28b2d2862fa1'(0ms)
Diagrams
This scenario:Payloads
Submitting the same order with the same idempotency key should return the same confirmation 11ms🔗Steps
✓Giventhe cinnamon swirl order count is reset(0ms)
✓Andan order request with an idempotency key(0ms)
✓Whenthe order is submitted twice with the same idempotency key(7ms)
✓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)
✓Thenboth responses should return the same confirmation id(1ms)
✓First confirmation id should be 'fee38bc0-1a55-4a7b-bee3-f2ab4f57f57e'(0ms)
Diagrams
This scenario:Payloads
Daily Specials Not Found
/daily-specials/orders - Ordering a non-existent daily special
Ordering a non-existent daily special should return not found 7ms🔗Steps
✓Givena daily special order request for a non-existent special(0ms)
✓Whenthe daily special order is submitted(3ms)
✓Thenthe daily special response should indicate not found(1ms)
✓Post steps response message status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Daily Specials Ordering
/daily-specials - Ordering daily specials with threshold limits
Valid daily special orders are fulfilledA valid daily special order should return a confirmation Happy Path78ms🔗Steps
✓Giventhe cinnamon swirl order count is reset(15ms)
✓Anda valid daily special order request for cinnamon swirl(1ms)
✓Whenthe daily special order is submitted(53ms)
✓Thenthe daily special order response should contain a valid confirmation(6ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Post steps response special id should be 'aaaa0000-0000-0000-0000-000000000001'(0ms)
✓Post steps response order confirmation id should not be empty(0ms)
Diagrams
This scenario:Payloads
Orders are rejected when the daily limit is reachedOrdering a daily special beyond the threshold should return a conflict response IgnoreIfExternalSut14ms🔗Steps
✓Giventhe matcha waffles order count is reset(4ms)
✓Andthe matcha waffles special has been ordered up to the configured limit(3ms)
✓Post steps response message status code should be Created(0ms)
✓Whenanother order is placed for the matcha waffles special(3ms)
✓Thenthe response should indicate the daily special is sold out(0ms)
✓Post steps response message status code should be Conflict(0ms)
Diagrams
This scenario:Payloads
Remaining quantity decreases with each orderRemaining quantity should decrease after each order IgnoreIfExternalSut10ms🔗Steps
✓Giventhe lemon ricotta order count is reset(2ms)
✓Anda daily special order for lemon ricotta of quantity one is placed(2ms)
✓Post steps response message status code should be Created(0ms)
✓Whenthe available daily specials are requested(1ms)
✓Thenthe lemon ricotta special should have one fewer remaining(3ms)
✓Response content is valid json should be true(0ms)
✓Lemon ricotta remaining quantity should be '9'(0ms)
Diagrams
This scenario:Payloads
Valid daily special orders are fulfilledThe daily specials endpoint should return all available specials 10ms🔗Steps
✓Whenthe available daily specials are requested(6ms)
✓Thenthe daily specials response should contain all expected specials(3ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps response should have count ExpectedSpecialsCount(0ms)
Diagrams
This scenario:Payloads
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 passed27ms🔗
#
Input Parameters
Status
Duration
Field
Value
Reason
Error Message
Response Status
1
Quantity
0
Quantity must be > zero
Quantity must be greater than zero.
Bad Request
Passed
14ms
2
SpecialId
SpecialId is required
'Special Id' is required.
Bad Request
Passed
12ms
Steps
✓Givena valid daily special order request with "Quantity" set to "0"(2ms)
✓Whenthe invalid daily special order request is submitted(6ms)
✓Thenthe daily special response should contain error "Quantity must be greater than zero." with status "Bad Request"(2ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Quantity must be greater than zero.') ](0ms)
Steps
✓Givena valid daily special order request with "SpecialId" set to ""(0ms)
✓Whenthe invalid daily special order request is submitted(10ms)
✓Thenthe daily special response should contain error "'Special Id' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Special Id' is required.') ](0ms)
Diagrams
This scenario:Payloads
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 SkipUnlessFakesControllable182ms🔗Steps
✓Giventhe cow service is configured to be unreachable(0ms)
✓Andthe supplier service is configured to be unreachable(0ms)
✓Whenthe health check endpoint is called(150ms)
✓Thenthe health check response should indicate a degraded status(10ms)
✓Health response status code should be OK(0ms)
✓Health check result status should be Degraded(0ms)
✓Andthe cow service dependency should report degraded(12ms)
✓Health check result results should contain key CowService(0ms)
✓Cow service health status should be Degraded(0ms)
✓Andthe 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
This scenario:Payloads
Health check should report degraded when the cow service is unavailable SkipUnlessFakesControllable75ms🔗Steps
✓Giventhe cow service is configured to be unreachable(0ms)
✓Whenthe health check endpoint is called(73ms)
✓Thenthe 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)
✓Andthe 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
This scenario:Payloads
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 SkipUnlessFakesControllable72ms🔗Steps
✓Giventhe kitchen service health check is configured to use a failing endpoint(56ms)
✓Whenthe health check endpoint is called(12ms)
✓Thenthe 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)
✓Andthe 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
This scenario:Payloads
Equipment Alerts
/graphql - Querying equipment alerts populated by Event Hub consumption
Equipment alerts should contain data ingested via Event Hub consumer Happy Path1.1s ยท 1.0s warm-up🔗Steps✓Givena pancake batch has been created(15ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour steps response message status code should be OK(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓Whenthe equipment alerts are queried via graphql(1.0s)
✓Thenthe graphql response should contain the equipment alert record(8ms)
✓Graph ql steps response message status code should be OK(0ms)
/equipment-readings - Recording and monitoring kitchen equipment readings (ClickHouse)
Recording an equipment reading should return the created record Happy Path39ms🔗Steps
✓Givena valid equipment reading request(1ms)
✓Whenthe equipment reading is recorded(28ms)
✓Thenthe reading response should contain the created record(6ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Post steps response equipment id should be 'Oven-89836cc9398c492aa2c4f89ebe4a02a3'(0ms)
✓Post steps response value should be 180.5m(0ms)
✓Post steps response reading id should not be null or empty(0ms)
Diagrams
This scenario:Payloads
Deleting a reading should remove it from the list 31ms🔗Steps✓Givenan equipment reading record has been created(4ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe reading is deleted(17ms)
✓Thenthe reading delete response should indicate no content(1ms)
✓Delete steps response message status code should be NoContent(0ms)
✓Andthe reading should no longer be listed(7ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps list response should not contain [ r => r.ReadingId == 'dcab02e9-fda3-453a-884b-924190126d74' ](0ms)
Diagrams
This scenario:Payloads
Listing readings by equipment should return matching records 52ms🔗Steps✓Givenan equipment reading record has been created(12ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe readings are listed by equipment(31ms)
✓Thenthe reading list response should contain the record(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 [ r => r.ReadingId == '105029bd-fb66-46ea-a749-06f8038d0534' ](0ms)
Diagrams
This scenario:Payloads
Recording a reading with missing metric should return bad request 7ms🔗Steps
✓Givenan equipment reading request with a missing metric(0ms)
✓Whenthe equipment reading is recorded(4ms)
✓Thenthe reading post response should indicate bad request(1ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Recording a reading with zero value should return bad request 7ms🔗Steps
✓Givenan equipment reading request with zero value(1ms)
✓Whenthe equipment reading is recorded(4ms)
✓Thenthe reading post response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Feedback Management
/feedback - Submitting and retrieving customer feedback
Feedback can be submitted and retrievedSubmitting feedback should return the created feedback Happy Path72ms🔗Steps
✓Givena valid feedback request(0ms)
✓Whenthe feedback is submitted(64ms)
✓Thenthe feedback response should contain the created feedback(6ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Post steps response customer name should be 'Customer-c7c5fc35368c4df49bb17010a8c00360'(0ms)
✓Post steps response rating should be 4(0ms)
Diagrams
This scenario:Payloads
Listing feedback for an order should return the feedback 708ms ยท 499ms warm-up🔗Steps✓Givena feedback entry exists(515ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe feedback is retrieved by order id(181ms)
✓Thenthe feedback list response should contain the feedback(8ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps list response should contain [ f => f.FeedbackId == 'eddc76ef-0bcb-4f61-8571-25319fc79d6d' ](0ms)
Diagrams
This scenario:Payloads
Retrieving existing feedback by id should return the feedback 20ms🔗Steps✓Givena feedback entry exists(3ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe feedback is retrieved by id(8ms)
✓Thenthe feedback get response should contain the feedback(6ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps response feedback id should be '90086ea1-f0c6-4bec-8310-8cbe868dcc5c'(0ms)
✓Get steps response customer name should be 'Customer-225633474dde434c8e3db214bd035605'(0ms)
✓Get steps response rating should be 4(0ms)
Diagrams
This scenario:Payloads
Non-existent feedback cannot be retrievedRetrieving non-existent feedback should return not found 27ms🔗Steps
✓Whena non-existent feedback is retrieved(23ms)
✓Thenthe feedback get response should indicate not found(3ms)
✓Get steps response message status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Feedback requests must pass validationSubmitting feedback with invalid rating should return bad request 10ms🔗Steps
✓Givena feedback request with an invalid rating(1ms)
✓Whenthe feedback is submitted(7ms)
✓Thenthe feedback response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Submitting feedback with missing customer name should return bad request 23ms🔗Steps
✓Givena feedback request with missing customer name(2ms)
✓Whenthe feedback is submitted(18ms)
✓Thenthe feedback response should indicate bad request(1ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
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 SkipUnlessFakesControllable29ms🔗Steps
✓Giventhe goat service will return service unavailable(1ms)
✓Whengoat milk is requested(23ms)
✓Thenthe goat milk response should indicate a bad gateway(2ms)
✓Goat milk steps response message status code should be BadGateway(0ms)
✓Goat milk error response body should contain GoatServiceUnavailableTitle(0ms)
Diagrams
This scenario:Payloads
Requesting goat milk when the goat service returns an invalid response should return a bad gateway response SkipUnlessFakesControllable11ms🔗Steps
✓Giventhe goat service will return an invalid response(3ms)
✓Whengoat milk is requested(6ms)
✓Thenthe 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
This scenario:Payloads
Goat Milk Feature Flag
/goat-milk - Goat milk availability controlled by feature flag
Goat milk is available when the feature flag is enabledGoat milk endpoint should return fresh goat milk when feature is enabled IgnoreIfExternalSut66ms🔗Steps
✓Giventhe goat milk feature flag is enabled(51ms)
✓Whengoat milk is requested(13ms)
✓Thenthe 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
This scenario:Payloads
Goat milk is hidden when the feature flag is disabledGoat milk endpoint should return not found when feature is disabled IgnoreIfExternalSut70ms🔗Steps
✓Giventhe goat milk feature flag is disabled(48ms)
✓Whengoat milk is requested(17ms)
✓Thenthe 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
This scenario:Payloads
Goat Milk Sourcing
/goat-milk - Retrieving goat milk from the Goat Service
A valid goat milk request should return fresh goat milk Happy Path11ms🔗Steps
✓Whengoat milk is requested(8ms)
✓Thenthe 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
This scenario:Payloads
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 PathSkipUnlessFakesControllable6ms🔗Steps
✓Givena request with a known correlation id(0ms)
✓Whenmilk is requested with the correlation id(4ms)
✓Thenthe 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 '7411c8c2-c6d2-49ff-a927-8ade568e918e'(0ms)
Diagrams
This scenario:Payloads
A request with a correlation id should forward it to the supplier service SkipUnlessFakesControllable14ms🔗Steps
✓Givena request with a known correlation id(0ms)
✓Andthe menu cache is cleared(3ms)
✓Whenthe menu is requested with the correlation id(5ms)
✓Thenthe supplier service should have received the correlation id(2ms)
✓Requests should not be empty(0ms)
✓Request headers should contain key CorrelationId(0ms)
✓Request headers[ custom headers correlation id] should be '53dda38b-7bb3-412e-a71c-35d90f98f12e'(0ms)
Diagrams
This scenario:Payloads
Health Check
/health - Health check endpoint with dependency status for monitoring
The health check endpoint should return a healthy status with dependency details Happy Path12ms🔗Steps
✓Whenthe health check endpoint is called(6ms)
✓Thenthe health check response should indicate healthy with all dependencies(4ms)
✓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
This scenario:Payloads
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 23ms🔗Steps
✓Whenthe health check endpoint is called(13ms)
✓Thenthe health check response should contain detailed entries(6ms)Diagrams
This scenario:Payloads
Heartbeat
/heartbeat - Heartbeat endpoint confirming the service is running
The heartbeat endpoint should return a running message Happy Path12ms🔗Steps
✓Whenthe heartbeat endpoint is called(6ms)
✓Thenthe heartbeat response should indicate the service is running(3ms)
✓Heartbeat response status code should be OK(0ms)
✓Result should not be null(0ms)
✓Result status should be HeartbeatStatus(0ms)
Diagrams
This scenario:Payloads
Ingredient Usage Analytics
/ingredient-usage - Recording and summarising ingredient usage (BigQuery)
Recording ingredient usage should return the created record Happy Path10ms🔗Steps
✓Givena valid ingredient usage request(1ms)
✓Whenthe ingredient usage is recorded(4ms)
✓Thenthe 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-c7ab38e085e84f2c92c3e15140acda95'(0ms)
✓Post steps response quantity used should be 2.5m(0ms)
✓Post steps response usage id should not be null or empty(0ms)
Diagrams
This scenario:Payloads
Getting usage summary should return aggregated data 126ms🔗Steps✓Givenan ingredient usage record has been created(2ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe usage summary is requested(115ms)
✓Thenthe summary should contain aggregated data(7ms)
✓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-265d5c53818f4d7a82d5ba97d8b32ffe' ](0ms)
Diagrams
This scenario:Payloads
Listing usage by ingredient should return matching records 452ms🔗Steps✓Givenan ingredient usage record has been created(85ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe usage is listed by ingredient name(357ms)
✓Thenthe usage list response should contain the record(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 [ u => u.IngredientName == 'Flour-8dce386716cd48d9930885318444c70d' ](0ms)
Diagrams
This scenario:Payloads
Recording usage with missing ingredient name should return bad request 79ms ยท 60ms warm-up🔗Steps
✓Givenan ingredient usage request with a missing ingredient name(3ms)
✓Whenthe ingredient usage is recorded(69ms)
✓Thenthe usage post response should indicate bad request(1ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Recording usage with zero quantity should return bad request 6ms🔗Steps
✓Givenan ingredient usage request with zero quantity(0ms)
✓Whenthe ingredient usage is recorded(3ms)
✓Thenthe usage post response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Ingredient Waste Tracking
/ingredient-waste - Recording and managing ingredient waste (BigQuery)
Recording ingredient waste should return the created record Happy Path6ms🔗Steps
✓Givena valid ingredient waste request(0ms)
✓Whenthe waste is recorded(2ms)
✓Thenthe waste response should contain the created record(2ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Post steps response ingredient name should not be null or empty(0ms)
✓Post steps response quantity wasted should be 0.5m(0ms)
✓Post steps response waste id should not be null or empty(0ms)
✓Post steps response reason should be "Expired before use"(0ms)
Diagrams
This scenario:Payloads
Deleting a waste record should return no content 27ms🔗Steps✓Givenan ingredient waste record has been created(3ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe waste record is deleted(21ms)
✓Thenthe delete response should indicate no content(1ms)
✓Delete steps response message status code should be NoContent(0ms)
Diagrams
This scenario:Payloads
Listing waste by recipe should return matching records 60ms🔗Steps✓Givenan ingredient waste record has been created(31ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe waste is listed by recipe(20ms)
✓Thenthe waste list response should contain the record(6ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps list response should contain [ w => w.WasteId == 'eb4b9eb2-28ad-4ac9-ba2f-f47a6a90adb0' ](0ms)
Diagrams
This scenario:Payloads
Recording waste with missing ingredient name should return bad request 4ms🔗Steps
✓Givena waste request with a missing ingredient name(1ms)
✓Whenthe waste is recorded(1ms)
✓Thenthe waste post response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Recording waste with missing reason should return bad request 3ms🔗Steps
✓Givena waste request with a missing reason(0ms)
✓Whenthe waste is recorded(1ms)
✓Thenthe waste post response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Recording waste with zero quantity should return bad request 10ms🔗Steps
✓Givena waste request with zero quantity(2ms)
✓Whenthe waste is recorded(4ms)
✓Thenthe waste post response should indicate bad request(2ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Inventory Management
/inventory - Managing ingredient inventory with full CRUD operations
Inventory items support full CRUD operationsAdding a new inventory item should return the created item Happy Path8ms🔗Steps
✓Givena valid inventory item request(0ms)
✓Whenthe inventory item is submitted(4ms)
✓Thenthe inventory response should contain the created item(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 'Flour-362cb3591de44a3a8254a93d9e76e3eb'(0ms)
✓Post steps response category should be "Dry Goods"(0ms)
Diagrams
This scenario:Payloads
Deleting an inventory item should return no content 28ms🔗Steps✓Givenan inventory item exists(2ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe inventory item is deleted(23ms)
✓Thenthe inventory delete response should indicate no content(0ms)
✓Delete steps response message status code should be NoContent(0ms)
Diagrams
This scenario:Payloads
Listing all inventory items should return all items 38ms🔗Steps✓Givenan inventory item exists(6ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenall inventory items are requested(22ms)
✓Thenthe inventory list response should contain the item(8ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps list response should contain [ i => i.Id == '2' ](0ms)
Diagrams
This scenario:Payloads
Non-existent inventory items cannot be retrievedRetrieving a non-existent inventory item should return not found 7ms🔗Steps
✓Whena non-existent inventory item is retrieved(5ms)
✓Thenthe inventory get response should indicate not found(1ms)
✓Get steps response message status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Inventory items support full CRUD operationsRetrieving an existing inventory item should return the item 302ms ยท 284ms warm-up🔗Steps✓Givenan inventory item exists(70ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe inventory item is retrieved by id(225ms)
✓Thenthe 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 'Flour-218603b9b50948d5bc7ab2bb3382cace'(0ms)
Diagrams
This scenario:Payloads
Updating an inventory item should return the updated item 28ms🔗Steps✓Givenan inventory item exists(1ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe inventory item is updated(22ms)
✓Thenthe inventory update response should contain the updated values(3ms)
✓Put steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Put steps response category should be "Updated Category"(0ms)
Diagrams
This scenario:Payloads
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 SkipUnlessFakesControllable1.3s ยท 1.2s warm-up🔗Steps✓Givena pancake batch has been created(780ms)
✓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)
✓Anda valid order request for the created batch(3ms)
✓Andthe kitchen service is configured to return busy(3ms)
✓Whenthe breakfast order is placed(514ms)
✓Thenthe order should still be created successfully despite the kitchen failure(4ms)
✓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
This scenario:Payloads
Menu Availability
/menu - Checking menu item availability from ingredient sources
The menu endpoint should return all menu items with availability status Happy PathMenuAvailability155ms🔗Steps
✓Whenthe menu is requested(19ms)
✓Thenthe menu response should contain all menu items(5ms)
✓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
This scenario:Payloads
Menu Caching
/menu - Menu response caching behaviour
Menu responses should be cached and returned even when supplier becomes unavailable SkipUnlessFakesControllableMenuCaching218ms🔗Steps✓Giventhe menu has been requested and cached(31ms)
✓Menu steps response message status code should be OK(0ms)
✓Andthe supplier service is then made unavailable(1ms)
✓Whenthe menu is requested again(4ms)
✓Thenthe menu response should still return available items(6ms)
✓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
This scenario:Payloads
Menu Downstream Failure
/menu - Menu behaviour when Supplier Service is unavailable
All menu items should be marked unavailable when the supplier service is down SkipUnlessFakesControllableMenuDownstreamFailure119ms🔗Steps
✓Giventhe supplier service will return service unavailable(15ms)
✓Whenthe menu is requested(30ms)
✓Thenthe menu response should mark all items as unavailable(5ms)
✓Menu steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Menu steps response should only contain [ m => m.IsAvailable == false ](0ms)
Diagrams
This scenario:Payloads
Milk Downstream Failure
/milk - Handling downstream Cow Service failures
Requesting milk when the cow service is unavailable should return a bad gateway response SkipUnlessFakesControllable6ms🔗Steps
✓Giventhe cow service will return service unavailable(0ms)
✓Whenmilk is requested(3ms)
✓Thenthe 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
This scenario:Payloads
Requesting milk when the cow service returns an invalid response should return a bad gateway response SkipUnlessFakesControllable308ms ยท 186ms warm-up🔗Steps
✓Giventhe cow service will return an invalid response(35ms)
✓Whenmilk is requested(201ms)
✓Thenthe milk response should indicate a bad gateway(22ms)
✓Milk steps response message status code should be BadGateway(0ms)
✓Milk error response body should contain CowServiceUnavailableTitle(0ms)
Diagrams
This scenario:Payloads
Requesting milk when the cow service times out should return a bad gateway response SkipUnlessFakesControllable24ms🔗Steps
✓Giventhe cow service will return a timeout(5ms)
✓Whenmilk is requested(16ms)
✓Thenthe 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
This scenario:Payloads
Order Cross Field Validation
/orders - Cross-field validation with configurable item limits
An order at the maximum items per order should be accepted IgnoreIfExternalSut155ms🔗Steps
✓Giventhe maximum items per order is configured to two(80ms)
✓Anda pancake batch has been created(46ms)
✓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)
✓Andan order request with two items(1ms)
✓Whenthe order is submitted(21ms)
✓Thenthe response should indicate success(2ms)
✓Order steps response message status code should be Created(0ms)
Diagrams
This scenario:Payloads
An order exceeding the maximum items per order should be rejected IgnoreIfExternalSut119ms🔗Steps
✓Giventhe maximum items per order is configured to two(80ms)
✓Anda pancake batch has been created(46ms)
✓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)
✓Andan order request with three items(1ms)
✓Whenthe order is submitted(11ms)
✓Thenthe response should indicate a validation error(1ms)
✓Order steps response message status code should be BadRequest(0ms)
✓Andthe error message should reference the item limit(1ms)
✓Order validation error response body should contain "Items"(0ms)
Diagrams
This scenario:Payloads
Order Pagination
/orders - Paginated listing of breakfast orders
Listing orders should return a paginated response Happy Path36ms🔗Steps✓Givenmultiple orders have been created(21ms)
✓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)
✓Whenorders are listed with default pagination(8ms)
✓Thenthe paginated response should contain the orders(5ms)
✓List steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓List steps response items should have count greater than or equal to '2'(0ms)
✓Andthe 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
This scenario:Payloads
Listing orders when none exist should return an empty page IgnoreIfNeedsDirectDbAccessIgnoreUnlessInMemoryDb13ms🔗Steps
✓Whenorders are listed with default pagination(8ms)
✓Thenthe paginated response should be empty(1ms)
✓List steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
Diagrams
This scenario:Payloads
Listing orders with a small page size should limit results 101ms🔗Steps✓Givenmultiple orders have been created(89ms)
✓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)
✓Whenorders are listed with page 1 and page size 1(10ms)
✓Thenthe 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
This scenario:Payloads
Requesting the second page should return different orders 98ms🔗Steps✓Givenmultiple orders have been created(63ms)
✓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)
✓Whenorders are listed with page 2 and page size 1(25ms)
✓Thenthe paginated response should have correct page metadata(6ms)
✓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
This scenario:Payloads
Order Rate Limiting
/orders - Rate limiting on order creation
Exceeding the rate limit should return too many requests IgnoreIfExternalSut126ms🔗Steps
✓Giventhe rate limit is configured to allow one request per window(54ms)
✓Anda pancake batch has been created(35ms)
✓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)
✓Anda valid order request(1ms)
✓Whenthe order is submitted twice in rapid succession(27ms)
✓Thenthe first request should succeed(1ms)
✓First response status code should be Created(0ms)
✓Andthe second request should be rate limited(1ms)
✓Second response status code should be TooManyRequests(0ms)
Diagrams
This scenario:Payloads
Order Retrieval
/orders - Retrieving orders by ID
Existing orders can be retrievedA created order should be retrievable by its ID Happy PathIgnoreIfNeedsEventInfrastructure30ms🔗Steps✓Givenan order has been created(23ms)
✓Response content is valid json should be true(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe order is retrieved by id(2ms)
✓Thenthe order retrieval response should contain the order(2ms)
✓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 '0d2dc7e8-3831-466d-9a6c-d4f63c386fbd'(0ms)
Diagrams
This scenario:Payloads
Non-existent orders return not foundRetrieving a non-existent order should return not found 6ms🔗Steps
✓Whena non-existent order is retrieved(3ms)
✓Thenthe order retrieval response should indicate not found(1ms)
✓Get order steps response message status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Order Status Transition
/orders - Order status transitions following the order lifecycle
Valid status transitions are acceptedA valid status transition should update the order 4/4 passed118ms🔗
#
Input Parameters
Status
Duration
From Status
To Status
1
Created
Cancelled
Passed
22ms
2
Created
Preparing
Passed
26ms
3
Preparing
Ready
Passed
39ms
4
Ready
Completed
Passed
29ms
Steps✓Givenan order exists with status "Created"(18ms)
✓Response content is valid json should be true(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe order status is updated to "Cancelled"(2ms)
✓Thenthe 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)
Steps✓Givenan order exists with status "Created"(18ms)
✓Response content is valid json should be true(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe order status is updated to "Preparing"(3ms)
✓Thenthe order status should be updated successfully to "Preparing"(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 'Preparing'(0ms)
Steps✓Givenan order exists with status "Preparing"(32ms)
✓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)
✓Whenthe order status is updated to "Ready"(5ms)
✓Thenthe order status should be updated successfully to "Ready"(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 'Ready'(0ms)
Steps✓Givenan order exists with status "Ready"(21ms)
✓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)
✓Patch steps response message status code should be OK(0ms)
✓Whenthe order status is updated to "Completed"(3ms)
✓Thenthe order status should be updated successfully to "Completed"(3ms)
✓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 'Completed'(0ms)
Diagrams
This scenario:Payloads
Invalid status transitions are rejectedAn invalid status transition should return a conflict response 7/7 passed578ms🔗
#
Input Parameters
Status
Duration
From Status
To Status
1
Cancelled
Preparing
Passed
135ms
2
Cancelled
Ready
Passed
33ms
3
Completed
Preparing
Passed
145ms
4
Created
Completed
Passed
64ms
5
Created
Ready
Passed
20ms
6
Preparing
Cancelled
Passed
34ms
7
Ready
Preparing
Passed
144ms
Steps✓Givenan order exists with status "Cancelled"(130ms)
✓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)
✓Whenthe order status is updated to "Preparing"(1ms)
✓Thenthe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓Givenan order exists with status "Cancelled"(28ms)
✓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)
✓Whenthe order status is updated to "Ready"(3ms)
✓Thenthe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓Givenan order exists with status "Completed"(139ms)
✓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)
✓Patch steps response message status code should be OK(0ms)
✓Patch steps response message status code should be OK(0ms)
✓Whenthe order status is updated to "Preparing"(2ms)
✓Thenthe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓Givenan order exists with status "Created"(55ms)
✓Response content is valid json should be true(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe order status is updated to "Completed"(4ms)
✓Thenthe response should indicate an invalid state transition(1ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓Givenan order exists with status "Created"(17ms)
✓Response content is valid json should be true(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe order status is updated to "Ready"(1ms)
✓Thenthe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓Givenan order exists with status "Preparing"(28ms)
✓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)
✓Whenthe order status is updated to "Cancelled"(1ms)
✓Thenthe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Steps✓Givenan order exists with status "Ready"(141ms)
✓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)
✓Patch steps response message status code should be OK(0ms)
✓Whenthe order status is updated to "Preparing"(1ms)
✓Thenthe response should indicate an invalid state transition(0ms)
✓Patch steps response message status code should be Conflict(0ms)
Diagrams
This scenario:Payloads
Order Status Via G RPC
/grpc - Retrieving order status via gRPC
Order status via gRPC should return order details Happy Path26ms🔗Steps✓Givena pancake batch has been created(8ms)
✓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)
✓Andan 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)
✓Whenthe order status is requested via gRPC(3ms)
✓Thenthe gRPC response should contain the order details(2ms)
✓Grpc steps order status reply should not be null(0ms)
✓Grpc steps order status reply order id should be '11f48d22-a835-43f7-ba65-5858ab21592d'(0ms)
✓Grpc steps order status reply customer name should be 'TestCustomer_8997350915935323216'(0ms)
✓Grpc steps order status reply status should be Created(0ms)
Diagrams
This scenario:Payloads
Order status for non-existent order should return not found 12ms🔗Steps
✓Whenthe order status for a non-existent order is requested via gRPC(9ms)
✓Thenthe gRPC response should be a not found error(1ms)
✓Grpc steps rpc exception should not be null(0ms)
✓Grpc steps rpc exception status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Order Summaries
/graphql - Querying order summary reports via GraphQL
Order summaries should contain ingested order data Happy PathIgnoreIfNeedsDirectDbAccess28ms🔗Steps
✓Givenan order has been created and ingested into the reporting database(3ms)
✓Whenthe order summaries are queried via graphql(12ms)
✓Thenthe graphql response should contain the ingested order summary(9ms)
✓Graph ql steps response message status code should be OK(0ms)
✓Graph ql steps order summaries should contain [ o => o.OrderId == '3b2cb058-0deb-4957-a770-ac997b8a7d83' && o.CustomerName == 'TestCustomer_3572690070906207147' && o.ItemCount == 3 && o.TableNumber == 7 ](0ms)
Diagrams
This scenario:Payloads
Order summaries should return an empty list when no orders exist 19ms🔗Steps
✓Whenthe order summaries are queried via graphql(13ms)
✓Thenthe graphql response should be successful(1ms)
✓Graph ql steps response message status code should be OK(0ms)
✓Andthe order summaries list should be empty or not contain the test order(3ms)
✓Graph ql steps order summaries should not contain [ o => o.OrderId == '846ab63d-89ab-4581-b8a6-d79a35a25cf0' ](0ms)
Diagrams
This scenario:Payloads
Order Timings Analytics
/order-timings - Recording and summarising kitchen order timings (ClickHouse)
Recording an order timing should return the created record Happy Path178ms ยท 163ms warm-up🔗Steps
✓Givena valid order timing request(2ms)
✓Whenthe order timing is recorded(167ms)
✓Thenthe timing response should contain the created record(6ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Post steps response station should be 'Griddle-c42480294c294e258d3640b0ff2b9120'(0ms)
✓Post steps response prep seconds should be 42.5m(0ms)
✓Post steps response timing id should not be null or empty(0ms)
Diagrams
This scenario:Payloads
Getting the timing summary should return aggregated data 39ms🔗Steps✓Givenan order timing record has been created(3ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe timing summary is requested(28ms)
✓Thenthe summary should contain aggregated data for the station(5ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps summary response should contain [ s => s.Station == 'Griddle-ebe5a6c9cb23460cb5adf739b8f32434' && s.TimingCount >= 1 ](0ms)
Diagrams
This scenario:Payloads
Listing timings by station should return matching records 159ms🔗Steps✓Givenan order timing record has been created(9ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe timings are listed by station(144ms)
✓Thenthe timing list response should contain the record(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 [ t => t.TimingId == '1e4330d5-3757-4933-9c9e-d13705e94142' ](0ms)
Diagrams
This scenario:Payloads
Recording a timing with missing station should return bad request 3ms🔗Steps
✓Givenan order timing request with a missing station(0ms)
✓Whenthe order timing is recorded(1ms)
✓Thenthe timing post response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Recording a timing with zero prep seconds should return bad request 8ms🔗Steps
✓Givenan order timing request with zero prep seconds(0ms)
✓Whenthe order timing is recorded(5ms)
✓Thenthe timing post response should indicate bad request(1ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
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 passed9ms🔗
#
Input Parameters
Status
Duration
Field
Value
Reason
Error Message
Response Status
1
Status
Status is required
'Status' is required.
Bad Request
Passed
9ms
Steps
✓Givena valid status update request with "Status" set to ""(1ms)
✓Whenthe invalid status update request is submitted(4ms)
✓Thenthe status update response should contain error "'Status' is required." with status "Bad Request"(2ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Status' is required.') ](0ms)
Diagrams
This scenario:Payloads
Orders endpoint is called with invalid fields should return a bad request response 5/5 passed41ms🔗
#
Input Parameters
Status
Duration
Field
Value
Reason
Error Message
Response Status
1
CustomerName
Customer name is required
'Customer Name' is required.
Bad Request
Passed
26ms
2
Items[0].BatchId
Batch ID is required
'Batch Id' is required.
Bad Request
Passed
3ms
3
Items[0].ItemType
Item type is required
'Item Type' is required.
Bad Request
Passed
4ms
4
Items[0].Quantity
0
Quantity must be greater than zero
Quantity must be greater than zero.
Bad Request
Passed
3ms
5
Items
At least one item is required
The Items field is required.
Bad Request
Passed
3ms
Steps
✓Givena valid order request with "CustomerName" set to ""(3ms)
✓Whenthe invalid order request is submitted(11ms)
✓Thenthe order response should contain error "'Customer Name' is required." with status "Bad Request"(6ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Customer Name' is required.') ](0ms)
Steps
✓Givena valid order request with "Items[0].BatchId" set to ""(0ms)
✓Whenthe invalid order request is submitted(1ms)
✓Thenthe order response should contain error "'Batch Id' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Batch Id' is required.') ](0ms)
Steps
✓Givena valid order request with "Items[0].ItemType" set to ""(1ms)
✓Whenthe invalid order request is submitted(1ms)
✓Thenthe order response should contain error "'Item Type' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Item Type' is required.') ](0ms)
Steps
✓Givena valid order request with "Items[0].Quantity" set to "0"(0ms)
✓Whenthe invalid order request is submitted(1ms)
✓Thenthe order response should contain error "Quantity must be greater than zero." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Quantity must be greater than zero.') ](0ms)
Steps
✓Givena valid order request with "Items" set to ""(0ms)
✓Whenthe invalid order request is submitted(1ms)
✓Thenthe order response should contain error "The Items field is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('The Items field is required.') ](0ms)
Diagrams
This scenario:Payloads
Outbox Retry Exhaustion
/orders - Outbox message transitions to failed after exhausting retries
An outbox message should transition to failed after exhausting retries IgnoreIfNeedsEventInfrastructure730ms🔗Steps
✓Giventhe outbox processor is configured with a failing dispatcher(163ms)
✓Anda pending outbox message with a test-specific destination(2ms)
✓Thenthe outbox message should be in a failed state(561ms)
Sequence Diagrams
This scenario:Payloads
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 passed17ms🔗
#
Input Parameters
Status
Duration
Content Type
1
application/xml
Passed
9ms
2
text/html
Passed
2ms
3
text/plain
Passed
5ms
Steps
✓Givena pancake request with content type "application/xml"(0ms)
✓Whenthe pancakes are prepared with the given content type(4ms)
✓Thenthe response should indicate unsupported media type(2ms)
✓Response status code should be UnsupportedMediaType(0ms)
Steps
✓Givena pancake request with content type "text/html"(0ms)
✓Whenthe pancakes are prepared with the given content type(1ms)
✓Thenthe response should indicate unsupported media type(0ms)
✓Response status code should be UnsupportedMediaType(0ms)
Steps
✓Givena pancake request with content type "text/plain"(0ms)
✓Whenthe pancakes are prepared with the given content type(3ms)
✓Thenthe response should indicate unsupported media type(0ms)
✓Response status code should be UnsupportedMediaType(0ms)
Diagrams
This scenario:Payloads
Pancakes Creation
/pancakes - Creating pancakes with ingredients and optional toppings
A valid pancake request should return a fresh batch Happy Path19ms🔗Steps✓Givena valid pancake 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)
✓Whenthe pancakes are prepared(5ms)
✓Thenthe pancakes response should contain a valid batch with all ingredients(3ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response ingredients should contain 'Some_Fresh_Milk'(0ms)
✓Pancake steps response ingredients should contain 'Some_Eggs'(0ms)
✓Pancake steps response ingredients should contain 'Some_Flour'(0ms)
✓Andthe cow service should have received a milk request(0ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ](0ms)
Diagrams
This scenario:Payloads
A pancake request with more toppings than allowed should return a bad request response IgnoreIfExternalSut41ms🔗Steps
✓Giventhe max toppings per item is the configured limit(0ms)
✓Anda valid pancake recipe with all ingredients(31ms)
✓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)
✓Andthe request has more toppings than the configured limit(2ms)
✓Whenthe pancakes are prepared(2ms)
✓Thenthe 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
This scenario:Payloads
Pancakes endpoint is called with invalid ingredients should return a bad request response 6/6 passed36ms🔗
#
Input Parameters
Status
Duration
Field
Value
Reason
Error Message
Response Status
1
Eggs
Eggs is required
'Eggs' is required.
Bad Request
Passed
5ms
2
Eggs
javascript:void(0)
XSS in eggs
Eggs contains potentially dangerous content.
Bad Request
Passed
4ms
3
Flour
<img onerror=x>
XSS in flour
Flour contains potentially dangerous content.
Bad Request
Passed
3ms
4
Flour
Flour is required
'Flour' is required.
Bad Request
Passed
5ms
5
Milk
<script>alert</script>
XSS in milk
Milk contains potentially dangerous content.
Bad Request
Passed
13ms
6
Milk
Milk is required
'Milk' is required.
Bad Request
Passed
5ms
Steps
✓Givena valid pancake request with "Eggs" set to ""(0ms)
✓Whenthe invalid pancake request is submitted(3ms)
✓Thenthe response should contain error "'Eggs' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Eggs' is required.') ](0ms)
Steps
✓Givena valid pancake request with "Eggs" set to "javascript:void(0)"(0ms)
✓Whenthe invalid pancake request is submitted(2ms)
✓Thenthe response should contain error "Eggs contains potentially dangerous content." with status "Bad Request"(1ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Eggs contains potentially dangerous content.') ](0ms)
Steps
✓Givena valid pancake request with "Flour" set to "<img onerror=x>"(0ms)
✓Whenthe invalid pancake request is submitted(1ms)
✓Thenthe response should contain error "Flour contains potentially dangerous content." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Flour contains potentially dangerous content.') ](0ms)
Steps
✓Givena valid pancake request with "Flour" set to ""(0ms)
✓Whenthe invalid pancake request is submitted(2ms)
✓Thenthe response should contain error "'Flour' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Flour' is required.') ](0ms)
Steps
✓Givena valid pancake request with "Milk" set to "<script>alert</script>"(2ms)
✓Whenthe invalid pancake request is submitted(4ms)
✓Thenthe response should contain error "Milk contains potentially dangerous content." with status "Bad Request"(3ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Milk contains potentially dangerous content.') ](0ms)
Steps
✓Givena valid pancake request with "Milk" set to ""(0ms)
✓Whenthe invalid pancake request is submitted(3ms)
✓Thenthe response should contain error "'Milk' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Milk' is required.') ](0ms)
Consuming recipe cost event should trigger downstream processing Happy PathIgnoreIfExternalSut28ms🔗Steps
✓Givena recipe cost calculated event(2ms)
✓Whenthe event is published to Kafka(18ms)
✓Thenthe calculation ID should be generated(2ms)
✓Publish steps calculation id should not be '00000000-0000-0000-0000-000000000000'(0ms)
✓Andthe kitchen service should have received the preparation request(1ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/prepare" && r.Method == HttpMethod.Post ](0ms)
Diagrams
This scenario:Payloads
Recipe Reports
/graphql - Querying recipe reports and aggregations via GraphQL
Recipe reports should contain ingested recipe data Happy PathIgnoreIfNeedsDirectDbAccess19ms🔗Steps
✓Givenrecipe logs have been ingested into the reporting database(2ms)
✓Whenthe recipe reports are queried via graphql(8ms)
✓Thenthe 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 == '59749e02-2578-4b7a-9f10-160bd82989ec' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ](0ms)
Diagrams
This scenario:Payloads
Ingredient usage should aggregate across multiple recipes IgnoreIfNeedsDirectDbAccess28ms🔗Steps
✓Givenmultiple recipe logs have been ingested with overlapping ingredients(4ms)
✓Whenthe ingredient usage is queried via graphql(15ms)
✓Thenthe ingredient usage should reflect aggregated counts(6ms)
✓Graph ql steps response message status code should be OK(0ms)
✓Graph ql steps ingredient usage should contain [ i => i.Ingredient == "Milk" && i.Count >= 2 ](0ms)
✓Graph ql steps ingredient usage should contain [ i => i.Ingredient == "Butter" && i.Count >= 1 ](0ms)
Diagrams
This scenario:Payloads
Popular recipes should return recipe types ordered by frequency IgnoreIfNeedsDirectDbAccess63ms🔗Steps
✓Givenmultiple recipe logs of different types have been ingested(4ms)
✓Whenthe popular recipes are queried via graphql(50ms)
✓Thenthe popular recipes should be ordered by count descending(6ms)
✓Graph ql steps response message status code should be OK(0ms)
✓Pancakes should not be null(0ms)
✓Pancakes count should be greater than or equal to 2(0ms)
✓Graph ql steps popular recipes should contain [ r => r.RecipeType == "Waffles" && r.Count >= 1 ](0ms)
Diagrams
This scenario:Payloads
Recipe Reviews Management
/recipe-reviews - Submitting and retrieving recipe reviews (MongoDB)
Submitting a recipe review should return the created review Happy Path126ms ยท 99ms warm-up🔗Steps
✓Givena valid recipe review request(2ms)
✓Whenthe recipe review is submitted(109ms)
✓Thenthe recipe review response should contain the created review(9ms)
✓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-a415dfff246a42339d947d4afe7ae4e9'(0ms)
✓Post steps response rating should be 5(0ms)
✓Post steps response review id should not be null or empty(0ms)
Diagrams
This scenario:Payloads
Listing reviews by recipe should return matching reviews 138ms🔗Steps✓Givena recipe review has been created(9ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe reviews are listed by recipe name(122ms)
✓Thenthe list response should contain the review(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 [ r => r.ReviewId == '616441eb-1bc6-4807-ac1f-203431ba4f6b' ](0ms)
Diagrams
This scenario:Payloads
Retrieving a non-existent review should return not found 23ms🔗Steps
✓Whena non-existent review is retrieved(22ms)
✓Thenthe review get response should indicate not found(1ms)
✓Get steps response message status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Retrieving existing review by id should return the review 10ms🔗Steps✓Givena recipe review has been created(1ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe review is retrieved by id(3ms)
✓Thenthe get 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 response review id should be 'b0f23973-4cff-4a93-a588-2d3841e97fa6'(0ms)
✓Get steps response recipe name should be 'Recipe-0fde95378d5e4231bd70fe9ea7ee6319'(0ms)
Diagrams
This scenario:Payloads
Submitting a review with an invalid rating should return bad request 88ms🔗Steps
✓Givena recipe review request with an invalid rating(2ms)
✓Whenthe recipe review is submitted(82ms)
✓Thenthe review post response should indicate bad request(1ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Submitting a review with missing recipe name should return bad request 5ms🔗Steps
✓Givena recipe review request with a missing recipe name(2ms)
✓Whenthe recipe review is submitted(1ms)
✓Thenthe review post response should indicate bad request(0ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Recipe Summary Via G RPC
/grpc - Retrieving recipe summaries via gRPC
Pancake recipe summary should return correct data Happy Path137ms ยท 54ms warm-up🔗Steps
✓Whena recipe summary is requested for "Pancakes" via gRPC(69ms)
✓Thenthe recipe summary should contain 42 total batches(13ms)
✓Grpc steps recipe summary reply total batches should be '42'(0ms)
✓Andthe recipe summary should contain ingredients "Milk, Flour, Eggs"(47ms)
✓Grpc steps recipe summary reply common ingredients should be equivalent to '[ "Milk", "Flour", "Eggs" ]'(0ms)
Diagrams
This scenario:Payloads
Waffle recipe summary should return correct data Happy Path4ms🔗Steps
✓Whena recipe summary is requested for "Waffles" via gRPC(1ms)
✓Thenthe recipe summary should contain 28 total batches(0ms)
✓Grpc steps recipe summary reply total batches should be '28'(0ms)
✓Andthe recipe summary should contain ingredients "Milk, Flour, Eggs, Butter"(2ms)
✓Grpc steps recipe summary reply common ingredients should be equivalent to '[ "Milk", "Flour", "Eggs", "Butter" ]'(0ms)
Diagrams
This scenario:Payloads
Unknown recipe type should return zero batches 7ms🔗Steps
✓Whena recipe summary is requested for "Unknown" via gRPC(3ms)
✓Thenthe recipe summary should contain 0 total batches(0ms)
✓Grpc steps recipe summary reply total batches should be '0'(0ms)
✓Andthe recipe summary should contain no ingredients(2ms)
✓Grpc steps recipe summary reply common ingredients should be empty(0ms)
Diagrams
This scenario:Payloads
Reporting Batch Completions
/graphql - Querying batch completion records populated by Pub/Sub consumption
Batch completions should contain data ingested via pubsub consumer Happy Path114ms🔗Steps✓Givena pancake batch has been created for batch completions(15ms)
✓Milk steps response message status code should be OK(0ms)
✓Eggs steps response message status code should be OK(0ms)
✓Flour steps response message status code should be OK(0ms)
✓Pancake steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Pancake steps response should not be null(0ms)
✓Pancake steps response batch id should not be empty(0ms)
✓Whenthe batch completions are queried via graphql(14ms)
✓Thenthe graphql response should contain the batch completion record(81ms)
✓Graph ql steps response message status code should be OK(0ms)
✓Graph ql steps batch completions should contain [ r => r.BatchId == '4ae9c98f-5557-4d0b-a869-f2af1f6226de' && r.RecipeType == "Pancakes" && r.Ingredients.Contains("Milk") ](0ms)
Diagrams
This scenario:Payloads
Reporting Event Grid Webhook
/webhooks/eventgrid - Ingredient shipments recorded via EventGrid webhook events
Ingredient shipments should be recorded when delivered via eventgrid webhook Happy Path66ms🔗Steps✓Givenan ingredient delivery event has been received via eventgrid webhook(44ms)
✓Response status code should be OK(0ms)
✓Whenthe ingredient shipments are queried via graphql(10ms)
✓Thenthe graphql response should contain the ingredient shipment record(8ms)
✓Graph ql steps response message status code should be OK(0ms)
/reservations - Managing table reservations with full CRUD operations and cancellation
Reservations can be created and retrievedCreating a reservation should return the confirmed reservation Happy Path9ms🔗Steps
✓Givena valid reservation request(0ms)
✓Whenthe reservation is submitted(5ms)
✓Thenthe reservation response should contain the confirmed booking(2ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Post steps response status should be "Confirmed"(0ms)
✓Post steps response customer name should be 'Customer-498d987429e14ee595637ef9ede4958f'(0ms)
Diagrams
This scenario:Payloads
Reservations can be cancelled onceCancelling a reservation should return the cancelled reservation 14ms🔗Steps✓Givena reservation exists(5ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe reservation is cancelled(4ms)
✓Thenthe cancellation response should indicate the reservation is cancelled(3ms)
✓Cancel steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Cancel steps response status should be "Cancelled"(0ms)
Diagrams
This scenario:Payloads
Cancelling an already cancelled reservation should return a conflict response 105ms ยท 62ms warm-up🔗Steps✓Givena cancelled reservation exists(95ms)
✓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)
✓Whenthe reservation is cancelled again(5ms)
✓Thenthe cancellation response should indicate a conflict(1ms)
✓Cancel steps response message status code should be Conflict(0ms)
Diagrams
This scenario:Payloads
Reservations can be deletedDeleting a reservation should return no content 18ms🔗Steps✓Givena reservation exists(3ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe reservation is deleted(12ms)
✓Thenthe reservation delete response should indicate no content(1ms)
✓Delete response status code should be NoContent(0ms)
Diagrams
This scenario:Payloads
Reservations can be created and retrievedRetrieving an existing reservation should return the reservation 28ms🔗Steps✓Givena reservation exists(9ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe reservation is retrieved by id(12ms)
✓Thenthe reservation get response should contain the reservation(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 '2'(0ms)
✓Get steps response customer name should be 'Customer-46bc3b8a51e44a87818cafb4cfaa00d7'(0ms)
✓Get steps response status should be "Confirmed"(0ms)
Diagrams
This scenario:Payloads
Service Time Analysis
Order served events - Service time analysis (Kafka โ ClickHouse โ gRPC โ Kitchen)
Consuming an order served event should trigger downstream processing Happy PathIgnoreIfExternalSut31ms🔗Steps
✓Givenan order served event(2ms)
✓Whenthe order served event is published to Kafka(20ms)
✓Thenthe order ID should be generated(2ms)
✓Publish steps order id should not be '00000000-0000-0000-0000-000000000000'(0ms)
✓Andthe kitchen service should have received the status request(4ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == $"/status/{orderId}" && r.Method == HttpMethod.Get ](0ms)
Diagrams
This scenario:Payloads
Specifications Async Api
/asyncapi/v1.json - Serving the AsyncAPI specification describing event-driven messaging
The AsyncApi endpoint should return a valid specification Happy Path132ms🔗Steps
✓Whenthe asyncapi endpoint is called(125ms)
✓Thenthe response should be valid(0ms)
✓Context format should not be null "the scenario should have fetched a specification document"(0ms)
✓Context document response message status code should be OK(0ms)
✓Response is valid json should be true $"response body (first 500 chars): {context.Document.Body?[..Math.Min(context.Document.Body.Length, 500)]}"(0ms)
✓Andthe asyncapi spec is written to disk(4ms)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("defaultContentType") should not be null(0ms)
✓Async api json root element get property("channels") should not be null(0ms)
✓Async api json root element get property("operations") should not be null(0ms)
✓Async api json root element get property("components") should not be null(0ms)
Diagrams
This scenario:Payloads
Specifications Async Api UI
/asyncapi - Serving the AsyncAPI documentation UI
The AsyncApi UI endpoint should return a valid page Happy Path9ms🔗Steps
✓Whenthe asyncapi ui endpoint is called(5ms)
✓Thenthe response should be a valid asyncapi page(1ms)
✓Context document response message status code should be OK(0ms)
✓Context document body should contain "<html"(0ms)
✓Context document body should contain UiRenderer(0ms)
✓Context document body should contain Endpoints.AsyncApi.AsyncApiSpec(0ms)
Diagrams
This scenario:Payloads
Specifications Graph QL Schema
/graphql/schema.json; /graphql/schema.graphql - Serving the GraphQL schema as introspection JSON and as a schema definition
The GraphQL schema definition endpoint should return the schema definition Happy Path65ms🔗Steps
✓Whenthe graphql schema definition endpoint is called(53ms)
✓Thenthe response should be a graphql schema definition(1ms)
✓Context document response message status code should be OK(0ms)
✓Context document response message content headers content type media type should be GraphQL(0ms)
✓Andthe schema definition should declare all the reporting queries(3ms)
✓Andthe graphql schema definition is written to disk(2ms)schema.graphql
Diagrams
This scenario:Payloads
The GraphQL schema endpoint should return a valid specification Happy Path106ms🔗Steps
✓Whenthe graphql schema endpoint is called(84ms)
✓Thenthe response should be valid(0ms)
✓Context format should not be null "the scenario should have fetched a specification document"(0ms)
✓Context document response message status code should be OK(0ms)
✓Response is valid json should be true $"response body (first 500 chars): {context.Document.Body?[..Math.Min(context.Document.Body.Length, 500)]}"(0ms)
✓Andthe schema should contain all the reporting queries(11ms)✓Andthe reporting queries should be documented(5ms)
✓Graph ql schema documents type description(context document json, graph ql schema defaults query type name) should not be null or white space(0ms)
✓Graph ql schema documents undocumented fields(context document json, graph ql schema defaults query type name) should be empty(0ms)
✓Andthe graphql schema is written to disk(3ms)graphql.json
Diagrams
This scenario:Payloads
Specifications Graph QL UI
/graphql/ - Serving the Nitro GraphQL IDE
The GraphQL UI endpoint should return a valid page Happy Path35ms🔗Steps
✓Whenthe graphql ui endpoint is called(28ms)
✓Thenthe response should be a valid nitro page(2ms)
✓Context document response message status code should be OK(0ms)
✓Context document body should contain "<html"(0ms)
✓Context document body should contain NitroMarker(0ms)
✓Andthe page should be served by the service itself(2ms)
✓Context document response message headers contains( graph ql schema defaults cdn ray header) should be false(0ms)
Diagrams
This scenario:Payloads
Specifications Grpc Contract
/grpc/v1.json; /grpc/protos/breakfast.proto - Serving the gRPC contract as a descriptor set and as its proto file
The Grpc contract endpoint should return a valid specification Happy Path48ms🔗Steps
✓Whenthe grpc contract endpoint is called(12ms)
✓Thenthe response should be valid(15ms)
✓Context format should not be null "the scenario should have fetched a specification document"(0ms)
✓Context document response message status code should be OK(0ms)
✓Context document descriptor set should not be null(0ms)
✓Andthe grpc contract should describe the breakfast service(12ms)
✓Context document descriptor set file select(f => f name) should equal ProtoFileName(0ms)
✓Contract file package should be Package(0ms)
✓Contract file service select(s => s name) should contain ServiceName(0ms)
✓Breakfast service method select(m => m name) should contain GetRecipeSummary(0ms)
✓Breakfast service method select(m => m name) should contain GetOrderStatus(0ms)
✓Breakfast service method select(m => m name) should contain StreamOrderUpdates(0ms)
✓Breakfast service method single(m => m name == grpc contract defaults stream order updates) server streaming should be true(0ms)
✓Andevery breakfast method should be documented(2ms)
✓Grpc descriptor comments undocumented methods( contract file, grpc contract defaults service name) should be empty(0ms)
✓Andthe grpc contract is written to disk(2ms)grpc.json
Diagrams
This scenario:Payloads
The Grpc proto endpoint should return the proto file Happy Path8ms🔗Steps
✓Whenthe grpc proto endpoint is called(5ms)
✓Thenthe response should be a plain text proto file(1ms)
✓Context document response message status code should be OK(0ms)
✓Context document response message content headers content type media type should be MediaTypeNames.Text.Plain(0ms)
✓Andthe proto file should declare the breakfast service(1ms)
✓Context document body should contain $"package {GrpcContractDefaults.Package};"(0ms)
✓Context document body should contain $"service {GrpcContractDefaults.ServiceName}"(0ms)
Diagrams
This scenario:Payloads
Specifications Grpc Reflection
gRPC server reflection - Letting gRPC tools discover the breakfast service
Grpc server reflection should describe the breakfast service Happy Path307ms🔗Steps
✓Whenthe breakfast service is described through grpc server reflection(244ms)
✓Thenthe description should be the breakfast proto file(18ms)
✓Reflection steps described files should contain single [ f => f.Name == GrpcContractDefaults.ProtoFileName ](0ms)
✓Described file package should be Package(0ms)
✓Andthe description should contain every breakfast method(6ms)
✓Described file service should contain single [ s => s.Name == GrpcContractDefaults.ServiceName ](0ms)
✓Service method select(m => m name) should contain GetRecipeSummary(0ms)
✓Service method select(m => m name) should contain GetOrderStatus(0ms)
✓Service method select(m => m name) should contain StreamOrderUpdates(0ms)
Diagrams
This scenario:Payloads
Grpc server reflection should list the breakfast service Happy Path45ms🔗Steps
✓Whenthe services are listed through grpc server reflection(38ms)
✓Thenthe breakfast service should be listed(1ms)
✓Reflection steps listed services should contain ServiceFullName(0ms)
✓Andthe reflection service should be listed(1ms)
✓Reflection steps listed services should contain ReflectionServiceFullName(0ms)
Diagrams
This scenario:Payloads
Specifications Grpc UI
/grpc/ - Serving the gRPC documentation page
The Grpc UI endpoint should return a page describing the service Happy Path90ms🔗Steps
✓Whenthe grpc ui endpoint is called(49ms)
✓Thenthe response should be a valid grpc documentation page(1ms)
✓Context document response message status code should be OK(0ms)
✓Context document response message content headers content type media type should be MediaTypeNames.Text.Html(0ms)
✓Context document body should contain "<html"(0ms)
✓Andthe page should describe every breakfast method(2ms)
✓Context document body should contain ServiceDescription(0ms)
✓Grpc contract page rows row of(context document body, grpc contract defaults get recipe summary) should not be null(0ms)
✓Grpc contract page rows row of(context document body, grpc contract defaults get order status) should not be null(0ms)
✓Grpc contract page rows row of(context document body, grpc contract defaults stream order updates) should contain ServerStreamingKind(0ms)
✓Andthe page should link to the grpc contract(1ms)
✓Context document body should contain $"href=\"{GrpcContractDefaults.ContractJsonLink}\""(0ms)
✓Context document body should contain $"href=\"{GrpcContractDefaults.ProtoFileLink}\""(0ms)
✓Andthe grpc ui page is written to disk(29ms)grpc.html
Diagrams
This scenario:Payloads
Specifications Open Api
/openapi/v1.json - Serving the OpenAPI specification describing all REST endpoints
The OpenApi endpoint should return a valid specification Happy Path334ms🔗Steps
✓Whenthe open api endpoint is called(238ms)
✓Thenthe response should be valid(1ms)
✓Context format should not be null "the scenario should have fetched a specification document"(0ms)
✓Context document response message status code should be OK(0ms)
✓Response is valid json should be true $"response body (first 500 chars): {context.Document.Body?[..Math.Min(context.Document.Body.Length, 500)]}"(0ms)
✓Andthe response should contain all the endpoints(3ms)
✓Andthe openapi spec is written to disk(3ms)openapi.json
Diagrams
This scenario:Payloads
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 Path118ms🔗Steps
✓Whenthe scalar ui endpoint is called(114ms)
✓Thenthe response should be a valid scalar page(2ms)
✓Context document response message status code should be OK(0ms)
✓Scalar ui response body should contain "<html"(0ms)
✓Scalar ui response body should contain "scalar"(0ms)
Diagrams
This scenario:Payloads
Staff Management
/staff - Managing kitchen staff members with full CRUD operations
Staff members support CRUD operationsAdding a new staff member should return the created member Happy Path11ms🔗Steps
✓Givena valid staff member request(1ms)
✓Whenthe staff member is submitted(6ms)
✓Thenthe 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 'Chef-7042c07636f549d9b7e4ee197a2d1ba2'(0ms)
✓Post steps response role should be "Chef"(0ms)
Diagrams
This scenario:Payloads
Staff requests must pass validationAdding a staff member with an invalid role should return a bad request response 16ms🔗Steps
✓Givena staff member request with an invalid role(1ms)
✓Whenthe staff member is submitted(12ms)
✓Thenthe staff response should indicate bad request(1ms)
✓Post steps response message status code should be BadRequest(0ms)
Diagrams
This scenario:Payloads
Staff members support CRUD operationsDeleting a staff member should return no content 22ms🔗Steps✓Givena staff member exists(3ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe staff member is deleted(17ms)
✓Thenthe staff delete response should indicate no content(0ms)
✓Delete response status code should be NoContent(0ms)
Diagrams
This scenario:Payloads
Retrieving an existing staff member should return the member 88ms🔗Steps✓Givena staff member exists(48ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Whenthe staff member is retrieved by id(30ms)
✓Thenthe staff get response should contain the member(5ms)
✓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 'Chef-02a1e5aee7514c4994b67841d6788190'(0ms)
✓Get steps response role should be "Chef"(0ms)
Diagrams
This scenario:Payloads
Status Update Not Found
/orders - Updating status of a non-existent order
Updating the status of a non-existent order should return not found 72ms ยท 63ms warm-up🔗Steps
✓Whena status update is sent for a non-existent order(68ms)
✓Thenthe status update response should indicate not found(1ms)
✓Patch steps response message status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Stream Order Updates Via G RPC
/grpc - Streaming order updates via gRPC server streaming
Streaming order updates should return the current status Happy Path875ms ยท 809ms warm-up🔗Steps✓Givena pancake batch has been created(254ms)
✓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)
✓Andan order has been created for the batch(573ms)
✓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)
✓Whenorder updates are streamed via gRPC(37ms)
✓Thenthe streamed response should contain the order status(5ms)
✓Grpc steps streamed replies should have count 1(0ms)
✓Grpc steps streamed replies[0] order id should be 'f7f9b994-0a3b-46b5-a89e-d8ef44a79722'(0ms)
✓Grpc steps streamed replies[0] customer name should be 'TestCustomer_6124984044811950857'(0ms)
✓Grpc steps streamed replies[0] status should be Created(0ms)
Diagrams
This scenario:Payloads
Streaming updates for non-existent order should return not found 70ms🔗Steps
✓Whenorder updates for a non-existent order are streamed via gRPC(45ms)
✓Thenthe gRPC stream should return a not found error(24ms)
✓Grpc steps rpc exception should not be null(0ms)
✓Grpc steps rpc exception status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Telemetry
/orders - Structured logging and telemetry verification
Creating an order should emit a structured log entry Happy PathIgnoreIfExternalSut237ms🔗Steps
✓Giventhe application is configured with an in-memory log capture(143ms)
✓Anda pancake batch has been created(69ms)
✓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)
✓Anda valid order request(0ms)
✓Whenthe order is submitted(16ms)
✓Thena structured log entry should have been captured for order creation(5ms)
✓Log provider entries should contain [ e => e.Message.Contains("created for customer") ](0ms)
✓Log provider entries should contain [ e => e.Message.Contains(orderSteps.Request.CustomerName) ](0ms)
✓Log provider entries should contain [ e => e.Message.Contains("1 items") ](0ms)
Diagrams
This scenario:Payloads
Toppings Deletion
/toppings - Deleting toppings from the system
Existing toppings can be deletedDeleting an existing topping should return no content Happy Path11ms🔗Steps
✓Givena known topping exists(0ms)
✓Whenthe topping is deleted(7ms)
✓Thenthe delete response should indicate success(2ms)
✓Delete steps response message status code should be NoContent(0ms)
Diagrams
This scenario:Payloads
Non-existent toppings cannot be deletedDeleting a non-existent topping should return not found 4ms🔗Steps
✓Givena topping id that does not exist(0ms)
✓Whenthe topping is deleted(1ms)
✓Thenthe delete response should indicate not found(1ms)
✓Delete steps response message status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Toppings Feature Flag
/toppings - Raspberry topping availability controlled by feature flag
Raspberry topping is hidden when the feature flag is disabledToppings should exclude raspberries when the feature flag is disabled IgnoreIfExternalSut55ms🔗Steps
✓Giventhe raspberry topping feature flag is disabled(44ms)
✓Whenthe available toppings are requested(7ms)
✓Thenthe toppings response should not include raspberries(2ms)
✓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
This scenario:Payloads
Raspberry topping is available when the feature flag is enabledToppings should include raspberries when the feature flag is enabled IgnoreIfExternalSut73ms🔗Steps
✓Giventhe raspberry topping feature flag is enabled(55ms)
✓Whenthe available toppings are requested(11ms)
✓Thenthe toppings response should include raspberries(3ms)
✓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
This scenario:Payloads
Toppings Management
/toppings - Listing available toppings and adding custom toppings
The toppings endpoint should return all available toppings Happy Path18ms🔗Steps
✓Whenthe available toppings are requested(8ms)
✓Thenthe toppings response should contain the default toppings(9ms)
✓Get steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Get steps response should have count ExpectedToppingCount(0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.Raspberries ](0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.Blueberries ](0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.MapleSyrup ](0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.WhippedCream ](0ms)
✓Get steps response should contain [ t => t.Name == ToppingDefaults.ChocolateChips ](0ms)
Diagrams
This scenario:Payloads
Adding a new topping should return the created topping 18ms🔗Steps
✓Givena valid topping request(0ms)
✓Whenthe new topping is submitted(11ms)
✓Thenthe topping response should contain the created topping(3ms)
✓Post steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Post steps response name should be Strawberries(0ms)
✓Post steps response category should be FruitCategory(0ms)
Diagrams
This scenario:Payloads
Toppings Update
/toppings - Updating existing toppings
Existing toppings can be updatedUpdating an existing topping should return the updated topping Happy Path48ms🔗Steps
✓Givena known blueberry topping exists(2ms)
✓Anda valid update topping request(0ms)
✓Whenthe topping is updated(36ms)
✓Thenthe update response should contain the updated topping(7ms)
✓Put steps response message status code should be OK(0ms)
✓Response content is valid json should be true(0ms)
✓Put steps response topping id should be '11111111-0000-0000-0000-000000000002'(0ms)
✓Put steps response name should be Strawberries(0ms)
✓Put steps response category should be FruitCategory(0ms)
Diagrams
This scenario:Payloads
Update requests must pass validation and XSS checksUpdate toppings endpoint is called with invalid or dangerous input 6/6 passed131ms🔗
#
Input Parameters
Status
Duration
Field
Value
Reason
Error Message
Response Status
1
Category
<script>alert('xss')</script>
Script tag in category
Category contains potentially dangerous content.
Bad Request
Passed
43ms
2
Category
Category is required
'Category' is required.
Bad Request
Passed
7ms
3
Category
javascript:alert(1)
Javascript protocol
Category contains potentially dangerous content.
Bad Request
Passed
4ms
4
Name
<img src=x onerror=alert(1)>
Event handler in name
Name contains potentially dangerous content.
Bad Request
Passed
64ms
5
Name
<script>alert('xss')</script>
Script tag in name
Name contains potentially dangerous content.
Bad Request
Passed
5ms
6
Name
Name is required
'Name' is required.
Bad Request
Passed
6ms
Steps
✓Givena known topping exists(4ms)
✓Anda valid update topping request with "Category" set to "<script>alert('xss')</script>"(7ms)
✓Whenthe invalid update topping request is submitted(18ms)
✓Thenthe update response should contain error "Category contains potentially dangerous content." with status "Bad Request"(11ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Category contains potentially dangerous content.') ](0ms)
Steps
✓Givena known topping exists(4ms)
✓Anda valid update topping request with "Category" set to ""(1ms)
✓Whenthe invalid update topping request is submitted(3ms)
✓Thenthe update response should contain error "'Category' is required." with status "Bad Request"(1ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Category' is required.') ](0ms)
Steps
✓Givena known topping exists(4ms)
✓Anda valid update topping request with "Category" set to "javascript:alert(1)"(0ms)
✓Whenthe invalid update topping request is submitted(1ms)
✓Thenthe update 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)
Steps
✓Givena known topping exists(4ms)
✓Anda valid update topping request with "Name" set to "<img src=x onerror=alert(1)>"(0ms)
✓Whenthe invalid update topping request is submitted(2ms)
✓Thenthe update response should contain error "Name contains potentially dangerous content." with status "Bad Request"(4ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Name contains potentially dangerous content.') ](0ms)
Steps
✓Givena known topping exists(4ms)
✓Anda valid update topping request with "Name" set to "<script>alert('xss')</script>"(0ms)
✓Whenthe invalid update topping request is submitted(2ms)
✓Thenthe update response should contain error "Name contains potentially dangerous content." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Name contains potentially dangerous content.') ](0ms)
Steps
✓Givena known topping exists(4ms)
✓Anda valid update topping request with "Name" set to ""(1ms)
✓Whenthe invalid update topping request is submitted(1ms)
✓Thenthe update response should contain error "'Name' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Name' is required.') ](0ms)
Diagrams
This scenario:Payloads
Non-existent toppings cannot be updatedUpdating a non-existent topping should return not found 11ms🔗Steps
✓Givena topping id that does not exist(3ms)
✓Anda valid update topping request(0ms)
✓Whenthe topping is updated(5ms)
✓Thenthe update response should indicate not found(1ms)
✓Put steps response message status code should be NotFound(0ms)
Diagrams
This scenario:Payloads
Toppings XSS Validation
/toppings - XSS and input validation for toppings
Toppings endpoint is called with invalid or dangerous input 6/6 passed73ms🔗
#
Input Parameters
Status
Duration
Field
Value
Reason
Error Message
Response Status
1
Category
<script>alert('xss')</script>
Script tag in category
Category contains potentially dangerous content.
Bad Request
Passed
4ms
2
Category
Category is required
'Category' is required.
Bad Request
Passed
40ms
3
Category
javascript:alert(1)
Javascript protocol
Category contains potentially dangerous content.
Bad Request
Passed
5ms
4
Name
<img src=x onerror=alert(1)>
Event handler in name
Name contains potentially dangerous content.
Bad Request
Passed
8ms
5
Name
<script>alert('xss')</script>
Script tag in name
Name contains potentially dangerous content.
Bad Request
Passed
6ms
6
Name
Name is required
'Name' is required.
Bad Request
Passed
7ms
Steps
✓Givena valid topping request with "Category" set to "<script>alert('xss')</script>"(0ms)
✓Whenthe invalid topping request is submitted(2ms)
✓Thenthe topping response should contain error "Category contains potentially dangerous content." with status "Bad Request"(1ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Category contains potentially dangerous content.') ](0ms)
Steps
✓Givena valid topping request with "Category" set to ""(2ms)
✓Whenthe invalid topping request is submitted(24ms)
✓Thenthe topping response should contain error "'Category' is required." with status "Bad Request"(5ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Category' is required.') ](0ms)
Steps
✓Givena valid topping request with "Category" set to "javascript:alert(1)"(0ms)
✓Whenthe invalid topping request is submitted(1ms)
✓Thenthe topping response should contain error "Category contains potentially dangerous content." with status "Bad Request"(3ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Category contains potentially dangerous content.') ](0ms)
Steps
✓Givena valid topping request with "Name" set to "<img src=x onerror=alert(1)>"(0ms)
✓Whenthe invalid topping request is submitted(4ms)
✓Thenthe topping response should contain error "Name contains potentially dangerous content." with status "Bad Request"(1ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Name contains potentially dangerous content.') ](0ms)
Steps
✓Givena valid topping request with "Name" set to "<script>alert('xss')</script>"(0ms)
✓Whenthe invalid topping request is submitted(1ms)
✓Thenthe topping response should contain error "Name contains potentially dangerous content." with status "Bad Request"(2ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Name contains potentially dangerous content.') ](0ms)
Steps
✓Givena valid topping request with "Name" set to ""(0ms)
✓Whenthe invalid topping request is submitted(5ms)
✓Thenthe topping response should contain error "'Name' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Name' is required.') ](0ms)
Diagrams
This scenario:Payloads
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 passed9ms🔗
#
Input Parameters
Status
Duration
Content Type
1
application/xml
Passed
2ms
2
text/html
Passed
5ms
3
text/plain
Passed
1ms
Steps
✓Givena waffle request with content type "application/xml"(0ms)
✓Whenthe waffles are prepared with the given content type(0ms)
✓Thenthe waffle response should indicate unsupported media type(0ms)
✓Response status code should be UnsupportedMediaType(0ms)
Steps
✓Givena waffle request with content type "text/html"(0ms)
✓Whenthe waffles are prepared with the given content type(1ms)
✓Thenthe waffle response should indicate unsupported media type(1ms)
✓Response status code should be UnsupportedMediaType(0ms)
Steps
✓Givena waffle request with content type "text/plain"(0ms)
✓Whenthe waffles are prepared with the given content type(0ms)
✓Thenthe waffle response should indicate unsupported media type(0ms)
✓Response status code should be UnsupportedMediaType(0ms)
Diagrams
This scenario:Payloads
Waffles Creation
/waffles - Creating waffles with ingredients including butter
A valid waffle request should return a fresh batch Happy Path38ms🔗Steps✓Givena valid waffle recipe with all ingredients(16ms)
✓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)
✓Whenthe waffles are prepared(13ms)
✓Thenthe waffles response should contain a valid batch with all ingredients(5ms)
✓Waffle steps response message status code should be Created(0ms)
✓Response content is valid json should be true(0ms)
✓Waffle steps response ingredients should contain 'Some_Fresh_Milk'(0ms)
✓Waffle steps response ingredients should contain 'Some_Eggs'(0ms)
✓Waffle steps response ingredients should contain 'Some_Flour'(0ms)
✓Waffle steps response ingredients should contain UnsaltedButter(0ms)
✓Andthe cow service should have received a milk request(0ms)
✓Requests should contain [ r => r.RequestUri.AbsolutePath == "/milk" && r.Method == HttpMethod.Get ](0ms)
Diagrams
This scenario:Payloads
A waffle request with more toppings than allowed should return a bad request response IgnoreIfExternalSut18ms🔗Steps
✓Giventhe max toppings per item is the configured limit(0ms)
✓Anda valid waffle recipe with all ingredients(8ms)
✓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)
✓Andthe waffle request has more toppings than the configured limit(1ms)
✓Whenthe waffles are prepared(4ms)
✓Thenthe waffles response should indicate too many toppings(2ms)
✓Waffle steps response message status code should be BadRequest(0ms)
✓Waffle error response body should contain MaxToppingsExceeded(0ms)
Diagrams
This scenario:Payloads
Waffles endpoint is called with invalid ingredients should return a bad request response 8/8 passed89ms🔗
#
Input Parameters
Status
Duration
Field
Value
Reason
Error Message
Response Status
1
Butter
<script>alert</script>
XSS in butter
Butter contains potentially dangerous content.
Bad Request
Passed
38ms
2
Butter
Butter is required
'Butter' is required.
Bad Request
Passed
4ms
3
Eggs
Eggs is required
'Eggs' is required.
Bad Request
Passed
8ms
4
Eggs
javascript:void(0)
XSS in eggs
Eggs contains potentially dangerous content.
Bad Request
Passed
7ms
5
Flour
<img onerror=x>
XSS in flour
Flour contains potentially dangerous content.
Bad Request
Passed
8ms
6
Flour
Flour is required
'Flour' is required.
Bad Request
Passed
5ms
7
Milk
<script>alert</script>
XSS in milk
Milk contains potentially dangerous content.
Bad Request
Passed
8ms
8
Milk
Milk is required
'Milk' is required.
Bad Request
Passed
7ms
Steps
✓Givena valid waffle request with "Butter" set to "<script>alert</script>"(8ms)
✓Whenthe invalid waffle request is submitted(23ms)
✓Thenthe waffle response should contain error "Butter contains potentially dangerous content." with status "Bad Request"(3ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Butter contains potentially dangerous content.') ](0ms)
Steps
✓Givena valid waffle request with "Butter" set to ""(0ms)
✓Whenthe invalid waffle request is submitted(2ms)
✓Thenthe waffle response should contain error "'Butter' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Butter' is required.') ](0ms)
Steps
✓Givena valid waffle request with "Eggs" set to ""(0ms)
✓Whenthe invalid waffle request is submitted(6ms)
✓Thenthe waffle response should contain error "'Eggs' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Eggs' is required.') ](0ms)
Steps
✓Givena valid waffle request with "Eggs" set to "javascript:void(0)"(1ms)
✓Whenthe invalid waffle request is submitted(4ms)
✓Thenthe waffle response should contain error "Eggs contains potentially dangerous content." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Eggs contains potentially dangerous content.') ](0ms)
Steps
✓Givena valid waffle request with "Flour" set to "<img onerror=x>"(0ms)
✓Whenthe invalid waffle request is submitted(6ms)
✓Thenthe waffle response should contain error "Flour contains potentially dangerous content." with status "Bad Request"(1ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Flour contains potentially dangerous content.') ](0ms)
Steps
✓Givena valid waffle request with "Flour" set to ""(0ms)
✓Whenthe invalid waffle request is submitted(3ms)
✓Thenthe waffle response should contain error "'Flour' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Flour' is required.') ](0ms)
Steps
✓Givena valid waffle request with "Milk" set to "<script>alert</script>"(0ms)
✓Whenthe invalid waffle request is submitted(6ms)
✓Thenthe waffle response should contain error "Milk contains potentially dangerous content." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains('Milk contains potentially dangerous content.') ](0ms)
Steps
✓Givena valid waffle request with "Milk" set to ""(0ms)
✓Whenthe invalid waffle request is submitted(4ms)
✓Thenthe waffle response should contain error "'Milk' is required." with status "Bad Request"(0ms)
✓Actual results should contain [ r => r.ErrorMessage.Contains(''Milk' is required.') ](0ms)
Diagrams
This scenario:Payloads
Scenario Timeline 🛈
ShowWarm-upOrder
Creating an order when the kitchen service returns an error should still create the order
1.3s
Creating an order should produce an audit log entry and events
1.3s
An order should progress through all status transitions to completion
1.3s
Equipment alerts should contain data ingested via Event Hub consumer
1.1s
A valid order should be created and an event published
1.0s
Streaming order updates should return the current status
875ms
An outbox message should transition to failed after exhausting retries
730ms
Listing feedback for an order should return the feedback
708ms
Listing usage by ingredient should return matching records
452ms
The OpenApi endpoint should return a valid specification
334ms
Requesting milk when the cow service returns an invalid response should return a bad gateway response
308ms
Grpc server reflection should describe the breakfast service
307ms
Retrieving an existing inventory item should return the item
302ms
Creating an order should emit a structured log entry
237ms
Menu responses should be cached and returned even when supplier becomes unavailable
218ms
Health check should report degraded when multiple downstream services are unavailable
182ms
Recording an order timing should return the created record
178ms
Creating an order should write an outbox message that gets processed
164ms
Listing timings by station should return matching records
159ms
An order at the maximum items per order should be accepted
155ms
The menu endpoint should return all menu items with availability status
155ms
An invalid status transition should return a conflict response
145ms
An invalid status transition should return a conflict response
144ms
Listing reviews by recipe should return matching reviews
138ms
Pancake recipe summary should return correct data
137ms
An invalid status transition should return a conflict response
135ms
The AsyncApi endpoint should return a valid specification
132ms
Exceeding the rate limit should return too many requests
126ms
Getting usage summary should return aggregated data
126ms
Submitting a recipe review should return the created review
126ms
All menu items should be marked unavailable when the supplier service is down
119ms
An order exceeding the maximum items per order should be rejected
119ms
The Scalar UI endpoint should return a valid page
118ms
Batch completions should contain data ingested via pubsub consumer
114ms
The GraphQL schema endpoint should return a valid specification
106ms
Cancelling an already cancelled reservation should return a conflict response
105ms
A request with a correlation id should return the same id in the response
104ms
Retrieving existing customer preferences should return the preferences
104ms
Listing orders with a small page size should limit results
101ms
Requesting the second page should return different orders
98ms
The Grpc UI endpoint should return a page describing the service
90ms
Submitting a review with an invalid rating should return bad request
88ms
Retrieving an existing staff member should return the member
88ms
Recording usage with missing ingredient name should return bad request
79ms
A valid daily special order should return a confirmation
78ms
Health check should report degraded when the cow service is unavailable
75ms
Audit logs should be filterable by entity id
75ms
Toppings should include raspberries when the feature flag is enabled
73ms
Health check should report degraded when a downstream service returns a non-success status
72ms
Submitting feedback should return the created feedback
72ms
Updating the status of a non-existent order should return not found
72ms
Goat milk endpoint should return not found when feature is disabled
70ms
Streaming updates for non-existent order should return not found
70ms
Updating customer preferences should return the updated preferences
69ms
Goat milk endpoint should return fresh goat milk when feature is enabled
66ms
Ingredient shipments should be recorded when delivered via eventgrid webhook
66ms
The GraphQL schema definition endpoint should return the schema definition
65ms
An invalid status transition should return a conflict response
64ms
Update toppings endpoint is called with invalid or dangerous input
64ms
Popular recipes should return recipe types ordered by frequency
63ms
Listing waste by recipe should return matching records
60ms
Listing notes by recipe should return matching notes
59ms
Toppings should exclude raspberries when the feature flag is disabled
55ms
Different muffin recipes should produce the expected batch
53ms
Listing readings by equipment should return matching records
52ms
Updating an existing topping should return the updated topping
48ms
The Grpc contract endpoint should return a valid specification
48ms
Grpc server reflection should list the breakfast service
45ms
Creating an order should produce a retrievable audit log entry
44ms
Update toppings endpoint is called with invalid or dangerous input
43ms
Muffins endpoint called with an invalid field should return a bad request response
41ms
A pancake request with more toppings than allowed should return a bad request response
41ms
Toppings endpoint is called with invalid or dangerous input
40ms
Recording an equipment reading should return the created record
39ms
A valid status transition should update the order
39ms
Getting the timing summary should return aggregated data
39ms
Audit logs should be returned in descending timestamp order
39ms
Listing all inventory items should return all items
38ms
Audit logs should be filterable by entity type
38ms
Waffles endpoint is called with invalid ingredients should return a bad request response
38ms
A valid waffle request should return a fresh batch
38ms
Listing orders should return a paginated response
36ms
Consuming customer feedback event should trigger downstream processing
36ms
Retrieving non-existent customer preferences should return not found
36ms
The GraphQL UI endpoint should return a valid page
35ms
An invalid status transition should return a conflict response
34ms
Updating a non-existent note should return not found
34ms
An invalid status transition should return a conflict response
33ms
Consuming an order served event should trigger downstream processing
31ms
Deleting a reading should remove it from the list
31ms
A created order should be retrievable by its ID
30ms
A valid status transition should update the order
29ms
Requesting goat milk when the goat service is unavailable should return a bad gateway response
29ms
Ingredient usage should aggregate across multiple recipes
28ms
Consuming recipe cost event should trigger downstream processing
28ms
Order summaries should contain ingested order data
28ms
Updating an inventory item should return the updated item
28ms
Retrieving an existing reservation should return the reservation
28ms
Deleting an inventory item should return no content
28ms
Retrieving non-existent feedback should return not found
27ms
Deleting a waste record should return no content
27ms
Order status via gRPC should return order details
26ms
A valid status transition should update the order
26ms
Orders endpoint is called with invalid fields should return a bad request response
26ms
Retrieving an existing note by id should return the note
24ms
Requesting milk when the cow service times out should return a bad gateway response
24ms
Retrieving a non-existent review should return not found
23ms
The health check response should include description and data for each entry
23ms
Submitting feedback with missing customer name should return bad request
23ms
Submitting the same order with different idempotency keys should return different confirmations
23ms
A valid status transition should update the order
22ms
Deleting a staff member should return no content
22ms
Updating an existing note should return the updated note
21ms
Retrieving existing feedback by id should return the feedback
20ms
An invalid status transition should return a conflict response
20ms
Recipe reports should contain ingested recipe data
19ms
A valid pancake request should return a fresh batch
19ms
Order summaries should return an empty list when no orders exist
19ms
Deleting a reservation should return no content
18ms
The toppings endpoint should return all available toppings
18ms
A waffle request with more toppings than allowed should return a bad request response
18ms
Adding a new topping should return the created topping
18ms
Saving customer preferences should return the saved preferences
17ms
A valid apple cinnamon muffin request should return a fresh batch
17ms
Adding a staff member with an invalid role should return a bad request response
16ms
Different muffin recipes should produce the expected batch
16ms
Daily specials order endpoint is called with invalid fields should return a bad request response
14ms
Cancelling a reservation should return the cancelled reservation
14ms
A request with a correlation id should forward it to the supplier service
14ms
Ordering a daily special beyond the threshold should return a conflict response
14ms
Filtering audit logs by a non-existent entity type should return an empty collection
13ms
Pancakes endpoint is called with invalid ingredients should return a bad request response
13ms
Listing orders when none exist should return an empty page
13ms
The health check endpoint should return a healthy status with dependency details
12ms
Order status for non-existent order should return not found
12ms
Daily specials order endpoint is called with invalid fields should return a bad request response
12ms
The heartbeat endpoint should return a running message
12ms
Deleting an existing topping should return no content
11ms
Submitting the same order with the same idempotency key should return the same confirmation
11ms
Adding a new staff member should return the created member
11ms
Requesting goat milk when the goat service returns an invalid response should return a bad gateway response
11ms
A valid goat milk request should return fresh goat milk
11ms
Updating a non-existent topping should return not found
11ms
Recording waste with zero quantity should return bad request
10ms
Remaining quantity should decrease after each order
10ms
Retrieving existing review by id should return the review
10ms
The daily specials endpoint should return all available specials
10ms
Recording ingredient usage should return the created record
10ms
Submitting feedback with invalid rating should return bad request
10ms
Different muffin recipes should produce the expected batch
10ms
Order status update endpoint is called with invalid fields should return a bad request response
9ms
Sending a request with an unsupported content type should return an unsupported media type response
9ms
Creating a reservation should return the confirmed reservation
9ms
Creating a chef note should return the created note
9ms
The AsyncApi UI endpoint should return a valid page
9ms
Adding a new inventory item should return the created item
8ms
The Grpc proto endpoint should return the proto file
8ms
Waffles endpoint is called with invalid ingredients should return a bad request response
8ms
Waffles endpoint is called with invalid ingredients should return a bad request response
8ms
Waffles endpoint is called with invalid ingredients should return a bad request response
8ms
Toppings endpoint is called with invalid or dangerous input
8ms
Recording a timing with zero prep seconds should return bad request
8ms
Toppings endpoint is called with invalid or dangerous input
7ms
Ordering a non-existent daily special should return not found
7ms
Retrieving a non-existent inventory item should return not found
7ms
Waffles endpoint is called with invalid ingredients should return a bad request response
7ms
Unknown recipe type should return zero batches
7ms
Update toppings endpoint is called with invalid or dangerous input
7ms
Recording a reading with zero value should return bad request
7ms
Recording a reading with missing metric should return bad request
7ms
Waffles endpoint is called with invalid ingredients should return a bad request response
7ms
Recording ingredient waste should return the created record
6ms
A request without a correlation id should have one generated in the response
6ms
A request with a correlation id should forward it to the cow service
6ms
Retrieving a non-existent order should return not found
6ms
Toppings endpoint is called with invalid or dangerous input
6ms
Retrieving a non-existent note should return not found
6ms
Recording usage with zero quantity should return bad request
6ms
Requesting milk when the cow service is unavailable should return a bad gateway response
6ms
Update toppings endpoint is called with invalid or dangerous input
6ms
Waffles endpoint is called with invalid ingredients should return a bad request response
5ms
Sending a request with an unsupported content type should return an unsupported media type response
5ms
Creating a note with missing note text should return bad request
5ms
Creating a note with missing recipe name should return bad request
5ms
Toppings endpoint is called with invalid or dangerous input
5ms
Pancakes endpoint is called with invalid ingredients should return a bad request response
5ms
Update toppings endpoint is called with invalid or dangerous input
5ms
Submitting a review with missing recipe name should return bad request
5ms
Pancakes endpoint is called with invalid ingredients should return a bad request response
5ms
Pancakes endpoint is called with invalid ingredients should return a bad request response
5ms
Sending a request with an unsupported content type should return an unsupported media type response
5ms
Orders endpoint is called with invalid fields should return a bad request response
4ms
Waffles endpoint is called with invalid ingredients should return a bad request response
4ms
Toppings endpoint is called with invalid or dangerous input
4ms
Saving customer preferences with missing customer name should return bad request
4ms
Waffle recipe summary should return correct data
4ms
Muffins endpoint called with an invalid field should return a bad request response
4ms
Muffins endpoint called with an invalid field should return a bad request response
4ms
Pancakes endpoint is called with invalid ingredients should return a bad request response
4ms
Update toppings endpoint is called with invalid or dangerous input
4ms
Deleting a non-existent topping should return not found
4ms
Recording waste with missing ingredient name should return bad request
4ms
Recording a timing with missing station should return bad request
3ms
Orders endpoint is called with invalid fields should return a bad request response
3ms
Orders endpoint is called with invalid fields should return a bad request response
3ms
Recording waste with missing reason should return bad request
3ms
Pancakes endpoint is called with invalid ingredients should return a bad request response
3ms
Orders endpoint is called with invalid fields should return a bad request response
3ms
Muffins endpoint called with an invalid field should return a bad request response
3ms
Muffins endpoint called with an invalid field should return a bad request response
2ms
Sending a request with an unsupported content type should return an unsupported media type response
2ms
Muffins endpoint called with an invalid field should return a bad request response
2ms
Sending a request with an unsupported content type should return an unsupported media type response
2ms
Sending a request with an unsupported content type should return an unsupported media type response
1ms
Component Diagram 🛈
ShowDirectionCall summaries
History nothing changed (against 50 earlier runs on main)
stream main ยท run gh:40174567678:1 ยท 50 earlier runs in the window