julianusti
9/19/2014 - 6:33 PM

gistfile1.js

var request = require('request');
var testUtils = require('../utils');

describe('shorterns.spec.js', function () {
	var apiUrl, url, payload, error, response, result;

	beforeEach(function () {
		apiUrl = testUtils.getRootUrl() + '/api/shorten';
	});

	describe('when user create shortcode', function () {
		beforeEach(function () {
			url = apiUrl;
		});

		beforeEach(function (done){
			request.post({url: url, body: payload, json:true}, function (err, res, body) {
				response = res;
				body = body;
				error = err;
				done(err);
			});
		});

		describe('with wrong payload', function () {
			beforeEach(function (){
				payload = { url: 'http://example.com/very-long-url', shortcode:'1uK7tms'};
			});

			beforeEach(function(){
				url = apiUrl;
			});

			describe('and url is missing', function() {
				beforeEach(function (){
					payload = {};
				});

				it('should respond 400 (Bad Request)', function () {
					expect(response.statusCode).to.equal(400);
				});
			});
		});

		describe('with right payload', function () {
			beforeEach(function(){
				url = apiUrl;
			});

			describe('and url is present', function() {
				beforeEach(function (){
					payload = { url: 'http://example.com/very-long-url' };
				});

				beforeEach(function (done){
					request.post({url: url, body: payload, json:true}, function (err, res, body) {
						response = res;
						result = body;
						error = err;
						done(err);
					});
				});

				it('should respond 201 (Created)', function () {
					expect(response.statusCode).to.equal(201);
				});

				it('should respond with shortcode', function(){
					expect(result.shortcode).to.be.ok;
				});
			});
		});
	
		describe('with desired shortcode', function () {
			describe('and shortcode is duplicated', function () {

				beforeEach(function (){
					payload = { url: 'http://example.com/coll-url', shortcode: '1kGJrn'};
				});

				beforeEach(function (done) {
					request.post({url: url, body: payload, json:true}, function (err, res, body) {
						response = res;
						result = body;
						error = err;
						done(err);
					});
				});

				it('should respond 409 (Conflict)', function () {
					expect(response.statusCode).to.equal(409);
				});
			});

			describe('and shortcode does not meet regex expression: ^[0-9a-zA-Z_]{4,}$', function () {
				beforeEach(function (){
					payload = { url: 'http://example.com/coll-url', shortcode: '1uK&tms'};
				});

				beforeEach(function (done) {
					request.post({url: url, body: payload, json:true}, function (err, res, body) {
						response = res;
						result = body;
						error = err;
						done(err);
					});
				});

				it('should respond 422 (Conflict)', function () {
					expect(response.statusCode).to.equal(422);
				});
			});
		});
	});

	describe('when user requesting shortcode', function () {
		describe('with shortcode that exist in database', function (){
			beforeEach(function () {
				url = apiUrl + '/1kGJrn';
			});

			beforeEach(function (done) {
				request({url: url, json: true}, function (err, resp, body) {
					response = resp;
					result = body;
					done(err);
				});
			});

			it('should respond 302(Found)', function (){
				expect(response.statusCode).to.equal(302);
			});

			it('should respond with location', function(){
				expect(result.location).to.be.ok;
			});
		});

		describe('with shortcode that doesn not exist in database', function () {
			beforeEach(function () {
				url = apiUrl + '/10K0tms';
			});

			beforeEach(function (done) {
				request({url: url, json: true}, function (err, resp, body) {
					response = resp;
					result = body;
					done(err);
				});
			});

			it('should respond 404(Not Found)', function (){
				expect(response.statusCode).to.equal(404);
			});
		});
	});

	describe('when user requesting shortcode stats', function () {
		describe('with shortcode that exist in database', function () {
			beforeEach(function () {
				url = apiUrl + '/1kGJrn/stats';
			});

			beforeEach(function (done) {
				request({url: url, json: true}, function (err, resp, body) {
					response = resp;
					result = body;
					done(err);
				});
			});

			it('should respond 200(OK)', function (){
				expect(response.statusCode).to.equal(200);
			});

			it('should respond with startDate', function (){
				expect(result.startDate).to.be.ok;
			});

			it('should respond with lastSeenDate', function (){
				expect(result.lastSeenDate).to.be.ok;
			});

			it('should respond with redirectCount', function (){
				expect(result.redirectCount).to.equal(0);
			});
		});

		describe('with shortcode that does not exist in database', function () {
			beforeEach(function () {
				url = apiUrl + '/100Jrn/stats';
			});

			beforeEach(function (done) {
				request({url: url, json: true}, function (err, resp, body) {
					response = resp;
					result = body;
					done(err);
				});
			});

			it('should respond 404 (Not Found)', function (){
				expect(response.statusCode).to.equal(404);
			});
		});
	});
});