• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

suculent / thinx-device-api / #252646769

01 Nov 2025 03:54PM UTC coverage: 71.357% (+25.1%) from 46.298%
#252646769

push

suculent
testing fixed broker URL configuration after MQTT upgrade

1841 of 3538 branches covered (52.04%)

Branch coverage included in aggregate %.

27 of 38 new or added lines in 1 file covered. (71.05%)

25 existing lines in 13 files now uncovered.

8169 of 10490 relevant lines covered (77.87%)

7.39 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.92
/spec/jasmine/ZZ-RouterDeviceSpec.js
1
/* Router integration test only; does not have to cover full unit functionality. */
2

3
const THiNX = require("../../thinx-core.js");
1✔
4

5
let chai = require('chai');
1✔
6
var expect = require('chai').expect;
1✔
7
let chaiHttp = require('chai-http');
1✔
8
var envi = require("../_envi.json");
1✔
9
chai.use(chaiHttp);
1✔
10

11
let thx;
12

13
describe("Devices", function () {
1✔
14

15
  beforeAll((done) => {
1✔
16
    console.log(`🚸 [chai] >>> running Devices spec`);
1✔
17
    thx = new THiNX();
1✔
18
    thx.init(() => {
1✔
19
      done();
1✔
20
    });
21
  });
22

23
  afterAll(() => {
1✔
24
    console.log(`🚸 [chai] <<< completed Devices spec`);
1✔
25
  });
26

27
  it("GET /api/user/devices (noauth)", function (done) {
1✔
28
    console.log("🚸 [chai] GET /api/user/devices (noauth)");
1✔
29
    chai.request(thx.app)
1✔
30
      .get('/api/user/devices')
31
      .end((err, res) => {
32
        expect(res.status).to.equal(401);
1✔
33
        done();
1✔
34
      });
35
  }, 30000);
36

37
  it("GET /api/user/devices (cookie)", function (done) {
1✔
38
    console.log("🚸 [chai] GET /api/user/devices (cookie)");
1✔
39
    chai.request(thx.app)
1✔
40
      .get('/api/user/devices')
41
      .set('Cookie', 'thx-session-cookie=something;owner=' + envi.oid)
42
      .end((err, res) => {
43
        expect(res.status).to.equal(401);
1✔
44
        done();
1✔
45
      });
46
  }, 30000);
47

48
  it("GET /api/user/device/data/:udid" + envi.oid, function (done) {
1✔
49
    console.log("🚸 [chai] GET /api/user/device/data/:udid");
1✔
50
    chai.request(thx.app)
1✔
51
      .get('/api/user/device/data/' + envi.oid)
52
      .end((err, res) => {
53
        expect(res.status).to.equal(404);
1✔
54
        done();
1✔
55
      });
56
  }, 30000);
57

58
  it("POST /api/device/edit", function (done) {
1✔
59
    console.log("🚸 [chai] POST /api/device/edit");
1✔
60
    chai.request(thx.app)
1✔
61
      .post('/api/device/edit')
62
      .send({ changes: { alias: "edited-alias" } })
63
      .end((err, res) => {
64
        expect(res.status).to.equal(401);
1✔
65
        done();
1✔
66
      });
67
  }, 30000);
68

69
  it("POST /api/device/attach", function (done) {
1✔
70
    console.log("🚸 [chai] POST /api/device/attach (invalid)");
1✔
71
    chai.request(thx.app)
1✔
72
      .post('/api/device/attach')
73
      .send({ udid: envi.oid })
74
      .end((err, res) => {
75
        expect(res.status).to.equal(401);
1✔
76
        done();
1✔
77
      });
78
  }, 30000);
79

80
  it("POST /api/device/detach", function (done) {
1✔
81
    console.log("🚸 [chai] POST /api/device/detach (invalid)");
1✔
82
    chai.request(thx.app)
1✔
83
      .post('/api/device/detach')
84
      .send({ udid: envi.oid })
85
      .end((err, res) => {
86
        expect(res.status).to.equal(401);
1✔
87
        done();
1✔
88
      });
89
  }, 30000);
90

91
  it("POST /api/device/mesh/attach", function (done) {
1✔
92
    console.log("🚸 [chai] POST /api/device/mesh/attach");
1✔
93
    chai.request(thx.app)
1✔
94
      .post('/api/device/mesh/attach')
95
      .send({ udid: envi.udid })
96
      .end((err, res) => {
97
        if (err) console.log("🚸 [chai] ERR", err);
1!
98
        expect(res.status).to.equal(401);
1✔
99
        done();
1✔
100
      });
101
  }, 30000);
102

103
  // POST /api/device/mesh/detach
104
  it("POST /api/device/mesh/detach", function (done) {
1✔
105
    console.log("🚸 [chai] POST /api/device/mesh/detach");
1✔
106
    chai.request(thx.app)
1✔
107
      .post('/api/device/mesh/detach')
108
      .send({ udid: envi.udid })
109
      .end((err, res) => {
110
        if (err) console.log("🚸 [chai] ERR", err);
1!
111
        expect(res.status).to.equal(401);
1✔
112
        done();
1✔
113
      });
114
  }, 30000);
115

116
  it("POST /api/device/data", function (done) {
1✔
117
    console.log("🚸 [chai] POST /api/device/data");
1✔
118
    chai.request(thx.app)
1✔
119
      .post('/api/device/data')
120
      .send({ udid: envi.oid })
121
      .end((err, res) => {
122
        console.log("🚸 [chai] response /api/device/data:", res.text, " status:", res.status);
1✔
123
        expect(res.status).to.equal(401);
1✔
124
        done();
1✔
125
      });
126
  }, 30000);
127

128
  it("POST /api/device/revoke", function (done) {
1✔
129
    console.log("🚸 [chai] POST /api/device/revoke");
1✔
130
    chai.request(thx.app)
1✔
131
      .post('/api/device/revoke')
132
      .send({ udid: envi.oid })
133
      .end((err, res) => {
134
        expect(res.status).to.equal(401);
1✔
135
        done();
1✔
136
      });
137
  }, 30000);
138

139
  //
140
  // Device Configuration
141
  //
142

143
  // push device configuration over MQTT
144
  it("POST /api/device/push", function (done) {
1✔
145
    console.log("🚸 [chai] POST /api/device/push");
1✔
146
    chai.request(thx.app)
1✔
147
      .post('/api/device/push')
148
      .send({ key: "value" })
149
      .end((err, res) => {
150
        expect(res.status).to.equal(401);
1✔
151
        done();
1✔
152
      });
153
  }, 30000);
154
});
155

