'use strict'; const Joi = require('joi'); const ServiceTester = require('../service-tester'); const { isIntegerPercentage, } = require('../test-validators'); const t = new ServiceTester({ id: 'codeclimate', title: 'Code Climate' }) // Tests based on Code Climate's test reports endpoint. t.create('test coverage percentage') .get('/c/jekyll/jekyll.json') .expectJSONTypes(Joi.object().keys({ name: 'coverage', value: isIntegerPercentage })); t.create('test coverage percentage alternative coverage URL') .get('/coverage/jekyll/jekyll.json') .expectJSONTypes(Joi.object().keys({ name: 'coverage', value: isIntegerPercentage })); t.create('test coverage percentage alternative top-level URL') .get('/jekyll/jekyll.json') .expectJSONTypes(Joi.object().keys({ name: 'coverage', value: isIntegerPercentage })); t.create('test coverage letter') .get('/c-letter/jekyll/jekyll.json') .expectJSONTypes(Joi.object().keys({ name: 'coverage', value: Joi.equal('A', 'B', 'C', 'D', 'E', 'F') })); t.create('test coverage percentage for non-existent repo') .get('/c/unknown/unknown.json') .expectJSON({ name: 'coverage', value: 'not found' }); t.create('test coverage percentage for repo without test reports') .get('/c/angular/angular.js.json') .expectJSON({ name: 'coverage', value: 'unknown' }); // Tests based on Code Climate's snapshots endpoint. t.create('issues count') .get('/issues/angular/angular.js.json') .expectJSONTypes(Joi.object().keys({ name: 'issues', value: Joi.number().integer().positive() })); t.create('technical debt percentage') .get('/tech-debt/angular/angular.js.json') .expectJSONTypes(Joi.object().keys({ name: 'technical debt', value: isIntegerPercentage })); t.create('maintainability percentage') .get('/maintainability-percentage/angular/angular.js.json') .expectJSONTypes(Joi.object().keys({ name: 'maintainability', value: isIntegerPercentage })); t.create('maintainability letter') .get('/maintainability/angular/angular.js.json') .expectJSONTypes(Joi.object().keys({ name: 'maintainability', value: Joi.equal('A', 'B', 'C', 'D', 'E', 'F') })); t.create('maintainability letter for non-existent repo') .get('/maintainability/unknown/unknown.json') .expectJSON({ name: 'maintainability', value: 'not found' }); t.create('maintainability letter for repo without snapshots') .get('/maintainability/kabisaict/flow.json') .expectJSON({ name: 'maintainability', value: 'unknown' }); t.create('malformed response for outer user repos query') .get('/maintainability/angular/angular.js.json') .intercept(nock => nock('https://api.codeclimate.com') .get('/v1/repos?github_slug=angular/angular.js') .reply(200, { data: [{}] // No relationships in the list of data elements. })) .expectJSON({ name: 'maintainability', value: 'invalid' }); t.create('malformed response for inner specific repo query') .get('/maintainability/angular/angular.js.json') .intercept(nock => nock('https://api.codeclimate.com', {allowUnmocked: true}) .get('/v1/repos/526933117e00a40567008444/snapshots/5ab4427859c16c0001003cad') .reply(200, {})) // No data. .networkOn() // Combined with allowUnmocked: true, this allows the outer user repos query to go through. .expectJSON({ name: 'maintainability', value: 'invalid' }); module.exports = t;