@auto-engineer/narrative 0.13.0 → 0.13.2
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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +22 -0
- package/dist/src/commands/export-schema-runner.js +1 -1
- package/dist/src/commands/export-schema-runner.js.map +1 -1
- package/dist/src/fluent-builder.js +3 -3
- package/dist/src/fluent-builder.js.map +1 -1
- package/dist/src/getNarratives.specs.js +149 -153
- package/dist/src/getNarratives.specs.js.map +1 -1
- package/dist/src/id/addAutoIds.d.ts.map +1 -1
- package/dist/src/id/addAutoIds.js +50 -12
- package/dist/src/id/addAutoIds.js.map +1 -1
- package/dist/src/id/addAutoIds.specs.js +396 -45
- package/dist/src/id/addAutoIds.specs.js.map +1 -1
- package/dist/src/id/hasAllIds.d.ts.map +1 -1
- package/dist/src/id/hasAllIds.js +28 -5
- package/dist/src/id/hasAllIds.js.map +1 -1
- package/dist/src/id/hasAllIds.specs.js +407 -214
- package/dist/src/id/hasAllIds.specs.js.map +1 -1
- package/dist/src/index.d.ts +6 -8
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/loader/graph.d.ts.map +1 -1
- package/dist/src/loader/graph.js +13 -6
- package/dist/src/loader/graph.js.map +1 -1
- package/dist/src/loader/ts-utils.d.ts +1 -0
- package/dist/src/loader/ts-utils.d.ts.map +1 -1
- package/dist/src/loader/ts-utils.js +95 -16
- package/dist/src/loader/ts-utils.js.map +1 -1
- package/dist/src/model-to-narrative.specs.js +531 -449
- package/dist/src/model-to-narrative.specs.js.map +1 -1
- package/dist/src/narrative-context.d.ts +8 -8
- package/dist/src/narrative-context.d.ts.map +1 -1
- package/dist/src/narrative-context.js +111 -301
- package/dist/src/narrative-context.js.map +1 -1
- package/dist/src/narrative-context.specs.js +15 -55
- package/dist/src/narrative-context.specs.js.map +1 -1
- package/dist/src/narrative.d.ts +19 -22
- package/dist/src/narrative.d.ts.map +1 -1
- package/dist/src/narrative.js +42 -71
- package/dist/src/narrative.js.map +1 -1
- package/dist/src/samples/test-with-ids.narrative.js +13 -29
- package/dist/src/samples/test-with-ids.narrative.js.map +1 -1
- package/dist/src/schema.d.ts +3205 -8287
- package/dist/src/schema.d.ts.map +1 -1
- package/dist/src/schema.js +29 -47
- package/dist/src/schema.js.map +1 -1
- package/dist/src/slice-builder.js +3 -3
- package/dist/src/slice-builder.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/flow.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/flow.js +118 -74
- package/dist/src/transformers/model-to-narrative/generators/flow.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/gwt.d.ts +9 -1
- package/dist/src/transformers/model-to-narrative/generators/gwt.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/gwt.js +112 -112
- package/dist/src/transformers/model-to-narrative/generators/gwt.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.js +13 -9
- package/dist/src/transformers/model-to-narrative/generators/imports.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/index.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/index.js +50 -23
- package/dist/src/transformers/narrative-to-model/index.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/type-inference.specs.js +100 -90
- package/dist/src/transformers/narrative-to-model/type-inference.specs.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/src/commands/export-schema-runner.ts +3 -1
- package/src/fluent-builder.ts +3 -3
- package/src/getNarratives.specs.ts +168 -176
- package/src/id/addAutoIds.specs.ts +424 -47
- package/src/id/addAutoIds.ts +57 -13
- package/src/id/hasAllIds.specs.ts +400 -223
- package/src/id/hasAllIds.ts +32 -6
- package/src/index.ts +9 -12
- package/src/loader/graph.ts +23 -6
- package/src/loader/ts-utils.ts +169 -26
- package/src/model-to-narrative.specs.ts +531 -449
- package/src/narrative-context.specs.ts +73 -116
- package/src/narrative-context.ts +127 -374
- package/src/narrative.ts +70 -120
- package/src/samples/test-with-ids.narrative.ts +23 -31
- package/src/schema.ts +36 -52
- package/src/slice-builder.ts +3 -3
- package/src/transformers/model-to-narrative/generators/flow.ts +191 -85
- package/src/transformers/model-to-narrative/generators/gwt.ts +195 -178
- package/src/transformers/model-to-narrative/generators/imports.ts +13 -9
- package/src/transformers/narrative-to-model/index.ts +87 -26
- package/src/transformers/narrative-to-model/type-inference.specs.ts +100 -90
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @auto-engineer/flow
|
|
2
2
|
|
|
3
|
+
## 0.13.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- add optional id to specs, steps, and client specs
|
|
8
|
+
|
|
9
|
+
- Updated dependencies []:
|
|
10
|
+
- @auto-engineer/file-store@0.13.2
|
|
11
|
+
- @auto-engineer/id@0.13.2
|
|
12
|
+
- @auto-engineer/message-bus@0.13.2
|
|
13
|
+
|
|
14
|
+
## 0.13.1
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- refactor from a given/when/then based format to Gherkin steps array
|
|
19
|
+
|
|
20
|
+
- Updated dependencies []:
|
|
21
|
+
- @auto-engineer/file-store@0.13.1
|
|
22
|
+
- @auto-engineer/id@0.13.1
|
|
23
|
+
- @auto-engineer/message-bus@0.13.1
|
|
24
|
+
|
|
3
25
|
## 0.13.0
|
|
4
26
|
|
|
5
27
|
### Minor Changes
|
|
@@ -17,7 +17,7 @@ const main = async () => {
|
|
|
17
17
|
try {
|
|
18
18
|
// Import from the installed package in the target directory
|
|
19
19
|
// This ensures we use the same module instance as the flow files
|
|
20
|
-
const narrative = await import('@auto-engineer/narrative');
|
|
20
|
+
const narrative = (await import('@auto-engineer/narrative'));
|
|
21
21
|
const { getNarratives } = narrative;
|
|
22
22
|
if (typeof getNarratives !== 'function') {
|
|
23
23
|
throw new Error('getNarratives not found in @auto-engineer/narrative exports');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-schema-runner.js","sourceRoot":"","sources":["../../../src/commands/export-schema-runner.ts"],"names":[],"mappings":";AACA,4FAA4F;AAC5F,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,WAAW,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,MAAM,KAAK,GAAG,WAAW,CAAC,qCAAqC,CAAC,CAAC;AACjE,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;IACjD,KAA2B,CAAC,KAAK,GAAG,GAAG,CAAC;AAC3C,CAAC,CAAC,OAAO;AAET,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;IACtB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC;IACnD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC;IAExD,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACvC,KAAK,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;IACvC,KAAK,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,4DAA4D;QAC5D,iEAAiE;QACjE,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"export-schema-runner.js","sourceRoot":"","sources":["../../../src/commands/export-schema-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ class CommandSliceBuilderImpl {
|
|
|
29
29
|
name,
|
|
30
30
|
id,
|
|
31
31
|
client: { specs: [] },
|
|
32
|
-
server: { description: '', specs:
|
|
32
|
+
server: { description: '', specs: [], data: undefined },
|
|
33
33
|
};
|
|
34
34
|
addSlice(this.slice);
|
|
35
35
|
debugCommand('Command slice added to flow: %s', name);
|
|
@@ -118,7 +118,7 @@ class QuerySliceBuilderImpl {
|
|
|
118
118
|
name,
|
|
119
119
|
id,
|
|
120
120
|
client: { specs: [] },
|
|
121
|
-
server: { description: '', specs:
|
|
121
|
+
server: { description: '', specs: [], data: undefined },
|
|
122
122
|
};
|
|
123
123
|
addSlice(this.slice);
|
|
124
124
|
debugQuery('Query slice added to flow: %s', name);
|
|
@@ -189,7 +189,7 @@ class ReactionSliceBuilderImpl {
|
|
|
189
189
|
type: 'react',
|
|
190
190
|
name,
|
|
191
191
|
id,
|
|
192
|
-
server: { specs:
|
|
192
|
+
server: { specs: [], data: undefined },
|
|
193
193
|
};
|
|
194
194
|
addSlice(this.slice);
|
|
195
195
|
debugReact('Reaction slice added to flow: %s', name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluent-builder.js","sourceRoot":"","sources":["../../src/fluent-builder.ts"],"names":[],"mappings":"AACA,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,EAAW,MAAM,SAAS,CAAC;AACzC,OAAO,WAAW,MAAM,OAAO,CAAC;AAEhC,MAAM,KAAK,GAAG,WAAW,CAAC,+BAA+B,CAAC,CAAC;AAC3D,IAAI,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;IACjD,KAA2B,CAAC,KAAK,GAAG,GAAG,CAAC;AAC3C,CAAC,CAAC,OAAO;AACT,MAAM,YAAY,GAAG,WAAW,CAAC,uCAAuC,CAAC,CAAC;AAC1E,IAAI,OAAO,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;IAC/D,YAAkC,CAAC,KAAK,GAAG,GAAG,CAAC;AAClD,CAAC,CAAC,OAAO;AACT,MAAM,UAAU,GAAG,WAAW,CAAC,qCAAqC,CAAC,CAAC;AACtE,IAAI,OAAO,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;IAC3D,UAAgC,CAAC,KAAK,GAAG,GAAG,CAAC;AAChD,CAAC,CAAC,OAAO;AACT,MAAM,UAAU,GAAG,WAAW,CAAC,qCAAqC,CAAC,CAAC;AACtE,IAAI,OAAO,IAAI,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;IAC3D,UAAgC,CAAC,KAAK,GAAG,GAAG,CAAC;AAChD,CAAC,CAAC,QAAQ;AACV,MAAM,eAAe,GAAG,WAAW,CAAC,0CAA0C,CAAC,CAAC;AAChF,IAAI,OAAO,IAAI,eAAe,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,CAAC;IACrE,eAAqC,CAAC,KAAK,GAAG,GAAG,CAAC;AACrD,CAAC,CAAC,UAAU;AAiCZ,MAAM,uBAAuB;IAG3B,YAAY,IAAY,EAAE,EAAW;QACnC,YAAY,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG;YACX,IAAI,EAAE,SAAS;YACf,IAAI;YACJ,EAAE;YACF,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACrB,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"fluent-builder.js","sourceRoot":"","sources":["../../src/fluent-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,32 +55,36 @@ describe('getNarratives', (_mode) => {
|
|
|
55
55
|
expect(createItemSlice.client.specs[0].children).toHaveLength(1);
|
|
56
56
|
}
|
|
57
57
|
expect(createItemSlice.server.specs).toBeDefined();
|
|
58
|
-
|
|
59
|
-
expect(
|
|
58
|
+
expect(Array.isArray(createItemSlice.server.specs)).toBe(true);
|
|
59
|
+
expect(createItemSlice.server.specs).toHaveLength(1);
|
|
60
|
+
const spec = createItemSlice.server.specs[0];
|
|
61
|
+
expect(spec.feature).toBeDefined();
|
|
60
62
|
expect(spec.rules).toHaveLength(1);
|
|
61
63
|
const rule = spec.rules[0];
|
|
62
|
-
expect(rule.
|
|
64
|
+
expect(rule.name).toBeDefined();
|
|
63
65
|
expect(rule.examples).toHaveLength(1);
|
|
64
66
|
const example = rule.examples[0];
|
|
65
|
-
expect(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
expect(example.steps).toBeDefined();
|
|
68
|
+
expect(example.steps.length).toBeGreaterThanOrEqual(2);
|
|
69
|
+
const whenStep = example.steps.find((s) => s.keyword === 'When');
|
|
70
|
+
const thenStep = example.steps.find((s) => s.keyword === 'Then');
|
|
71
|
+
expect(whenStep).toBeDefined();
|
|
72
|
+
expect(thenStep).toBeDefined();
|
|
73
|
+
if (whenStep && 'text' in whenStep) {
|
|
74
|
+
expect(whenStep.text).toBe('CreateItem');
|
|
75
|
+
expect(whenStep.docString).toMatchObject({
|
|
71
76
|
itemId: 'item_123',
|
|
72
77
|
description: 'A new item',
|
|
73
78
|
});
|
|
74
79
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
exampleData: {
|
|
80
|
+
if (thenStep && 'text' in thenStep) {
|
|
81
|
+
expect(thenStep.text).toBe('ItemCreated');
|
|
82
|
+
expect(thenStep.docString).toMatchObject({
|
|
79
83
|
id: 'item_123',
|
|
80
84
|
description: 'A new item',
|
|
81
85
|
addedAt: new Date('2024-01-15T10:00:00.000Z'),
|
|
82
|
-
}
|
|
83
|
-
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
84
88
|
}
|
|
85
89
|
const viewItemSlice = items.slices[1];
|
|
86
90
|
expect(viewItemSlice.type).toBe('query');
|
|
@@ -102,7 +106,7 @@ describe('getNarratives', (_mode) => {
|
|
|
102
106
|
expect(data[0].target).toMatchObject({ type: 'State', name: 'items' });
|
|
103
107
|
expect(data[0].origin).toMatchObject({ name: 'ItemsProjection', type: 'projection' });
|
|
104
108
|
const specs = viewItemSlice?.server?.specs;
|
|
105
|
-
if (specs == null || specs.
|
|
109
|
+
if (specs == null || specs.length === 0 || specs[0].feature === '')
|
|
106
110
|
throw new Error('No specs found in view items slice');
|
|
107
111
|
expect(specs).toBeDefined();
|
|
108
112
|
}
|
|
@@ -122,28 +126,32 @@ describe('getNarratives', (_mode) => {
|
|
|
122
126
|
expect(submitOrderSlice.client.specs[0].children).toHaveLength(2);
|
|
123
127
|
}
|
|
124
128
|
expect(submitOrderSlice.server.specs).toBeDefined();
|
|
125
|
-
|
|
129
|
+
expect(Array.isArray(submitOrderSlice.server.specs)).toBe(true);
|
|
130
|
+
expect(submitOrderSlice.server.specs).toHaveLength(1);
|
|
131
|
+
const spec = submitOrderSlice.server.specs[0];
|
|
126
132
|
expect(spec.rules).toHaveLength(1);
|
|
127
133
|
const rule = spec.rules[0];
|
|
128
134
|
expect(rule.examples).toHaveLength(1);
|
|
129
135
|
const example = rule.examples[0];
|
|
130
|
-
expect(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
+
expect(example.steps).toBeDefined();
|
|
137
|
+
expect(example.steps.length).toBeGreaterThanOrEqual(2);
|
|
138
|
+
const whenStep = example.steps.find((s) => s.keyword === 'When');
|
|
139
|
+
const thenStep = example.steps.find((s) => s.keyword === 'Then');
|
|
140
|
+
expect(whenStep).toBeDefined();
|
|
141
|
+
expect(thenStep).toBeDefined();
|
|
142
|
+
if (whenStep && 'text' in whenStep) {
|
|
143
|
+
expect(whenStep.text).toBe('PlaceOrder');
|
|
144
|
+
expect(whenStep.docString).toMatchObject({ productId: 'product_789', quantity: 3 });
|
|
136
145
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
exampleData: {
|
|
146
|
+
if (thenStep && 'text' in thenStep) {
|
|
147
|
+
expect(thenStep.text).toBe('OrderPlaced');
|
|
148
|
+
expect(thenStep.docString).toMatchObject({
|
|
141
149
|
orderId: 'order_001',
|
|
142
150
|
productId: 'product_789',
|
|
143
151
|
quantity: 3,
|
|
144
152
|
placedAt: new Date('2024-01-20T10:00:00.000Z'),
|
|
145
|
-
}
|
|
146
|
-
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
147
155
|
}
|
|
148
156
|
}
|
|
149
157
|
const messages = schemas.messages;
|
|
@@ -197,16 +205,15 @@ describe('getNarratives', (_mode) => {
|
|
|
197
205
|
if (slice.type === 'react') {
|
|
198
206
|
expect(slice.server).toBeDefined();
|
|
199
207
|
expect(slice.server.specs).toBeDefined();
|
|
200
|
-
expect(
|
|
201
|
-
|
|
208
|
+
expect(Array.isArray(slice.server.specs)).toBe(true);
|
|
209
|
+
expect(slice.server.specs.length).toBeGreaterThanOrEqual(1);
|
|
210
|
+
const spec = slice.server.specs[0];
|
|
202
211
|
expect(spec.rules).toBeDefined();
|
|
203
212
|
expect(Array.isArray(spec.rules)).toBe(true);
|
|
204
213
|
spec.rules.forEach((rule) => {
|
|
205
214
|
rule.examples.forEach((example) => {
|
|
206
|
-
expect(example.
|
|
207
|
-
expect(Array.isArray(example.
|
|
208
|
-
expect(example.then).toBeDefined();
|
|
209
|
-
expect(Array.isArray(example.then)).toBe(true);
|
|
215
|
+
expect(example.steps).toBeDefined();
|
|
216
|
+
expect(Array.isArray(example.steps)).toBe(true);
|
|
210
217
|
});
|
|
211
218
|
});
|
|
212
219
|
}
|
|
@@ -259,10 +266,10 @@ describe('getNarratives', (_mode) => {
|
|
|
259
266
|
const commandSlice = testFlowWithIds.slices.find((s) => s.name === 'Create test item');
|
|
260
267
|
if (commandSlice?.type !== 'command')
|
|
261
268
|
return;
|
|
262
|
-
expect(commandSlice.server.specs.rules).toHaveLength(2);
|
|
263
|
-
const rule1 = commandSlice.server.specs.rules.find((r) => r.
|
|
269
|
+
expect(commandSlice.server.specs[0].rules).toHaveLength(2);
|
|
270
|
+
const rule1 = commandSlice.server.specs[0].rules.find((r) => r.name === 'Valid test items should be created successfully');
|
|
264
271
|
expect(rule1?.id).toBe('RULE-001');
|
|
265
|
-
const rule2 = commandSlice.server.specs.rules.find((r) => r.
|
|
272
|
+
const rule2 = commandSlice.server.specs[0].rules.find((r) => r.name === 'Invalid test items should be rejected');
|
|
266
273
|
expect(rule2?.id).toBe('RULE-002');
|
|
267
274
|
});
|
|
268
275
|
it('should have ids for query slice rules', async () => {
|
|
@@ -274,8 +281,8 @@ describe('getNarratives', (_mode) => {
|
|
|
274
281
|
const querySlice = testFlowWithIds.slices.find((s) => s.name === 'Get test items');
|
|
275
282
|
if (querySlice?.type !== 'query')
|
|
276
283
|
return;
|
|
277
|
-
expect(querySlice.server.specs.rules).toHaveLength(1);
|
|
278
|
-
const rule3 = querySlice.server.specs.rules.find((r) => r.
|
|
284
|
+
expect(querySlice.server.specs[0].rules).toHaveLength(1);
|
|
285
|
+
const rule3 = querySlice.server.specs[0].rules.find((r) => r.name === 'Items should be retrievable after creation');
|
|
279
286
|
expect(rule3?.id).toBe('RULE-003');
|
|
280
287
|
});
|
|
281
288
|
it('should have ids for react slice rules', async () => {
|
|
@@ -287,8 +294,8 @@ describe('getNarratives', (_mode) => {
|
|
|
287
294
|
const reactSlice = testFlowWithIds.slices.find((s) => s.name === 'React to test event');
|
|
288
295
|
if (reactSlice?.type !== 'react')
|
|
289
296
|
return;
|
|
290
|
-
expect(reactSlice.server.specs.rules).toHaveLength(1);
|
|
291
|
-
const rule4 = reactSlice.server.specs.rules.find((r) => r.
|
|
297
|
+
expect(reactSlice.server.specs[0].rules).toHaveLength(1);
|
|
298
|
+
const rule4 = reactSlice.server.specs[0].rules.find((r) => r.name === 'System should react to test item creation');
|
|
292
299
|
expect(rule4?.id).toBe('RULE-004');
|
|
293
300
|
});
|
|
294
301
|
it('should handle when examples correctly', async () => {
|
|
@@ -304,14 +311,10 @@ describe('getNarratives', (_mode) => {
|
|
|
304
311
|
const submitSlice = questionnaireFlow.slices.find((s) => s.name === 'submits the questionnaire');
|
|
305
312
|
expect(submitSlice?.type).toBe('command');
|
|
306
313
|
if (submitSlice?.type === 'command') {
|
|
307
|
-
const example = submitSlice.server?.specs?.rules[0]?.examples[0];
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
example.when !== null &&
|
|
312
|
-
!Array.isArray(example.when) &&
|
|
313
|
-
'commandRef' in example.when) {
|
|
314
|
-
expect(example.when.commandRef).toBe('SubmitQuestionnaire');
|
|
314
|
+
const example = submitSlice.server?.specs?.[0]?.rules[0]?.examples[0];
|
|
315
|
+
const whenStep = example?.steps?.find((s) => s.keyword === 'When');
|
|
316
|
+
if (whenStep && 'text' in whenStep) {
|
|
317
|
+
expect(whenStep.text).toBe('SubmitQuestionnaire');
|
|
315
318
|
}
|
|
316
319
|
}
|
|
317
320
|
}
|
|
@@ -538,7 +541,7 @@ flow('questionnaires-test', () => {
|
|
|
538
541
|
expect(querySlice?.type).toBe('query');
|
|
539
542
|
if (querySlice?.type !== 'query')
|
|
540
543
|
return;
|
|
541
|
-
const example = querySlice.server.specs.rules[0]?.examples[0];
|
|
544
|
+
const example = querySlice.server.specs[0].rules[0]?.examples[0];
|
|
542
545
|
expect(example).toBeDefined();
|
|
543
546
|
if (example !== null && example !== undefined) {
|
|
544
547
|
validateMixedGivenTypes(example);
|
|
@@ -677,39 +680,37 @@ flow('Todo List', () => {
|
|
|
677
680
|
expect(summarySlice?.type).toBe('query');
|
|
678
681
|
if (summarySlice?.type !== 'query')
|
|
679
682
|
return;
|
|
680
|
-
const example = summarySlice.server.specs.rules[0]?.examples[0];
|
|
683
|
+
const example = summarySlice.server.specs[0].rules[0]?.examples[0];
|
|
681
684
|
expect(example).toBeDefined();
|
|
682
|
-
expect(example.
|
|
683
|
-
expect(Array.isArray(example.
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
validateGivenItemsHaveEventRef(example.given);
|
|
689
|
-
validateTodoEventRefs(example.given);
|
|
685
|
+
expect(example.steps).toBeDefined();
|
|
686
|
+
expect(Array.isArray(example.steps)).toBe(true);
|
|
687
|
+
const givenAndSteps = example.steps.filter((s) => s.keyword === 'Given' || s.keyword === 'And');
|
|
688
|
+
expect(givenAndSteps).toHaveLength(5);
|
|
689
|
+
validateGivenItemsHaveEventRef(givenAndSteps);
|
|
690
|
+
validateTodoEventRefs(givenAndSteps);
|
|
690
691
|
validateTodoMessages(model);
|
|
691
692
|
});
|
|
692
693
|
});
|
|
693
|
-
function validateGivenItemsHaveEventRef(
|
|
694
|
-
for (let i = 0; i <
|
|
695
|
-
const
|
|
696
|
-
if (typeof
|
|
697
|
-
expect('
|
|
698
|
-
expect('
|
|
694
|
+
function validateGivenItemsHaveEventRef(givenSteps) {
|
|
695
|
+
for (let i = 0; i < givenSteps.length; i++) {
|
|
696
|
+
const step = givenSteps[i];
|
|
697
|
+
if (typeof step === 'object' && step !== null) {
|
|
698
|
+
expect(step.keyword === 'Given' || step.keyword === 'And').toBe(true);
|
|
699
|
+
expect('text' in step).toBe(true);
|
|
699
700
|
}
|
|
700
701
|
}
|
|
701
702
|
}
|
|
702
|
-
function
|
|
703
|
-
if (
|
|
704
|
-
expect(
|
|
703
|
+
function expectStepText(step, expectedType) {
|
|
704
|
+
if (step !== null && step !== undefined && typeof step === 'object' && 'text' in step) {
|
|
705
|
+
expect(step.text).toBe(expectedType);
|
|
705
706
|
}
|
|
706
707
|
}
|
|
707
|
-
function validateTodoEventRefs(
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
708
|
+
function validateTodoEventRefs(givenSteps) {
|
|
709
|
+
expectStepText(givenSteps[0], 'TodoAdded');
|
|
710
|
+
expectStepText(givenSteps[1], 'TodoAdded');
|
|
711
|
+
expectStepText(givenSteps[2], 'TodoAdded');
|
|
712
|
+
expectStepText(givenSteps[3], 'TodoMarkedInProgress');
|
|
713
|
+
expectStepText(givenSteps[4], 'TodoMarkedComplete');
|
|
713
714
|
}
|
|
714
715
|
function validateTodoMessages(model) {
|
|
715
716
|
const todoAddedEvent = model.messages.find((m) => m.name === 'TodoAdded');
|
|
@@ -729,14 +730,10 @@ function validateSubmitQuestionnaireCommand(questionnaireFlow) {
|
|
|
729
730
|
const submitSlice = questionnaireFlow.slices.find((s) => s.name === 'submits questionnaire');
|
|
730
731
|
expect(submitSlice?.type).toBe('command');
|
|
731
732
|
if (submitSlice?.type === 'command') {
|
|
732
|
-
const example = submitSlice.server?.specs?.rules[0]?.examples[0];
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
example.when !== null &&
|
|
737
|
-
!Array.isArray(example.when) &&
|
|
738
|
-
'commandRef' in example.when) {
|
|
739
|
-
expect(example.when.commandRef).toBe('SubmitQuestionnaire');
|
|
733
|
+
const example = submitSlice.server?.specs?.[0]?.rules[0]?.examples[0];
|
|
734
|
+
const whenStep = example?.steps?.find((s) => s.keyword === 'When');
|
|
735
|
+
if (whenStep && 'text' in whenStep) {
|
|
736
|
+
expect(whenStep.text).toBe('SubmitQuestionnaire');
|
|
740
737
|
}
|
|
741
738
|
}
|
|
742
739
|
}
|
|
@@ -747,15 +744,11 @@ function validateQuestionAnsweredEvent(model) {
|
|
|
747
744
|
function validateGivenSectionEventRefs(questionnaireFlow) {
|
|
748
745
|
const viewsSlice = questionnaireFlow.slices.find((s) => s.name === 'views progress');
|
|
749
746
|
if (viewsSlice?.type === 'query') {
|
|
750
|
-
const example = viewsSlice.server?.specs?.rules[0]?.examples[0];
|
|
751
|
-
if (example?.
|
|
752
|
-
const
|
|
753
|
-
if (
|
|
754
|
-
expect(
|
|
755
|
-
expect('stateRef' in givenItem).toBe(false);
|
|
756
|
-
if ('eventRef' in givenItem) {
|
|
757
|
-
expect(givenItem.eventRef).toBe('QuestionAnswered');
|
|
758
|
-
}
|
|
747
|
+
const example = viewsSlice.server?.specs?.[0]?.rules[0]?.examples[0];
|
|
748
|
+
if (example?.steps !== undefined && Array.isArray(example.steps)) {
|
|
749
|
+
const givenStep = example.steps.find((s) => s.keyword === 'Given');
|
|
750
|
+
if (givenStep && 'text' in givenStep) {
|
|
751
|
+
expect(givenStep.text).toBe('QuestionAnswered');
|
|
759
752
|
}
|
|
760
753
|
}
|
|
761
754
|
}
|
|
@@ -767,45 +760,43 @@ function validateCurrentQuestionIdType(model) {
|
|
|
767
760
|
expect(currentQuestionIdField?.type).toBe('string | null');
|
|
768
761
|
}
|
|
769
762
|
function validateMixedGivenTypes(example) {
|
|
770
|
-
expect(example.
|
|
771
|
-
expect(example.
|
|
772
|
-
expect(Array.isArray(example.
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
if ('stateRef' in firstGiven) {
|
|
780
|
-
expect(firstGiven.stateRef).toBe('ConfigState');
|
|
763
|
+
expect(example.name).toBe('system with 2 items reaches max of 2');
|
|
764
|
+
expect(example.steps).toBeDefined();
|
|
765
|
+
expect(Array.isArray(example.steps)).toBe(true);
|
|
766
|
+
const givenSteps = example.steps.filter((s) => s.keyword === 'Given' || s.keyword === 'And');
|
|
767
|
+
expect(givenSteps).toHaveLength(4);
|
|
768
|
+
const firstGiven = givenSteps[0];
|
|
769
|
+
expect('text' in firstGiven).toBe(true);
|
|
770
|
+
if ('text' in firstGiven) {
|
|
771
|
+
expect(firstGiven.text).toBe('ConfigState');
|
|
781
772
|
}
|
|
782
|
-
const secondGiven =
|
|
783
|
-
expect('
|
|
784
|
-
if ('
|
|
785
|
-
expect(secondGiven.
|
|
773
|
+
const secondGiven = givenSteps[1];
|
|
774
|
+
expect('text' in secondGiven).toBe(true);
|
|
775
|
+
if ('text' in secondGiven) {
|
|
776
|
+
expect(secondGiven.text).toBe('SystemInitialized');
|
|
786
777
|
}
|
|
787
|
-
const thirdGiven =
|
|
788
|
-
expect('
|
|
789
|
-
if ('
|
|
790
|
-
expect(thirdGiven.
|
|
778
|
+
const thirdGiven = givenSteps[2];
|
|
779
|
+
expect('text' in thirdGiven).toBe(true);
|
|
780
|
+
if ('text' in thirdGiven) {
|
|
781
|
+
expect(thirdGiven.text).toBe('ItemAdded');
|
|
791
782
|
}
|
|
792
|
-
const fourthGiven =
|
|
793
|
-
expect('
|
|
794
|
-
if ('
|
|
795
|
-
expect(fourthGiven.
|
|
783
|
+
const fourthGiven = givenSteps[3];
|
|
784
|
+
expect('text' in fourthGiven).toBe(true);
|
|
785
|
+
if ('text' in fourthGiven) {
|
|
786
|
+
expect(fourthGiven.text).toBe('ItemAdded');
|
|
796
787
|
}
|
|
797
788
|
}
|
|
798
789
|
function validateEmptyWhenClause(example) {
|
|
799
|
-
|
|
790
|
+
const whenStep = example.steps.find((s) => s.keyword === 'When');
|
|
791
|
+
expect(whenStep).toBeUndefined();
|
|
800
792
|
}
|
|
801
793
|
function validateThenClause(example) {
|
|
802
|
-
|
|
803
|
-
expect(
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
expect(thenOutcome.stateRef).toBe('SystemStatus');
|
|
794
|
+
const thenSteps = example.steps.filter((s) => s.keyword === 'Then');
|
|
795
|
+
expect(thenSteps).toHaveLength(1);
|
|
796
|
+
const thenOutcome = thenSteps[0];
|
|
797
|
+
expect('text' in thenOutcome).toBe(true);
|
|
798
|
+
if ('text' in thenOutcome) {
|
|
799
|
+
expect(thenOutcome.text).toBe('SystemStatus');
|
|
809
800
|
}
|
|
810
801
|
}
|
|
811
802
|
function validateMixedGivenTypeMessages(model) {
|
|
@@ -976,32 +967,34 @@ function getSubmitSlice(questionnaireFlow) {
|
|
|
976
967
|
return submitSlice;
|
|
977
968
|
}
|
|
978
969
|
function getSubmitExample(submitSlice) {
|
|
979
|
-
const rule = submitSlice.server?.specs?.rules[0];
|
|
970
|
+
const rule = submitSlice.server?.specs?.[0]?.rules[0];
|
|
980
971
|
expect(rule).toBeDefined();
|
|
981
972
|
expect(rule?.examples).toHaveLength(1);
|
|
982
973
|
const example = rule?.examples[0];
|
|
983
|
-
expect(example?.
|
|
974
|
+
expect(example?.name).toBe('submits the questionnaire successfully');
|
|
984
975
|
return example;
|
|
985
976
|
}
|
|
986
977
|
function validateSubmitCommandRef(example) {
|
|
987
978
|
const ex = example;
|
|
988
|
-
expect(ex?.
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
expect(
|
|
979
|
+
expect(ex?.steps).toBeDefined();
|
|
980
|
+
const whenStep = ex?.steps?.find((s) => s.keyword === 'When');
|
|
981
|
+
if (whenStep && 'text' in whenStep) {
|
|
982
|
+
expect(whenStep.text).toBe('SubmitQuestionnaire');
|
|
983
|
+
expect(whenStep.text).not.toBe('SendQuestionnaireLink');
|
|
992
984
|
}
|
|
993
985
|
else {
|
|
994
|
-
throw new Error('Expected
|
|
986
|
+
throw new Error('Expected steps to have a When step with text property');
|
|
995
987
|
}
|
|
996
988
|
}
|
|
997
989
|
function validateLinkSliceCommandRef(questionnaireFlow) {
|
|
998
990
|
const linkSlice = questionnaireFlow.slices.find((s) => s.name === 'sends the questionnaire link');
|
|
999
991
|
expect(linkSlice?.type).toBe('command');
|
|
1000
992
|
if (linkSlice?.type === 'command') {
|
|
1001
|
-
const linkExample = linkSlice.server?.specs?.rules[0]?.examples[0];
|
|
993
|
+
const linkExample = linkSlice.server?.specs?.[0]?.rules[0]?.examples[0];
|
|
1002
994
|
const ex = linkExample;
|
|
1003
|
-
|
|
1004
|
-
|
|
995
|
+
const whenStep = ex?.steps?.find((s) => s.keyword === 'When');
|
|
996
|
+
if (whenStep && 'text' in whenStep) {
|
|
997
|
+
expect(whenStep.text).toBe('SendQuestionnaireLink');
|
|
1005
998
|
}
|
|
1006
999
|
}
|
|
1007
1000
|
}
|
|
@@ -1027,17 +1020,19 @@ function getServerSpecsFromSlice(submitSlice) {
|
|
|
1027
1020
|
const slice = submitSlice;
|
|
1028
1021
|
const serverSpecs = slice.server?.specs;
|
|
1029
1022
|
expect(serverSpecs).toBeDefined();
|
|
1030
|
-
|
|
1031
|
-
expect(
|
|
1032
|
-
|
|
1033
|
-
|
|
1023
|
+
expect(Array.isArray(serverSpecs)).toBe(true);
|
|
1024
|
+
expect(serverSpecs).toHaveLength(1);
|
|
1025
|
+
const firstSpec = serverSpecs[0];
|
|
1026
|
+
expect(firstSpec?.rules).toBeDefined();
|
|
1027
|
+
expect(firstSpec?.rules).toHaveLength(1);
|
|
1028
|
+
return firstSpec;
|
|
1034
1029
|
}
|
|
1035
1030
|
function getFirstRuleFromSpecs(serverSpecs) {
|
|
1036
1031
|
const specs = serverSpecs;
|
|
1037
1032
|
const rule = specs?.rules?.[0];
|
|
1038
1033
|
expect(rule).toBeDefined();
|
|
1039
1034
|
const r = rule;
|
|
1040
|
-
expect(r?.
|
|
1035
|
+
expect(r?.name).toBe('questionnaire allowed to be submitted when all questions are answered');
|
|
1041
1036
|
expect(r?.examples).toBeDefined();
|
|
1042
1037
|
expect(r?.examples).toHaveLength(1);
|
|
1043
1038
|
return rule;
|
|
@@ -1047,34 +1042,35 @@ function getFirstExampleFromRule(rule) {
|
|
|
1047
1042
|
const example = r?.examples?.[0];
|
|
1048
1043
|
expect(example).toBeDefined();
|
|
1049
1044
|
const ex = example;
|
|
1050
|
-
expect(ex?.
|
|
1045
|
+
expect(ex?.name).toBe('submits the questionnaire successfully');
|
|
1051
1046
|
return example;
|
|
1052
1047
|
}
|
|
1053
1048
|
function validateExampleCommandRef(example) {
|
|
1054
1049
|
const ex = example;
|
|
1055
|
-
expect(ex?.
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
expect(
|
|
1050
|
+
expect(ex?.steps).toBeDefined();
|
|
1051
|
+
const whenStep = ex?.steps?.find((s) => s.keyword === 'When');
|
|
1052
|
+
expect(whenStep).toBeDefined();
|
|
1053
|
+
if (whenStep && 'text' in whenStep) {
|
|
1054
|
+
expect(whenStep.text).toBe('SubmitQuestionnaire');
|
|
1055
|
+
expect(whenStep.text).not.toBe('SendQuestionnaireLink');
|
|
1056
|
+
expect(whenStep.docString).toEqual({
|
|
1060
1057
|
questionnaireId: 'q-001',
|
|
1061
1058
|
participantId: 'participant-abc',
|
|
1062
1059
|
});
|
|
1063
1060
|
}
|
|
1064
1061
|
else {
|
|
1065
|
-
throw new Error('Expected when to have
|
|
1062
|
+
throw new Error('Expected when step to have text property');
|
|
1066
1063
|
}
|
|
1067
1064
|
}
|
|
1068
1065
|
function validateThenEvents(example) {
|
|
1069
1066
|
const ex = example;
|
|
1070
|
-
expect(ex?.
|
|
1071
|
-
|
|
1072
|
-
expect(
|
|
1073
|
-
const
|
|
1074
|
-
if (
|
|
1075
|
-
|
|
1076
|
-
expect(
|
|
1077
|
-
expect(event.exampleData).toEqual({
|
|
1067
|
+
expect(ex?.steps).toBeDefined();
|
|
1068
|
+
const thenSteps = ex?.steps?.filter((s) => s.keyword === 'Then');
|
|
1069
|
+
expect(thenSteps).toHaveLength(1);
|
|
1070
|
+
const thenStep = thenSteps?.[0];
|
|
1071
|
+
if (thenStep && 'text' in thenStep) {
|
|
1072
|
+
expect(thenStep.text).toBe('QuestionnaireSubmitted');
|
|
1073
|
+
expect(thenStep.docString).toEqual({
|
|
1078
1074
|
questionnaireId: 'q-001',
|
|
1079
1075
|
participantId: 'participant-abc',
|
|
1080
1076
|
submittedAt: new Date('2030-01-01T09:00:00.000Z'),
|