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

suculent / thinx-device-api / #252646960

14 Mar 2026 04:35PM UTC coverage: 52.052% (-10.0%) from 62.077%
#252646960

push

suculent
Revert test bootstrap experiments to baseline

1399 of 3653 branches covered (38.3%)

Branch coverage included in aggregate %.

27 of 40 new or added lines in 3 files covered. (67.5%)

1153 existing lines in 32 files now uncovered.

5996 of 10554 relevant lines covered (56.81%)

10.32 hits per line

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

40.0
/spec/jasmine/ZZ-RouterSourcesSpec.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
describe("Sources (noauth)", function () {
1✔
15

16
    beforeAll((done) => {
1✔
17
        console.log(`🚸 [chai] >>> running Sources (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 Sources (noauth) spec`);
1✔
26
    });
27

28
    it("GET /api/user/sources/list", function (done) {
1✔
29
        chai.request(thx.app)
×
30
            .get('/api/user/sources/list')
31
            .end((err, res) => {
32
                expect(res.status).to.equal(401);
×
33
                done();
×
34
            });
35
    }, 30000);
36

37
    it("POST /api/user/source", function (done) {
1✔
38
        chai.request(thx.app)
×
39
            .post('/api/user/source')
40
            .send({})
41
            .end((err, res) => {
42
                expect(res.status).to.equal(401);
×
43
                done();
×
44
            });
45
    }, 30000);
46

47
    it("POST /api/user/source/revoke (invalid)", function (done) {
1✔
48
        chai.request(thx.app)
×
49
            .post('/api/user/source/revoke')
50
            .send({ key_id: null })
51
            .end((err, res) => {
52
                expect(res.status).to.equal(401);
×
53
                done();
×
54
            });
55
    }, 30000);
56
});
57

58
describe("Sources (JWT)", function () {
1✔
59

60
    let agent;
61
    let jwt;
62
  
63
    beforeAll((done) => {
1✔
64
        console.log(`🚸 [chai] >>> running Sources (JWT) spec`);
1✔
65
        agent = chai.request.agent(thx.app);
1✔
66
        agent
1✔
67
            .post('/api/login')
68
            .send({ username: 'dynamic', password: 'dynamic', remember: false })
69
            .catch((e) => { console.log(e); })
×
70
            .then(function (res) {
71
                expect(res).to.have.cookie('x-thx-core');
1✔
UNCOV
72
                let body = JSON.parse(res.text);
×
UNCOV
73
                jwt = 'Bearer ' + body.access_token;
×
UNCOV
74
                done();
×
75
            });
76
    });
77
  
78
    afterAll((done) => {
1✔
79
        agent.close();
1✔
80
        if (thx && thx.server) thx.server.close();
1!
81
        console.log(`🚸 [chai] <<< completed Sources (JWT) spec`);
1✔
82
        done();
1✔
83
    });
84

85
    let source_for_revocation = null;
1✔
86

87
    let mock_source = {
1✔
88
        owner: envi.dynamic.oid,
89
        alias: "mock-source",
90
        url: "https://github.com/suculent/thinx-firmware-esp8266-pio.git",
91
        branch: "master",
92
        secret: process.env.GITHUB_SECRET
93
      };
94

95
    it("GET /api/user/sources/list (valid)", function (done) {
1✔
UNCOV
96
        chai.request(thx.app)
×
97
            .get('/api/user/sources/list')
98
            .set('Authorization', jwt)
99
            .end((err, res) => {
UNCOV
100
                console.log("[chai] GET /api/user/sources/list (valid)", res.text);
×
UNCOV
101
                expect(res.status).to.equal(200);
×
UNCOV
102
                let j = JSON.parse(res.text);
×
UNCOV
103
                expect(j.success).to.equal(true);
×
UNCOV
104
                expect(j.response).to.be.an('object');
×
UNCOV
105
                done();
×
106
            });
107
    }, 30000);
108

109

110
    it("GET /api/v2/source", function (done) {
1✔
UNCOV
111
        chai.request(thx.app)
×
112
            .get('/api/v2/source')
113
            .set('Authorization', jwt)
114
            .end((err, res) => {
UNCOV
115
                console.log("[chai] GET /api/v2/source", res.text);
×
UNCOV
116
                expect(res.status).to.equal(200);
×
UNCOV
117
                let j = JSON.parse(res.text);
×
UNCOV
118
                expect(j.success).to.equal(true);
×
UNCOV
119
                expect(j.response).to.be.an('object');
×
UNCOV
120
                done();
×
121
            });
122
    }, 30000);
123

124
    it("POST /api/user/source (invalid)", function (done) {
1✔
UNCOV
125
        chai.request(thx.app)
×
126
            .post('/api/user/source')
127
            .set('Authorization', jwt)
128
            .send({})
129
            .end((err, res) => {
UNCOV
130
                expect(res.status).to.equal(200);
×
UNCOV
131
                expect(res.text).to.equal('{"success":false,"response":"missing_source_alias"}');
×
UNCOV
132
                done();
×
133
            });
134
    }, 30000);
135

136
    it("POST /api/user/source (semi-valid, does not fetch)", function (done) {
1✔
UNCOV
137
        chai.request(thx.app)
×
138
            .post('/api/user/source')
139
            .set('Authorization', jwt)
140
            .send(mock_source)
141
            .end((err, res) => {
UNCOV
142
                console.log("[chai] POST /api/user/source (semi-valid, does not fetch) response:", res.text);
×
UNCOV
143
                expect(res.text).to.be.a('string');
×
UNCOV
144
                let r = JSON.parse(res.text);
×
UNCOV
145
                expect(res.status).to.equal(200);
×
UNCOV
146
                expect(r.success).to.equal(true);
×
UNCOV
147
                done();
×
148
            });
149
    }, 30000);
150

151
    it("PUT /api/v2/source (semi-valid, does not fetch)", function (done) {
1✔
UNCOV
152
        chai.request(thx.app)
×
153
            .put('/api/v2/source')
154
            .set('Authorization', jwt)
155
            .send(mock_source)
156
            .end((err, res) => {
UNCOV
157
                console.log("[chai] PUT /api/v2/source (semi-valid, does not fetch) response:", res.text);
×
UNCOV
158
                expect(res.text).to.be.a('string');
×
UNCOV
159
                let r = JSON.parse(res.text);
×
UNCOV
160
                expect(res.status).to.equal(200);
×
UNCOV
161
                expect(r.success).to.equal(true);
×
UNCOV
162
                done();
×
163
            });
164
    }, 30000);
165

166
    it("POST /api/user/source/revoke", function (done) {
1✔
UNCOV
167
        expect(source_for_revocation !== 0);
×
UNCOV
168
        chai.request(thx.app)
×
169
            .post('/api/user/source/revoke')
170
            .set('Authorization', jwt)
171
            .send({ source_id: null })
172
            .end((err, res) => {
UNCOV
173
                expect(res.status).to.equal(200);
×
UNCOV
174
                expect(res.text).to.equal('{"success":false,"response":"missing_source_ids"}');
×
UNCOV
175
                done();
×
176
            });
177
    }, 30000);
178

179
    it("POST /api/user/source/revoke (valid)", function (done) {
1✔
UNCOV
180
        chai.request(thx.app)
×
181
            .post('/api/user/source/revoke')
182
            .set('Authorization', jwt)
183
            .send({ source_ids: source_for_revocation })
184
            .end((err, res) => {
UNCOV
185
                expect(res.status).to.equal(200);
×
UNCOV
186
                expect(res.text).to.equal('{"success":true,"source_ids":[]}');
×
UNCOV
187
                done();
×
188
            });
189
    }, 30000);
190

191
    it("DELETE /api/user/source/revoke (valid)", function (done) {
1✔
UNCOV
192
        chai.request(thx.app)
×
193
            .delete('/api/v2/source')
194
            .set('Authorization', jwt)
195
            .send({ source_ids: source_for_revocation })
196
            .end((err, res) => {
UNCOV
197
                console.log("🚸 [chai] DELETE /api/v2/source response:", res.text, res.status);
×
UNCOV
198
                expect(res.status).to.equal(200);
×
199
                // expect(res.text).to.equal('{"success":true,"source_ids":[]}'); already deleted
UNCOV
200
                done();
×
201
            });
202
    }, 30000);
203
});
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc