var sinon = require('sinon');
var chai = require("chai")
chai.use(require("sinon-chai"))
var expect = chai.expect
var rewire = require('rewire');

var webhook = rewire('../../website/server/libs/api-v2/webhook');

describe('webhooks', function() {
  var postSpy;

  beforeEach(function() {
    postSpy = sinon.stub();
    webhook.__set__('request.post', postSpy);
  });

  describe('sendTaskWebhook', function() {
    var task = {
      details: { _id: 'task-id' },
      delta: 1.4,
      direction: 'up'
    };

    var data = {
      task: task,
      user: { _id: 'user-id' }
    };

    it('does not send if no webhook endpoints exist', function() {
      var  webhooks = { };

      webhook.sendTaskWebhook(webhooks, data);

      expect(postSpy).to.not.be.called;
    });

    it('does not send if no webhooks are enabled', function() {
      var webhooks = {
        'some-id': {
          sort: 0,
          id: 'some-id',
          enabled: false,
          url: 'http://example.org/endpoint'
        }
      };

      webhook.sendTaskWebhook(webhooks, data);

      expect(postSpy).to.not.be.called;
    });

    it('does not send if webhook url is not valid', function() {
      var webhooks = {
        'some-id': {
          sort: 0,
          id: 'some-id',
          enabled: true,
          url: 'http://malformedurl/endpoint'
        }
      };

      webhook.sendTaskWebhook(webhooks, data);

      expect(postSpy).to.not.be.called;
    });

    it('sends task direction, task, task delta, and abridged user data', function() {
      var webhooks = {
        'some-id': {
          sort: 0,
          id: 'some-id',
          enabled: true,
          url: 'http://example.org/endpoint'
        }
      };

      webhook.sendTaskWebhook(webhooks, data);

      expect(postSpy).to.be.calledOnce;
      expect(postSpy).to.be.calledWith({
        url: 'http://example.org/endpoint',
        body: {
          direction: 'up',
          task: { _id: 'task-id' },
          delta: 1.4,
          user: {
            _id: 'user-id'
          }
        },
        json: true
      });
    });

    it('sends a post request for each webhook endpoint', function() {
      var webhooks = {
        'some-id': {
          sort: 0,
          id: 'some-id',
          enabled: true,
          url: 'http://example.org/endpoint'
        },
        'second-webhook': {
          sort: 1,
          id: 'second-webhook',
          enabled: true,
          url: 'http://example.com/2/endpoint'
        }
      };

      webhook.sendTaskWebhook(webhooks, data);

      expect(postSpy).to.be.calledTwice;
      expect(postSpy).to.be.calledWith({
        url: 'http://example.org/endpoint',
        body: {
          direction: 'up',
          task: { _id: 'task-id' },
          delta: 1.4,
          user: {
            _id: 'user-id'
          }
        },
        json: true
      });
      expect(postSpy).to.be.calledWith({
        url: 'http://example.com/2/endpoint',
        body: {
          direction: 'up',
          task: { _id: 'task-id' },
          delta: 1.4,
          user: {
            _id: 'user-id'
          }
        },
        json: true
      });
    });
  });
});
