@alwaysai/device-agent 0.1.0 → 0.1.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 (100) hide show
  1. package/lib/application-control/config.d.ts +0 -1
  2. package/lib/application-control/config.d.ts.map +1 -1
  3. package/lib/application-control/config.js +15 -29
  4. package/lib/application-control/config.js.map +1 -1
  5. package/lib/application-control/environment-variables.d.ts +7 -3
  6. package/lib/application-control/environment-variables.d.ts.map +1 -1
  7. package/lib/application-control/environment-variables.js +71 -35
  8. package/lib/application-control/environment-variables.js.map +1 -1
  9. package/lib/application-control/environment-variables.test.d.ts +2 -0
  10. package/lib/application-control/environment-variables.test.d.ts.map +1 -0
  11. package/lib/application-control/environment-variables.test.js +163 -0
  12. package/lib/application-control/environment-variables.test.js.map +1 -0
  13. package/lib/application-control/index.d.ts +3 -3
  14. package/lib/application-control/index.d.ts.map +1 -1
  15. package/lib/application-control/index.js +1 -3
  16. package/lib/application-control/index.js.map +1 -1
  17. package/lib/application-control/models.d.ts +0 -1
  18. package/lib/application-control/models.d.ts.map +1 -1
  19. package/lib/application-control/models.js +12 -26
  20. package/lib/application-control/models.js.map +1 -1
  21. package/lib/application-control/status.d.ts +3 -0
  22. package/lib/application-control/status.d.ts.map +1 -1
  23. package/lib/application-control/status.js +19 -1
  24. package/lib/application-control/status.js.map +1 -1
  25. package/lib/application-control/utils.d.ts.map +1 -1
  26. package/lib/application-control/utils.js +2 -2
  27. package/lib/application-control/utils.js.map +1 -1
  28. package/lib/cloud-connection/device-agent-cloud-connection.d.ts +6 -3
  29. package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
  30. package/lib/cloud-connection/device-agent-cloud-connection.js +205 -151
  31. package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
  32. package/lib/cloud-connection/live-updates-handler.d.ts +3 -0
  33. package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -1
  34. package/lib/cloud-connection/live-updates-handler.js +23 -7
  35. package/lib/cloud-connection/live-updates-handler.js.map +1 -1
  36. package/lib/cloud-connection/live-updates-handler.test.d.ts +2 -0
  37. package/lib/cloud-connection/live-updates-handler.test.d.ts.map +1 -0
  38. package/lib/cloud-connection/live-updates-handler.test.js +57 -0
  39. package/lib/cloud-connection/live-updates-handler.test.js.map +1 -0
  40. package/lib/cloud-connection/passthrough-handler.d.ts.map +1 -1
  41. package/lib/cloud-connection/passthrough-handler.js +6 -3
  42. package/lib/cloud-connection/passthrough-handler.js.map +1 -1
  43. package/lib/cloud-connection/shadow-handler.d.ts +11 -3
  44. package/lib/cloud-connection/shadow-handler.d.ts.map +1 -1
  45. package/lib/cloud-connection/shadow-handler.js +22 -7
  46. package/lib/cloud-connection/shadow-handler.js.map +1 -1
  47. package/lib/cloud-connection/shadow-handler.test.js +313 -228
  48. package/lib/cloud-connection/shadow-handler.test.js.map +1 -1
  49. package/lib/cloud-connection/shadow.js +1 -1
  50. package/lib/cloud-connection/shadow.js.map +1 -1
  51. package/lib/environment.d.ts +1 -0
  52. package/lib/environment.d.ts.map +1 -1
  53. package/lib/environment.js +2 -1
  54. package/lib/environment.js.map +1 -1
  55. package/lib/infrastructure/agent-config.d.ts +3 -1
  56. package/lib/infrastructure/agent-config.d.ts.map +1 -1
  57. package/lib/subcommands/app/env-vars.d.ts +1 -1
  58. package/lib/subcommands/app/env-vars.d.ts.map +1 -1
  59. package/lib/subcommands/app/env-vars.js +32 -5
  60. package/lib/subcommands/app/env-vars.js.map +1 -1
  61. package/lib/subcommands/app/index.d.ts.map +1 -1
  62. package/lib/subcommands/app/index.js +4 -1
  63. package/lib/subcommands/app/index.js.map +1 -1
  64. package/lib/subcommands/app/models.d.ts.map +1 -1
  65. package/lib/subcommands/app/models.js +6 -1
  66. package/lib/subcommands/app/models.js.map +1 -1
  67. package/lib/subcommands/app/shadow.d.ts +7 -0
  68. package/lib/subcommands/app/shadow.d.ts.map +1 -0
  69. package/lib/subcommands/app/shadow.js +48 -0
  70. package/lib/subcommands/app/shadow.js.map +1 -0
  71. package/lib/subcommands/app/version.js +2 -2
  72. package/lib/subcommands/app/version.js.map +1 -1
  73. package/lib/util/cloud-mode-ready.d.ts +2 -0
  74. package/lib/util/cloud-mode-ready.d.ts.map +1 -0
  75. package/lib/util/cloud-mode-ready.js +22 -0
  76. package/lib/util/cloud-mode-ready.js.map +1 -0
  77. package/package.json +1 -1
  78. package/readme.md +2 -2
  79. package/src/application-control/config.ts +30 -31
  80. package/src/application-control/environment-variables.test.ts +171 -0
  81. package/src/application-control/environment-variables.ts +102 -43
  82. package/src/application-control/index.ts +3 -9
  83. package/src/application-control/models.ts +14 -29
  84. package/src/application-control/status.ts +20 -0
  85. package/src/application-control/utils.ts +4 -2
  86. package/src/cloud-connection/device-agent-cloud-connection.ts +222 -153
  87. package/src/cloud-connection/live-updates-handler.test.ts +68 -0
  88. package/src/cloud-connection/live-updates-handler.ts +30 -7
  89. package/src/cloud-connection/passthrough-handler.ts +10 -3
  90. package/src/cloud-connection/shadow-handler.test.ts +329 -239
  91. package/src/cloud-connection/shadow-handler.ts +38 -12
  92. package/src/cloud-connection/shadow.ts +1 -1
  93. package/src/environment.ts +2 -0
  94. package/src/infrastructure/agent-config.ts +1 -1
  95. package/src/subcommands/app/env-vars.ts +38 -8
  96. package/src/subcommands/app/index.ts +4 -1
  97. package/src/subcommands/app/models.ts +10 -1
  98. package/src/subcommands/app/shadow.ts +48 -0
  99. package/src/subcommands/app/version.ts +2 -2
  100. package/src/util/cloud-mode-ready.ts +23 -0
@@ -30,7 +30,7 @@ describe('Test Shadow Handler', () => {
30
30
  }).toThrow(Error);
31
31
  });
32
32
 
33
- test('ignore message from self', async () => {
33
+ test('ignore update delta message from self', async () => {
34
34
  const ogAppCfg1: AppConfig = {
35
35
  scripts: {
36
36
  start: 'python app.py'
@@ -55,263 +55,372 @@ describe('Test Shadow Handler', () => {
55
55
  }
56
56
  };
57
57
 
58
- const appCfgUpdates = await shadowHandler.handleShadowTopic({
58
+ const updates = await shadowHandler.handleShadowTopic({
59
59
  topic: shadowHandler.shadowTopics.projects.updateDelta,
60
60
  payload,
61
61
  clientToken: clientId
62
62
  });
63
- expect(appCfgUpdates.length).toBe(0);
63
+ expect(updates.length).toBe(0);
64
64
  });
65
65
 
66
- test('handle shadow get response with updated models', async () => {
67
- const ogAppCfg1: AppConfig = {
68
- scripts: {
69
- start: 'python app.py'
70
- },
71
- models: {
72
- 'alwaysai/mobilenet_ssd': 3
73
- }
74
- };
75
-
76
- jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
77
- const appCfg1: AppConfig = {
78
- scripts: {
79
- start: 'python app.py'
80
- },
81
- models: {
82
- 'alwaysai/yolo_v3': 4
83
- }
84
- };
85
-
66
+ test('handle project shadow empty delta', async () => {
86
67
  const payload = {
87
- delta: {
88
- [projectId1]: {
89
- appConfig: JSON.stringify(appCfg1)
90
- }
91
- }
68
+ [projectId1]: {}
92
69
  };
93
70
 
94
- const appCfgUpdates = await shadowHandler.handleShadowTopic({
95
- topic: shadowHandler.shadowTopics.projects.getAccepted,
71
+ const updates = await shadowHandler.handleShadowTopic({
72
+ topic: shadowHandler.shadowTopics.projects.updateDelta,
96
73
  payload,
97
74
  clientToken: ''
98
75
  });
99
- expect(appCfgUpdates.length).toBe(1);
100
- expect(appCfgUpdates[0]).toEqual({
101
- projectId: projectId1,
102
- newAppCfg: appCfg1,
103
- updatedModels: {
104
- 'alwaysai/yolo_v3': 4
105
- }
106
- });
76
+ expect(updates.length).toBe(0);
107
77
  });
108
78
 
109
- test('handle shadow delta without app config', async () => {
110
- const ogAppCfg1: AppConfig = {
111
- scripts: {
112
- start: 'python app.py'
113
- },
114
- models: {
115
- 'alwaysai/mobilenet_ssd': 2
116
- }
117
- };
118
- jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
79
+ describe('handle project shadow app cfg', () => {
80
+ test('handle project shadow app cfg get response with updated models', async () => {
81
+ const ogAppCfg1: AppConfig = {
82
+ scripts: {
83
+ start: 'python app.py'
84
+ },
85
+ models: {
86
+ 'alwaysai/mobilenet_ssd': 3
87
+ }
88
+ };
119
89
 
120
- const payload = {
121
- [projectId1]: {}
122
- };
90
+ jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
91
+ const appCfg1: AppConfig = {
92
+ scripts: {
93
+ start: 'python app.py'
94
+ },
95
+ models: {
96
+ 'alwaysai/yolo_v3': 4
97
+ }
98
+ };
123
99
 
124
- const appCfgUpdates = await shadowHandler.handleShadowTopic({
125
- topic: shadowHandler.shadowTopics.projects.updateDelta,
126
- payload,
127
- clientToken: ''
100
+ const payload = {
101
+ delta: {
102
+ [projectId1]: {
103
+ appConfig: JSON.stringify(appCfg1)
104
+ }
105
+ }
106
+ };
107
+
108
+ const updates = await shadowHandler.handleShadowTopic({
109
+ topic: shadowHandler.shadowTopics.projects.getAccepted,
110
+ payload,
111
+ clientToken: ''
112
+ });
113
+ expect(updates.length).toBe(1);
114
+ expect(updates[0]).toEqual({
115
+ projectId: projectId1,
116
+ appCfgUpdate: {
117
+ newAppCfg: appCfg1,
118
+ updatedModels: {
119
+ 'alwaysai/yolo_v3': 4
120
+ }
121
+ }
122
+ });
128
123
  });
129
- expect(appCfgUpdates.length).toBe(0);
130
- });
131
124
 
132
- test('handle shadow delta with updated models', async () => {
133
- const ogAppCfg1: AppConfig = {
134
- scripts: {
135
- start: 'python app.py'
136
- },
137
- models: {
138
- 'alwaysai/mobilenet_ssd': 2
139
- }
140
- };
125
+ test('handle project shadow app cfg delta with updated models', async () => {
126
+ const ogAppCfg1: AppConfig = {
127
+ scripts: {
128
+ start: 'python app.py'
129
+ },
130
+ models: {
131
+ 'alwaysai/mobilenet_ssd': 2
132
+ }
133
+ };
141
134
 
142
- jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
143
- const appCfg1: AppConfig = {
144
- scripts: {
145
- start: 'python app.py'
146
- },
147
- models: {
148
- 'alwaysai/mobilenet_ssd': 3,
149
- 'alwaysai/yolo_v4': 5
150
- }
151
- };
135
+ jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
136
+ const appCfg1: AppConfig = {
137
+ scripts: {
138
+ start: 'python app.py'
139
+ },
140
+ models: {
141
+ 'alwaysai/mobilenet_ssd': 3,
142
+ 'alwaysai/yolo_v4': 5
143
+ }
144
+ };
152
145
 
153
- const payload = {
154
- [projectId1]: {
155
- appConfig: JSON.stringify(appCfg1)
156
- }
157
- };
146
+ const payload = {
147
+ [projectId1]: {
148
+ appConfig: JSON.stringify(appCfg1)
149
+ }
150
+ };
158
151
 
159
- const appCfgUpdates = await shadowHandler.handleShadowTopic({
160
- topic: shadowHandler.shadowTopics.projects.updateDelta,
161
- payload,
162
- clientToken: ''
163
- });
164
- expect(appCfgUpdates.length).toBe(1);
165
- expect(appCfgUpdates[0]).toEqual({
166
- projectId: projectId1,
167
- newAppCfg: appCfg1,
168
- updatedModels: {
169
- 'alwaysai/mobilenet_ssd': 3,
170
- 'alwaysai/yolo_v4': 5
171
- }
152
+ const updates = await shadowHandler.handleShadowTopic({
153
+ topic: shadowHandler.shadowTopics.projects.updateDelta,
154
+ payload,
155
+ clientToken: ''
156
+ });
157
+ expect(updates.length).toBe(1);
158
+ expect(updates[0]).toEqual({
159
+ projectId: projectId1,
160
+ appCfgUpdate: {
161
+ newAppCfg: appCfg1,
162
+ updatedModels: {
163
+ 'alwaysai/mobilenet_ssd': 3,
164
+ 'alwaysai/yolo_v4': 5
165
+ }
166
+ }
167
+ });
172
168
  });
173
- });
174
169
 
175
- test('handle shadow delta with updated models for two apps', async () => {
176
- const ogAppCfg1: AppConfig = {
177
- scripts: {
178
- start: 'python app.py'
179
- },
180
- models: {
181
- 'alwaysai/mobilenet_ssd': 2
182
- }
183
- };
184
- jest.mocked(readAppCfgFile).mockResolvedValueOnce(ogAppCfg1);
185
- const ogAppCfg2: AppConfig = {
186
- scripts: {
187
- start: 'python app.py'
188
- },
189
- models: {
190
- 'alwaysai/yolo_v4': 5
191
- }
192
- };
193
- jest.mocked(readAppCfgFile).mockResolvedValueOnce(ogAppCfg2);
170
+ test('handle project shadow app cfg delta with updated models for two apps', async () => {
171
+ const ogAppCfg1: AppConfig = {
172
+ scripts: {
173
+ start: 'python app.py'
174
+ },
175
+ models: {
176
+ 'alwaysai/mobilenet_ssd': 2
177
+ }
178
+ };
179
+ jest.mocked(readAppCfgFile).mockResolvedValueOnce(ogAppCfg1);
180
+ const ogAppCfg2: AppConfig = {
181
+ scripts: {
182
+ start: 'python app.py'
183
+ },
184
+ models: {
185
+ 'alwaysai/yolo_v4': 5
186
+ }
187
+ };
188
+ jest.mocked(readAppCfgFile).mockResolvedValueOnce(ogAppCfg2);
194
189
 
195
- const appCfg1: AppConfig = {
196
- scripts: {
197
- start: 'python app.py'
198
- },
199
- models: {
200
- 'alwaysai/mobilenet_ssd': 3,
201
- 'alwaysai/yolo_v4': 5
202
- }
203
- };
204
- const appCfg2: AppConfig = {
205
- scripts: {
206
- start: 'python app.py'
207
- },
208
- models: {
209
- 'alwaysai/yolo_v4': 5,
210
- 'alwaysai/human_pose': 7
211
- }
212
- };
213
- const payload = {
214
- [projectId1]: {
215
- appConfig: JSON.stringify(appCfg1)
216
- },
217
- [projectId2]: {
218
- appConfig: JSON.stringify(appCfg2)
219
- }
220
- };
190
+ const appCfg1: AppConfig = {
191
+ scripts: {
192
+ start: 'python app.py'
193
+ },
194
+ models: {
195
+ 'alwaysai/mobilenet_ssd': 3,
196
+ 'alwaysai/yolo_v4': 5
197
+ }
198
+ };
199
+ const appCfg2: AppConfig = {
200
+ scripts: {
201
+ start: 'python app.py'
202
+ },
203
+ models: {
204
+ 'alwaysai/yolo_v4': 5,
205
+ 'alwaysai/human_pose': 7
206
+ }
207
+ };
208
+ const payload = {
209
+ [projectId1]: {
210
+ appConfig: JSON.stringify(appCfg1)
211
+ },
212
+ [projectId2]: {
213
+ appConfig: JSON.stringify(appCfg2)
214
+ }
215
+ };
221
216
 
222
- const appCfgUpdates = await shadowHandler.handleShadowTopic({
223
- topic: shadowHandler.shadowTopics.projects.updateDelta,
224
- payload,
225
- clientToken: ''
217
+ const updates = await shadowHandler.handleShadowTopic({
218
+ topic: shadowHandler.shadowTopics.projects.updateDelta,
219
+ payload,
220
+ clientToken: ''
221
+ });
222
+ expect(updates.length).toBe(2);
223
+ expect(updates[0]).toEqual({
224
+ projectId: projectId1,
225
+ appCfgUpdate: {
226
+ newAppCfg: appCfg1,
227
+ updatedModels: {
228
+ 'alwaysai/mobilenet_ssd': 3,
229
+ 'alwaysai/yolo_v4': 5
230
+ }
231
+ }
232
+ });
233
+ expect(updates[1]).toEqual({
234
+ projectId: projectId2,
235
+ appCfgUpdate: {
236
+ newAppCfg: appCfg2,
237
+ updatedModels: {
238
+ 'alwaysai/human_pose': 7
239
+ }
240
+ }
241
+ });
226
242
  });
227
- expect(appCfgUpdates.length).toBe(2);
228
- expect(appCfgUpdates[0]).toEqual({
229
- projectId: projectId1,
230
- newAppCfg: appCfg1,
231
- updatedModels: {
232
- 'alwaysai/mobilenet_ssd': 3,
233
- 'alwaysai/yolo_v4': 5
234
- }
243
+
244
+ test('handle project shadow app cfg delta with updated analytics', async () => {
245
+ const ogAppCfg1: AppConfig = {
246
+ scripts: {
247
+ start: 'python app.py'
248
+ },
249
+ models: {}
250
+ };
251
+ jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
252
+
253
+ const appCfg1: AppConfig = {
254
+ scripts: {
255
+ start: 'python app.py'
256
+ },
257
+ models: {},
258
+ analytics: {
259
+ enable_cloud_publish: true
260
+ }
261
+ };
262
+
263
+ const payload = {
264
+ [projectId1]: {
265
+ appConfig: JSON.stringify(appCfg1)
266
+ }
267
+ };
268
+
269
+ const updates = await shadowHandler.handleShadowTopic({
270
+ topic: shadowHandler.shadowTopics.projects.updateDelta,
271
+ payload,
272
+ clientToken: ''
273
+ });
274
+ expect(updates.length).toBe(1);
275
+ expect(updates[0]).toEqual({
276
+ projectId: projectId1,
277
+ appCfgUpdate: {
278
+ newAppCfg: appCfg1
279
+ }
280
+ });
235
281
  });
236
- expect(appCfgUpdates[1]).toEqual({
237
- projectId: projectId2,
238
- newAppCfg: appCfg2,
239
- updatedModels: {
240
- 'alwaysai/human_pose': 7
241
- }
282
+
283
+ test('handle project shadow app cfg delta with invalid app config', async () => {
284
+ const ogAppCfg1: AppConfig = {
285
+ scripts: {
286
+ start: 'python app.py'
287
+ },
288
+ models: {
289
+ 'alwaysai/mobilenet_ssd': 2
290
+ }
291
+ };
292
+
293
+ jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
294
+ const appCfg1 = {
295
+ scripts: {
296
+ start: 'python app.py'
297
+ },
298
+ models: {
299
+ 'alwaysai/mobilenet_ssd': '3', // string instead of int
300
+ 'alwaysai/yolo_v4': '5' // string instead of int
301
+ }
302
+ };
303
+
304
+ const payload = {
305
+ [projectId1]: {
306
+ appConfig: JSON.stringify(appCfg1)
307
+ }
308
+ };
309
+
310
+ const updates = await shadowHandler.handleShadowTopic({
311
+ topic: shadowHandler.shadowTopics.projects.updateDelta,
312
+ payload,
313
+ clientToken: ''
314
+ });
315
+ expect(updates.length).toBe(0);
242
316
  });
243
317
  });
244
318
 
245
- test('handle shadow delta with updated analytics', async () => {
246
- const ogAppCfg1: AppConfig = {
247
- scripts: {
248
- start: 'python app.py'
249
- },
250
- models: {}
251
- };
252
- jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
319
+ describe('handle project shadow env vars', () => {
320
+ test('handle project shadow env vars get response with delta', async () => {
321
+ const envVars1 = {
322
+ VAR0: 'value0'
323
+ };
324
+ const payload = {
325
+ delta: {
326
+ [projectId1]: {
327
+ envVars: envVars1
328
+ }
329
+ }
330
+ };
253
331
 
254
- const appCfg1: AppConfig = {
255
- scripts: {
256
- start: 'python app.py'
257
- },
258
- models: {},
259
- analytics: {
260
- enable_cloud_publish: true
261
- }
262
- };
332
+ const updates = await shadowHandler.handleShadowTopic({
333
+ topic: shadowHandler.shadowTopics.projects.getAccepted,
334
+ payload,
335
+ clientToken: ''
336
+ });
337
+ expect(updates.length).toBe(1);
338
+ expect(updates[0]).toEqual({
339
+ projectId: projectId1,
340
+ envVarUpdate: {
341
+ envVars: envVars1
342
+ }
343
+ });
344
+ });
263
345
 
264
- const payload = {
265
- [projectId1]: {
266
- appConfig: JSON.stringify(appCfg1)
267
- }
268
- };
346
+ test('handle project shadow env vars update delta', async () => {
347
+ const envVars1 = {
348
+ VAR1: 'value1'
349
+ };
350
+ const payload = {
351
+ [projectId1]: {
352
+ envVars: envVars1
353
+ }
354
+ };
269
355
 
270
- const appCfgUpdates = await shadowHandler.handleShadowTopic({
271
- topic: shadowHandler.shadowTopics.projects.updateDelta,
272
- payload,
273
- clientToken: ''
356
+ const updates = await shadowHandler.handleShadowTopic({
357
+ topic: shadowHandler.shadowTopics.projects.updateDelta,
358
+ payload,
359
+ clientToken: ''
360
+ });
361
+ expect(updates.length).toBe(1);
362
+ expect(updates[0]).toEqual({
363
+ projectId: projectId1,
364
+ envVarUpdate: {
365
+ envVars: envVars1
366
+ }
367
+ });
274
368
  });
275
- expect(appCfgUpdates.length).toBe(1);
276
- expect(appCfgUpdates[0]).toEqual({
277
- projectId: projectId1,
278
- newAppCfg: appCfg1
369
+
370
+ test('handle project shadow env vars update delta for two projects', async () => {
371
+ const envVars1 = {
372
+ VAR1: 'value1'
373
+ };
374
+ const envVars2 = {
375
+ VAR2: null
376
+ };
377
+ const payload = {
378
+ [projectId1]: {
379
+ envVars: envVars1
380
+ },
381
+ [projectId2]: {
382
+ envVars: envVars2
383
+ }
384
+ };
385
+
386
+ const updates = await shadowHandler.handleShadowTopic({
387
+ topic: shadowHandler.shadowTopics.projects.updateDelta,
388
+ payload,
389
+ clientToken: ''
390
+ });
391
+ expect(updates.length).toBe(2);
392
+ expect(updates[0]).toEqual({
393
+ projectId: projectId1,
394
+ envVarUpdate: {
395
+ envVars: envVars1
396
+ }
397
+ });
398
+ expect(updates[1]).toEqual({
399
+ projectId: projectId2,
400
+ envVarUpdate: {
401
+ envVars: envVars2
402
+ }
403
+ });
279
404
  });
280
405
  });
281
406
 
282
- test('handle shadow delta with invalid app config', async () => {
283
- const ogAppCfg1: AppConfig = {
284
- scripts: {
285
- start: 'python app.py'
286
- },
287
- models: {
288
- 'alwaysai/mobilenet_ssd': 2
289
- }
290
- };
291
-
292
- jest.mocked(readAppCfgFile).mockResolvedValue(ogAppCfg1);
293
- const appCfg1 = {
294
- scripts: {
295
- start: 'python app.py'
407
+ test('clear project shadow', async () => {
408
+ shadowHandler.clearAppConfig(projectId1);
409
+ const packet = {
410
+ state: {
411
+ desired: {
412
+ [projectId1]: null
413
+ },
414
+ reported: {
415
+ [projectId1]: null
416
+ }
296
417
  },
297
- models: {
298
- 'alwaysai/mobilenet_ssd': '3',
299
- 'alwaysai/yolo_v4': '5'
300
- }
301
- };
302
-
303
- const payload = {
304
- [projectId1]: {
305
- appConfig: JSON.stringify(appCfg1)
306
- }
418
+ clientToken: clientId
307
419
  };
308
-
309
- const appCfgUpdates = await shadowHandler.handleShadowTopic({
310
- topic: shadowHandler.shadowTopics.projects.updateDelta,
311
- payload,
312
- clientToken: ''
313
- });
314
- expect(appCfgUpdates.length).toBe(0);
420
+ expect(jest.mocked(publisher.publish)).toBeCalledWith(
421
+ shadowHandler.shadowTopics.projects.update,
422
+ JSON.stringify(packet)
423
+ );
315
424
  });
316
425
 
317
426
  test.skip('publish app config', async () => {
@@ -324,7 +433,7 @@ describe('Test Shadow Handler', () => {
324
433
  };
325
434
  jest.mocked(readAppCfgFile).mockResolvedValue(testAppCfg);
326
435
 
327
- await shadowHandler.publishAppConfig(projectId1);
436
+ await shadowHandler.updateProjectShadow(projectId1);
328
437
  expect(jest.mocked(readAppCfgFile)).toBeCalledWith({ projectId1 });
329
438
  const packet = {
330
439
  state: {
@@ -349,23 +458,4 @@ describe('Test Shadow Handler', () => {
349
458
  })
350
459
  );
351
460
  });
352
-
353
- test('clear project shadow', async () => {
354
- shadowHandler.clearAppConfig(projectId1);
355
- const packet = {
356
- state: {
357
- desired: {
358
- [projectId1]: null
359
- },
360
- reported: {
361
- [projectId1]: null
362
- }
363
- },
364
- clientToken: clientId
365
- };
366
- expect(jest.mocked(publisher.publish)).toBeCalledWith(
367
- shadowHandler.shadowTopics.projects.update,
368
- JSON.stringify(packet)
369
- );
370
- });
371
461
  });