@sprucelabs/spruce-cli 28.2.0 → 28.2.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.
Files changed (35) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/build/__tests__/behavioral/events/KeepingEventsInSync2.test.js +9 -9
  3. package/build/__tests__/behavioral/events/KeepingEventsInSync2.test.js.map +1 -1
  4. package/build/__tests__/behavioral/permissions/SyncingPermissions.test.d.ts +7 -0
  5. package/build/__tests__/behavioral/permissions/SyncingPermissions.test.js +116 -14
  6. package/build/__tests__/behavioral/permissions/SyncingPermissions.test.js.map +1 -1
  7. package/build/__tests__/behavioral/tests/CreatingATest.test.js +1 -1
  8. package/build/__tests__/behavioral/tests/CreatingATest.test.js.map +1 -1
  9. package/build/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.js +1 -1
  10. package/build/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.js.map +1 -1
  11. package/build/__tests__/behavioral/tests/TestingDataStores.test.js +3 -3
  12. package/build/__tests__/behavioral/tests/TestingDataStores.test.js.map +1 -1
  13. package/build/__tests__/behavioral/views/KeepingViewsInSync.test.d.ts +5 -0
  14. package/build/__tests__/behavioral/views/KeepingViewsInSync.test.js +60 -7
  15. package/build/__tests__/behavioral/views/KeepingViewsInSync.test.js.map +1 -1
  16. package/build/__tests__/support/EventFaker.d.ts +2 -0
  17. package/build/__tests__/support/EventFaker.js +7 -0
  18. package/build/__tests__/support/EventFaker.js.map +1 -1
  19. package/build/features/permission/writers/PermissionWriter.js +10 -1
  20. package/build/features/permission/writers/PermissionWriter.js.map +1 -1
  21. package/build/features/view/actions/CreateAction.d.ts +1 -0
  22. package/build/features/view/writers/ViewWriter.d.ts +1 -1
  23. package/build/features/view/writers/ViewWriter.js +4 -0
  24. package/build/features/view/writers/ViewWriter.js.map +1 -1
  25. package/package.json +3 -3
  26. package/src/__tests__/behavioral/events/KeepingEventsInSync2.test.ts +23 -10
  27. package/src/__tests__/behavioral/permissions/SyncingPermissions.test.ts +185 -52
  28. package/src/__tests__/behavioral/tests/CreatingATest.test.ts +1 -1
  29. package/src/__tests__/behavioral/tests/SelectingAnAbstractTestClass.test.ts +1 -1
  30. package/src/__tests__/behavioral/tests/TestingDataStores.test.ts +11 -3
  31. package/src/__tests__/behavioral/views/KeepingViewsInSync.test.ts +89 -7
  32. package/src/__tests__/support/EventFaker.ts +10 -0
  33. package/src/features/permission/writers/PermissionWriter.ts +11 -1
  34. package/src/features/view/actions/CreateAction.ts +2 -0
  35. package/src/features/view/writers/ViewWriter.ts +15 -1
