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

suculent / thinx-device-api / #252646768

01 Nov 2025 03:31PM UTC coverage: 46.298% (-25.7%) from 71.971%
#252646768

push

suculent
testing upgraded mqtt package

1123 of 3470 branches covered (32.36%)

Branch coverage included in aggregate %.

5324 of 10455 relevant lines covered (50.92%)

4.07 hits per line

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

26.82
/spec/jasmine/ZZ-RouterTransferSpec.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
chai.use(chaiHttp);
1✔
9

10
let thx;
11

12
var envi = require("../_envi.json");
1✔
13

14
describe("Device Ownership Transfer (noauth)", function () {
1✔
15

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

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

28
    it("POST /api/transfer/request (noauth, invalid)", function (done) {
1✔
29
        chai.request(thx.app)
×
30
            .post('/api/transfer/request')
31
            .send({})
32
            .end((_err, res) => {
33
                expect(res.status).to.equal(401);
×
34
                done();
×
35
            });
36
    }, 30000);
37

38
    it("GET /api/transfer/decline (noauth, invalid)", function (done) {
1✔
39
        chai.request(thx.app)
×
40
            .get('/api/transfer/decline')
41
            .end((_err, res) => {
42
                expect(res.status).to.equal(400);
×
43
                expect(res.text).to.be.a('string'); // <html>
×
44
                done();
×
45
            });
46
    }, 30000);
47

48
    it("POST /api/transfer/decline (noauth, invalid)", function (done) {
1✔
49
        chai.request(thx.app)
×
50
            .post('/api/transfer/decline')
51
            .send({})
52
            .end((_err, res) => {
53
                expect(res.status).to.equal(401);
×
54
                done();
×
55
            });
56
    }, 30000);
57

58
    it("GET /api/transfer/accept (noauth, invalid)", function (done) {
1✔
59
        chai.request(thx.app)
×
60
            .get('/api/transfer/accept')
61
            .end((_err, res) => {
62
                expect(res.status).to.equal(400);
×
63
                expect(res.text).to.be.a('string');
×
64
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
×
65
                done();
×
66
            });
67
    }, 30000);
68

69
    it("POST /api/transfer/accept (noauth, invalid)", function (done) {
1✔
70
        chai.request(thx.app)
×
71
            .get('/api/transfer/accept')
72
            .send({})
73
            .end((_err, res) => {
74
                expect(res.status).to.equal(400);
×
75
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
×
76
                done();
×
77
            });
78
    }, 30000);
79
});
80

