For the metric-imperial-converter I can pass all of the user stories other than the last two:
- All 16 unit tests are complete and passing.
- All 5 functional tests are complete and passing.
Locally (npm run dev) these all successfully pass so I am unsure why it is any different when hosted on heroku. Help appreciated.
Link to GitHub repo: GitHub - aidansabin/silver-journey-metimpconv
Heroku app: https://shielded-garden-21508.herokuapp.com/
api.js
'use strict';
const expect = require('chai').expect;
const ConvertHandler = require('../controllers/convertHandler.js');
module.exports = function (app) {
let convertHandler = new ConvertHandler();
app.route('/api/convert').get((req, res) => {
let input = req.query.input;
let initNum = convertHandler.getNum(input);
let initUnit = convertHandler.getUnit(input);
if (!initNum && !initUnit) {
res.send('invalid number and unit');
} else if (!initNum) {
res.send('invalid number');
} else if (!initUnit) {
res.send('invalid unit');
}
let returnNum = convertHandler.convert(initNum, initUnit);
let returnUnit = convertHandler.getReturnUnit(initUnit);
let string = convertHandler.getString(initNum, initUnit, returnNum, returnUnit);
if (initUnit === 'l') {
initUnit = 'L';
}
if (returnUnit === 'l') {
returnUnit = 'L';
}
res.send({ initNum: parseFloat(initNum), initUnit, returnNum: parseFloat(returnNum), returnUnit, string });
});
};
unit-tests:
const chai = require('chai');
let assert = chai.assert;
const ConvertHandler = require('../controllers/convertHandler.js');
let convertHandler = new ConvertHandler();
suite('Unit Tests', function() {
suite('Function convertHandler.getNum(input)', function() {
test('Whole number input', function(done) {
let input = '32L';
assert.equal(convertHandler.getNum(input), 32);
done();
});
test('Decimal number input', function(done) {
let input = '32.2L';
assert.equal(convertHandler.getNum(input), 32.2);
done();
});
test('Fractional input', function(done) {
let input = '3/4L';
assert.equal(convertHandler.getNum(input), 3/4);
done();
});
test('Fractional input with decimal', function(done) {
let input = '3.5/4L';
assert.equal(convertHandler.getNum(input), 3.5/4);
done();
});
test('Double fraction input', function(done) {
let input = '3/2/3L';
assert.equal(convertHandler.getNum(input), undefined);
done();
});
test('No numerical input', function(done) {
let input = 'L';
assert.equal(convertHandler.getNum(input), 1);
done();
});
});
suite('Function convertHandler.getUnit(input)', function() {
test('Valid unit input', function(done) {
let input = ['mi', 'km', 'gal', 'l', 'lbs', 'kg'];
input.forEach(val => assert.equal(convertHandler.getUnit(val), val));
done();
});
test('Invalid unit input', function(done) {
let input = '32Li';
assert.equal(convertHandler.getUnit(input), undefined);
done();
});
});
suite('Function convertHandler.getReturnUnit(initUnit)', function() {
test('Correct return unit', function(done) {
let input = ['mi', 'km', 'gal', 'l', 'lbs', 'kg'];
let result = ['km', 'mi', 'l', 'gal', 'kg', 'lbs'];
input.forEach((val, i) => assert.equal(convertHandler.getReturnUnit(val), result[i]));
done();
});
});
suite('Function convertHandler.spellOutUnit(unit)', function() {
test('Correct spelled-out string', function(done) {
let input = ['mi', 'km', 'gal', 'l', 'lbs', 'kg'];
let result = ['miles', 'kilometers', 'gallons', 'liters', 'pounds', 'kilograms'];
input.forEach((val, i) => assert.equal(convertHandler.spellOutUnit(val), result[i]));
done();
});
});
suite('Function convertHandler.convert(initNum, initUnit)', function() {
test('Convert gal to L', function(done) {
let input = ['32', 'gal'];
assert.equal(convertHandler.convert(input[0], input[1]), 121.13312);
done();
});
test('Convert L to gal', function(done) {
let input = ['32', 'l'];
assert.equal(convertHandler.convert(input[0], input[1]), 8.45351);
done();
});
test('Convert mi to km', function(done) {
let input = ['32', 'mi'];
assert.equal(convertHandler.convert(input[0], input[1]), 51.49888);
done();
});
test('Convert km to mi', function(done) {
let input = ['32', 'km'];
assert.equal(convertHandler.convert(input[0], input[1]), 19.88393);
done();
});
test('Convert lbs to kg', function(done) {
let input = ['32', 'lbs'];
assert.equal(convertHandler.convert(input[0], input[1]), 14.51494);
done();
});
test('Convert kg to lbs', function(done) {
let input = ['32', 'kg'];
assert.equal(convertHandler.convert(input[0], input[1]), 70.54798);
done();
});
})
});
functional tests:
const chaiHttp = require('chai-http');
const chai = require('chai');
let assert = chai.assert;
const server = require('../server');
chai.use(chaiHttp);
suite('Functional Tests', function() {
test('Convert 10L (valid input)', function(done) {
chai
.request(server)
.get('/api/convert')
.query({ input: '10L' })
.end((err, res) => {
assert.equal(res.status, 200);
assert.equal(res.body.initNum, 10);
assert.equal(res.body.initUnit, 'L');
assert.equal(res.body.returnNum, 2.64172);
assert.equal(res.body.returnUnit, 'gal');
done();
});
});
test('Convert 32g (invalid input)', function(done) {
chai
.request(server)
.get('/api/convert')
.query({ input: '32g' })
.end((err, res) => {
assert.equal(res.status, 200);
assert.equal(res.body.initUnit, undefined);
done();
});
});
test('Convert 3/7.2/4kg (invalid input)', function(done) {
chai
.request(server)
.get('/api/convert')
.query({ input: '3/7.2/4kg' })
.end((err, res) => {
assert.equal(res.status, 200);
assert.equal(res.body.initNum, undefined);
done();
});
});
test('Convert 3/7.2/4g (invalid number and unit)', function(done) {
chai
.request(server)
.get('/api/convert')
.query({ input: '3/7.2/4g' })
.end((err, res) => {
assert.equal(res.status, 200);
assert.equal(res.body.initNum, undefined);
assert.equal(res.body.initUnit, undefined);
done();
});
});
test('Convert kg (no number input)', function(done) {
chai
.request(server)
.get('/api/convert')
.query({ input: 'kg' })
.end((err, res) => {
assert.equal(res.status, 200);
assert.equal(res.body.initNum, 1);
assert.equal(res.body.initUnit, 'kg');
done();
});
});
});
convertHandler.js
function ConvertHandler() {
const unitPhrases = {
"mi": "miles",
"km": "kilometers",
"gal": "gallons",
"l": "liters",
"kg": "kilograms",
"lbs": "pounds"
}
const unitPairs = {
"mi": "km",
"km": "mi",
"gal": "l",
"l": "gal",
"kg": "lbs",
"lbs": "kg"
}
this.checkFraction = function(input) {
if (input[0].split('/').length === 2) {
return true;
} else if (input[0].split('/').length > 2) {
return undefined;
} else {
return false;
}
}
this.getNum = function(input) {
let result = input.match(/[.\d\/]+/g) || ['1'];
if (this.checkFraction(result) === undefined) {
return undefined;
} else if (this.checkFraction(result)) {
let fraction = result[0].split('/');
return fraction[0] / fraction[1];
} else {
return result[0];
}
};
this.getUnit = function(input) {
let result = input.match(/[a-z]+/ig);
if (unitPhrases.hasOwnProperty(result[0].toLowerCase())) {
return result[0].toLowerCase();
} else {
return undefined;
}
};
this.getReturnUnit = function(initUnit) {
let result = unitPairs[initUnit];
return result;
};
this.spellOutUnit = function(unit) {
let result = unitPhrases[unit];
return result;
};
this.convert = function(initNum, initUnit) {
const galToL = 3.78541;
const lbsToKg = 0.453592;
const miToKm = 1.60934;
let result;
switch(initUnit.toString()) {
case "gal":
result = initNum * galToL;
break;
case "l":
result = initNum / galToL;
break;
case "lbs":
result = initNum * lbsToKg;
break;
case "kg":
result = initNum / lbsToKg;
break;
case "mi":
result = initNum * miToKm;
break;
case "km":
result = initNum / miToKm;
break;
}
return result.toFixed(5);
};
this.getString = function(initNum, initUnit, returnNum, returnUnit) {
let result = initNum + " " + this.spellOutUnit(initUnit) + " converts to " + returnNum + " " + this.spellOutUnit(returnUnit);
return result;
};
}
module.exports = ConvertHandler;