// Configure Mocha, telling both it and chai to use BDD-style tests. mocha.setup("tdd"); var assert = chai.assert; let repository = { "200": { "offer-id": 200, "percentage": 15 }, "400": { "offer-id": 400, "percentage": 22 } }; class IResponse { constructor(data) { this.data = data; } then(fn) { //todo } fail(fn) { //todo } response() { return this.data; } } //do class SuccesfullResponse extends IResponse { then(fn) { return fn(this); } fail(fn) { return this; } } //do not class ErrorResponse extends IResponse { then(fn) { return this; } fail(fn) { return fn(this); } } function validateId(id) { if (typeof id !== 'string') { return new ErrorResponse({ "code": 400, "body": { "errors": ["The id you provided is invalid"] } }); } return new SuccesfullResponse({ id: id });; } function findOfferById(state) { if (!repository[state.data.id]){ notify("Offer not found: " + state.id); return new ErrorResponse({ "code": 404, "body": { "errors": ["The id you provided cannot be found"] } }); } else return new SuccesfullResponse({ "code": 200, "body": repository[state.data.id] }); } function json(state) { return new SuccesfullResponse(JSON.stringify(state.data)); } function getOfferById(requestId) { return validateId(requestId) .then(findOfferById) .then(json) .fail(json) .response(); } describe('functional pipelines (with either) endpoint should', function(){ it('return an offer 200', function(){ assert.equal("{\"code\":200,\"body\":{\"offer-id\":200,\"percentage\":15}}", getOfferById("200")); }); it('return a validation error 400 when not found', function(){ assert.equal("{\"code\":400,\"body\":{\"errors\":[\"The id you provided is invalid\"]}}", getOfferById(400)); }); it('return a not found 404', function(){ assert.equal("{\"code\":404,\"body\":{\"errors\":[\"The id you provided cannot be found\"]}}", getOfferById("404")); }); }); // Run all our test suites. Only necessary in the browser. mocha.run();