@projectcaluma/ember-testing 10.0.0 → 11.0.0-beta.1

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.
Files changed (38) hide show
  1. package/CHANGELOG.md +1009 -0
  2. package/addon/mirage-graphql/filters/answer.js +13 -0
  3. package/addon/mirage-graphql/filters/base.js +12 -12
  4. package/addon/mirage-graphql/filters/question.js +1 -3
  5. package/addon/mirage-graphql/filters/work-item.js +9 -7
  6. package/addon/mirage-graphql/handler.js +1 -1
  7. package/addon/mirage-graphql/mocks/answer.js +4 -28
  8. package/addon/mirage-graphql/mocks/base.js +29 -25
  9. package/addon/mirage-graphql/mocks/form.js +25 -99
  10. package/addon/mirage-graphql/mocks/question.js +17 -47
  11. package/addon/mirage-graphql/mocks/work-item.js +105 -0
  12. package/addon/mirage-graphql/schema.graphql +0 -16
  13. package/addon/scenarios/distribution.js +315 -0
  14. package/addon-mirage-support/factories/answer.js +2 -2
  15. package/addon-mirage-support/factories/case.js +2 -2
  16. package/addon-mirage-support/factories/document.js +2 -2
  17. package/addon-mirage-support/factories/file.js +2 -2
  18. package/addon-mirage-support/factories/form.js +2 -2
  19. package/addon-mirage-support/factories/format-validator.js +2 -2
  20. package/addon-mirage-support/factories/option.js +1 -1
  21. package/addon-mirage-support/factories/question.js +2 -2
  22. package/addon-mirage-support/factories/task.js +2 -2
  23. package/addon-mirage-support/factories/work-item.js +2 -2
  24. package/addon-mirage-support/factories/workflow.js +9 -0
  25. package/addon-mirage-support/models/answer.js +3 -2
  26. package/addon-mirage-support/models/case.js +2 -1
  27. package/addon-mirage-support/models/document.js +1 -1
  28. package/addon-mirage-support/models/file.js +1 -1
  29. package/addon-mirage-support/models/form.js +2 -2
  30. package/addon-mirage-support/models/format-validator.js +1 -1
  31. package/addon-mirage-support/models/option.js +1 -1
  32. package/addon-mirage-support/models/question.js +5 -2
  33. package/addon-mirage-support/models/task.js +1 -1
  34. package/addon-mirage-support/models/work-item.js +1 -1
  35. package/addon-mirage-support/models/workflow.js +1 -1
  36. package/blueprints/@projectcaluma/ember-testing/index.js +1 -4
  37. package/index.js +1 -1
  38. package/package.json +14 -13
