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

suculent / thinx-device-api / #252646148

07 May 2025 09:25PM UTC coverage: 59.0% (-13.0%) from 72.046%
#252646148

push

suculent
overridden vulnerable cookies and deprecated superagent

1504 of 3464 branches covered (43.42%)

Branch coverage included in aggregate %.

6700 of 10441 relevant lines covered (64.17%)

5.7 hits per line

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

31.82
/spec/jasmine/ZZ-RouterTransformerSpec.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
var envi = require("../_envi.json");
1✔
11

12
let thx;
13

14
//
15
// Authenticated
16
//
17

18
describe("Transformer (JWT)", function () {
1✔
19

20
  let agent;
21
  let jwt;
22

23
  beforeAll((done) => {
1✔
24
    console.log(`🚸 [chai] >>> running Transformer (JWT) spec`);
1✔
25
    thx = new THiNX();
1✔
26
    thx.init(() => {
1✔
27
      agent = chai.request.agent(thx.app);
2✔
28
      agent
2✔
29
        .post('/api/login')
30
        .send({ username: 'dynamic', password: 'dynamic', remember: false })
31
        .then(function (res) {
32
          let body = JSON.parse(res.text);
×
33
          jwt = 'Bearer ' + body.access_token;
×
34
          done();
×
35
        })
36
        .catch((e) => { console.log(e); });
×
37
    });
38
  });
39

40
  afterAll((done) => {
1✔
41
    agent.close();
1✔
42
    console.log(`🚸 [chai] <<< completed Transfer (JWT) spec`);
1✔
43
    done();
1✔
44
  });
45

46
  var created_api_key = null;
1✔
47

48
  var JRS7 = {
1✔
49
    mac: "77:77:77:77:77:77",
50
    firmware: "ZZ-RouterDeviceSpec.js",
51
    version: "1.0.0",
52
    alias: "test-device-7-dynamic",
53
    owner: envi.dynamic.owner,
54
    platform: "arduino"
55
  };
56

57
   it("POST /api/transformer/run (noauth)", function (done) {
1✔
58
    chai.request(thx.app)
×
59
      .post('/api/transformer/run')
60
      .send({})
61
      .end((_err, res) => {
62
        expect(res.status).to.equal(401);
×
63
        done();
×
64
      });
65
  }, 30000);
66

67
  // create
68
  it("POST /api/user/apikey (JWT T1)", function (done) {
1✔
69
    chai.request(thx.app)
×
70
      .post('/api/user/apikey')
71
      .set('Authorization', jwt)
72
      .send({
73
        'alias': 'transformer-apikey-alias'
74
      })
75
      .end((_err, res) => {
76
        //  {"success":true,"api_key":"9b7bd4f4eacf63d8453b32dbe982eea1fb8bbc4fc8e3bcccf2fc998f96138629","hash":"0a920b2e99a917a04d7961a28b49d05524d10cd8bdc2356c026cfc1c280ca22c"}
77
        expect(res.status).to.equal(200);
×
78
        let j = JSON.parse(res.text);
×
79
        expect(j.success).to.equal(true);
×
80
        expect(j.response.api_key).to.be.a('string');
×
81
        expect(j.response.hash).to.be.a('string');
×
82
        created_api_key = j.response.hash;
×
83
        done();
×
84
      });
85
  }, 30000);
86

87
  it("POST /device/register (jwt, valid)", function (done) {
1✔
88

89
    chai.request(thx.app)
×
90
      .post('/device/register')
91
      .set('Authentication', created_api_key)
92
      .send({ registration: JRS7 })
93
      .end((_err, res) => {
94
        expect(res.status).to.equal(200);
×
95
        let r = JSON.parse(res.text);
×
96
        JRS7.udid = r.registration.udid;
×
97
        // TODO: Store UDID!
98
        expect(res.text).to.be.a('string');
×
99
        done();
×
100
      });
101
  }, 30000);
102

103
  it("POST /api/device/edit", function (done) {
1✔
104
    agent
×
105
      .post('/api/device/edit')
106
      .set('Authorization', jwt)
107
      .send({ changes: { info: { transformers: envi.dynamic.transformers } } })
108
      .end((_err, res) => {
109
        expect(res.status).to.equal(200);
×
110
        expect(res.text).to.be.a('string');
×
111
        expect(res.text).to.equal('{"success":false,"response":"changes.udid_undefined"}');
×
112
        done();
×
113
      });
114
  }, 30000);
115

116
  it("POST /api/device/edit", function (done) {
1✔
117
    agent
×
118
      .post('/api/device/edit')
119
      .set('Authorization', jwt)
120
      .send({ changes: { info: { transformers: envi.dynamic.transformers }, udid: JRS7.udid } })
121
      .end((_err, res) => {
122
        expect(res.status).to.equal(200);
×
123
        expect(res.text).to.be.a('string');
×
124
        let j = JSON.parse(res.text);
×
125
        expect(j.success).to.equal(true);
×
126
        console.log("🚸 [chai] POST /api/device/edit response", JSON.stringify(j));
×
127
        // {"success":true,"message":{"success":true,"change":{"transformers":[{"ufid":"vt:b688d51871191b9f645678b10ce70ec23704ef5c549019b8beeaec9939401756","alias":"Empty","body":"var transformer = function(status, device) { return status };"}],"udid":"64984150-b771-11ec-bf10-f505ba97f5e2","doc":null,"value":null}}} 
128
        done();
×
129
      });
130
  }, 30000);
131

132
  it("POST /api/transformer/run (JWT, invalid)", function (done) {
1✔
133
    agent
×
134
      .post('/api/transformer/run')
135
      .set('Authorization', jwt)
136
      .send({})
137
      .end((_err, res) => {
138
        expect(res.text).to.equal('{"success":false,"response":"udid_not_found"}');
×
139
        expect(res.status).to.equal(200);
×
140
        done();
×
141
      });
142
  }, 30000);
143

144
  it("POST /api/transformer/run (JWT, semi-valid)", function (done) {
1✔
145
    agent
×
146
      .post('/api/transformer/run')
147
      .set('Authorization', jwt)
148
      .send({ device_id: envi.dynamic.udid })
149
      .end((_err, res) => {
150
        expect(res.status).to.equal(200);
×
151
        expect(res.text).to.be.a('string');
×
152
        expect(res.text).to.equal('{"success":false,"response":"no_such_device"}');
×
153
        done();
×
154
      });
155
  }, 30000);
156

157
  it("POST /api/transformer/run (JWT, valid, trans)", function (done) {
1✔
158

159
    agent
×
160
      .get('/api/user/devices')
161
      .set('Authorization', jwt)
162
      .end((_err, res) => {
163
        let r = JSON.parse(res.text);
×
164

165
        /* {
166
            "success": true,
167
            "response": [
168
              {
169
                "alias": "****-device-5-dynamic",
170
                "auto_update": false,
171
                "category": "grey-mint",
172
                "checksum": null,
173
                "commit": "Unknown",
174
                "description": "new device",
175
                "environment": {},
176
                "env_hash": null,
177
                "firmware": "ZZ-RouterDeviceSpec.js",
178
                "icon": "01",
179
                "lastupdate": "2022-04-08T15:05:22.153Z",
180
                "lat": 0,
181
                "lon": 0,
182
                "mac": "55:55:55:55:55:55",
183
                "mesh_ids": [],
184
                "owner": "bab692f8c9c78cf64f579406bdf6c6cd2c4d00b3c0c8390387d051495dd95247",
185
                "platform": "arduino",
186
                "rssi": " ",
187
                "snr": " ",
188
                "source": null,
189
                "station": " ",
190
                "status": " ",
191
                "tags": [],
192
                "timezone_abbr": "UTC",
193
                "timezone_offset": 0,
194
                "transformers": [],
195
                "udid": "4fd4e580-b74d-11ec-9ecb-3f8befeb85e6",
196
                "version": "1.0.0"
197
              }
198
            ]
199
          }
200
          */
201

202
        // skip run until device is available; coverage will grow but it should not fail
203
        if (r.response.length == 0) return done();
×
204

205
        let udid = r.response[0].udid; // or JRS7.udid
×
206

207
        console.log("Running transformer with device", udid);
×
208

209
        expect(res.status).to.equal(200);
×
210
        expect(res.text).to.be.a('string');
×
211

212
        agent
×
213
          .post('/api/transformer/run')
214
          .set('Authorization', jwt)
215
          .send({ device_id: udid })
216
          .end((__err, __res) => {
217
            let j = JSON.parse(__res.text);
×
218
            expect(j.success).to.equal(true);
×
219
            expect(__res.status).to.equal(200);
×
220
            // {"success":true,"response":{"registration":{"success":true,"status":"OK","auto_update":false,"owner":"bab692f8c9c78cf64f579406bdf6c6cd2c4d00b3c0c8390387d051495dd95247","alias":"****-device-6-dynamic","mesh_ids":[],"udid":"2cca5eb0-cee7-11ec-bf6e-6f0d4bd71a6a","timestamp":1652025293}}}
221
            //
222
            done();
×
223
          });
224
      });
225

226
  }, 30000);
227

228
  it("POST /api/user/delete (jwt, last action)", function (done) {
1✔
229
    chai.request(thx.app)
×
230
      .post('/api/user/delete')
231
      .set('Authorization', jwt)
232
      .send({ owner: envi.dynamic.owner })
233
      .end((_err, res) => {
234
        expect(res.status).to.equal(200);
×
235
        expect(res.text).to.equal('{"success":true,"response":"deleted"}');
×
236
        done();
×
237
      });
238
  }, 30000);
239

240
});
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