@auto-engineer/narrative 1.138.0 → 1.140.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.
- package/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +5 -5
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +41 -0
- package/dist/scripts/convert-flow-exec.js +2 -2
- package/dist/scripts/convert-flow-exec.js.map +1 -1
- package/dist/scripts/print-schema.js +5 -5
- package/dist/scripts/print-schema.js.map +1 -1
- package/dist/src/fluent-builder.d.ts +29 -29
- package/dist/src/fluent-builder.d.ts.map +1 -1
- package/dist/src/fluent-builder.js +81 -81
- package/dist/src/fluent-builder.js.map +1 -1
- package/dist/src/{getNarratives.d.ts → getScenes.d.ts} +6 -6
- package/dist/src/getScenes.d.ts.map +1 -0
- package/dist/src/{getNarratives.js → getScenes.js} +16 -16
- package/dist/src/getScenes.js.map +1 -0
- package/dist/src/id/addAutoIds.d.ts.map +1 -1
- package/dist/src/id/addAutoIds.js +22 -22
- package/dist/src/id/addAutoIds.js.map +1 -1
- package/dist/src/id/hasAllIds.d.ts.map +1 -1
- package/dist/src/id/hasAllIds.js +2 -2
- package/dist/src/id/hasAllIds.js.map +1 -1
- package/dist/src/index.d.ts +8 -8
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/loader/index.js +1 -1
- package/dist/src/loader/index.js.map +1 -1
- package/dist/src/loader/runtime-cjs.js +1 -1
- package/dist/src/loader/runtime-cjs.js.map +1 -1
- package/dist/src/narrative-context.d.ts +9 -9
- package/dist/src/narrative-context.d.ts.map +1 -1
- package/dist/src/narrative-context.js +47 -47
- package/dist/src/narrative-context.js.map +1 -1
- package/dist/src/narrative-registry.d.ts +6 -6
- package/dist/src/narrative-registry.d.ts.map +1 -1
- package/dist/src/narrative-registry.js +26 -26
- package/dist/src/narrative-registry.js.map +1 -1
- package/dist/src/narrative.d.ts +5 -5
- package/dist/src/narrative.d.ts.map +1 -1
- package/dist/src/narrative.js +26 -27
- package/dist/src/narrative.js.map +1 -1
- package/dist/src/parse-graphql-request.d.ts +1 -1
- package/dist/src/parse-graphql-request.d.ts.map +1 -1
- package/dist/src/parse-graphql-request.js +3 -3
- package/dist/src/parse-graphql-request.js.map +1 -1
- package/dist/src/samples/items.narrative.js +2 -2
- package/dist/src/samples/items.narrative.js.map +1 -1
- package/dist/src/samples/mixed-given-types.narrative.js +2 -2
- package/dist/src/samples/mixed-given-types.narrative.js.map +1 -1
- package/dist/src/samples/place-order.narrative.js +2 -2
- package/dist/src/samples/place-order.narrative.js.map +1 -1
- package/dist/src/samples/questionnaires.narrative.js +2 -2
- package/dist/src/samples/questionnaires.narrative.js.map +1 -1
- package/dist/src/samples/seasonal-assistant.schema.json +2 -2
- package/dist/src/samples/test-with-ids.narrative.js +2 -2
- package/dist/src/samples/test-with-ids.narrative.js.map +1 -1
- package/dist/src/schema.d.ts +136 -136
- package/dist/src/schema.d.ts.map +1 -1
- package/dist/src/schema.js +76 -76
- package/dist/src/schema.js.map +1 -1
- package/dist/src/slice-builder.d.ts +6 -6
- package/dist/src/slice-builder.d.ts.map +1 -1
- package/dist/src/slice-builder.js +21 -21
- package/dist/src/slice-builder.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/analysis/lint-helpers.js +1 -1
- package/dist/src/transformers/model-to-narrative/analysis/lint-helpers.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/cross-module-imports.js +4 -4
- package/dist/src/transformers/model-to-narrative/cross-module-imports.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/compose.js +3 -3
- package/dist/src/transformers/model-to-narrative/generators/compose.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/flow.d.ts +2 -2
- package/dist/src/transformers/model-to-narrative/generators/flow.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/flow.js +20 -20
- package/dist/src/transformers/model-to-narrative/generators/flow.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 +1 -1
- package/dist/src/transformers/model-to-narrative/generators/imports.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/generators/module-code.js +14 -14
- package/dist/src/transformers/model-to-narrative/generators/module-code.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/index.d.ts +4 -4
- package/dist/src/transformers/model-to-narrative/index.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/index.js +1 -1
- package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts +2 -2
- package/dist/src/transformers/model-to-narrative/spec-traversal.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/spec-traversal.js +5 -5
- package/dist/src/transformers/model-to-narrative/spec-traversal.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/types.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/types.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.js +4 -4
- package/dist/src/transformers/model-to-narrative/utils/integration-extractor.js.map +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.d.ts +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.d.ts.map +1 -1
- package/dist/src/transformers/model-to-narrative/validate-modules.js +19 -19
- package/dist/src/transformers/model-to-narrative/validate-modules.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/assemble.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/assemble.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/assemble.js +10 -3
- package/dist/src/transformers/narrative-to-model/assemble.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/debug.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/debug.js +1 -1
- package/dist/src/transformers/narrative-to-model/debug.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/derive-modules.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/derive-modules.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/derive-modules.js +9 -9
- package/dist/src/transformers/narrative-to-model/derive-modules.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/index.d.ts +2 -2
- package/dist/src/transformers/narrative-to-model/index.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/index.js +39 -39
- package/dist/src/transformers/narrative-to-model/index.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/spec-processors.js +1 -1
- package/dist/src/transformers/narrative-to-model/spec-processors.js.map +1 -1
- package/dist/src/transformers/narrative-to-model/strings.d.ts +1 -1
- package/dist/src/transformers/narrative-to-model/strings.d.ts.map +1 -1
- package/dist/src/transformers/narrative-to-model/strings.js +6 -6
- package/dist/src/transformers/narrative-to-model/strings.js.map +1 -1
- package/dist/src/validate-slice-requests.d.ts +4 -4
- package/dist/src/validate-slice-requests.d.ts.map +1 -1
- package/dist/src/validate-slice-requests.js +34 -34
- package/dist/src/validate-slice-requests.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/scripts/convert-flow-exec.ts +2 -2
- package/scripts/print-schema.ts +8 -8
- package/src/fluent-builder.specs.ts +3 -3
- package/src/fluent-builder.ts +141 -141
- package/src/{getNarratives.cache.specs.ts → getScenes.cache.specs.ts} +45 -45
- package/src/{getNarratives.specs.ts → getScenes.specs.ts} +302 -300
- package/src/{getNarratives.ts → getScenes.ts} +20 -20
- package/src/id/addAutoIds.specs.ts +105 -105
- package/src/id/addAutoIds.ts +26 -26
- package/src/id/hasAllIds.specs.ts +59 -59
- package/src/id/hasAllIds.ts +6 -6
- package/src/index.ts +12 -13
- package/src/loader/index.ts +1 -1
- package/src/loader/runtime-cjs.ts +1 -1
- package/src/model-to-narrative.specs.ts +133 -135
- package/src/narrative-context.specs.ts +24 -24
- package/src/narrative-context.ts +61 -61
- package/src/narrative-registry.ts +31 -31
- package/src/narrative.ts +31 -33
- package/src/parse-graphql-request.specs.ts +5 -5
- package/src/parse-graphql-request.ts +3 -3
- package/src/samples/items.narrative.ts +2 -2
- package/src/samples/mixed-given-types.narrative.ts +2 -2
- package/src/samples/place-order.narrative.ts +2 -2
- package/src/samples/questionnaires.narrative.ts +2 -2
- package/src/samples/seasonal-assistant.schema.json +2 -2
- package/src/samples/test-with-ids.narrative.ts +2 -2
- package/src/schema.specs.ts +99 -91
- package/src/schema.ts +89 -89
- package/src/slice-builder.ts +30 -30
- package/src/transformers/model-to-narrative/analysis/lint-helpers.ts +1 -1
- package/src/transformers/model-to-narrative/cross-module-imports.specs.ts +43 -43
- package/src/transformers/model-to-narrative/cross-module-imports.ts +4 -4
- package/src/transformers/model-to-narrative/generators/compose.ts +4 -4
- package/src/transformers/model-to-narrative/generators/flow.ts +36 -36
- package/src/transformers/model-to-narrative/generators/imports.ts +1 -1
- package/src/transformers/model-to-narrative/generators/module-code.ts +15 -15
- package/src/transformers/model-to-narrative/index.ts +4 -4
- package/src/transformers/model-to-narrative/modules.specs.ts +58 -58
- package/src/transformers/model-to-narrative/spec-traversal.specs.ts +43 -43
- package/src/transformers/model-to-narrative/spec-traversal.ts +6 -6
- package/src/transformers/model-to-narrative/types.ts +1 -1
- package/src/transformers/model-to-narrative/utils/integration-extractor.ts +5 -5
- package/src/transformers/model-to-narrative/validate-modules.ts +22 -22
- package/src/transformers/narrative-to-model/assemble.ts +12 -4
- package/src/transformers/narrative-to-model/debug.ts +1 -1
- package/src/transformers/narrative-to-model/derive-modules.specs.ts +35 -35
- package/src/transformers/narrative-to-model/derive-modules.ts +11 -11
- package/src/transformers/narrative-to-model/index.ts +47 -47
- package/src/transformers/narrative-to-model/spec-processors.ts +1 -1
- package/src/transformers/narrative-to-model/strings.ts +6 -6
- package/src/transformers/narrative-to-model/type-inference.specs.ts +11 -11
- package/src/validate-slice-requests.specs.ts +113 -113
- package/src/validate-slice-requests.ts +49 -49
- package/dist/src/getNarratives.d.ts.map +0 -1
- package/dist/src/getNarratives.js.map +0 -1
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
import type { Model } from './schema';
|
|
3
|
-
import {
|
|
3
|
+
import { validateMomentRequests } from './validate-slice-requests';
|
|
4
4
|
|
|
5
5
|
function emptyModel(overrides: Partial<Model> = {}): Model {
|
|
6
6
|
return {
|
|
7
7
|
variant: 'specs',
|
|
8
|
-
|
|
8
|
+
scenes: [],
|
|
9
9
|
messages: [],
|
|
10
10
|
modules: [],
|
|
11
11
|
...overrides,
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
describe('
|
|
15
|
+
describe('validateMomentRequests', () => {
|
|
16
16
|
describe('burst 1: parse safety', () => {
|
|
17
17
|
it('returns empty array for empty model', () => {
|
|
18
|
-
expect(
|
|
18
|
+
expect(validateMomentRequests(emptyModel())).toEqual([]);
|
|
19
19
|
});
|
|
20
20
|
|
|
21
|
-
it('skips
|
|
21
|
+
it('skips moments without request', () => {
|
|
22
22
|
const model = emptyModel({
|
|
23
|
-
|
|
23
|
+
scenes: [
|
|
24
24
|
{
|
|
25
25
|
name: 'TestFlow',
|
|
26
|
-
|
|
26
|
+
moments: [
|
|
27
27
|
{
|
|
28
28
|
type: 'command',
|
|
29
29
|
name: 'DoThing',
|
|
@@ -34,15 +34,15 @@ describe('validateSliceRequests', () => {
|
|
|
34
34
|
},
|
|
35
35
|
],
|
|
36
36
|
});
|
|
37
|
-
expect(
|
|
37
|
+
expect(validateMomentRequests(model)).toEqual([]);
|
|
38
38
|
});
|
|
39
39
|
|
|
40
|
-
it('skips
|
|
40
|
+
it('skips moments with empty string request', () => {
|
|
41
41
|
const model = emptyModel({
|
|
42
|
-
|
|
42
|
+
scenes: [
|
|
43
43
|
{
|
|
44
44
|
name: 'TestFlow',
|
|
45
|
-
|
|
45
|
+
moments: [
|
|
46
46
|
{
|
|
47
47
|
type: 'command',
|
|
48
48
|
name: 'DoThing',
|
|
@@ -54,15 +54,15 @@ describe('validateSliceRequests', () => {
|
|
|
54
54
|
},
|
|
55
55
|
],
|
|
56
56
|
});
|
|
57
|
-
expect(
|
|
57
|
+
expect(validateMomentRequests(model)).toEqual([]);
|
|
58
58
|
});
|
|
59
59
|
|
|
60
60
|
it('returns request_parse_error for invalid syntax', () => {
|
|
61
61
|
const model = emptyModel({
|
|
62
|
-
|
|
62
|
+
scenes: [
|
|
63
63
|
{
|
|
64
64
|
name: 'TestFlow',
|
|
65
|
-
|
|
65
|
+
moments: [
|
|
66
66
|
{
|
|
67
67
|
type: 'command',
|
|
68
68
|
name: 'DoThing',
|
|
@@ -74,22 +74,22 @@ describe('validateSliceRequests', () => {
|
|
|
74
74
|
},
|
|
75
75
|
],
|
|
76
76
|
});
|
|
77
|
-
expect(
|
|
77
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
78
78
|
{
|
|
79
79
|
type: 'request_parse_error',
|
|
80
80
|
message: expect.any(String),
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
sceneName: 'TestFlow',
|
|
82
|
+
momentName: 'DoThing',
|
|
83
83
|
},
|
|
84
84
|
]);
|
|
85
85
|
});
|
|
86
86
|
|
|
87
87
|
it('returns request_parse_error for anonymous operation', () => {
|
|
88
88
|
const model = emptyModel({
|
|
89
|
-
|
|
89
|
+
scenes: [
|
|
90
90
|
{
|
|
91
91
|
name: 'TestFlow',
|
|
92
|
-
|
|
92
|
+
moments: [
|
|
93
93
|
{
|
|
94
94
|
type: 'command',
|
|
95
95
|
name: 'DoThing',
|
|
@@ -101,22 +101,22 @@ describe('validateSliceRequests', () => {
|
|
|
101
101
|
},
|
|
102
102
|
],
|
|
103
103
|
});
|
|
104
|
-
expect(
|
|
104
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
105
105
|
{
|
|
106
106
|
type: 'request_parse_error',
|
|
107
107
|
message: 'Operation must have a name',
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
sceneName: 'TestFlow',
|
|
109
|
+
momentName: 'DoThing',
|
|
110
110
|
},
|
|
111
111
|
]);
|
|
112
112
|
});
|
|
113
113
|
|
|
114
114
|
it('returns request_parse_error when no operation definition found', () => {
|
|
115
115
|
const model = emptyModel({
|
|
116
|
-
|
|
116
|
+
scenes: [
|
|
117
117
|
{
|
|
118
118
|
name: 'TestFlow',
|
|
119
|
-
|
|
119
|
+
moments: [
|
|
120
120
|
{
|
|
121
121
|
type: 'command',
|
|
122
122
|
name: 'DoThing',
|
|
@@ -128,12 +128,12 @@ describe('validateSliceRequests', () => {
|
|
|
128
128
|
},
|
|
129
129
|
],
|
|
130
130
|
});
|
|
131
|
-
expect(
|
|
131
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
132
132
|
{
|
|
133
133
|
type: 'request_parse_error',
|
|
134
134
|
message: 'No operation found in request',
|
|
135
|
-
|
|
136
|
-
|
|
135
|
+
sceneName: 'TestFlow',
|
|
136
|
+
momentName: 'DoThing',
|
|
137
137
|
},
|
|
138
138
|
]);
|
|
139
139
|
});
|
|
@@ -145,10 +145,10 @@ describe('validateSliceRequests', () => {
|
|
|
145
145
|
const jsonAst = JSON.stringify(ast);
|
|
146
146
|
|
|
147
147
|
const model = emptyModel({
|
|
148
|
-
|
|
148
|
+
scenes: [
|
|
149
149
|
{
|
|
150
150
|
name: 'TestFlow',
|
|
151
|
-
|
|
151
|
+
moments: [
|
|
152
152
|
{
|
|
153
153
|
type: 'command',
|
|
154
154
|
name: 'DoThing',
|
|
@@ -168,19 +168,19 @@ describe('validateSliceRequests', () => {
|
|
|
168
168
|
},
|
|
169
169
|
],
|
|
170
170
|
});
|
|
171
|
-
const errors =
|
|
171
|
+
const errors = validateMomentRequests(model);
|
|
172
172
|
const parseErrors = errors.filter((e) => e.type === 'request_parse_error');
|
|
173
173
|
expect(parseErrors).toEqual([]);
|
|
174
174
|
});
|
|
175
175
|
});
|
|
176
176
|
|
|
177
177
|
describe('burst 2: mutation validation', () => {
|
|
178
|
-
it('returns mutation_wrong_operation_type when command
|
|
178
|
+
it('returns mutation_wrong_operation_type when command moment uses query', () => {
|
|
179
179
|
const model = emptyModel({
|
|
180
|
-
|
|
180
|
+
scenes: [
|
|
181
181
|
{
|
|
182
182
|
name: 'TestFlow',
|
|
183
|
-
|
|
183
|
+
moments: [
|
|
184
184
|
{
|
|
185
185
|
type: 'command',
|
|
186
186
|
name: 'DoThing',
|
|
@@ -192,22 +192,22 @@ describe('validateSliceRequests', () => {
|
|
|
192
192
|
},
|
|
193
193
|
],
|
|
194
194
|
});
|
|
195
|
-
expect(
|
|
195
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
196
196
|
{
|
|
197
197
|
type: 'mutation_wrong_operation_type',
|
|
198
|
-
message: "Command
|
|
199
|
-
|
|
200
|
-
|
|
198
|
+
message: "Command moment 'DoThing' request should be a mutation, but found query",
|
|
199
|
+
sceneName: 'TestFlow',
|
|
200
|
+
momentName: 'DoThing',
|
|
201
201
|
},
|
|
202
202
|
]);
|
|
203
203
|
});
|
|
204
204
|
|
|
205
205
|
it('returns mutation_missing_input_arg when no $input variable', () => {
|
|
206
206
|
const model = emptyModel({
|
|
207
|
-
|
|
207
|
+
scenes: [
|
|
208
208
|
{
|
|
209
209
|
name: 'TestFlow',
|
|
210
|
-
|
|
210
|
+
moments: [
|
|
211
211
|
{
|
|
212
212
|
type: 'command',
|
|
213
213
|
name: 'DoThing',
|
|
@@ -219,22 +219,22 @@ describe('validateSliceRequests', () => {
|
|
|
219
219
|
},
|
|
220
220
|
],
|
|
221
221
|
});
|
|
222
|
-
expect(
|
|
222
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
223
223
|
{
|
|
224
224
|
type: 'mutation_missing_input_arg',
|
|
225
225
|
message: "Mutation 'DoThing' is missing required $input variable",
|
|
226
|
-
|
|
227
|
-
|
|
226
|
+
sceneName: 'TestFlow',
|
|
227
|
+
momentName: 'DoThing',
|
|
228
228
|
},
|
|
229
229
|
]);
|
|
230
230
|
});
|
|
231
231
|
|
|
232
232
|
it('returns mutation_input_type_mismatch when input type does not match', () => {
|
|
233
233
|
const model = emptyModel({
|
|
234
|
-
|
|
234
|
+
scenes: [
|
|
235
235
|
{
|
|
236
236
|
name: 'TestFlow',
|
|
237
|
-
|
|
237
|
+
moments: [
|
|
238
238
|
{
|
|
239
239
|
type: 'command',
|
|
240
240
|
name: 'DoThing',
|
|
@@ -246,22 +246,22 @@ describe('validateSliceRequests', () => {
|
|
|
246
246
|
},
|
|
247
247
|
],
|
|
248
248
|
});
|
|
249
|
-
expect(
|
|
249
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
250
250
|
{
|
|
251
251
|
type: 'mutation_input_type_mismatch',
|
|
252
252
|
message: "Mutation 'DoThing' input type should be 'DoThingInput', but found 'WrongInput'",
|
|
253
|
-
|
|
254
|
-
|
|
253
|
+
sceneName: 'TestFlow',
|
|
254
|
+
momentName: 'DoThing',
|
|
255
255
|
},
|
|
256
256
|
]);
|
|
257
257
|
});
|
|
258
258
|
|
|
259
259
|
it('returns mutation_message_not_found when command not in messages', () => {
|
|
260
260
|
const model = emptyModel({
|
|
261
|
-
|
|
261
|
+
scenes: [
|
|
262
262
|
{
|
|
263
263
|
name: 'TestFlow',
|
|
264
|
-
|
|
264
|
+
moments: [
|
|
265
265
|
{
|
|
266
266
|
type: 'command',
|
|
267
267
|
name: 'DoThing',
|
|
@@ -274,22 +274,22 @@ describe('validateSliceRequests', () => {
|
|
|
274
274
|
],
|
|
275
275
|
messages: [],
|
|
276
276
|
});
|
|
277
|
-
expect(
|
|
277
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
278
278
|
{
|
|
279
279
|
type: 'mutation_message_not_found',
|
|
280
280
|
message: "No command message 'DoThing' found in model.messages",
|
|
281
|
-
|
|
282
|
-
|
|
281
|
+
sceneName: 'TestFlow',
|
|
282
|
+
momentName: 'DoThing',
|
|
283
283
|
},
|
|
284
284
|
]);
|
|
285
285
|
});
|
|
286
286
|
|
|
287
287
|
it('returns no errors for valid mutation', () => {
|
|
288
288
|
const model = emptyModel({
|
|
289
|
-
|
|
289
|
+
scenes: [
|
|
290
290
|
{
|
|
291
291
|
name: 'TestFlow',
|
|
292
|
-
|
|
292
|
+
moments: [
|
|
293
293
|
{
|
|
294
294
|
type: 'command',
|
|
295
295
|
name: 'DoThing',
|
|
@@ -308,17 +308,17 @@ describe('validateSliceRequests', () => {
|
|
|
308
308
|
},
|
|
309
309
|
],
|
|
310
310
|
});
|
|
311
|
-
expect(
|
|
311
|
+
expect(validateMomentRequests(model)).toEqual([]);
|
|
312
312
|
});
|
|
313
313
|
});
|
|
314
314
|
|
|
315
315
|
describe('burst 3: query validation — operation type, state, top-level fields', () => {
|
|
316
|
-
it('returns query_wrong_operation_type when query
|
|
316
|
+
it('returns query_wrong_operation_type when query moment uses mutation', () => {
|
|
317
317
|
const model = emptyModel({
|
|
318
|
-
|
|
318
|
+
scenes: [
|
|
319
319
|
{
|
|
320
320
|
name: 'TestFlow',
|
|
321
|
-
|
|
321
|
+
moments: [
|
|
322
322
|
{
|
|
323
323
|
type: 'query',
|
|
324
324
|
name: 'GetThing',
|
|
@@ -330,22 +330,22 @@ describe('validateSliceRequests', () => {
|
|
|
330
330
|
},
|
|
331
331
|
],
|
|
332
332
|
});
|
|
333
|
-
expect(
|
|
333
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
334
334
|
{
|
|
335
335
|
type: 'query_wrong_operation_type',
|
|
336
|
-
message: "Query
|
|
337
|
-
|
|
338
|
-
|
|
336
|
+
message: "Query moment 'GetThing' request should be a query, but found mutation",
|
|
337
|
+
sceneName: 'TestFlow',
|
|
338
|
+
momentName: 'GetThing',
|
|
339
339
|
},
|
|
340
340
|
]);
|
|
341
341
|
});
|
|
342
342
|
|
|
343
343
|
it('returns query_state_not_found when target state not in messages', () => {
|
|
344
344
|
const model = emptyModel({
|
|
345
|
-
|
|
345
|
+
scenes: [
|
|
346
346
|
{
|
|
347
347
|
name: 'TestFlow',
|
|
348
|
-
|
|
348
|
+
moments: [
|
|
349
349
|
{
|
|
350
350
|
type: 'query',
|
|
351
351
|
name: 'GetThing',
|
|
@@ -366,22 +366,22 @@ describe('validateSliceRequests', () => {
|
|
|
366
366
|
],
|
|
367
367
|
messages: [],
|
|
368
368
|
});
|
|
369
|
-
expect(
|
|
369
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
370
370
|
{
|
|
371
371
|
type: 'query_state_not_found',
|
|
372
372
|
message: "State 'ThingState' referenced by query 'GetThing' not found in model.messages",
|
|
373
|
-
|
|
374
|
-
|
|
373
|
+
sceneName: 'TestFlow',
|
|
374
|
+
momentName: 'GetThing',
|
|
375
375
|
},
|
|
376
376
|
]);
|
|
377
377
|
});
|
|
378
378
|
|
|
379
379
|
it('returns query_field_not_found when selecting field not on state', () => {
|
|
380
380
|
const model = emptyModel({
|
|
381
|
-
|
|
381
|
+
scenes: [
|
|
382
382
|
{
|
|
383
383
|
name: 'TestFlow',
|
|
384
|
-
|
|
384
|
+
moments: [
|
|
385
385
|
{
|
|
386
386
|
type: 'query',
|
|
387
387
|
name: 'GetThing',
|
|
@@ -411,22 +411,22 @@ describe('validateSliceRequests', () => {
|
|
|
411
411
|
},
|
|
412
412
|
],
|
|
413
413
|
});
|
|
414
|
-
expect(
|
|
414
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
415
415
|
{
|
|
416
416
|
type: 'query_field_not_found',
|
|
417
417
|
message: "Field 'missing' in query 'GetThing' not found on state 'ThingState'",
|
|
418
|
-
|
|
419
|
-
|
|
418
|
+
sceneName: 'TestFlow',
|
|
419
|
+
momentName: 'GetThing',
|
|
420
420
|
},
|
|
421
421
|
]);
|
|
422
422
|
});
|
|
423
423
|
|
|
424
|
-
it('skips query
|
|
424
|
+
it('skips query moment without data gracefully', () => {
|
|
425
425
|
const model = emptyModel({
|
|
426
|
-
|
|
426
|
+
scenes: [
|
|
427
427
|
{
|
|
428
428
|
name: 'TestFlow',
|
|
429
|
-
|
|
429
|
+
moments: [
|
|
430
430
|
{
|
|
431
431
|
type: 'query',
|
|
432
432
|
name: 'GetThing',
|
|
@@ -438,15 +438,15 @@ describe('validateSliceRequests', () => {
|
|
|
438
438
|
},
|
|
439
439
|
],
|
|
440
440
|
});
|
|
441
|
-
expect(
|
|
441
|
+
expect(validateMomentRequests(model)).toEqual([]);
|
|
442
442
|
});
|
|
443
443
|
|
|
444
444
|
it('skips __typename in selection', () => {
|
|
445
445
|
const model = emptyModel({
|
|
446
|
-
|
|
446
|
+
scenes: [
|
|
447
447
|
{
|
|
448
448
|
name: 'TestFlow',
|
|
449
|
-
|
|
449
|
+
moments: [
|
|
450
450
|
{
|
|
451
451
|
type: 'query',
|
|
452
452
|
name: 'GetThing',
|
|
@@ -473,15 +473,15 @@ describe('validateSliceRequests', () => {
|
|
|
473
473
|
},
|
|
474
474
|
],
|
|
475
475
|
});
|
|
476
|
-
expect(
|
|
476
|
+
expect(validateMomentRequests(model)).toEqual([]);
|
|
477
477
|
});
|
|
478
478
|
|
|
479
479
|
it('returns no errors for valid query', () => {
|
|
480
480
|
const model = emptyModel({
|
|
481
|
-
|
|
481
|
+
scenes: [
|
|
482
482
|
{
|
|
483
483
|
name: 'TestFlow',
|
|
484
|
-
|
|
484
|
+
moments: [
|
|
485
485
|
{
|
|
486
486
|
type: 'query',
|
|
487
487
|
name: 'GetThing',
|
|
@@ -511,17 +511,17 @@ describe('validateSliceRequests', () => {
|
|
|
511
511
|
},
|
|
512
512
|
],
|
|
513
513
|
});
|
|
514
|
-
expect(
|
|
514
|
+
expect(validateMomentRequests(model)).toEqual([]);
|
|
515
515
|
});
|
|
516
516
|
});
|
|
517
517
|
|
|
518
518
|
describe('burst 4: query nested field validation', () => {
|
|
519
519
|
it('returns query_nested_field_not_found for nested field not in inline object', () => {
|
|
520
520
|
const model = emptyModel({
|
|
521
|
-
|
|
521
|
+
scenes: [
|
|
522
522
|
{
|
|
523
523
|
name: 'TestFlow',
|
|
524
|
-
|
|
524
|
+
moments: [
|
|
525
525
|
{
|
|
526
526
|
type: 'query',
|
|
527
527
|
name: 'GetThing',
|
|
@@ -551,22 +551,22 @@ describe('validateSliceRequests', () => {
|
|
|
551
551
|
},
|
|
552
552
|
],
|
|
553
553
|
});
|
|
554
|
-
expect(
|
|
554
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
555
555
|
{
|
|
556
556
|
type: 'query_nested_field_not_found',
|
|
557
557
|
message: "Nested field 'missing' in query 'GetThing' not found on type of 'address'",
|
|
558
|
-
|
|
559
|
-
|
|
558
|
+
sceneName: 'TestFlow',
|
|
559
|
+
momentName: 'GetThing',
|
|
560
560
|
},
|
|
561
561
|
]);
|
|
562
562
|
});
|
|
563
563
|
|
|
564
564
|
it('resolves nested field on referenced message type', () => {
|
|
565
565
|
const model = emptyModel({
|
|
566
|
-
|
|
566
|
+
scenes: [
|
|
567
567
|
{
|
|
568
568
|
name: 'TestFlow',
|
|
569
|
-
|
|
569
|
+
moments: [
|
|
570
570
|
{
|
|
571
571
|
type: 'query',
|
|
572
572
|
name: 'GetThing',
|
|
@@ -601,15 +601,15 @@ describe('validateSliceRequests', () => {
|
|
|
601
601
|
},
|
|
602
602
|
],
|
|
603
603
|
});
|
|
604
|
-
expect(
|
|
604
|
+
expect(validateMomentRequests(model)).toEqual([]);
|
|
605
605
|
});
|
|
606
606
|
|
|
607
607
|
it('skips nested field on unresolvable type without error', () => {
|
|
608
608
|
const model = emptyModel({
|
|
609
|
-
|
|
609
|
+
scenes: [
|
|
610
610
|
{
|
|
611
611
|
name: 'TestFlow',
|
|
612
|
-
|
|
612
|
+
moments: [
|
|
613
613
|
{
|
|
614
614
|
type: 'query',
|
|
615
615
|
name: 'GetThing',
|
|
@@ -639,15 +639,15 @@ describe('validateSliceRequests', () => {
|
|
|
639
639
|
},
|
|
640
640
|
],
|
|
641
641
|
});
|
|
642
|
-
expect(
|
|
642
|
+
expect(validateMomentRequests(model)).toEqual([]);
|
|
643
643
|
});
|
|
644
644
|
|
|
645
645
|
it('resolves nested fields on bracket array syntax type', () => {
|
|
646
646
|
const model = emptyModel({
|
|
647
|
-
|
|
647
|
+
scenes: [
|
|
648
648
|
{
|
|
649
649
|
name: 'TestFlow',
|
|
650
|
-
|
|
650
|
+
moments: [
|
|
651
651
|
{
|
|
652
652
|
type: 'query',
|
|
653
653
|
name: 'GetThing',
|
|
@@ -677,15 +677,15 @@ describe('validateSliceRequests', () => {
|
|
|
677
677
|
},
|
|
678
678
|
],
|
|
679
679
|
});
|
|
680
|
-
expect(
|
|
680
|
+
expect(validateMomentRequests(model)).toEqual([]);
|
|
681
681
|
});
|
|
682
682
|
|
|
683
683
|
it('returns no errors for valid query with nested selections', () => {
|
|
684
684
|
const model = emptyModel({
|
|
685
|
-
|
|
685
|
+
scenes: [
|
|
686
686
|
{
|
|
687
687
|
name: 'TestFlow',
|
|
688
|
-
|
|
688
|
+
moments: [
|
|
689
689
|
{
|
|
690
690
|
type: 'query',
|
|
691
691
|
name: 'GetThing',
|
|
@@ -715,17 +715,17 @@ describe('validateSliceRequests', () => {
|
|
|
715
715
|
},
|
|
716
716
|
],
|
|
717
717
|
});
|
|
718
|
-
expect(
|
|
718
|
+
expect(validateMomentRequests(model)).toEqual([]);
|
|
719
719
|
});
|
|
720
720
|
});
|
|
721
721
|
|
|
722
722
|
describe('burst 5: integration', () => {
|
|
723
723
|
it('returns no false positives on a questionnaires-style model', () => {
|
|
724
724
|
const model = emptyModel({
|
|
725
|
-
|
|
725
|
+
scenes: [
|
|
726
726
|
{
|
|
727
727
|
name: 'Questionnaire Management',
|
|
728
|
-
|
|
728
|
+
moments: [
|
|
729
729
|
{
|
|
730
730
|
type: 'command',
|
|
731
731
|
name: 'SubmitAnswer',
|
|
@@ -799,15 +799,15 @@ describe('validateSliceRequests', () => {
|
|
|
799
799
|
},
|
|
800
800
|
],
|
|
801
801
|
});
|
|
802
|
-
expect(
|
|
802
|
+
expect(validateMomentRequests(model)).toEqual([]);
|
|
803
803
|
});
|
|
804
804
|
|
|
805
|
-
it('catches multiple errors across
|
|
805
|
+
it('catches multiple errors across scenes', () => {
|
|
806
806
|
const model = emptyModel({
|
|
807
|
-
|
|
807
|
+
scenes: [
|
|
808
808
|
{
|
|
809
809
|
name: 'Flow1',
|
|
810
|
-
|
|
810
|
+
moments: [
|
|
811
811
|
{
|
|
812
812
|
type: 'command',
|
|
813
813
|
name: 'BadCmd',
|
|
@@ -819,7 +819,7 @@ describe('validateSliceRequests', () => {
|
|
|
819
819
|
},
|
|
820
820
|
{
|
|
821
821
|
name: 'Flow2',
|
|
822
|
-
|
|
822
|
+
moments: [
|
|
823
823
|
{
|
|
824
824
|
type: 'query',
|
|
825
825
|
name: 'BadQuery',
|
|
@@ -831,18 +831,18 @@ describe('validateSliceRequests', () => {
|
|
|
831
831
|
},
|
|
832
832
|
],
|
|
833
833
|
});
|
|
834
|
-
expect(
|
|
834
|
+
expect(validateMomentRequests(model)).toEqual([
|
|
835
835
|
{
|
|
836
836
|
type: 'mutation_wrong_operation_type',
|
|
837
|
-
message: "Command
|
|
838
|
-
|
|
839
|
-
|
|
837
|
+
message: "Command moment 'BadCmd' request should be a mutation, but found query",
|
|
838
|
+
sceneName: 'Flow1',
|
|
839
|
+
momentName: 'BadCmd',
|
|
840
840
|
},
|
|
841
841
|
{
|
|
842
842
|
type: 'query_wrong_operation_type',
|
|
843
|
-
message: "Query
|
|
844
|
-
|
|
845
|
-
|
|
843
|
+
message: "Query moment 'BadQuery' request should be a query, but found mutation",
|
|
844
|
+
sceneName: 'Flow2',
|
|
845
|
+
momentName: 'BadQuery',
|
|
846
846
|
},
|
|
847
847
|
]);
|
|
848
848
|
});
|