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

suculent / thinx-device-api / #252646129

07 May 2025 04:36PM UTC coverage: 71.43% (-0.2%) from 71.616%
#252646129

push

suculent
fixed error handling in transfer; fixed test expectations

1808 of 3468 branches covered (52.13%)

Branch coverage included in aggregate %.

28 of 28 new or added lines in 4 files covered. (100.0%)

63 existing lines in 8 files now uncovered.

8130 of 10445 relevant lines covered (77.84%)

8.07 hits per line

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

95.53
/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();
1✔
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)
1✔
30
            .post('/api/transfer/request')
31
            .send({})
32
            .end((_err, res) => {
33
                expect(res.status).to.equal(401);
1✔
34
                done();
1✔
35
            });
36
    }, 30000);
37

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

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

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

69
    it("POST /api/transfer/accept (noauth, invalid)", function (done) {
1✔
70
        chai.request(thx.app)
1✔
71
            .get('/api/transfer/accept')
72
            .send({})
73
            .end((_err, res) => {
74
                expect(res.status).to.equal(400);
1✔
75
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
1✔
76
                done();
1✔
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);
1✔
97
                jwt = 'Bearer ' + body.access_token;
1✔
98
                done();
1✔
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)
1✔
109
            .post('/api/transfer/request')
110
            .set('Authorization', jwt)
111
            .send({})
112
            .end((_err, res) => {
113
                expect(res.status).to.equal(200);
1✔
114
                expect(res.text).to.be.a('string'); 
1✔
115
                expect(res.text).to.equal('{"success":false,"response":"missing_recipient"}');
1✔
116
                done();
1✔
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)
1✔
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);
1✔
128
                expect(res.text).to.be.a('string'); 
1✔
129
                expect(res.text).to.equal('{"success":false,"response":"recipient_unknown"}');
1✔
130
                done();
1✔
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)
1✔
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);
1✔
142
                expect(res.status).to.equal(200);
1✔
143
                expect(res.text).to.be.a('string'); 
1✔
144
                let j = JSON.parse(res.text);
1✔
145
                transfer_id = j.response;
1✔
146
                expect(j.success).to.equal(true);
1✔
147
                done();
1✔
148
            });
149
    }, 30000);
150

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

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

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

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

199
    it("POST /api/transfer/accept (noauth, null)", function (done) {
1✔
200
        chai.request(thx.app)
1✔
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);
1✔
206
                expect(res.text).to.be.a('string');
1✔
207
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
1✔
208
                done();
1✔
209
            });
210
    }, 30000);
211

212
    // v2
213

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

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

238
    it("POST /api/v2/transfer/decline (jwt, invalid)", function (done) {
1✔
239
        chai.request(thx.app)
1✔
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);
1✔
245
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
1✔
246
                done();
1✔
247
            });
248
    }, 30000);
249

250
    it("POST /api/v2/transfer/decline (jwt, invalid)", function (done) {
1✔
251
        chai.request(thx.app)
1✔
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);
1✔
257
                expect(res.text).to.be.a('string');
1✔
258
                expect(res.text).to.equal('{"success":false,"response":"owner_missing"}');
1✔
259
                done();
1✔
260
            });
261
    }, 30000);
262

263
    it("POST /api/v2/transfer/decline (jwt, invalid) 2", function (done) {
1✔
264
        chai.request(thx.app)
1✔
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);
1✔
270
                expect(res.text).to.be.a('string');
1✔
271
                expect(res.text).to.equal('{"success":false,"response":"udids_missing"}');
1✔
272
                done();
1✔
273
            });
274
    }, 30000);
275

276
    it("GET /api/v2/transfer/decline (jwt, invalid) 2", function (done) {
1✔
277
        chai.request(thx.app)
1✔
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);
1✔
283
                expect(res.text).to.be.a('string');
1✔
284
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
1✔
285
                done();
×
286
            });
287
    }, 30000);
288

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

301
    it("POST /api/v2/transfer/accept (jwt, invalid)", function (done) {
1✔
302
        chai.request(thx.app)
1✔
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);
1✔
308
                expect(res.text).to.be.a('string');
1✔
309
                expect(res.text).to.equal('{"success":false,"response":"owner_missing"}');
1✔
310
                done();
1✔
311
            });
312
    }, 30000);
313

314
    it("POST /api/v2/transfer/accept (jwt, invalid) 2", function (done) {
1✔
315
        chai.request(thx.app)
1✔
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);
1✔
321
                expect(res.text).to.be.a('string');
1✔
322
                expect(res.text).to.equal('{"success":false,"response":"udids_missing"}');
1✔
323
                done();
1✔
324
            });
325
    }, 30000);
326

327
    it("POST /api/v2/transfer/accept III", function (done) {
1✔
328
        chai.request(thx.app)
1✔
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);
1✔
334
                expect(res.text).to.be.a('string');
1✔
335
                done();
1✔
336
            });
337
    }, 30000);
338

339
    it("POST /api/v2/transfer/decline IV", function (done) {
1✔
340
        chai.request(thx.app)
1✔
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);
1✔
346
                expect(res.text).to.be.a('string');
1✔
347
                expect(res.text).to.equal('{"success":true,"response":"decline_complete_no_such_dtid"}');
1✔
348
                // returns HTML
349
                done();
1✔
350
            });
351
    }, 30000);
352

353
    it("GET /api/v2/transfer/decline V", function (done) {
1✔
354
        chai.request(thx.app)
1✔
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);
1✔
360
                expect(res.text).to.be.a('string');
1✔
361
                expect(res.text).to.equal('{"success":false,"response":"missing_transfer_id"}');
1✔
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)
1✔
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);
1✔
374
                expect(res.text).to.be.a('string');
1✔
375
                expect(res.text).to.equal('{"success":false,"response":"transfer_id_missing"}');
1✔
376
                done();
1✔
377
            });
378
    }, 30000);
379

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