executable-stories-formatters 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,108 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "projectRoot": "/home/ci/myapp",
4
+ "startedAtMs": 1706745600000,
5
+ "finishedAtMs": 1706745615000,
6
+ "meta": {
7
+ "framework": "xunit",
8
+ "dotnetVersion": "8.0.2"
9
+ },
10
+ "testCases": [
11
+ {
12
+ "externalId": "MyApp.Tests.Auth.LoginTests.SuccessfulLogin_ReturnsToken",
13
+ "title": "Successful login returns token",
14
+ "titlePath": ["MyApp.Tests.Auth", "LoginTests", "Successful login returns token"],
15
+ "sourceFile": "tests/MyApp.Tests/Auth/LoginTests.cs",
16
+ "sourceLine": 22,
17
+ "status": "pass",
18
+ "durationMs": 287,
19
+ "story": {
20
+ "scenario": "Successful login returns token",
21
+ "steps": [
22
+ { "keyword": "Given", "text": "a registered user with email 'alice@example.com'" },
23
+ { "keyword": "When", "text": "the user submits login with valid credentials" },
24
+ { "keyword": "Then", "text": "the response status is 200" },
25
+ { "keyword": "And", "text": "a JWT token is returned" }
26
+ ],
27
+ "tags": ["smoke", "auth"],
28
+ "tickets": ["AUTH-101"],
29
+ "suitePath": ["MyApp.Tests.Auth", "LoginTests"],
30
+ "sourceOrder": 0
31
+ },
32
+ "meta": {
33
+ "framework": "xunit",
34
+ "frameworkCaseId": "MyApp.Tests.Auth.LoginTests.SuccessfulLogin_ReturnsToken"
35
+ }
36
+ },
37
+ {
38
+ "externalId": "MyApp.Tests.Auth.LoginTests.InvalidPassword_Returns401",
39
+ "title": "Invalid password returns 401",
40
+ "titlePath": ["MyApp.Tests.Auth", "LoginTests", "Invalid password returns 401"],
41
+ "sourceFile": "tests/MyApp.Tests/Auth/LoginTests.cs",
42
+ "sourceLine": 48,
43
+ "status": "fail",
44
+ "durationMs": 198,
45
+ "error": {
46
+ "message": "Xunit.Sdk.EqualException: Assert.Equal() Failure\nExpected: 401\nActual: 500",
47
+ "stack": " at MyApp.Tests.Auth.LoginTests.InvalidPassword_Returns401() in /home/ci/myapp/tests/MyApp.Tests/Auth/LoginTests.cs:line 62\n at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)"
48
+ },
49
+ "meta": {
50
+ "framework": "xunit",
51
+ "frameworkCaseId": "MyApp.Tests.Auth.LoginTests.InvalidPassword_Returns401"
52
+ }
53
+ },
54
+ {
55
+ "externalId": "MyApp.Tests.Auth.LoginTests.RateLimiting_BlocksAfterFiveAttempts",
56
+ "title": "Rate limiting blocks after five attempts",
57
+ "titlePath": ["MyApp.Tests.Auth", "LoginTests", "Rate limiting blocks after five attempts"],
58
+ "sourceFile": "tests/MyApp.Tests/Auth/LoginTests.cs",
59
+ "sourceLine": 75,
60
+ "status": "skip",
61
+ "durationMs": 0,
62
+ "meta": {
63
+ "framework": "xunit",
64
+ "frameworkCaseId": "MyApp.Tests.Auth.LoginTests.RateLimiting_BlocksAfterFiveAttempts",
65
+ "skipReason": "[Skip] Rate limit middleware not deployed yet"
66
+ }
67
+ },
68
+ {
69
+ "externalId": "MyApp.Tests.Cart.CheckoutTests.CompleteCheckout_WithCreditCard",
70
+ "title": "Complete checkout with credit card",
71
+ "titlePath": ["MyApp.Tests.Cart", "CheckoutTests", "Complete checkout with credit card"],
72
+ "sourceFile": "tests/MyApp.Tests/Cart/CheckoutTests.cs",
73
+ "sourceLine": 16,
74
+ "status": "pass",
75
+ "durationMs": 654,
76
+ "story": {
77
+ "scenario": "Complete checkout with credit card",
78
+ "steps": [
79
+ { "keyword": "Given", "text": "a cart with 2 items totaling $59.98" },
80
+ { "keyword": "When", "text": "the user submits payment with a test credit card" },
81
+ { "keyword": "Then", "text": "the order is confirmed" },
82
+ { "keyword": "And", "text": "a confirmation email is queued" }
83
+ ],
84
+ "tags": ["checkout", "payments", "e2e"],
85
+ "tickets": ["SHOP-200"],
86
+ "suitePath": ["MyApp.Tests.Cart", "CheckoutTests"],
87
+ "sourceOrder": 0
88
+ },
89
+ "meta": {
90
+ "framework": "xunit",
91
+ "frameworkCaseId": "MyApp.Tests.Cart.CheckoutTests.CompleteCheckout_WithCreditCard"
92
+ }
93
+ },
94
+ {
95
+ "externalId": "MyApp.Tests.Cart.CheckoutTests.EmptyCart_ShouldBlock",
96
+ "title": "Empty cart should block checkout",
97
+ "titlePath": ["MyApp.Tests.Cart", "CheckoutTests", "Empty cart should block checkout"],
98
+ "sourceFile": "tests/MyApp.Tests/Cart/CheckoutTests.cs",
99
+ "sourceLine": 50,
100
+ "status": "pass",
101
+ "durationMs": 38,
102
+ "meta": {
103
+ "framework": "xunit",
104
+ "frameworkCaseId": "MyApp.Tests.Cart.CheckoutTests.EmptyCart_ShouldBlock"
105
+ }
106
+ }
107
+ ]
108
+ }
@@ -0,0 +1,254 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "projectRoot": "/home/ci/app",
4
+ "startedAtMs": 1706745600000,
5
+ "finishedAtMs": 1706745612345,
6
+ "packageVersion": "2.1.0",
7
+ "gitSha": "a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2",
8
+ "ci": {
9
+ "name": "GitHub Actions",
10
+ "url": "https://github.com/acme/app/actions/runs/12345",
11
+ "buildNumber": "12345"
12
+ },
13
+ "meta": {
14
+ "framework": "pytest",
15
+ "pythonVersion": "3.12.1"
16
+ },
17
+ "testCases": [
18
+ {
19
+ "externalId": "tests/auth/test_login.py::test_successful_login",
20
+ "title": "Successful login with valid credentials",
21
+ "titlePath": ["Authentication", "Login", "Successful login with valid credentials"],
22
+ "sourceFile": "tests/auth/test_login.py",
23
+ "sourceLine": 15,
24
+ "status": "pass",
25
+ "durationMs": 342,
26
+ "story": {
27
+ "scenario": "Successful login with valid credentials",
28
+ "steps": [
29
+ { "keyword": "Given", "text": "a registered user with email 'alice@example.com'" },
30
+ {
31
+ "keyword": "When",
32
+ "text": "the user submits login with valid credentials",
33
+ "docs": [
34
+ {
35
+ "kind": "code",
36
+ "label": "Request payload",
37
+ "content": "{ \"email\": \"alice@example.com\", \"password\": \"••••••\" }",
38
+ "lang": "json",
39
+ "phase": "runtime"
40
+ }
41
+ ]
42
+ },
43
+ {
44
+ "keyword": "Then",
45
+ "text": "the response status is 200",
46
+ "docs": [
47
+ { "kind": "kv", "label": "Response time", "value": "45ms", "phase": "runtime" }
48
+ ]
49
+ },
50
+ { "keyword": "And", "text": "a JWT token is returned" },
51
+ { "keyword": "And", "text": "the token contains the correct user ID" }
52
+ ],
53
+ "tags": ["smoke", "auth", "critical"],
54
+ "tickets": ["AUTH-101", "SEC-42"],
55
+ "suitePath": ["Authentication", "Login"],
56
+ "docs": [
57
+ { "kind": "note", "text": "Core authentication flow — must pass before deployment.", "phase": "static" },
58
+ {
59
+ "kind": "link",
60
+ "label": "API Spec",
61
+ "url": "https://docs.example.com/api/auth#login",
62
+ "phase": "static"
63
+ }
64
+ ],
65
+ "sourceOrder": 0
66
+ },
67
+ "attachments": [
68
+ {
69
+ "name": "Login screenshot",
70
+ "mediaType": "image/png",
71
+ "path": "screenshots/login.png"
72
+ }
73
+ ],
74
+ "retry": 0,
75
+ "retries": 0,
76
+ "meta": {
77
+ "framework": "pytest",
78
+ "frameworkCaseId": "tests/auth/test_login.py::test_successful_login"
79
+ }
80
+ },
81
+ {
82
+ "externalId": "tests/auth/test_login.py::test_login_invalid_password",
83
+ "title": "Login with invalid password shows error",
84
+ "titlePath": ["Authentication", "Login", "Login with invalid password shows error"],
85
+ "sourceFile": "tests/auth/test_login.py",
86
+ "sourceLine": 42,
87
+ "status": "pass",
88
+ "durationMs": 215,
89
+ "story": {
90
+ "scenario": "Login with invalid password shows error",
91
+ "steps": [
92
+ { "keyword": "Given", "text": "a registered user" },
93
+ { "keyword": "When", "text": "the user submits login with an incorrect password" },
94
+ { "keyword": "Then", "text": "the response status is 401" },
95
+ { "keyword": "And", "text": "the error message is 'Invalid credentials'" }
96
+ ],
97
+ "tags": ["auth"],
98
+ "suitePath": ["Authentication", "Login"],
99
+ "sourceOrder": 1
100
+ },
101
+ "retry": 0,
102
+ "retries": 0,
103
+ "meta": {
104
+ "framework": "pytest",
105
+ "frameworkCaseId": "tests/auth/test_login.py::test_login_invalid_password"
106
+ }
107
+ },
108
+ {
109
+ "externalId": "tests/auth/test_login.py::test_login_rate_limiting",
110
+ "title": "Login is rate-limited after 5 failed attempts",
111
+ "titlePath": ["Authentication", "Login", "Login is rate-limited after 5 failed attempts"],
112
+ "sourceFile": "tests/auth/test_login.py",
113
+ "sourceLine": 68,
114
+ "status": "fail",
115
+ "durationMs": 1523,
116
+ "error": {
117
+ "message": "AssertionError: Expected status 429 but got 200",
118
+ "stack": "Traceback (most recent call last):\n File \"tests/auth/test_login.py\", line 85, in test_login_rate_limiting\n assert response.status_code == 429\nAssertionError: Expected status 429 but got 200"
119
+ },
120
+ "story": {
121
+ "scenario": "Login is rate-limited after 5 failed attempts",
122
+ "steps": [
123
+ { "keyword": "Given", "text": "a registered user" },
124
+ { "keyword": "When", "text": "the user fails login 5 times in a row" },
125
+ { "keyword": "Then", "text": "the 6th attempt returns 429 Too Many Requests" },
126
+ { "keyword": "And", "text": "the Retry-After header is set" }
127
+ ],
128
+ "tags": ["auth", "security", "rate-limiting"],
129
+ "tickets": ["SEC-55"],
130
+ "suitePath": ["Authentication", "Login"],
131
+ "docs": [
132
+ {
133
+ "kind": "table",
134
+ "label": "Rate limit thresholds",
135
+ "columns": ["Window", "Max attempts", "Lockout"],
136
+ "rows": [
137
+ ["1 minute", "5", "30 seconds"],
138
+ ["1 hour", "20", "15 minutes"]
139
+ ],
140
+ "phase": "static"
141
+ }
142
+ ],
143
+ "sourceOrder": 2
144
+ },
145
+ "retry": 0,
146
+ "retries": 2,
147
+ "meta": {
148
+ "framework": "pytest",
149
+ "frameworkCaseId": "tests/auth/test_login.py::test_login_rate_limiting"
150
+ }
151
+ },
152
+ {
153
+ "externalId": "tests/cart/test_checkout.py::test_checkout_flow",
154
+ "title": "Complete checkout with credit card",
155
+ "titlePath": ["Shopping Cart", "Checkout", "Complete checkout with credit card"],
156
+ "sourceFile": "tests/cart/test_checkout.py",
157
+ "sourceLine": 10,
158
+ "status": "pass",
159
+ "durationMs": 890,
160
+ "story": {
161
+ "scenario": "Complete checkout with credit card",
162
+ "steps": [
163
+ { "keyword": "Given", "text": "a cart with 2 items totaling $59.98" },
164
+ { "keyword": "And", "text": "a valid shipping address" },
165
+ {
166
+ "keyword": "When",
167
+ "text": "the user submits payment with a test credit card",
168
+ "docs": [
169
+ {
170
+ "kind": "section",
171
+ "title": "Payment details",
172
+ "markdown": "Uses Stripe test card `4242 4242 4242 4242` with any future expiry.",
173
+ "phase": "static"
174
+ }
175
+ ]
176
+ },
177
+ { "keyword": "Then", "text": "the order is confirmed" },
178
+ { "keyword": "And", "text": "a confirmation email is queued" },
179
+ { "keyword": "But", "text": "no charge is made in test mode" }
180
+ ],
181
+ "tags": ["checkout", "payments", "e2e"],
182
+ "tickets": ["SHOP-200"],
183
+ "suitePath": ["Shopping Cart", "Checkout"],
184
+ "docs": [
185
+ {
186
+ "kind": "mermaid",
187
+ "code": "sequenceDiagram\n User->>Cart: Add items\n User->>Checkout: Submit order\n Checkout->>Stripe: Charge card\n Stripe-->>Checkout: Success\n Checkout->>Email: Send confirmation\n Checkout-->>User: Order confirmed",
188
+ "title": "Checkout sequence",
189
+ "phase": "static"
190
+ }
191
+ ],
192
+ "sourceOrder": 0
193
+ },
194
+ "retry": 0,
195
+ "retries": 0,
196
+ "meta": {
197
+ "framework": "pytest",
198
+ "frameworkCaseId": "tests/cart/test_checkout.py::test_checkout_flow"
199
+ }
200
+ },
201
+ {
202
+ "externalId": "tests/cart/test_checkout.py::test_empty_cart_checkout",
203
+ "title": "Cannot checkout with an empty cart",
204
+ "titlePath": ["Shopping Cart", "Checkout", "Cannot checkout with an empty cart"],
205
+ "sourceFile": "tests/cart/test_checkout.py",
206
+ "sourceLine": 55,
207
+ "status": "skip",
208
+ "durationMs": 2,
209
+ "story": {
210
+ "scenario": "Cannot checkout with an empty cart",
211
+ "steps": [
212
+ { "keyword": "Given", "text": "an empty cart" },
213
+ { "keyword": "When", "text": "the user attempts to checkout" },
214
+ { "keyword": "Then", "text": "the checkout is blocked with 'Cart is empty'" }
215
+ ],
216
+ "tags": ["checkout"],
217
+ "suitePath": ["Shopping Cart", "Checkout"],
218
+ "sourceOrder": 1
219
+ },
220
+ "meta": {
221
+ "framework": "pytest",
222
+ "frameworkCaseId": "tests/cart/test_checkout.py::test_empty_cart_checkout",
223
+ "skipReason": "Temporarily disabled — cart redesign in progress (SHOP-250)"
224
+ },
225
+ "retry": 0,
226
+ "retries": 0
227
+ },
228
+ {
229
+ "title": "test_db_connection_pool_size",
230
+ "titlePath": ["Infrastructure", "Database", "test_db_connection_pool_size"],
231
+ "sourceFile": "tests/infra/test_db.py",
232
+ "sourceLine": 12,
233
+ "status": "pass",
234
+ "durationMs": 55,
235
+ "meta": {
236
+ "framework": "pytest",
237
+ "frameworkCaseId": "tests/infra/test_db.py::test_db_connection_pool_size"
238
+ }
239
+ },
240
+ {
241
+ "title": "test_redis_cache_ttl",
242
+ "titlePath": ["Infrastructure", "Cache", "test_redis_cache_ttl"],
243
+ "sourceFile": "tests/infra/test_cache.py",
244
+ "sourceLine": 8,
245
+ "status": "pending",
246
+ "durationMs": 0,
247
+ "meta": {
248
+ "framework": "pytest",
249
+ "frameworkCaseId": "tests/infra/test_cache.py::test_redis_cache_ttl",
250
+ "pendingReason": "Redis cluster migration not complete"
251
+ }
252
+ }
253
+ ]
254
+ }
@@ -0,0 +1,108 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "projectRoot": "/home/ci/myapp",
4
+ "startedAtMs": 1706745600000,
5
+ "finishedAtMs": 1706745609000,
6
+ "meta": {
7
+ "framework": "go",
8
+ "goVersion": "1.22.0"
9
+ },
10
+ "testCases": [
11
+ {
12
+ "externalId": "myapp/auth.TestSuccessfulLogin",
13
+ "title": "Successful login with valid credentials",
14
+ "titlePath": ["myapp/auth", "TestSuccessfulLogin"],
15
+ "sourceFile": "auth/auth_test.go",
16
+ "sourceLine": 18,
17
+ "status": "pass",
18
+ "durationMs": 125,
19
+ "story": {
20
+ "scenario": "Successful login with valid credentials",
21
+ "steps": [
22
+ { "keyword": "Given", "text": "a registered user with email 'alice@example.com'" },
23
+ { "keyword": "When", "text": "the user submits login with valid credentials" },
24
+ { "keyword": "Then", "text": "the response status is 200" },
25
+ { "keyword": "And", "text": "a JWT token is returned" }
26
+ ],
27
+ "tags": ["smoke", "auth"],
28
+ "tickets": ["AUTH-101"],
29
+ "suitePath": ["myapp/auth"],
30
+ "sourceOrder": 0
31
+ },
32
+ "meta": {
33
+ "framework": "go",
34
+ "frameworkCaseId": "myapp/auth.TestSuccessfulLogin"
35
+ }
36
+ },
37
+ {
38
+ "externalId": "myapp/auth.TestLoginInvalidPassword",
39
+ "title": "Login with invalid password returns 401",
40
+ "titlePath": ["myapp/auth", "TestLoginInvalidPassword"],
41
+ "sourceFile": "auth/auth_test.go",
42
+ "sourceLine": 45,
43
+ "status": "fail",
44
+ "durationMs": 98,
45
+ "error": {
46
+ "message": "auth_test.go:58: expected status 401, got 500",
47
+ "stack": "--- FAIL: TestLoginInvalidPassword (0.098s)\n auth_test.go:58: expected status 401, got 500"
48
+ },
49
+ "meta": {
50
+ "framework": "go",
51
+ "frameworkCaseId": "myapp/auth.TestLoginInvalidPassword"
52
+ }
53
+ },
54
+ {
55
+ "externalId": "myapp/auth.TestLoginRateLimiting",
56
+ "title": "Login is rate-limited after 5 failed attempts",
57
+ "titlePath": ["myapp/auth", "TestLoginRateLimiting"],
58
+ "sourceFile": "auth/auth_test.go",
59
+ "sourceLine": 72,
60
+ "status": "skip",
61
+ "durationMs": 0,
62
+ "meta": {
63
+ "framework": "go",
64
+ "frameworkCaseId": "myapp/auth.TestLoginRateLimiting",
65
+ "skipReason": "Rate limit middleware not deployed yet"
66
+ }
67
+ },
68
+ {
69
+ "externalId": "myapp/cart.TestCompleteCheckout",
70
+ "title": "Complete checkout with credit card",
71
+ "titlePath": ["myapp/cart", "TestCompleteCheckout"],
72
+ "sourceFile": "cart/checkout_test.go",
73
+ "sourceLine": 15,
74
+ "status": "pass",
75
+ "durationMs": 340,
76
+ "story": {
77
+ "scenario": "Complete checkout with credit card",
78
+ "steps": [
79
+ { "keyword": "Given", "text": "a cart with 2 items totaling $59.98" },
80
+ { "keyword": "When", "text": "the user submits payment with a test credit card" },
81
+ { "keyword": "Then", "text": "the order is confirmed" },
82
+ { "keyword": "And", "text": "a confirmation email is queued" }
83
+ ],
84
+ "tags": ["checkout", "payments", "e2e"],
85
+ "tickets": ["SHOP-200"],
86
+ "suitePath": ["myapp/cart"],
87
+ "sourceOrder": 0
88
+ },
89
+ "meta": {
90
+ "framework": "go",
91
+ "frameworkCaseId": "myapp/cart.TestCompleteCheckout"
92
+ }
93
+ },
94
+ {
95
+ "externalId": "myapp/cart.TestEmptyCartCheckout",
96
+ "title": "Cannot checkout with an empty cart",
97
+ "titlePath": ["myapp/cart", "TestEmptyCartCheckout"],
98
+ "sourceFile": "cart/checkout_test.go",
99
+ "sourceLine": 48,
100
+ "status": "pass",
101
+ "durationMs": 12,
102
+ "meta": {
103
+ "framework": "go",
104
+ "frameworkCaseId": "myapp/cart.TestEmptyCartCheckout"
105
+ }
106
+ }
107
+ ]
108
+ }
@@ -0,0 +1,108 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "projectRoot": "/home/ci/myapp",
4
+ "startedAtMs": 1706745600000,
5
+ "finishedAtMs": 1706745618000,
6
+ "meta": {
7
+ "framework": "junit5",
8
+ "javaVersion": "21.0.2"
9
+ },
10
+ "testCases": [
11
+ {
12
+ "externalId": "[engine:junit-jupiter]/[class:com.acme.auth.LoginTest]/[method:testSuccessfulLogin()]",
13
+ "title": "Successful login with valid credentials",
14
+ "titlePath": ["com.acme.auth", "LoginTest", "Successful login with valid credentials"],
15
+ "sourceFile": "src/test/java/com/acme/auth/LoginTest.java",
16
+ "sourceLine": 24,
17
+ "status": "pass",
18
+ "durationMs": 312,
19
+ "story": {
20
+ "scenario": "Successful login with valid credentials",
21
+ "steps": [
22
+ { "keyword": "Given", "text": "a registered user with email 'alice@example.com'" },
23
+ { "keyword": "When", "text": "the user submits login with valid credentials" },
24
+ { "keyword": "Then", "text": "the response status is 200" },
25
+ { "keyword": "And", "text": "a JWT token is returned" }
26
+ ],
27
+ "tags": ["smoke", "auth"],
28
+ "tickets": ["AUTH-101"],
29
+ "suitePath": ["com.acme.auth", "LoginTest"],
30
+ "sourceOrder": 0
31
+ },
32
+ "meta": {
33
+ "framework": "junit5",
34
+ "frameworkCaseId": "[engine:junit-jupiter]/[class:com.acme.auth.LoginTest]/[method:testSuccessfulLogin()]"
35
+ }
36
+ },
37
+ {
38
+ "externalId": "[engine:junit-jupiter]/[class:com.acme.auth.LoginTest]/[method:testLoginInvalidPassword()]",
39
+ "title": "Login with invalid password returns 401",
40
+ "titlePath": ["com.acme.auth", "LoginTest", "Login with invalid password returns 401"],
41
+ "sourceFile": "src/test/java/com/acme/auth/LoginTest.java",
42
+ "sourceLine": 48,
43
+ "status": "fail",
44
+ "durationMs": 245,
45
+ "error": {
46
+ "message": "org.opentest4j.AssertionFailedError: Expected status 401 but got 500",
47
+ "stack": "org.opentest4j.AssertionFailedError: Expected status 401 but got 500\n\tat com.acme.auth.LoginTest.testLoginInvalidPassword(LoginTest.java:62)\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:580)"
48
+ },
49
+ "meta": {
50
+ "framework": "junit5",
51
+ "frameworkCaseId": "[engine:junit-jupiter]/[class:com.acme.auth.LoginTest]/[method:testLoginInvalidPassword()]"
52
+ }
53
+ },
54
+ {
55
+ "externalId": "[engine:junit-jupiter]/[class:com.acme.auth.LoginTest]/[method:testLoginRateLimiting()]",
56
+ "title": "Login is rate-limited after 5 failed attempts",
57
+ "titlePath": ["com.acme.auth", "LoginTest", "Login is rate-limited after 5 failed attempts"],
58
+ "sourceFile": "src/test/java/com/acme/auth/LoginTest.java",
59
+ "sourceLine": 75,
60
+ "status": "skip",
61
+ "durationMs": 1,
62
+ "meta": {
63
+ "framework": "junit5",
64
+ "frameworkCaseId": "[engine:junit-jupiter]/[class:com.acme.auth.LoginTest]/[method:testLoginRateLimiting()]",
65
+ "skipReason": "@Disabled: Rate limit middleware not deployed yet"
66
+ }
67
+ },
68
+ {
69
+ "externalId": "[engine:junit-jupiter]/[class:com.acme.cart.CheckoutTest]/[method:testCompleteCheckout()]",
70
+ "title": "Complete checkout with credit card",
71
+ "titlePath": ["com.acme.cart", "CheckoutTest", "Complete checkout with credit card"],
72
+ "sourceFile": "src/test/java/com/acme/cart/CheckoutTest.java",
73
+ "sourceLine": 18,
74
+ "status": "pass",
75
+ "durationMs": 876,
76
+ "story": {
77
+ "scenario": "Complete checkout with credit card",
78
+ "steps": [
79
+ { "keyword": "Given", "text": "a cart with 2 items totaling $59.98" },
80
+ { "keyword": "When", "text": "the user submits payment with a test credit card" },
81
+ { "keyword": "Then", "text": "the order is confirmed" },
82
+ { "keyword": "And", "text": "a confirmation email is queued" }
83
+ ],
84
+ "tags": ["checkout", "payments", "e2e"],
85
+ "tickets": ["SHOP-200"],
86
+ "suitePath": ["com.acme.cart", "CheckoutTest"],
87
+ "sourceOrder": 0
88
+ },
89
+ "meta": {
90
+ "framework": "junit5",
91
+ "frameworkCaseId": "[engine:junit-jupiter]/[class:com.acme.cart.CheckoutTest]/[method:testCompleteCheckout()]"
92
+ }
93
+ },
94
+ {
95
+ "externalId": "[engine:junit-jupiter]/[class:com.acme.cart.CheckoutTest]/[method:testEmptyCartCheckout()]",
96
+ "title": "Cannot checkout with an empty cart",
97
+ "titlePath": ["com.acme.cart", "CheckoutTest", "Cannot checkout with an empty cart"],
98
+ "sourceFile": "src/test/java/com/acme/cart/CheckoutTest.java",
99
+ "sourceLine": 52,
100
+ "status": "pass",
101
+ "durationMs": 45,
102
+ "meta": {
103
+ "framework": "junit5",
104
+ "frameworkCaseId": "[engine:junit-jupiter]/[class:com.acme.cart.CheckoutTest]/[method:testEmptyCartCheckout()]"
105
+ }
106
+ }
107
+ ]
108
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "projectRoot": "/home/ci/app",
4
+ "testCases": [
5
+ {
6
+ "title": "Login succeeds with valid credentials",
7
+ "status": "pass"
8
+ },
9
+ {
10
+ "title": "Login fails with wrong password",
11
+ "status": "fail"
12
+ },
13
+ {
14
+ "title": "Registration is disabled in staging",
15
+ "status": "skip"
16
+ }
17
+ ]
18
+ }