UNPKG

4 kBJavaScriptView Raw
1(function (request, Joi, Promise, util, logger) {
2 'use strict';
3
4 var optionsValidation = Joi.object({
5 endpoint: Joi.string().min(1).optional().example('https://api.codacy.com/2.0/coverage/:commitId/:language')
6 });
7 var tokenValidation = Joi.string().required().min(1).example('1234567890');//TODO: Revisit this validation to see if we can better validate the values
8 var commitIdValidation = Joi.string().required().min(1).example('1234567890'); //TODO: Revisit this validation to see if we can better validate the values
9 var coverageDataValidation = Joi.object({
10 total: Joi.number().integer().required().min(0).max(100),
11 fileReports: Joi.array().required().items(Joi.object({
12 filename: Joi.string().required().min(1),
13 total: Joi.number().integer().required().min(0).max(100),
14 coverage: Joi.object().pattern(/\d/, Joi.number().integer().min(1))
15 }).required())
16 }).example({total: 50, fileReports: [{filename: 'filename', total: 10, coverage: {1: 1, 2: 3}}]});
17
18 module.exports = function (options) {
19 logger.trace(util.format('Creating reporter for %j', options));
20 var optionsValid = Joi.validate(options, optionsValidation, {
21 stripUnknown: true
22 });
23
24 if (optionsValid.error) {
25 logger.error(optionsValid.error);
26 throw optionsValid.error;
27 }
28
29 var endpoint = options.endpoint || 'https://api.codacy.com/2.0/coverage/:commitId/javascript';
30 logger.debug('Setting up reporter communicating to: ' + endpoint);
31
32 return {
33 sendCoverage: function sendCoverage(token, commitId, data) {
34 return new Promise(function (resolve, reject) {
35 logger.trace(util.format('Sending Coverage for token [%s] and commitId [%s]', token, commitId));
36 var tokenValid = Joi.validate(token, tokenValidation);
37 var commitIdValid = Joi.validate(commitId, commitIdValidation);
38 var dataValid = Joi.validate(data, coverageDataValidation, {
39 stripUnknown: true
40 });
41 var validationErr = tokenValid.error || commitIdValid.error || dataValid.error;
42
43 if (validationErr) {
44 logger.error(validationErr);
45 return reject(validationErr);
46 }
47
48 var url = endpoint.replace(':commitId', commitId);
49 logger.trace(util.format('Sending POST to %s', url));
50
51 return request({
52 url: url,
53 method: 'POST',
54 json: data,
55 headers: {
56 // jscs:disable
57 'project_token': token
58 // jscs:enable
59 },
60 resolveWithFullResponse: true
61 }).then(function (res) {
62 if (res.statusCode !== 200) {
63 var err = new Error(util.format('Expected Status Code of 200, but got [%s]', res.statusCode));
64 logger.error(util.format('Status Code [%s] - Error [%j]', res.statusCode, res.error));
65 return reject(err);
66 }
67 logger.debug('Successfully sent coverage data');
68 resolve();
69 }, function (res) {
70 var err = new Error(util.format('Expected Successful Status Code, but got [%s]', res.statusCode));
71 logger.error(util.format('Status Code [%s] - Error [%j]', res.statusCode, res.error));
72 reject(err);
73 });
74 });
75 }
76 };
77 };
78}(require('request-promise'), require('joi'), require('bluebird'), require('util'), require('./logger')()));