@@ -0,0 +1,315 @@
1
+ import { faker } from "@faker-js/faker";
2
+ import moment from "moment";
3
+
4
+ export function createBlueprint(server) {
5
+ const inquiryForm = server.create("form", { slug: "inquiry" });
6
+ const inquiryAnswerForm = server.create("form", { slug: "inquiry-answer" });
7
+
8
+ server.create("question", {
9
+ slug: "inquiry-remark",
10
+ label: "Remark",
11
+ isRequired: "true",
12
+ maxLength: 9999,
13
+ minLength: 0,
14
+ formIds: [inquiryForm.id],
15
+ type: "TEXTAREA",
16
+ });
17
+ server.create("question", {
18
+ slug: "inquiry-deadline",
19
+ label: "Deadline",
20
+ isRequired: "true",
21
+ formIds: [inquiryForm.id],
22
+ type: "DATE",
23
+ });
24
+
25
+ server.create("question", {
26
+ slug: "inquiry-answer-status",
27
+ type: "CHOICE",
28
+ formIds: [inquiryAnswerForm.id],
29
+ isRequired: "true",
30
+ label: "Status",
31
+ options: [
32
+ server.create("option", {
33
+ slug: "inquiry-answer-status-positive",
34
+ label: "Positive",
35
+ }),
36
+ server.create("option", {
37
+ slug: "inquiry-answer-status-negative",
38
+ label: "Negative",
39
+ }),
40
+ server.create("option", {
41
+ slug: "inquiry-answer-status-needs-interaction",
42
+ label: "Needs interaction",
43
+ }),
44
+ ],
45
+ });
46
+ server.create("question", {
47
+ slug: "inquiry-answer-reason",
48
+ isRequired: "true",
49
+ maxLength: 9999,
50
+ minLength: 0,
51
+ label: "Reason",
52
+ type: "TEXTAREA",
53
+ formIds: [inquiryAnswerForm.id],
54
+ });
55
+
56
+ server.create("workflow", { slug: "distribution" });
57
+ server.create("workflow", { slug: "inquiry" });
58
+
59
+ server.create("task", { slug: "create-inquiry" });
60
+ server.create("task", { slug: "complete-distribution" });
61
+ server.create("task", { slug: "inquiry" });
62
+ server.create("task", {
63
+ slug: "compose-inquiry-answer",
64
+ type: "COMPLETE_WORKFLOW_FORM",
65
+ });
66
+ server.create("task", { slug: "confirm-inquiry-answer" });
67
+ server.create("task", { slug: "revise-inquiry-answer" });
68
+ server.create("task", {
69
+ slug: "adjust-inquiry-answer",
70
+ type: "COMPLETE_WORKFLOW_FORM",
71
+ });
72
+ }
73
+
74
+ export function createInquiry(
75
+ server,
76
+ distributionCase,
77
+ { from, to, remark, deadline },
78
+ workItemAttrs = {}
79
+ ) {
80
+ const document = server.create("document", { formId: "inquiry" });
81
+
82
+ server.create("answer", {
83
+ document,
84
+ questionId: "inquiry-remark",
85
+ value: remark ?? faker.lorem.paragraph(),
86
+ });
87
+
88
+ server.create("answer", {
89
+ document,
90
+ questionId: "inquiry-deadline",
91
+ value: deadline ?? faker.date.future(),
92
+ });
93
+
94
+ return server.create("work-item", {
95
+ taskId: "inquiry",
96
+ document,
97
+ status: "SUSPENDED",
98
+ case: distributionCase,
99
+ addressedGroups: [to.id],
100
+ controllingGroups: [from.id],
101
+ ...workItemAttrs,
102
+ });
103
+ }
104
+
105
+ export function sendInquiry(server, { inquiry }) {
106
+ const childCase = server.create("case", {
107
+ status: "RUNNING",
108
+ workflowId: "inquiry",
109
+ document: server.create("document", { formId: "inquiry-answer" }),
110
+ });
111
+
112
+ server.create("work-item", {
113
+ taskId: "compose-inquiry-answer",
114
+ status: "READY",
115
+ case: childCase,
116
+ addressedGroups: inquiry.addressedGroups,
117
+ });
118
+
119
+ inquiry.update({ status: "READY", childCase });
120
+
121
+ return inquiry;
122
+ }
123
+
124
+ export function answerInquiry(server, { inquiry, status, reason }) {
125
+ if (inquiry.status !== "READY") {
126
+ inquiry = sendInquiry(server, { inquiry });
127
+ }
128
+
129
+ server.create("answer", {
130
+ document: inquiry.childCase.document,
131
+ questionId: "inquiry-answer-status",
132
+ value: status,
133
+ });
134
+
135
+ server.create("answer", {
136
+ document: inquiry.childCase.document,
137
+ questionId: "inquiry-answer-reason",
138
+ value: reason ?? faker.lorem.paragraph(),
139
+ });
140
+
141
+ inquiry.childCase.workItems
142
+ .filter((workItem) => workItem.taskId === "compose-inquiry-answer")
143
+ .update({ status: "COMPLETED" });
144
+ server.create("work-item", {
145
+ taskId: "confirm-inquiry-answer",
146
+ status: "READY",
147
+ case: inquiry.childCase,
148
+ addressedGroups: inquiry.addressedGroups,
149
+ });
150
+ server.create("work-item", {
151
+ taskId: "revise-inquiry-answer",
152
+ status: "READY",
153
+ case: inquiry.childCase,
154
+ addressedGroups: inquiry.addressedGroups,
155
+ });
156
+
157
+ return inquiry;
158
+ }
159
+
160
+ export function confirmInquiry({ inquiry }) {
161
+ inquiry.update({ status: "COMPLETED" });
162
+ inquiry.childCase.update({
163
+ status: "COMPLETED",
164
+ closedAt: faker.date.recent(),
165
+ });
166
+ inquiry.childCase.workItems
167
+ .filter((workItem) => workItem.taskId === "confirm-inquiry-answer")
168
+ .update({ status: "COMPLETED" });
169
+ inquiry.childCase.workItems
170
+ .filter((workItem) => workItem.taskId === "revise-inquiry-answer")
171
+ .update({ status: "CANCELED" });
172
+
173
+ return inquiry;
174
+ }
175
+
176
+ export function reviseInquiry(server, { inquiry }) {
177
+ server.create("work-item", {
178
+ taskId: "adjust-inquiry-answer",
179
+ status: "READY",
180
+ case: inquiry.childCase,
181
+ addressedGroups: inquiry.addressedGroups,
182
+ });
183
+ inquiry.childCase.workItems
184
+ .filter((workItem) => workItem.taskId === "confirm-inquiry-answer")
185
+ .update({ status: "CANCELED" });
186
+ inquiry.childCase.workItems
187
+ .filter((workItem) => workItem.taskId === "revise-inquiry-answer")
188
+ .update({ status: "COMPLETED" });
189
+
190
+ return inquiry;
191
+ }
192
+
193
+ export function createCase(server, { group }) {
194
+ const distributionCase = server.create("case", {
195
+ status: "RUNNING",
196
+ workflowId: "distribution",
197
+ });
198
+
199
+ server.create("work-item", {
200
+ case: distributionCase,
201
+ taskId: "create-inquiry",
202
+ status: "READY",
203
+ addressedGroups: [group.id],
204
+ });
205
+
206
+ server.create("work-item", {
207
+ case: distributionCase,
208
+ taskId: "complete-distribution",
209
+ status: "READY",
210
+ addressedGroups: [group.id],
211
+ });
212
+
213
+ return distributionCase;
214
+ }
215
+
216
+ export default function (server, groups) {
217
+ createBlueprint(server);
218
+
219
+ const g = groups[0];
220
+ const g1 = groups[1];
221
+ const g2 = groups[2];
222
+ const g3 = groups[3];
223
+ const g4 = groups[4];
224
+
225
+ const create = (...args) => createInquiry(server, distributionCase, ...args);
226
+ const send = (...args) => sendInquiry(server, ...args);
227
+ const answer = (...args) => answerInquiry(server, ...args);
228
+ const confirm = (...args) => confirmInquiry(...args);
229
+ const revise = (...args) => reviseInquiry(server, ...args);
230
+
231
+ const distributionCase = createCase(server, { group: g1 });
232
+
233
+ server.create("work-item", {
234
+ taskId: "create-inquiry",
235
+ status: "READY",
236
+ addressedGroups: [g.id],
237
+ });
238
+
239
+ // controlling
240
+ create({ from: g, to: g1 });
241
+ send({
242
+ inquiry: create({
243
+ from: g,
244
+ to: g2,
245
+ deadline: faker.date.past(),
246
+ }),
247
+ });
248
+ confirm({
249
+ inquiry: answer({
250
+ inquiry: create({
251
+ from: g,
252
+ to: g3,
253
+ deadline: faker.date.past(),
254
+ }),
255
+ status: "inquiry-answer-status-needs-interaction",
256
+ }),
257
+ });
258
+
259
+ // "override" third controlling inquiry
260
+ confirm({
261
+ inquiry: answer({
262
+ inquiry: create({ from: g, to: g3 }, { createdAt: faker.date.recent() }),
263
+ status: "inquiry-answer-status-positive",
264
+ }),
265
+ });
266
+
267
+ // addressed
268
+ confirm({
269
+ inquiry: answer({
270
+ inquiry: create({ from: g2, to: g }),
271
+ status: "inquiry-answer-status-needs-interaction",
272
+ }),
273
+ });
274
+ // "override" first addressed inquiry
275
+ send({
276
+ inquiry: create(
277
+ {
278
+ from: g2,
279
+ to: g,
280
+ deadline: moment.utc().add(2, "days").toDate(),
281
+ },
282
+ { createdAt: faker.date.recent() }
283
+ ),
284
+ });
285
+ confirm({
286
+ inquiry: answer({
287
+ inquiry: create({ from: g4, to: g }),
288
+ status: "inquiry-answer-status-negative",
289
+ }),
290
+ });
291
+ answer({
292
+ inquiry: create({ from: g3, to: g }),
293
+ status: "inquiry-answer-status-positive",
294
+ });
295
+ revise({
296
+ inquiry: answer({
297
+ inquiry: create({ from: g1, to: g }),
298
+ status: "inquiry-answer-status-needs-interaction",
299
+ }),
300
+ });
301
+
302
+ // more
303
+ confirm({
304
+ inquiry: answer({
305
+ inquiry: create({ from: g2, to: g3 }),
306
+ status: "inquiry-answer-status-needs-interaction",
307
+ }),
308
+ });
309
+ confirm({
310
+ inquiry: answer({
311
+ inquiry: create({ from: g3, to: g4 }),
312
+ status: "inquiry-answer-status-positive",
313
+ }),
314
+ });
315
+ }
@@ -1,5 +1,5 @@
1
- import { Factory } from "ember-cli-mirage";
2
- import faker from "faker";
1
+ import { faker } from "@faker-js/faker";
2
+ import { Factory } from "miragejs";
3
3
  import moment from "moment";
4
4
 
5
5
  export default Factory.extend({
@@ -1,5 +1,5 @@
1
- import { Factory } from "ember-cli-mirage";
2
- import faker from "faker";
1
+ import { faker } from "@faker-js/faker";
2
+ import { Factory } from "miragejs";
3
3
 
4
4
  const STATUS = ["RUNNING", "COMPLETED", "CANCELED", "SUSPENDED"];
5
5
 
@@ -1,5 +1,5 @@
1
- import { Factory } from "ember-cli-mirage";
2
- import faker from "faker";
1
+ import { faker } from "@faker-js/faker";
2
+ import { Factory } from "miragejs";
3
3
 
4
4
  export default Factory.extend({
5
5
  id: () => faker.datatype.uuid(),
@@ -1,5 +1,5 @@
1
- import { Factory } from "ember-cli-mirage";
2
- import faker from "faker";
1
+ import { faker } from "@faker-js/faker";
2
+ import { Factory } from "miragejs";
3
3
 
4
4
  export default Factory.extend({
5
5
  id: () => faker.datatype.uuid(),
@@ -1,5 +1,5 @@
1
- import { Factory } from "ember-cli-mirage";
2
- import faker from "faker";
1
+ import { faker } from "@faker-js/faker";
2
+ import { Factory } from "miragejs";
3
3
 
4
4
  export default Factory.extend({
5
5
  id() {
@@ -1,5 +1,5 @@
1
- import { Factory } from "ember-cli-mirage";
2
- import faker from "faker";
1
+ import { faker } from "@faker-js/faker";
2
+ import { Factory } from "miragejs";
3
3
 
4
4
  export default Factory.extend({
5
5
  id() {
@@ -1,4 +1,4 @@
1
- import { Factory } from "ember-cli-mirage";
1
+ import { Factory } from "miragejs";
2
2
 
3
3
  export default Factory.extend({
4
4
  id() {
@@ -1,5 +1,5 @@
1
- import { Factory } from "ember-cli-mirage";
2
- import faker from "faker";
1
+ import { faker } from "@faker-js/faker";
2
+ import { Factory } from "miragejs";
3
3
 
4
4
  export default Factory.extend({
5
5
  id() {
@@ -1,5 +1,5 @@
1
- import { Factory } from "ember-cli-mirage";
2
- import faker from "faker";
1
+ import { faker } from "@faker-js/faker";
2
+ import { Factory } from "miragejs";
3
3
 
4
4
  export default Factory.extend({
5
5
  id() {
@@ -1,5 +1,5 @@
1
- import { Factory } from "ember-cli-mirage";
2
- import faker from "faker";
1
+ import { faker } from "@faker-js/faker";
2
+ import { Factory } from "miragejs";
3
3
 
4
4
  const STATUS = ["READY", "CANCELED", "COMPLETED", "SKIPPED", "SUSPENDED"];
5
5
 
@@ -0,0 +1,9 @@
1
+ import { Factory } from "miragejs";
2
+
3
+ export default Factory.extend({
4
+ id() {
5
+ return this.slug;
6
+ },
7
+ name: (i) => `Workflow #${i + 1}`,
8
+ slug: (i) => `workflow-${i + 1}`,
9
+ });
@@ -1,6 +1,7 @@
1
- import { Model, belongsTo } from "ember-cli-mirage";
1
+ import { Model, belongsTo, hasMany } from "miragejs";
2
2
 
3
3
  export default Model.extend({
4
- document: belongsTo(),
4
+ document: belongsTo("document"),
5
5
  question: belongsTo(),
6
+ documents: hasMany("document", { inverse: null }),
6
7
  });
@@ -1,7 +1,8 @@
1
- import { Model, belongsTo, hasMany } from "ember-cli-mirage";
1
+ import { Model, belongsTo, hasMany } from "miragejs";
2
2
 
3
3
  export default Model.extend({
4
4
  document: belongsTo(),
5
5
  workflow: belongsTo(),
6
+ parentWorkItem: belongsTo("workItem", { inverse: "childCase" }),
6
7
  workItems: hasMany(),
7
8
  });
@@ -1,4 +1,4 @@
1
- import { Model, belongsTo, hasMany } from "ember-cli-mirage";
1
+ import { Model, belongsTo, hasMany } from "miragejs";
2
2
 
3
3
  export default Model.extend({
4
4
  form: belongsTo(),
@@ -1,3 +1,3 @@
1
- import { Model } from "ember-cli-mirage";
1
+ import { Model } from "miragejs";
2
2
 
3
3
  export default Model.extend({});
@@ -1,5 +1,5 @@
1
- import { Model, hasMany } from "ember-cli-mirage";
1
+ import { Model, hasMany } from "miragejs";
2
2
 
3
3
  export default Model.extend({
4
- questions: hasMany(),
4
+ questions: hasMany({ inverse: "forms" }),
5
5
  });
@@ -1,3 +1,3 @@
1
- import { Model } from "ember-cli-mirage";
1
+ import { Model } from "miragejs";
2
2
 
3
3
  export default Model.extend({});
@@ -1,4 +1,4 @@
1
- import { Model, hasMany } from "ember-cli-mirage";
1
+ import { Model, hasMany } from "miragejs";
2
2
 
3
3
  export default Model.extend({
4
4
  questions: hasMany(),
@@ -1,7 +1,10 @@
1
- import { Model, hasMany, belongsTo } from "ember-cli-mirage";
1
+ import { Model, hasMany, belongsTo } from "miragejs";
2
2
 
3
3
  export default Model.extend({
4
- forms: hasMany(),
4
+ forms: hasMany({ inverse: "questions" }),
5
5
  options: hasMany(),
6
+ subForm: belongsTo("form", { inverse: null }),
7
+ rowForm: belongsTo("form", { inverse: null }),
6
8
  defaultAnswer: belongsTo("answer", { inverse: null }),
9
+ formatValidators: hasMany(),
7
10
  });
@@ -1,4 +1,4 @@
1
- import { Model, belongsTo, hasMany } from "ember-cli-mirage";
1
+ import { Model, belongsTo, hasMany } from "miragejs";
2
2
 
3
3
  export default Model.extend({
4
4
  workflow: belongsTo(),
@@ -1,4 +1,4 @@
1
- import { Model, belongsTo } from "ember-cli-mirage";
1
+ import { Model, belongsTo } from "miragejs";
2
2
 
3
3
  export default Model.extend({
4
4
  case: belongsTo(),
@@ -1,4 +1,4 @@
1
- import { Model, belongsTo, hasMany } from "ember-cli-mirage";
1
+ import { Model, belongsTo, hasMany } from "miragejs";
2
2
 
3
3
  export default Model.extend({
4
4
  workflow: belongsTo(),
@@ -5,10 +5,7 @@ module.exports = {
5
5
 
6
6
  afterInstall() {
7
7
  return this.addAddonsToProject({
8
- packages: [
9
- { name: "@projectcaluma/ember-core" },
10
- { name: "ember-cli-mirage" },
11
- ],
8
+ packages: [{ name: "ember-cli-mirage" }],
12
9
  }).then(() => this.addPackagesToProject([{ name: "faker" }]));
13
10
  },
14
11
  };
package/index.js CHANGED
@@ -15,6 +15,6 @@ module.exports = {
15
15
  destDir: "mirage",
16
16
  });
17
17
 
18
- return mergeTrees([appTree, mirageTree]);
18
+ return mergeTrees([appTree, mirageTree].filter(Boolean));
19
19
  },
20
20
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@projectcaluma/ember-testing",
3
- "version": "10.0.0",
3
+ "version": "11.0.0-beta.1",
4
4
  "description": "Ember addon for testing with Caluma addons.",
5
5
  "keywords": [
6
6
  "ember-addon"
@@ -14,26 +14,28 @@
14
14
  "test:ember-compatibility": "ember try:each"
15
15
  },
16
16
  "dependencies": {
17
+ "@faker-js/faker": "^6.0.0-alpha.5",
17
18
  "broccoli-funnel": "^3.0.8",
18
19
  "broccoli-merge-trees": "^4.2.0",
19
20
  "ember-apollo-client": "^3.2.0",
20
- "ember-auto-import": "^2.2.3",
21
- "ember-cli-babel": "^7.26.6",
22
- "ember-cli-htmlbars": "^6.0.0",
23
- "ember-cli-mirage": "^2.2.0",
24
- "ember-fetch": "^8.0.4",
25
- "faker": "^5.5.3",
26
- "graphql": "^15.6.1",
21
+ "ember-auto-import": "^2.4.0",
22
+ "ember-cli-babel": "^7.26.11",
23
+ "ember-cli-htmlbars": "^6.0.1",
24
+ "ember-cli-mirage": "^2.4.0",
25
+ "ember-fetch": "^8.1.1",
26
+ "ember-inflector": "^4.0.2",
27
+ "graphql": "^15.8.0",
27
28
  "graphql-iso-date": "^3.6.1",
28
29
  "graphql-tools": "^4.0.8",
30
+ "miragejs": "^0.1.43",
29
31
  "moment": "^2.29.1"
30
32
  },
31
33
  "devDependencies": {
32
34
  "@ember/optional-features": "2.0.0",
33
35
  "@ember/test-helpers": "2.6.0",
34
- "@embroider/test-setup": "0.47.2",
36
+ "@embroider/test-setup": "1.0.0",
35
37
  "broccoli-asset-rev": "3.0.0",
36
- "ember-cli": "3.28.4",
38
+ "ember-cli": "3.28.5",
37
39
  "ember-cli-code-coverage": "1.0.3",
38
40
  "ember-cli-dependency-checker": "3.2.0",
39
41
  "ember-cli-inject-live-reload": "2.1.0",
@@ -45,15 +47,14 @@
45
47
  "ember-maybe-import-regenerator": "1.0.0",
46
48
  "ember-qunit": "5.1.5",
47
49
  "ember-resolver": "8.0.3",
48
- "ember-source": "3.28.6",
50
+ "ember-source": "3.28.8",
49
51
  "ember-source-channel-url": "3.0.0",
50
52
  "ember-try": "2.0.0",
51
- "get-graphql-schema": "2.1.2",
52
53
  "graphql-tag": "2.12.6",
53
54
  "loader.js": "4.7.0",
54
55
  "qunit": "2.17.2",
55
56
  "qunit-dom": "2.0.0",
56
- "webpack": "5.64.1"
57
+ "webpack": "5.68.0"
57
58
  },
58
59
  "engines": {
59
60
  "node": "12.* || 14.* || >= 16"