@@ -8,7 +8,16 @@ const AbstractWriter_1 = __importDefault(require("../../../writers/AbstractWrite
8
8
  class PermissionWriter extends AbstractWriter_1.default {
9
9
  async writeTypesFile(cwd, map) {
10
10
  const destination = spruce_skill_utils_1.diskUtil.resolveHashSprucePath(cwd, 'permissions', 'permissions.types.ts');
11
- const contents = this.templates.permissionTypes({ contracts: map });
11
+ const keys = Object.keys(map);
12
+ keys.sort();
13
+ const sorted = {};
14
+ for (const key of keys) {
15
+ map[key].sort((a, b) => a.localeCompare(b));
16
+ sorted[key] = map[key];
17
+ }
18
+ const contents = this.templates.permissionTypes({
19
+ contracts: sorted,
20
+ });
12
21
  const files = await this.writeFileIfChangedMixinResults(destination, contents, 'Types file for any permission contracts you created or depend on.');
13
22
  return files;
14
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionWriter.js","sourceRoot":"","sources":["../../../../src/features/permission/writers/PermissionWriter.ts"],"names":[],"mappings":";;;;;AACA,uEAAoE;AACpE,qFAA4D;AAG5D,MAAqB,gBAAiB,SAAQ,wBAAc;IACjD,KAAK,CAAC,cAAc,CAAC,GAAW,EAAE,GAA0B;QAC/D,MAAM,WAAW,GAAG,6BAAQ,CAAC,qBAAqB,CAC9C,GAAG,EACH,aAAa,EACb,sBAAsB,CACzB,CAAA;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QAEnE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,8BAA8B,CACnD,WAAW,EACX,QAAQ,EACR,mEAAmE,CACtE,CAAA;QAED,OAAO,KAAK,CAAA;IAChB,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAC1B,cAAsB,EACtB,OAEC;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;QAE7B,MAAM,eAAe,GAAG,6BAAQ,CAAC,qBAAqB,CAClD,cAAc,EACd,aAAa,CAChB,CAAA;QACD,MAAM,eAAe,GAAG,6BAAQ,CAAC,WAAW,CACxC,eAAe,EACf,gBAAgB,CACnB,CAAA;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,SAAS,EAAE,8BAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,IAAI,EAAE,6BAAQ,CAAC,mBAAmB,CAC9B,eAAe,EACf,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAC5B;SACJ,CAAC,CAAC,CAAA;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;QAEhE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,8BAA8B,CACnD,eAAe,EACf,OAAO,EACP,yDAAyD,CAC5D,CAAA;QAED,OAAO,KAAK,CAAA;IAChB,CAAC;IAEM,KAAK,CAAC,aAAa,CACtB,cAAsB,EACtB,OAKC;QAED,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;QAEnE,MAAM,WAAW,GAAG,6BAAQ,CAAC,WAAW,CACpC,cAAc,EACd,GAAG,SAAS,iBAAiB,CAChC,CAAA;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC;YACrD,SAAS;YACT,SAAS;YACT,WAAW;YACX,YAAY;SACf,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,8BAA8B,CACnD,WAAW,EACX,OAAO,EACP,sCAAsC,CACzC,CAAA;QAED,OAAO,KAAK,CAAA;IAChB,CAAC;IAEM,WAAW,CAAC,GAAW;QAC1B,MAAM,WAAW,GAAG,6BAAQ,CAAC,qBAAqB,CAC9C,GAAG,EACH,UAAU,EACV,sBAAsB,CACzB,CAAA;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,CAAA;QAExD,MAAM,OAAO,GAAG,IAAI,CAAC,8BAA8B,CAC/C,WAAW,EACX,cAAc,EACd,0CAA0C,CAC7C,CAAA;QAED,OAAO,OAAO,CAAA;IAClB,CAAC;CACJ;AAxGD,mCAwGC"}
1
+ {"version":3,"file":"PermissionWriter.js","sourceRoot":"","sources":["../../../../src/features/permission/writers/PermissionWriter.ts"],"names":[],"mappings":"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"}
@@ -52,4 +52,5 @@ declare const optionsSchema: {
52
52
  };
53
53
  };
54
54
  type OptionsSchema = typeof optionsSchema;
55
+ export type CreateViewOptions = SchemaValues<OptionsSchema>;
55
56
  export {};
@@ -5,7 +5,7 @@ export default class ViewWriter extends AbstractWriter {
5
5
  namePascal: string;
6
6
  nameKebab: string;
7
7
  }): Promise<import("../../../writers/AbstractWriter").WriteResults>;
8
- writeCombinedViewsFile(cwd: string, options: ViewsOptions): Promise<import("../../../writers/AbstractWriter").WriteResults>;
8
+ writeCombinedViewsFile(cwd: string, options: Omit<ViewsOptions, 'allTemplateItems'>): Promise<import("../../../writers/AbstractWriter").WriteResults>;
9
9
  private removeFileExtensionsFromTemplateItems;
10
10
  private makePathRelative;
11
11
  writeViewController(cwd: string, options: {
@@ -22,11 +22,15 @@ class ViewWriter extends AbstractWriter_1.default {
22
22
  if (appTemplateItem) {
23
23
  appTemplateItem = this.makePathRelative(appTemplateItem, destinationDir);
24
24
  }
25
+ svcTemplateItems.sort((a, b) => a.namePascal.localeCompare(b.namePascal));
26
+ vcTemplateItems.sort((a, b) => a.namePascal.localeCompare(b.namePascal));
27
+ const allTemplateItems = [...vcTemplateItems, ...svcTemplateItems].sort((a, b) => a.namePascal.localeCompare(b.namePascal));
25
28
  const contents = this.templates.views({
26
29
  vcTemplateItems,
27
30
  svcTemplateItems,
28
31
  viewPluginItems,
29
32
  appTemplateItem,
33
+ allTemplateItems,
30
34
  ...rest,
31
35
  });
32
36
  const results = await this.writeFileIfChangedMixinResults(destination, contents, 'Used to export your controllers to Heartwood.');
@@ -1 +1 @@
1
- {"version":3,"file":"ViewWriter.js","sourceRoot":"","sources":["../../../../src/features/view/writers/ViewWriter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ViewWriter.js","sourceRoot":"","sources":["../../../../src/features/view/writers/ViewWriter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "28.2.0",
7
+ "version": "28.2.2",
8
8
  "skill": {
9
9
  "namespace": "spruce-cli",
10
10
  "upgradeIgnoreList": [
@@ -85,7 +85,7 @@
85
85
  "@sprucelabs/spruce-core-schemas": "^41.3.7",
86
86
  "@sprucelabs/spruce-event-utils": "^41.0.126",
87
87
  "@sprucelabs/spruce-skill-utils": "^32.0.116",
88
- "@sprucelabs/spruce-templates": "^28.2.0",
88
+ "@sprucelabs/spruce-templates": "^28.2.2",
89
89
  "@typescript-eslint/eslint-plugin": "^8.45.0",
90
90
  "@typescript-eslint/parser": "^8.45.0",
91
91
  "cfonts": "^3.3.1",
@@ -570,5 +570,5 @@
570
570
  "conventional-changelog-sprucelabs"
571
571
  ]
572
572
  },
573
- "gitHead": "50e9bcb98e32a47b60cb73b7abe7fd373b6ce084"
573
+ "gitHead": "ba4318682bd68509a074a3a9c5361a1688aec22c"
574
574
  }
@@ -172,31 +172,44 @@ export default class KeepingEventsInSyncTest extends AbstractEventTest {
172
172
  )) as any
173
173
  const sig = eventContractUtil.getSignatureByName(contract, fqen)
174
174
 
175
- assert.isTruthy(sig.emitPayloadSchema)
176
- assert.isTruthy(
175
+ assert.isTruthy(sig.emitPayloadSchema, 'Did not save emitPayloadSchema')
176
+ assert.isEqual(
177
177
  //@ts-ignore
178
178
  sig.emitPayloadSchema.fields?.payload?.options?.schema?.id,
179
- 'myNewEventEmitPayloadId'
179
+ 'myNewEventEmitPayloadId',
180
+ 'emitPayloadSchema id is wrong'
180
181
  )
181
- assert.isTruthy(
182
+ assert.isEqual(
182
183
  sig.responsePayloadSchema?.id,
183
- 'myNewEventResponsePayloadId'
184
+ 'myNewEventResponsePayloadId',
185
+ 'responsePayloadSchema id is wrong'
186
+ )
187
+
188
+ assert.isTruthy(
189
+ sig.emitPermissionContract,
190
+ 'emitPermissionContract missing'
184
191
  )
185
192
 
186
- assert.isTruthy(sig.emitPermissionContract)
187
193
  assert.isEqual(
188
194
  sig.emitPermissionContract.id,
189
- `${skill2.slug}.myNewEventEmitPermissionContract`
195
+ `${skill2.slug}.myNewEventEmitPermissionContract`,
196
+ 'emitPermissionContract id is wrong'
197
+ )
198
+ assert.isEqual(
199
+ sig.emitPermissionContract.permissions[0].id,
200
+ 'can-emit',
201
+ 'emitPermissionContract permission id is wrong'
190
202
  )
191
- assert.isEqual(sig.emitPermissionContract.permissions[0].id, 'can-emit')
192
203
  assert.isTruthy(sig.listenPermissionContract)
193
204
  assert.isEqual(
194
205
  sig.listenPermissionContract.id,
195
- `${skill2.slug}.myNewEventListenPermissionContract`
206
+ `${skill2.slug}.myNewEventListenPermissionContract`,
207
+ 'listenPermissionContract id is wrong'
196
208
  )
197
209
  assert.isEqual(
198
210
  sig.listenPermissionContract.permissions[0].id,
199
- 'can-listen'
211
+ 'can-listen',
212
+ 'listenPermissionContract permission id is wrong'
200
213
  )
201
214
 
202
215
  assert.isEqual(sig.description, description, 'description missing')
@@ -1,43 +1,51 @@
1
1
  import { MercuryClientFactory } from '@sprucelabs/mercury-client'
2
2
  import { diskUtil } from '@sprucelabs/spruce-skill-utils'
3
- import { assert, test } from '@sprucelabs/test-utils'
3
+ import { assert, generateId, test } from '@sprucelabs/test-utils'
4
4
  import ActionFactory from '../../../features/ActionFactory'
5
5
  import SyncAction, {
6
6
  SyncPermissionsOptions,
7
7
  } from '../../../features/permission/actions/SyncAction'
8
8
  import { ListPermContractsTargetAndPayload } from '../../../features/permission/stores/PermissionStore'
9
9
  import testUtil from '../../../tests/utilities/test.utility'
10
+ import { ListSkill } from '../../support/EventFaker'
10
11
  import AbstractPermissionsTest from './support/AbstractPermissionsTest'
11
12
  import generateShortAlphaId from './support/generateShortAlphaId'
12
- import { sortPermissionContracts } from './support/sortPermissionContracts'
13
13
 
14
14
  export default class SyncingPermissionsTest extends AbstractPermissionsTest {
15
15
  private static syncAction: SyncAction
16
16
  private static contractId1: string
17
17
  private static contractId2: string
18
+ private static heartwoodSkill: ListSkill = {
19
+ id: generateId(),
20
+ slug: 'heartwood',
21
+ dateCreated: 0,
22
+ name: 'Heartwood',
23
+ }
18
24
 
19
25
  protected static async beforeAll() {
20
26
  await super.beforeAll()
21
- this.contractId1 = generateShortAlphaId()
22
- this.contractId2 = generateShortAlphaId()
27
+ this.contractId1 = 'b-should-be-second' + generateShortAlphaId()
28
+ this.contractId2 = 'a-should-be-first' + generateShortAlphaId()
23
29
  }
24
30
 
25
31
  protected static async beforeEach() {
26
32
  await super.beforeEach()
33
+
27
34
  this.syncAction = this.Action('permission', 'sync')
35
+
28
36
  MercuryClientFactory.setIsTestMode(true)
29
37
  ExecuteTrackingAction.wasExecuteInvoked = false
30
38
  await this.eventFaker.fakeListPermissionContracts()
39
+
40
+ await this.eventFaker.fakeListSkills(() => {
41
+ return [this.heartwoodSkill]
42
+ })
31
43
  }
32
44
 
33
45
  @test()
34
46
  protected static async generatesExpectedTypesFile() {
35
47
  const results = await this.sync()
36
-
37
- const expected = this.resolveHashSprucePath(
38
- `permissions/permissions.types.ts`
39
- )
40
-
48
+ const expected = this.getTypesPath()
41
49
  testUtil.assertFileByPathInGeneratedFiles(expected, results.files)
42
50
  }
43
51
 
@@ -74,47 +82,42 @@ export default class SyncingPermissionsTest extends AbstractPermissionsTest {
74
82
  protected static async combinedFileImportsAllPermissions() {
75
83
  await this.createPermissionContract(this.contractId2)
76
84
 
77
- const imported = await this.Service('import').importDefault(
78
- this.getCombinedPath()
79
- )
85
+ const imported = await this.import()
80
86
 
81
- assert.isEqualDeep(
82
- imported.sort(sortPermissionContracts),
83
- [
84
- {
85
- id: this.contractId1,
86
- name: this.contractId1,
87
- description: '',
88
- requireAllPermissions: false,
89
- permissions: [
90
- {
91
- id: 'can-high-five',
92
- name: 'Can give high five',
93
- description:
94
- 'Will this person be allowed to high five?',
95
- defaults: { skill: false },
96
- requireAllStatuses: false,
97
- },
98
- ],
99
- },
100
- {
101
- id: this.contractId2,
102
- name: this.contractId2,
103
- description: '',
104
- requireAllPermissions: false,
105
- permissions: [
106
- {
107
- id: 'can-high-five',
108
- name: 'Can give high five',
109
- description:
110
- 'Will this person be allowed to high five?',
111
- defaults: { skill: false },
112
- requireAllStatuses: false,
113
- },
114
- ],
115
- },
116
- ].sort(sortPermissionContracts)
117
- )
87
+ assert.isEqualDeep(imported, [
88
+ {
89
+ id: this.contractId2,
90
+ name: this.contractId2,
91
+ description: '',
92
+ requireAllPermissions: false,
93
+ permissions: [
94
+ {
95
+ id: 'can-high-five',
96
+ name: 'Can give high five',
97
+ description:
98
+ 'Will this person be allowed to high five?',
99
+ defaults: { skill: false },
100
+ requireAllStatuses: false,
101
+ },
102
+ ],
103
+ },
104
+ {
105
+ id: this.contractId1,
106
+ name: this.contractId1,
107
+ description: '',
108
+ requireAllPermissions: false,
109
+ permissions: [
110
+ {
111
+ id: 'can-high-five',
112
+ name: 'Can give high five',
113
+ description:
114
+ 'Will this person be allowed to high five?',
115
+ defaults: { skill: false },
116
+ requireAllStatuses: false,
117
+ },
118
+ ],
119
+ },
120
+ ])
118
121
  }
119
122
 
120
123
  @test()
@@ -130,8 +133,11 @@ export default class SyncingPermissionsTest extends AbstractPermissionsTest {
130
133
  )
131
134
 
132
135
  await this.sync({ shouldSyncCorePermissions: true })
133
- assert.isTrue(wasHit)
134
- assert.isUndefined(passedTarget)
136
+ assert.isTrue(wasHit, 'Did not emit list-permission-contracts event')
137
+ assert.isUndefined(
138
+ passedTarget,
139
+ 'Should not have passed a target to list-permission-contracts'
140
+ )
135
141
  }
136
142
 
137
143
  @test()
@@ -145,6 +151,127 @@ export default class SyncingPermissionsTest extends AbstractPermissionsTest {
145
151
  assert.isTrue(ExecuteTrackingAction.wasExecuteInvoked)
146
152
  }
147
153
 
154
+ @test()
155
+ protected static async permsSentInAlphabeticalOrder() {
156
+ await this.addHeartwoodAsDependency()
157
+ await this.fakeHeartwoodPermContracts()
158
+
159
+ await this.sync()
160
+ const contents = this.readTypesFile()
161
+
162
+ const firstId = contents.indexOf('perk-a-should-be-first')
163
+ const secondId = contents.indexOf('perk-should-be-second')
164
+ const thirdId = contents.indexOf('perl-a-should-be-first')
165
+ const fourthId = contents.indexOf('perl-should-be-second')
166
+ const fifthId = contents.indexOf('perm-a-should-be-first')
167
+ const sixthId = contents.indexOf('perm-should-be-second')
168
+
169
+ assert.isTrue(
170
+ firstId < secondId,
171
+ 'Permissions are not in alphabetical order'
172
+ )
173
+
174
+ assert.isTrue(
175
+ secondId < thirdId,
176
+ 'Permissions are not in alphabetical order'
177
+ )
178
+
179
+ assert.isTrue(
180
+ thirdId < fourthId,
181
+ 'Permissions are not in alphabetical order'
182
+ )
183
+
184
+ assert.isTrue(
185
+ fourthId < fifthId,
186
+ 'Permissions are not in alphabetical order'
187
+ )
188
+
189
+ assert.isTrue(
190
+ fifthId < sixthId,
191
+ 'Permissions are not in alphabetical order'
192
+ )
193
+ }
194
+
195
+ private static async fakeHeartwoodPermContracts() {
196
+ await this.eventFaker.fakeListPermissionContracts(() => {
197
+ return [
198
+ {
199
+ id: 'ab-' + generateShortAlphaId(),
200
+ contract: {
201
+ id: 'ab-' + generateShortAlphaId(),
202
+ name: generateId(),
203
+ permissions: [
204
+ {
205
+ id: 'perl-should-be-second',
206
+ name: 'Should be second',
207
+ },
208
+ {
209
+ id: 'perl-a-should-be-first',
210
+ name: 'Should be first',
211
+ },
212
+ ],
213
+ },
214
+ },
215
+ {
216
+ id: 'ba-' + generateShortAlphaId(),
217
+ contract: {
218
+ id: 'ba-' + generateShortAlphaId(),
219
+ name: generateId(),
220
+ permissions: [
221
+ {
222
+ id: 'perm-should-be-second',
223
+ name: 'Should be second',
224
+ },
225
+ {
226
+ id: 'perm-a-should-be-first',
227
+ name: 'Should be first',
228
+ },
229
+ ],
230
+ },
231
+ },
232
+ {
233
+ id: 'aa-' + generateShortAlphaId(),
234
+ contract: {
235
+ id: 'aa-' + generateShortAlphaId(),
236
+ name: generateId(),
237
+ permissions: [
238
+ {
239
+ id: 'perk-should-be-second',
240
+ name: 'Should be second',
241
+ },
242
+ {
243
+ id: 'perk-a-should-be-first',
244
+ name: 'Should be first',
245
+ },
246
+ ],
247
+ },
248
+ },
249
+ ]
250
+ })
251
+ }
252
+
253
+ private static async import() {
254
+ return await this.Service('import').importDefault(
255
+ this.getCombinedPath()
256
+ )
257
+ }
258
+
259
+ private static async addHeartwoodAsDependency() {
260
+ const results = await this.Action('dependency', 'add').execute({
261
+ namespace: 'heartwood',
262
+ })
263
+
264
+ assert.isFalsy(results.errors, 'Should not have errored')
265
+ }
266
+
267
+ private static readTypesFile() {
268
+ return diskUtil.readFile(this.getTypesPath())
269
+ }
270
+
271
+ private static getTypesPath() {
272
+ return this.resolveHashSprucePath(`permissions/permissions.types.ts`)
273
+ }
274
+
148
275
  private static getCombinedPath() {
149
276
  return this.resolveHashSprucePath('permissions', 'permissions.ts')
150
277
  }
@@ -158,7 +285,13 @@ export default class SyncingPermissionsTest extends AbstractPermissionsTest {
158
285
  }
159
286
 
160
287
  private static async sync(options?: SyncPermissionsOptions) {
161
- return await this.syncAction.execute(options)
288
+ const results = await this.syncAction.execute(options)
289
+ assert.isFalsy(
290
+ results.errors,
291
+ 'Should not have errored when syncing permissions'
292
+ )
293
+
294
+ return results
162
295
  }
163
296
 
164
297
  private static async emitDidExecuteUpgrade() {
@@ -43,7 +43,7 @@ export default class CreatingBehavioralTestsTest extends AbstractTestTest {
43
43
 
44
44
  await assert.doesThrowAsync(
45
45
  () => this.Service('command').execute('yarn test'),
46
- /false.*?does not equal.*?true/gis
46
+ /Expected:.*?false/gis
47
47
  )
48
48
  }
49
49
 
@@ -204,7 +204,7 @@ export default class SelectingAnAbstractTestClassTest extends AbstractTestTest {
204
204
 
205
205
  await assert.doesThrowAsync(
206
206
  () => this.Service('command').execute('yarn test'),
207
- /false.*?does not equal.*?true/gis
207
+ /Expected: false/gis
208
208
  )
209
209
  }
210
210
 
@@ -75,11 +75,19 @@ export default class TestingDataStoresTest extends AbstractSkillTest {
75
75
  shouldReportWhileRunning: false,
76
76
  })
77
77
 
78
- assert.isArray(testResults.errors)
79
- assert.isLength(testResults.errors, 1)
78
+ assert.isArray(testResults.errors, 'should have returned errors')
79
+ assert.isLength(
80
+ testResults.errors,
81
+ 1,
82
+ 'should have only returned 1 error'
83
+ )
80
84
 
81
85
  const first = testResults.errors[0]
82
86
 
83
- assert.doesInclude(first.message, 'does not equal')
87
+ assert.doesInclude(
88
+ first.message,
89
+ 'Expected:',
90
+ 'should have failed the test'
91
+ )
84
92
  }
85
93
  }
@@ -1,6 +1,7 @@
1
1
  import { diskUtil } from '@sprucelabs/spruce-skill-utils'
2
2
  import { test, assert } from '@sprucelabs/test-utils'
3
3
  import { FeatureActionResponse } from '../../../features/features.types'
4
+ import { CreateViewOptions } from '../../../features/view/actions/CreateAction'
4
5
  import SyncAction from '../../../features/view/actions/SyncAction'
5
6
  import AbstractSkillTest from '../../../tests/AbstractSkillTest'
6
7
  import testUtil from '../../../tests/utilities/test.utility'
@@ -38,13 +39,7 @@ export default class KeepingViewsInSyncTest extends AbstractSkillTest {
38
39
 
39
40
  @test()
40
41
  protected static async generatesValidTypesFileWithNoSkillViews() {
41
- const results = await this.Action('view', 'create').execute({
42
- viewType: 'view',
43
- nameReadable: 'test',
44
- viewModel: 'Card',
45
- })
46
- assert.isFalsy(results.errors)
47
- await this.assertValuedViewsFile(results)
42
+ await this.createCardViewController('test')
48
43
  }
49
44
 
50
45
  @test()
@@ -62,6 +57,93 @@ export default class KeepingViewsInSyncTest extends AbstractSkillTest {
62
57
  await this.Service('typeChecker').check(testScriptPath)
63
58
  }
64
59
 
60
+ @test()
61
+ protected static async alwaysRendersCombinedViewsFileAlphabetically() {
62
+ await this.createCardViewController('apple bottom')
63
+ await this.createCardViewController('banana bottom')
64
+ await this.createCardViewController('zebra tooshie')
65
+
66
+ const contents = this.readCombinedViewsFile()
67
+
68
+ const vcsExpeced = `{
69
+ AppleBottomViewController,
70
+ BananaBottomViewController,
71
+ RootSkillViewController,
72
+ TestViewController,
73
+ ZebraTooshieViewController,
74
+ }`
75
+
76
+ assert.doesInclude(
77
+ contents,
78
+ vcsExpeced,
79
+ 'views.ts vcs = {} out of order'
80
+ )
81
+
82
+ const viewControllerMapExpected = `'testing-views.apple-bottom': AppleBottomViewController
83
+ 'testing-views.banana-bottom': BananaBottomViewController
84
+ 'testing-views.root': RootSkillViewController
85
+ 'testing-views.test': TestViewController
86
+ 'testing-views.zebra-tooshie': ZebraTooshieViewController`
87
+
88
+ assert.doesInclude(
89
+ contents,
90
+ viewControllerMapExpected,
91
+ 'views.ts viewControllerMap out of order'
92
+ )
93
+
94
+ const viewControllerOptionsMapExpected = `'testing-views.apple-bottom': ConstructorParameters<typeof AppleBottomViewController>[0]
95
+ 'testing-views.banana-bottom': ConstructorParameters<typeof BananaBottomViewController>[0]
96
+ 'testing-views.test': ConstructorParameters<typeof TestViewController>[0]
97
+ 'testing-views.zebra-tooshie': ConstructorParameters<typeof ZebraTooshieViewController>[0]`
98
+
99
+ assert.doesInclude(
100
+ contents,
101
+ viewControllerOptionsMapExpected,
102
+ 'views.ts viewControllerOptionsMap out of order'
103
+ )
104
+ }
105
+
106
+ @test()
107
+ protected static async sortsSkillViewsAlphabetically() {
108
+ await this.create({
109
+ viewType: 'skillView',
110
+ nameReadable: 'Cheesey',
111
+ isRoot: false,
112
+ })
113
+
114
+ const skillViewControllerMapExpected = `'testing-views.cheesey': CheeseySkillViewController
115
+ 'testing-views.root': RootSkillViewController`
116
+
117
+ const contents = this.readCombinedViewsFile()
118
+
119
+ assert.doesInclude(
120
+ contents,
121
+ skillViewControllerMapExpected,
122
+ 'views.ts skillViewControllerMap out of order'
123
+ )
124
+ }
125
+
126
+ private static readCombinedViewsFile() {
127
+ return diskUtil.readFile(this.resolvePath('src/.spruce/views/views.ts'))
128
+ }
129
+
130
+ private static async createCardViewController(name: string) {
131
+ const options = {
132
+ viewType: 'view',
133
+ nameReadable: name,
134
+ viewModel: 'Card',
135
+ }
136
+ const results = await this.create(options)
137
+
138
+ await this.assertValuedViewsFile(results)
139
+ }
140
+
141
+ private static async create(options: CreateViewOptions) {
142
+ const results = await this.Action('view', 'create').execute(options)
143
+ assert.isFalsy(results.errors)
144
+ return results
145
+ }
146
+
65
147
  private static async assertValuedViewsFile(results: FeatureActionResponse) {
66
148
  const match = testUtil.assertFileByPathInGeneratedFiles(
67
149
  `views/views.ts`,
@@ -4,6 +4,14 @@ import { generateId } from '@sprucelabs/test-utils'
4
4
  import { ListPermContractsTargetAndPayload } from '../../features/permission/stores/PermissionStore'
5
5
 
6
6
  export default class EventFaker {
7
+ public async fakeListSkills(cb?: () => void | ListSkill[]) {
8
+ await eventFaker.on('list-skills::v2020_12_25', () => {
9
+ return {
10
+ skills: cb?.() ?? [],
11
+ }
12
+ })
13
+ }
14
+
7
15
  public async fakeListPermissionContracts(
8
16
  cb?: (
9
17
  targetAndPayload: ListPermContractsTargetAndPayload
@@ -42,3 +50,5 @@ export default class EventFaker {
42
50
  })
43
51
  }
44
52
  }
53
+
54
+ export type ListSkill = SpruceSchemas.Mercury.v2020_12_25.ListSkillsSkill