81
describe("Transfer (JWT)", function () {
1✔
82

83
    let agent;
84
    let jwt;
85
    let transfer_id;
86
  
87
    beforeAll((done) => {
1✔
88
        console.log(`🚸 [chai] >>> running Transfer (JWT) spec`);
1✔
89
        agent = chai.request.agent(thx.app);
1✔
90
        agent
1✔
91
            .post('/api/login')
92
            .send({ username: 'dynamic', password: 'dynamic', remember: false })
93
            .catch((e) => { console.log(e); })
×
94
            .then(function (res) {
95
                expect(res).to.have.cookie('x-thx-core');
1✔
96
                let body = JSON.parse(res.text);
×
97
                jwt = 'Bearer ' + body.access_token;
×
98
                done();
×
99
            });
100
    });
101

102
    afterAll(() => {
1✔
103
        console.log(`🚸 [chai] <<< completed Transfer (JWT) spec`);
1✔
104
    });
105

106
    // save trid for accept and decline, create valid version of this; needs at least two owners and one device
107
    it("POST /api/transfer/request (jwt, invalid)", function (done) {
1✔
108
        chai.request(thx.app)
×
109
            .post('/api/transfer/request')
110
            .set('Authorization', jwt)
111
            .send({})
112
            .end((_err, res) => {
113
                expect(res.status).to.equal(200);
×
114
                expect(res.text).to.be.a('string'); 
×
115
                expect(res.text).to.equal('{"success":false,"response":"missing_recipient"}');
×
116
                done();
×
117
            });
118
    }, 30000);
119

120
    // migrate using invalid data (owner_id instead of e-mail)
121
    it("POST /api/transfer/request (jwt, semi-valid)", function (done) {
1✔
122
        chai.request(thx.app)
×
123
            .post('/api/transfer/request')
124
            .set('Authorization', jwt)
125
            .send({ to: envi.dynamic.owner, udids: [envi.udid], mig_sources: true, mig_apikeys: true })
126
            .end((_err, res) => {
127
                expect(res.status).to.equal(200);
×
128
                expect(res.text).to.be.a('string'); 
×
129
                expect(res.text).to.equal('{"success":false,"response":"recipient_unknown"}');
×
130
                done();
×
131
            });
132
    }, 30000);
133

134
    // migrate from dynamic owner to cimrman
135
    it("POST /api/transfer/request (jwt, valid)", function (done) {
1✔
136
        chai.request(thx.app)
×
137
            .post('/api/transfer/request')
138
            .set('Authorization', jwt)
139
            .send({ to: "cimrman@thinx.cloud", udids: [envi.udid], mig_sources: false, mig_apikeys: false })
140
            .end((_err, res) => {
141
                console.log("🚸 [chai] POST /api/transfer/request (jwt, valid) response: ", res.text);
×
142
                expect(res.status).to.equal(200);
×
143
                expect(res.text).to.be.a('string'); 
×
144
                let j = JSON.parse(res.text);
×
145
                transfer_id = j.response;
×
146
                expect(j.success).to.equal(true);
×
147
                done();
×
148
            });
149
    }, 30000);
150

151
    it("GET /api/transfer/decline (jwt, invalid)", function (done) {
1✔
152
        chai.request(thx.app)
×
153
            .get('/api/transfer/decline')
154
            .set('Authorization', jwt)
155
            .end((_err, res) => {
156
                expect(res.status).to.equal(400);
×
157
                expect(res.text).to.be.a('string'); // <html>
×
158
                done();
×
159
            });
160
    }, 30000);
161

162
    it("POST /api/transfer/decline (jwt, invalid)", function (done) {
1✔
163
        chai.request(thx.app)
×
164
            .post('/api/transfer/decline')
165
            .set('Authorization', jwt)
166
            .send({})
167
            .end((_err, res) => {
168
                expect(res.status).to.equal(400);
×
169
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
×
170
                done();
×
171
            });
172
    }, 30000);
173

174
    it("GET /api/transfer/accept (jwt, invalid)", function (done) {
1✔
175
        chai.request(thx.app)
×
176
            .get('/api/transfer/accept')
177
            .set('Authorization', jwt)
178
            .end((_err, res) => {
179
                expect(res.status).to.equal(400);
×
180
                expect(res.text).to.be.a('string');
×
181
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
×
182
                done();
×
183
            });
184
    }, 30000);
185

186
    it("POST /api/transfer/accept (jwt, invalid)", function (done) {
1✔
187
        chai.request(thx.app)
×
188
            .post('/api/transfer/accept')
189
            .set('Authorization', jwt)
190
            .send({})
191
            .end((_err, res) => {
192
                expect(res.status).to.equal(400);
×
193
                expect(res.text).to.be.a('string');
×
194
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
×
195
                done();
×
196
            });
197
    }, 30000);
198

199
    it("POST /api/transfer/accept (noauth, null)", function (done) {
1✔
200
        chai.request(thx.app)
×
201
            .get('/api/transfer/accept')
202
            .set('Authorization', jwt)
203
            .send({ owner: null, transfer_id: null, udid: null})
204
            .end((_err, res) => {
205
                expect(res.status).to.equal(400);
×
206
                expect(res.text).to.be.a('string');
×
207
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
×
208
                done();
×
209
            });
210
    }, 30000);
211

212
    // v2
213

214
    it("POST /api/v2/transfer/request (jwt, invalid)", function (done) {
1✔
215
        chai.request(thx.app)
×
216
            .post('/api/v2/transfer/request')
217
            .set('Authorization', jwt)
218
            .send({})
219
            .end((_err, res) => {
220
                expect(res.status).to.equal(200);
×
221
                expect(res.text).to.be.a('string');
×
222
                expect(res.text).to.equal('{"success":false,"response":"missing_recipient"}');
×
223
                done();
×
224
            });
225
    }, 30000);
226

227
    it("GET /api/v2/transfer/decline (jwt, invalid)", function (done) {
1✔
228
        chai.request(thx.app)
×
229
            .get('/api/v2/transfer/decline')
230
            .set('Authorization', jwt)
231
            .end((_err, res) => {
232
                expect(res.status).to.equal(400);
×
233
                expect(res.text).to.be.a('string'); // <html>
×
234
                done();
×
235
            });
236
    }, 30000);
237

238
    it("POST /api/v2/transfer/decline (jwt, invalid)", function (done) {
1✔
239
        chai.request(thx.app)
×
240
            .post('/api/v2/transfer/decline')
241
            .set('Authorization', jwt)
242
            .send({ udid: null})
243
            .end((_err, res) => {
244
                expect(res.status).to.equal(400);
×
245
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
×
246
                done();
×
247
            });
248
    }, 30000);
249

250
    it("POST /api/v2/transfer/decline (jwt, invalid)", function (done) {
1✔
251
        chai.request(thx.app)
×
252
            .post('/api/v2/transfer/decline')
253
            .set('Authorization', jwt)
254
            .send({ udid: null, transfer_id: transfer_id })
255
            .end((_err, res) => {
256
                expect(res.status).to.equal(400);
×
257
                expect(res.text).to.be.a('string');
×
258
                expect(res.text).to.equal('{"success":false,"response":"owner_missing"}');
×
259
                done();
×
260
            });
261
    }, 30000);
262

263
    it("POST /api/v2/transfer/decline (jwt, invalid) 2", function (done) {
1✔
264
        chai.request(thx.app)
×
265
            .post('/api/v2/transfer/decline')
266
            .set('Authorization', jwt)
267
            .send({ udid: null, transfer_id: transfer_id, owner: envi.dynamic.owner })
268
            .end((_err, res) => {
269
                expect(res.status).to.equal(400);
×
270
                expect(res.text).to.be.a('string');
×
271
                expect(res.text).to.equal('{"success":false,"response":"udids_missing"}');
×
272
                done();
×
273
            });
274
    }, 30000);
275

276
    it("GET /api/v2/transfer/decline (jwt, invalid) 2", function (done) {
1✔
277
        chai.request(thx.app)
×
278
            .post('/api/v2/transfer/decline')
279
            .set('Authorization', jwt)
280
            .send({ transfer_id: "transfer_id", owner: envi.dynamic.owner })
281
            .end((_err, res) => {
282
                expect(res.status).to.equal(400);
×
283
                expect(res.text).to.be.a('string');
×
284
                expect(res.text).to.equal('{"success":false,"response":"udids_missing"}');
×
285
                done();
×
286
            });
287
    }, 30000);
288

289
    it("GET /api/v2/transfer/accept (jwt, invalid)", function (done) {
1✔
290
        chai.request(thx.app)
×
291
            .get('/api/v2/transfer/accept')
292
            .set('Authorization', jwt)
293
            .end((_err, res) => {
294
                expect(res.status).to.equal(400);
×
295
                expect(res.text).to.be.a('string');
×
296
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
×
297
                done();
×
298
            });
299
    }, 30000);
300

301
    it("POST /api/v2/transfer/accept (jwt, invalid)", function (done) {
1✔
302
        chai.request(thx.app)
×
303
            .post('/api/v2/transfer/accept')
304
            .set('Authorization', jwt)
305
            .send({ udid: null, transfer_id: transfer_id })
306
            .end((_err, res) => {
307
                expect(res.status).to.equal(400);
×
308
                expect(res.text).to.be.a('string');
×
309
                expect(res.text).to.equal('{"success":false,"response":"owner_missing"}');
×
310
                done();
×
311
            });
312
    }, 30000);
313

314
    it("POST /api/v2/transfer/accept (jwt, invalid) 2", function (done) {
1✔
315
        chai.request(thx.app)
×
316
            .post('/api/v2/transfer/accept')
317
            .set('Authorization', jwt)
318
            .send({ udids: null, transfer_id: transfer_id, owner: envi.dynamic.owner })
319
            .end((_err, res) => {
320
                expect(res.status).to.equal(400);
×
321
                expect(res.text).to.be.a('string');
×
322
                expect(res.text).to.equal('{"success":false,"response":"udids_missing"}');
×
323
                done();
×
324
            });
325
    }, 30000);
326

327
    it("POST /api/v2/transfer/accept III", function (done) {
1✔
328
        chai.request(thx.app)
×
329
            .post('/api/v2/transfer/accept')
330
            .set('Authorization', jwt)
331
            .send({ udids: [envi.dynamic.udid], transfer_id: transfer_id, owner: envi.dynamic.owner }) // will probably need real device using GET /api/device
332
            .end((_err, res) => {
333
                expect(res.status).to.equal(200);
×
334
                expect(res.text).to.be.a('string');
×
335
                done();
×
336
            });
337
    }, 30000);
338

339
    it("POST /api/v2/transfer/decline IV", function (done) {
1✔
340
        chai.request(thx.app)
×
341
            .post('/api/v2/transfer/decline')
342
            .set('Authorization', jwt)
343
            .send({ udids: [envi.dynamic.udid], transfer_id: transfer_id, owner: envi.dynamic.owner }) // will probably need real device using GET /api/device
344
            .end((_err, res) => {
345
                expect(res.status).to.equal(200);
×
346
                expect(res.text).to.be.a('string');
×
347
                expect(res.text).to.equal('{"success":true,"response":"decline_complete_no_such_dtid"}');
×
348
                // returns HTML
349
                done();
×
350
            });
351
    }, 30000);
352

353
    it("GET /api/v2/transfer/decline V", function (done) {
1✔
354
        chai.request(thx.app)
×
355
            .get('/api/v2/transfer/decline')
356
            .set('Authorization', jwt)
357
            .send({ udids: [envi.dynamic.udid], transfer_id: transfer_id, owner: envi.dynamic.owner }) // will probably need real device using GET /api/device
358
            .end((_err, res) => {
359
                expect(res.status).to.equal(400);
×
360
                expect(res.text).to.be.a('string');
×
361
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
×
362
                // returns HTML
363
                done();
×
364
            });
365
    }, 30000);
366

367
    it("POST /api/v2/transfer/accept (jwt, null)", function (done) {
1✔
368
        chai.request(thx.app)
×
369
            .get('/api/v2/transfer/accept')
370
            .set('Authorization', jwt)
371
            .send({ owner: null, transfer_id: null, udids: null})
372
            .end((_err, res) => {
373
                expect(res.status).to.equal(400);
×
374
                expect(res.text).to.be.a('string');
×
375
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
×
376
                done();
×
377
            });
378
    }, 30000);
379

380
    it("GET /api/v2/transfer/accept (jwt, null)", function (done) {
1✔
381
        chai.request(thx.app)
×
382
            .get('/api/v2/transfer/accept?transfer_id='+transfer_id)
383
            .set('Authorization', jwt)
384
            .end((_err, res) => {
385
                expect(res.status).to.equal(200);
×
386
                expect(res.text).to.be.a('string');
×
387
                done();
×
388
            });
389
    }, 30000);
390
                
391
});
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