Skip to content

Commit d08f9f3

Browse files
committed
Add reports tests
1 parent 2fd32ce commit d08f9f3

File tree

4 files changed

+601
-3
lines changed

4 files changed

+601
-3
lines changed

src/routes/projectReports/getEmbedReport.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ module.exports = [
1414
permissions('projectReporting.view'),
1515
async (req, res, next) => {
1616
const projectId = Number(req.params.projectId);
17-
const mockReport = config.lookerConfig.USE_MOCK === 'true';
17+
const mockReport = config.get('lookerConfig.USE_MOCK') === 'true';
1818
let reportName = mockReport ? 'mock' : req.query.reportName;
1919
const authUser = req.authUser;
2020
let REPORTS = null;
2121
let allowedUsers = null;
2222
try {
2323
allowedUsers = JSON.parse(_.get(config, 'lookerConfig.ALLOWED_USERS', '[]'));
2424
req.log.trace(allowedUsers, 'allowedUsers');
25-
REPORTS = JSON.parse(config.lookerConfig.EMBED_REPORTS_MAPPING);
25+
REPORTS = JSON.parse(config.get('lookerConfig.EMBED_REPORTS_MAPPING'));
2626
} catch (error) {
2727
req.log.error(error);
2828
req.log.debug('Invalid reports mapping. Should be a valid JSON.');
Lines changed: 289 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,289 @@
1+
import chai from 'chai';
2+
import sinon from 'sinon';
3+
import request from 'supertest';
4+
import config from 'config';
5+
import models from '../../models';
6+
import server from '../../app';
7+
import testUtil from '../../tests/util';
8+
import util from '../../util';
9+
import lookerSerivce from '../../services/lookerService';
10+
11+
const should = chai.should();
12+
13+
describe('GET embed report', () => {
14+
let project0;
15+
let project1;
16+
beforeEach((done) => {
17+
testUtil.clearDb()
18+
.then(() => models.Project.create({
19+
type: 'generic',
20+
directProjectId: 0,
21+
billingAccountId: 0,
22+
name: 'test0',
23+
description: 'test project0',
24+
status: 'reviewed',
25+
details: {},
26+
createdBy: 1,
27+
updatedBy: 1,
28+
lastActivityAt: 1,
29+
lastActivityUserId: '1',
30+
}))
31+
.then((p0) => {
32+
project0 = p0;
33+
return models.ProjectMember.create({
34+
userId: 40051331,
35+
projectId: project0.id,
36+
role: 'customer',
37+
isPrimary: true,
38+
createdBy: 1,
39+
updatedBy: 1,
40+
});
41+
})
42+
.then(() => models.ProjectTemplate.create({
43+
name: 'template 2',
44+
key: 'key 2',
45+
category: 'concrete',
46+
icon: 'http://example.com/icon1.ico',
47+
question: 'question 2',
48+
info: 'info 2',
49+
aliases: ['key-2', 'key_2'],
50+
scope: {},
51+
phases: {},
52+
createdBy: 1,
53+
updatedBy: 2,
54+
}))
55+
.then(temp => models.Project.create({
56+
type: 'generic',
57+
directProjectId: 1,
58+
billingAccountId: 1,
59+
name: 'test1',
60+
description: 'test project1',
61+
status: 'reviewed',
62+
details: {},
63+
createdBy: 1,
64+
updatedBy: 1,
65+
lastActivityAt: 1,
66+
templateId: temp.id,
67+
lastActivityUserId: '1',
68+
}))
69+
.then((p) => {
70+
project1 = p;
71+
// create members
72+
return models.ProjectMember.create({
73+
userId: 40051332,
74+
projectId: project1.id,
75+
role: 'copilot',
76+
isPrimary: true,
77+
createdBy: 1,
78+
updatedBy: 1,
79+
});
80+
})
81+
.then(() => models.ProjectMember.create({
82+
userId: 40051334,
83+
projectId: project1.id,
84+
role: 'manager',
85+
isPrimary: true,
86+
createdBy: 1,
87+
updatedBy: 1,
88+
}))
89+
.then(() => models.ProjectMember.create({
90+
userId: 40051331,
91+
projectId: project1.id,
92+
role: 'customer',
93+
isPrimary: true,
94+
createdBy: 1,
95+
updatedBy: 1,
96+
}))
97+
.then(() => {
98+
done();
99+
});
100+
});
101+
102+
after((done) => {
103+
testUtil.clearDb(done);
104+
});
105+
106+
describe('GET /projects/{id}/reports/embed', () => {
107+
let sandbox;
108+
beforeEach(() => {
109+
sandbox = sinon.sandbox.create();
110+
});
111+
afterEach(() => {
112+
sandbox.restore();
113+
});
114+
115+
it('should return 403 if user does not have permissions', (done) => {
116+
request(server)
117+
.get(`/v5/projects/${project1.id}/reports/embed`)
118+
.set({
119+
Authorization: `Bearer ${testUtil.jwts.member2}`,
120+
})
121+
.expect('Content-Type', /json/)
122+
.expect(403, done);
123+
});
124+
125+
it('should return 403 if project not exist', (done) => {
126+
request(server)
127+
.get('/v5/projects/100100/reports/embed')
128+
.set({
129+
Authorization: `Bearer ${testUtil.jwts.member}`,
130+
})
131+
.expect('Content-Type', /json/)
132+
.expect(403, done);
133+
});
134+
135+
it('should return 404 when report name not mock and not in EMBED_REPORTS_MAPPING', (done) => {
136+
const cfg = sinon.stub(config, 'get');
137+
cfg.withArgs('lookerConfig.USE_MOCK').returns(false);
138+
request(server)
139+
.get(`/v5/projects/${project1.id}/reports/embed?reportName=random`)
140+
.set({
141+
Authorization: `Bearer ${testUtil.jwts.member}`,
142+
})
143+
.expect('Content-Type', /json/)
144+
.expect(404, () => {
145+
cfg.restore();
146+
done();
147+
});
148+
});
149+
150+
it('should return 500 when get admin user error', (done) => {
151+
const cfg = sinon.stub(config, 'get');
152+
const gem = sinon.stub(lookerSerivce, 'generateEmbedUrl', () => 'generatedUrl');
153+
cfg.withArgs('lookerConfig.USE_MOCK').returns(false);
154+
request(server)
155+
.get(`/v5/projects/${project1.id}/reports/embed?reportName=mock`)
156+
.set({
157+
Authorization: `Bearer ${testUtil.jwts.admin}`,
158+
})
159+
.expect(500, () => {
160+
gem.restore();
161+
cfg.restore();
162+
done();
163+
});
164+
});
165+
166+
it('should return 404 when the project template is not found', (done) => {
167+
const cfg = sinon.stub(config, 'get');
168+
const gem = sinon.stub(lookerSerivce, 'generateEmbedUrl', () => 'generatedUrl');
169+
cfg.withArgs('lookerConfig.USE_MOCK').returns(false);
170+
cfg.withArgs('lookerConfig.EMBED_REPORTS_MAPPING').returns('{"mock-concrete-customer": "/embed/looks/2"}');
171+
request(server)
172+
.get(`/v5/projects/${project0.id}/reports/embed?reportName=mock`)
173+
.set({
174+
Authorization: `Bearer ${testUtil.jwts.member}`,
175+
})
176+
.expect('Content-Type', /json/)
177+
.expect(404, () => {
178+
gem.restore();
179+
cfg.restore();
180+
done();
181+
});
182+
});
183+
184+
it('should return generate customer url', (done) => {
185+
const cfg = sinon.stub(config, 'get');
186+
const gem = sinon.stub(lookerSerivce, 'generateEmbedUrl', () => 'generatedUrl');
187+
cfg.withArgs('lookerConfig.USE_MOCK').returns(false);
188+
cfg.withArgs('lookerConfig.EMBED_REPORTS_MAPPING')
189+
.returns('{"mock-concrete-customer": "/customer/embed/looks/2"}');
190+
request(server)
191+
.get(`/v5/projects/${project1.id}/reports/embed?reportName=mock`)
192+
.set({
193+
Authorization: `Bearer ${testUtil.jwts.member}`,
194+
})
195+
.expect('Content-Type', /json/)
196+
.expect(200)
197+
.end((err, res) => {
198+
gem.restore();
199+
cfg.restore();
200+
if (err) {
201+
done(err);
202+
} else {
203+
const resJson = res.body;
204+
should.exist(resJson);
205+
resJson.should.equal('generatedUrl');
206+
const [user, project, member, embedUrl] = gem.lastCall.args;
207+
user.userId.should.equal(40051331);
208+
project.should.deep.equal({ id: project1.id });
209+
member.userId.should.equal(40051331);
210+
member.role.should.equal('customer');
211+
embedUrl.should.equal('/customer/embed/looks/2');
212+
done();
213+
}
214+
});
215+
});
216+
217+
it('should return generate admin url', (done) => {
218+
const cfg = sinon.stub(config, 'get');
219+
const gem = sinon.stub(lookerSerivce, 'generateEmbedUrl', () => 'generatedUrl');
220+
const getAdmin = sinon.stub(util, 'getTopcoderUser', () => ({
221+
firstName: 'fn',
222+
lastName: 'ln',
223+
userId: 40051333,
224+
}));
225+
cfg.withArgs('lookerConfig.USE_MOCK').returns(false);
226+
cfg.withArgs('lookerConfig.EMBED_REPORTS_MAPPING').returns('{"mock-concrete-topcoder": "/admin/embed/looks/2"}');
227+
request(server)
228+
.get(`/v5/projects/${project1.id}/reports/embed?reportName=mock`)
229+
.set({
230+
Authorization: `Bearer ${testUtil.jwts.admin}`,
231+
})
232+
.expect('Content-Type', /json/)
233+
.expect(200)
234+
.end((err, res) => {
235+
getAdmin.restore();
236+
gem.restore();
237+
cfg.restore();
238+
if (err) {
239+
done(err);
240+
} else {
241+
const resJson = res.body;
242+
should.exist(resJson);
243+
resJson.should.equal('generatedUrl');
244+
const [user, project, member, embedUrl] = gem.lastCall.args;
245+
user.userId.should.equal(40051333);
246+
project.should.deep.equal({ id: project1.id });
247+
member.userId.should.equal(40051333);
248+
member.firstName.should.equal('fn');
249+
member.lastName.should.equal('ln');
250+
member.role.should.equal('');
251+
embedUrl.should.equal('/admin/embed/looks/2');
252+
done();
253+
}
254+
});
255+
});
256+
257+
it('should return generate copilot url', (done) => {
258+
const cfg = sinon.stub(config, 'get');
259+
const gem = sinon.stub(lookerSerivce, 'generateEmbedUrl', () => 'generatedUrl');
260+
cfg.withArgs('lookerConfig.USE_MOCK').returns(false);
261+
cfg.withArgs('lookerConfig.EMBED_REPORTS_MAPPING').returns('{"mock-concrete-copilot": "/copilot/embed/looks/2"}');
262+
request(server)
263+
.get(`/v5/projects/${project1.id}/reports/embed?reportName=mock`)
264+
.set({
265+
Authorization: `Bearer ${testUtil.jwts.copilot}`,
266+
})
267+
.expect('Content-Type', /json/)
268+
.expect(200)
269+
.end((err, res) => {
270+
gem.restore();
271+
cfg.restore();
272+
if (err) {
273+
done(err);
274+
} else {
275+
const resJson = res.body;
276+
should.exist(resJson);
277+
resJson.should.equal('generatedUrl');
278+
const [user, project, member, embedUrl] = gem.lastCall.args;
279+
user.userId.should.equal(40051332);
280+
project.should.deep.equal({ id: project1.id });
281+
member.userId.should.equal(40051332);
282+
member.role.should.equal('copilot');
283+
embedUrl.should.equal('/copilot/embed/looks/2');
284+
done();
285+
}
286+
});
287+
});
288+
});
289+
});

src/routes/projectReports/getReport.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ module.exports = [
1717
const projectId = Number(req.params.projectId);
1818
const reportName = req.query.reportName;
1919

20-
if (config.lookerConfig.USE_MOCK === 'true') {
20+
if (config.get('lookerConfig.USE_MOCK') === 'true') {
2121
req.log.info('using mock');
2222
// using mock
2323
return mock(projectId, reportName, req, res);

0 commit comments

Comments
 (0)