156
describe("Devices (JWT)", function () {
1✔
157

158
  let agent;
159
  let jwt;
160

161
  var JRS5 = {
1✔
162
    mac: "55:55:55:55:55:55",
163
    firmware: "ZZ-RouterDeviceSpec.js",
164
    version: "1.0.0",
165
    alias: "test-device-5-dynamic",
166
    owner: envi.dynamic.owner,
167
    platform: "arduino"
168
  };
169

170
  let created_api_key = null;
1✔
171

172
  beforeAll((done) => {
1✔
173
    console.log(`🚸 [chai] >>> running Devices (JWT) spec`);
1✔
174
    agent = chai.request.agent(thx.app);
1✔
175
    agent
1✔
176
      .post('/api/login')
177
      .send({ username: 'dynamic', password: 'dynamic', remember: false })
178
      .then(function (res) {
179
        console.log(`🚸 [chai] DeviceSpec (JWT) beforeAll POST /api/login (valid) response: ${JSON.stringify(res)}`);
1✔
180
        expect(res).to.have.cookie('x-thx-core');
1✔
181
        let body = JSON.parse(res.text);
1✔
182
        jwt = 'Bearer ' + body.access_token;
1✔
183
        done();
1✔
184
      })
UNCOV
185
      .catch((e) => { console.log(e); });
×
186
  });
187

188
  afterAll(() => {
1✔
189
    console.log(`🚸 [chai] <<< completed Devices (JWT) spec`);
1✔
190
    agent.close();
1✔
191
  });
192

193
  it("POST /api/user/apikey (D)", function (done) {
1✔
194
    chai.request(thx.app)
1✔
195
      .post('/api/user/apikey')
196
      .set('Authorization', jwt)
197
      .send({
198
        'alias': 'device-apikey-alias'
199
      })
200
      .end((err, res) => {
201
        //  {"success":true,"api_key":"9b7bd4f4eacf63d8453b32dbe982eea1fb8bbc4fc8e3bcccf2fc998f96138629","hash":"0a920b2e99a917a04d7961a28b49d05524d10cd8bdc2356c026cfc1c280ca22c"}
202
        expect(res.status).to.equal(200);
1✔
203
        let j = JSON.parse(res.text);
1✔
204
        expect(j.success).to.equal(true);
1✔
205
        expect(j.response.api_key).to.be.a('string');
1✔
206
        expect(j.response.hash).to.be.a('string');
1✔
207
        created_api_key = j.response.hash;
1✔
208
        console.log("[spec] saving apikey (D)", j.response.api_key);
1✔
209
        done();
1✔
210
      });
211
  }, 30000);
212

213
  it("POST /device/register (jwt, valid) D", function (done) {
1✔
214

215
    chai.request(thx.app)
1✔
216
      .post('/device/register')
217
      .set('Authentication', created_api_key)
218
      .send({ registration: JRS5 })
219
      .end((err, res) => {
220
        console.log("🚸 [chai] POST /device/register (jwt, valid) D response:", res.text);
1✔
221
        expect(res.status).to.equal(200);
1✔
222
        let r = JSON.parse(res.text);
1✔
223
        console.log("🚸 [chai] POST /device/register (jwt, valid) D response:", JSON.stringify(r));
1✔
224
        JRS5.udid = r.registration.udid;
1✔
225
        expect(res.text).to.be.a('string');
1✔
226
        done();
1✔
227
      });
228
  }, 30000);
229

230
  let dynamic_devices = [];
1✔
231

232
  it("GET /api/user/devices (JWT)", function (done) {
1✔
233
    console.log("🚸 [chai] GET /api/user/devices (JWT)");
1✔
234
    agent
1✔
235
      .get('/api/user/devices')
236
      .set('Authorization', jwt)
237
      .end((err, res) => {
238
        console.log("🚸 [chai] GET /api/user/devices (JWT) response:", res.text, " status:", res.status);
1✔
239
        let j = JSON.parse(res.text);
1✔
240
        dynamic_devices = j.response;
1✔
241
        expect(res.status).to.equal(200);
1✔
242
        expect(res.text).to.be.a('string');
1✔
243
        done();
1✔
244
      });
245
  }, 30000);
246

247
  it("GET /api/user/device/data/:udid" + envi.oid, function (done) {
1✔
248
    console.log("🚸 [chai] GET /api/user/device/data/:udid");
1✔
249
    agent
1✔
250
      .get('/api/user/device/data/' + envi.oid)
251
      .set('Authorization', jwt)
252
      .end((err, res) => {
253
        expect(res.status).to.equal(404);
1✔
254
        //expect(res.text).to.be.a('string');
255
        done();
1✔
256
      });
257
  }, 30000);
258

259
  it("POST /api/device/edit", function (done) {
1✔
260
    console.log("🚸 [chai] POST /api/device/edit (JWT)");
1✔
261
    agent
1✔
262
      .post('/api/device/edit')
263
      .set('Authorization', jwt)
264
      .send({ changes: { alias: "edited-alias", udid: dynamic_devices[1].udid } })
265
      .end((err, res) => {
266
        console.log("🚸 [chai] POST /api/device/edit (JWT)response:", res.text, " status:", res.status);
1✔
267
        //expect(res.status).to.equal(200);
268
        //expect(res.text).to.be.a('string');
269
        done();
1✔
270
      });
271
  }, 30000);
272

273
  it("POST /api/device/attach", function (done) {
1✔
274
    console.log("🚸 [chai] POST /api/device/attach (JWT)");
1✔
275
    agent
1✔
276
      .post('/api/device/attach')
277
      .set('Authorization', jwt)
278
      .send({ udid: dynamic_devices[1].udid })
279
      .end((err, res) => {
280
        console.log("🚸 [chai] POST /api/device/attach (JWT) response:", res.text, " status:", res.status);
1✔
281
        //expect(res.status).to.equal(200);
282
        //expect(res.text).to.be.a('string');
283
        done();
1✔
284
      });
285
  }, 30000);
286

287
  it("POST /api/device/attach", function (done) {
1✔
288
    console.log("🚸 [chai] POST /api/device/attach (JWT) 2");
1✔
289
    agent
1✔
290
      .post('/api/device/attach')
291
      .set('Authorization', jwt)
292
      .send({ udid: JRS5.udid })
293
      .end((err, res) => {
294
        console.log("🚸 [chai] POST /api/device/attach (JWT) 2 response:", res.text, " status:", res.status);
1✔
295
        //expect(res.status).to.equal(200);
296
        //expect(res.text).to.be.a('string');
297
        done();
1✔
298
      });
299
  }, 30000);
300

301
  it("POST /api/device/detach", function (done) {
1✔
302
    console.log("🚸 [chai] POST /api/device/detach  (JWT)");
1✔
303
    agent
1✔
304
      .post('/api/device/detach')
305
      .set('Authorization', jwt)
306
      .send({ udid: dynamic_devices[1].udid })
307
      .end((err, res) => {
308
        console.log("🚸 [chai] POST /api/device/detach  (JWT) response:", res.text, " status:", res.status);
1✔
309
        //expect(res.status).to.equal(200);
310
        //expect(res.text).to.be.a('string');
311
        done();
1✔
312
      });
313
  }, 30000);
314

315
  it("POST /api/device/detach", function (done) {
1✔
316
    console.log("🚸 [chai] POST /api/device/detach  (JWT) 2");
1✔
317
    agent
1✔
318
      .post('/api/device/detach')
319
      .set('Authorization', jwt)
320
      .send({ udid: JRS5.udid })
321
      .end((_err, res) => {
322
        expect(res.status).to.equal(200);
1✔
323
        expect(res.text).to.be.a('string');
1✔
324
        expect(res.text).to.equal('{"success":true,"response":"detached"}');
1✔
325
        done();
1✔
326
      });
327
  }, 30000);
328

329
  let mesh_id;
330

331
  it("POST /api/mesh/create (jwt, valid)", (done) => {
1✔
332
    agent
1✔
333
      .post('/api/mesh/create')
334
      .set('Authorization', jwt)
335
      .send({ alias: "device-mesh-alias", owner_id: envi.dynamic.owner, mesh_id: 'device-mesh-id' })
336
      .end((_err, res) => {
337
        let r = JSON.parse(res.text);
1✔
338
        mesh_id = r.mesh_id;
1✔
339
        expect(res.status).to.equal(200);
1✔
340
        expect(res.text).to.be.a('string');
1✔
341
        expect(res.text).to.equal('{"success":true,"response":{"mesh_id":"device-mesh-id","alias":"device-mesh-alias"}}');
1✔
342
        done();
1✔
343
      });
344
  }, 30000);
345

346
  it("POST /api/device/mesh/attach", function (done) {
1✔
347
    console.log("🚸 [chai] POST /api/device/mesh/attach (JWT)");
1✔
348
    agent
1✔
349
      .post('/api/device/mesh/attach')
350
      .set('Authorization', jwt)
351
      .send({ udid: envi.dynamic.udid, mesh_id: "device-mesh-id" })
352
      .end((err, res) => {
353
        console.log("🚸 [chai] POST /api/device/mesh/attach (JWT) response:", res.text, " status:", res.status);
1✔
354
        //expect(res.status).to.equal(200);
355
        //expect(res.text).to.be.a('string');
356
        done();
1✔
357
      });
358
  }, 30000);
359

360
  it("POST /api/device/mesh/attach", function (done) {
1✔
361
    console.log("🚸 [chai] POST /api/device/mesh/attach (JWT) 2");
1✔
362
    agent
1✔
363
      .post('/api/device/mesh/attach')
364
      .set('Authorization', jwt)
365
      .send({ udid: JRS5.udid, mesh_id: mesh_id })
366
      .end((err, res) => {
367
        console.log("🚸 [chai] POST /api/device/mesh/attach (JWT) 2 response:", res.text, " status:", res.status);
1✔
368
        //expect(res.status).to.equal(200);
369
        //expect(res.text).to.be.a('string');
370
        done();
1✔
371
      });
372
  }, 30000);
373

374
  it("POST /api/device/mesh/attach", function (done) {
1✔
375
    console.log("🚸 [chai] POST /api/device/mesh/attach (JWT) 3");
1✔
376
    agent
1✔
377
      .post('/api/device/mesh/attach')
378
      .set('Authorization', jwt)
379
      .send({ mesh_id: mesh_id })
380
      .end((err, res) => {
381
        console.log("🚸 [chai] POST /api/device/mesh/attach (JWT) 3 response:", res.text, " status:", res.status);
1✔
382
        //expect(res.status).to.equal(200);
383
        //expect(res.text).to.be.a('string');
384
        done();
1✔
385
      });
386
  }, 30000);
387

388
  it("POST /api/device/mesh/attach", function (done) {
1✔
389
    console.log("🚸 [chai] POST /api/device/mesh/attach (JWT) 4");
1✔
390
    agent
1✔
391
      .post('/api/device/mesh/attach')
392
      .set('Authorization', jwt)
393
      .send({ udid: envi.dynamic.udid, mesh_id: mesh_id })
394
      .end((err, res) => {
395
        console.log("🚸 [chai] POST /api/device/mesh/attach (JWT) 4 response:", res.text, " status:", res.status);
1✔
396
        //expect(res.status).to.equal(200);
397
        //expect(res.text).to.be.a('string');
398
        done();
1✔
399
      });
400
  }, 30000);
401

402
  it("POST /api/device/mesh/detach", function (done) {
1✔
403
    console.log("🚸 [chai] POST /api/device/mesh/detach (noudid)");
1✔
404
    chai.request(thx.app)
1✔
405
      .post('/api/device/mesh/detach')
406
      .send({ mesh_id: mesh_id })
407
      .end((err, res) => {
408
        console.log("🚸 [chai] POST /api/device/mesh/detach (noudid) response:", res.text, " status:", res.status);
1✔
409
        //expect(res.status).to.equal(200);
410
        //expect(res.text).to.be.a('string');
411
        done();
1✔
412
      });
413
  }, 30000);
414

415
  // POST /api/device/mesh/detach
416
  it("POST /api/device/mesh/detach", function (done) {
1✔
417
    console.log("🚸 [chai] POST /api/device/mesh/detach (JWT)");
1✔
418
    agent
1✔
419
      .post('/api/device/mesh/detach')
420
      .set('Authorization', jwt)
421
      .send({ udid: envi.dynamic.udid, mesh_id: "device-mesh-id" })
422
      .end((err, res) => {
423
        console.log("🚸 [chai] POST /api/device/mesh/detach (JWT) response:", res.text, " status:", res.status);
1✔
424
        //expect(res.status).to.equal(200);
425
        //expect(res.text).to.be.a('string');
426
        done();
1✔
427
      });
428
  }, 30000);
429

430
  it("POST /api/device/mesh/detach", function (done) {
1✔
431
    console.log("🚸 [chai] POST /api/device/mesh/detach (JWT) 2");
1✔
432
    agent
1✔
433
      .post('/api/device/mesh/detach')
434
      .set('Authorization', jwt)
435
      .send({ udid: JRS5.udid, mesh_id: "device-mesh-id" })
436
      .end((err, res) => {
437
        console.log("🚸 [chai] POST /api/device/mesh/detach (JWT) 2 response:", res.text, " status:", res.status);
1✔
438
        //expect(res.status).to.equal(200);
439
        //expect(res.text).to.be.a('string');
440
        done();
1✔
441
      });
442
  }, 30000);
443

444
  it("POST /api/device/data", function (done) {
1✔
445
    console.log("🚸 [chai] POST /api/device/data (JWT)");
1✔
446
    agent
1✔
447
      .post('/api/device/data')
448
      .set('Authorization', jwt)
449
      .send({ udid: envi.oid })
450
      .end((err, res) => {
451
        console.log("🚸 [chai] response /api/device/data (JWT):", res.text, " status:", res.status);
1✔
452
        //expect(res.status).to.equal(200);
453
        //expect(res.text).to.be.a('string');
454
        done();
1✔
455
      });
456
  }, 30000);
457

458
  it("POST /api/device/data", function (done) {
1✔
459
    console.log("🚸 [chai] POST /api/device/data (JWT) 2");
1✔
460
    agent
1✔
461
      .post('/api/device/data')
462
      .set('Authorization', jwt)
463
      .send({ udid: JRS5.udid })
464
      .end((err, res) => {
465
        console.log("🚸 [chai] response /api/device/data (JWT) 2:", res.text, " status:", res.status);
1✔
466
        //expect(res.status).to.equal(200);
467
        //expect(res.text).to.be.a('string');
468
        done();
1✔
469
      });
470
  }, 30000);
471

472
  it("POST /api/device/revoke", function (done) {
1✔
473
    console.log("🚸 [chai] POST /api/device/revoke (JWT)");
1✔
474
    agent
1✔
475
      .post('/api/device/revoke')
476
      .set('Authorization', jwt)
477
      .send({ udid: envi.oid })
478
      .end((err, res) => {
479
        console.log("🚸 [chai] POST /api/device/revoke (JWT) response:", res.text, " status:", res.status);
1✔
480
        //expect(res.status).to.equal(200);
481
        //expect(res.text).to.be.a('string');
482
        done();
1✔
483
      });
484
  }, 30000);
485

486
  //
487
  // Device Configuration
488
  //
489

490
  // push device configuration over MQTT
491
  it("POST /api/device/push", function (done) {
1✔
492
    console.log("🚸 [chai] POST /api/device/push (JWT+udid)");
1✔
493
    agent
1✔
494
      .post('/api/device/push')
495
      .set('Authorization', jwt)
496
      .send({ key: "value" })
497
      .end((err, res) => {
498
        console.log("🚸 [chai] POST /api/device/push (JWT+udid) response:", res.text, " status:", res.status);
1✔
499
        // no messenger, will fail here...
500
        //expect(res.status).to.equal(200);
501
        //expect(res.text).to.be.a('string');
502
        done();
1✔
503
      });
504
  }, 30000);
505

506
  it("POST /api/device/push", function (done) {
1✔
507
    console.log("🚸 [chai] POST /api/device/push (JWT+udid)");
1✔
508
    agent
1✔
509
      .post('/api/device/push')
510
      .set('Authorization', jwt)
511
      .send({ udid: JRS5.udid, key: "value" })
512
      .end((err, res) => {
513
        console.log("🚸 [chai] POST /api/device/push (JWT) response:", res.text, " status:", res.status);
1✔
514
        // no messenger, will fail here...
515
        //expect(res.status).to.equal(200);
516
        //expect(res.text).to.be.a('string');
517
        done();
1✔
518
      });
519
  }, 30000);
520

521
  it("POST /api/device/push", function (done) {
1✔
522
    console.log("🚸 [chai] POST /api/device/push (JWT+udid)");
1✔
523
    agent
1✔
524
      .post('/api/device/push')
525
      .set('Authorization', jwt)
526
      .send({ udids: [JRS5.udid], key: "value" })
527
      .end((err, res) => {
528
        console.log("🚸 [chai] POST /api/device/push (JWT) response:", res.text, " status:", res.status);
1✔
529
        // no messenger, will fail here...
530
        //expect(res.status).to.equal(200);
531
        //expect(res.text).to.be.a('string');
532
        done();
1✔
533
      });
534
  }, 30000);
535

536
  it("POST /api/device/revoke", function (done) {
1✔
537
    console.log("🚸 [chai] POST /api/device/revoke (JWT) 2");
1✔
538
    agent
1✔
539
      .post('/api/device/revoke')
540
      .set('Authorization', jwt)
541
      .send({ udid: JRS5.udid })
542
      .end((err, res) => {
543
        console.log("🚸 [chai] POST /api/device/revoke (JWT) 2 response:", res.text, " status:", res.status);
1✔
544
        //expect(res.status).to.equal(200);
545
        //expect(res.text).to.be.a('string');
546
        done();
1✔
547
      });
548
  }, 30000);
549

550
  //
551
  // API v2 specs for device.router.js
552
  //
553

554
  // GET /api/v2/device
555
  it("GET /api/v2/device (JWT)", function (done) {
1✔
556
    console.log("🚸 [chai] GET /api/v2/device (JWT)");
1✔
557
    agent
1✔
558
      .get('/api/v2/device')
559
      .set('Authorization', jwt)
560
      .end((err, res) => {
561
        console.log("🚸 [chai] GET /api/v2/device (JWT) response 1:", res.text, " status:", res.status);
1✔
562
        expect(res.status).to.equal(200);
1✔
563
        expect(res.text).to.be.a('string');
1✔
564
        done();
1✔
565
      });
566
  }, 30000);
567

568
  // PUT /api/v2/device
569
  it("PUT /api/v2/device (JWT)", function (done) {
1✔
570
    console.log("🚸 [chai] PUT /api/v2/device (JWT)");
1✔
571
    agent
1✔
572
      .put('/api/v2/device')
573
      .set('Authorization', jwt)
574
      .send({ changes: { alias: "changed" }})
575
      .end((err, res) => {
576
        console.log("🚸 [chai] PUT /api/v2/device (JWT) response 2:", res.text, " status:", res.status);
1✔
577
        expect(res.status).to.equal(200);
1✔
578
        expect(res.text).to.be.a('string');
1✔
579
        done();
1✔
580
      });
581
  }, 30000);
582

583
  // PUT /api/v2/source/attach
584
  it("PUT /api/v2/source/attach", function (done) {
1✔
585
    console.log("🚸 [chai] PUT /api/v2/source/attach (JWT)");
1✔
586
    agent
1✔
587
      .put('/api/v2/source/attach')
588
      .set('Authorization', jwt)
589
      .send({ udid: JRS5.udid })
590
      .end((err, res) => {
591
        console.log("🚸 [chai] PUT /api/v2/source/attach response:", res.text, " status:", res.status);
1✔
592
        //expect(res.status).to.equal(200);
593
        //expect(res.text).to.be.a('string');
594
        done();
1✔
595
      });
596
  }, 30000);
597
  
598
  // PUT /api/v2/source/detach
599
  it("PUT /api/v2/source/detach", function (done) {
1✔
600
    console.log("🚸 [chai] PUT /api/v2/source/detach (JWT)");
1✔
601
    agent
1✔
602
      .put('/api/v2/source/detach')
603
      .set('Authorization', jwt)
604
      .send({ udid: envi.oid })
605
      .end((err, res) => {
606
        console.log("🚸 [chai] PUT /api/v2/source/detach (JWT) response:", res.text, " status:", res.status);
1✔
607
        //expect(res.status).to.equal(200);
608
        //expect(res.text).to.be.a('string');
609
        done();
1✔
610
      });
611
  }, 30000);
612

613
  // PUT /api/v2/mesh/attach
614
  it("PUT /api/v2/mesh/attach", function (done) {
1✔
615
    console.log("🚸 [chai] PUT /api/v2/mesh/attach");
1✔
616
    agent
1✔
617
      .put('/api/v2/mesh/attach')
618
      .set('Authorization', jwt)
619
      .send({ udid: envi.dynamic.udid, mesh_id: mesh_id })
620
      .end((err, res) => {
621
        console.log("🚸 [chai] PUT /api/v2/mesh/attach response:", res.text, " status:", res.status);
1✔
622
        //expect(res.status).to.equal(200);
623
        //expect(res.text).to.be.a('string');
624
        done();
1✔
625
      });
626
  }, 30000);
627

628
  // PUT /api/v2/mesh/detach
629
  it("PUT /api/v2/mesh/detach", function (done) {
1✔
630
    console.log("🚸 [chai] PUT /api/v2/mesh/detach");
1✔
631
    agent
1✔
632
      .put('/api/v2/mesh/detach')
633
      .set('Authorization', jwt)
634
      .send({ udid: envi.dynamic.udid, mesh_id: "device-mesh-id" })
635
      .end((err, res) => {
636
        console.log("🚸 [chai] PUT /api/v2/mesh/detach response:", res.text, " status:", res.status);
1✔
637
        //expect(res.status).to.equal(200);
638
        //expect(res.text).to.be.a('string');
639
        done();
1✔
640
      });
641
  }, 30000);
642

643
  // DELETE /api/v2/device
644
  it("DELETE /api/v2/device (JWT)", function (done) {
1✔
645
    console.log("🚸 [chai] DELETE /api/v2/device (JWT, invalid)");
1✔
646
    agent
1✔
647
      .delete('/api/v2/device')
648
      .send({})
649
      .set('Authorization', jwt)
650
      .end((err, res) => {
651
        console.log("🚸 [chai] DELETE /api/v2/device (JWT, invalid) response:", res.text, " status:", res.status);
1✔
652
        expect(res.status).to.equal(200);
1✔
653
        expect(res.text).to.be.a('string');
1✔
654
        done();
1✔
655
      });
656
  }, 30000);
657

658
  it("DELETE /api/v2/device (JWT)", function (done) {
1✔
659
    console.log("🚸 [chai] DELETE /api/v2/device (JWT, multi)");
1✔
660
    agent
1✔
661
      .delete('/api/v2/device')
662
      .send({ udids: dynamic_devices })
663
      .set('Authorization', jwt)
664
      .end((err, res) => {
665
        console.log("🚸 [chai] GET /api/v2/device (JWT, multi) response:", res.text, " status:", res.status);
1✔
666
        expect(res.status).to.equal(200);
1✔
667
        expect(res.text).to.be.a('string');
1✔
668
        done();
1✔
669
      });
670
  }, 30000);
671

672
  
673
});
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc