import assert from 'assert';
import _ from 'lodash';

import {notify} from '../../../src/lib/notify';

export default function(express) {
  const config = {
    notify: {
      method: 'POST',
      headers: [{
        'Content-Type': 'application/json'
      }],
      endpoint: "http://localhost:55550/api/notify",
      content: '{"color":"green","message":"New package published: * {{ name }}*","notify":true,"message_format":"text"}'
    }
  };

  describe('notifications', () => {

    beforeAll(function () {
      express.post('/api/notify', function (req, res) {
        res.send(req.body);
      });
      express.post('/api/notify/bad', function (req, res) {
        res.status(400);
        res.send('bad response');
      });
    });

    test('notification should be send', done => {
      const metadata = {
        name: "pkg-test"
      };

      notify(metadata, config).then(function (body) {
        const jsonBody = JSON.parse(body);
        assert.ok(`New package published: * ${metadata.name}*` === jsonBody.message,
        'Body notify message should be equal');
        done();
      }, function (err) {
        assert.fail(err);
        done();
      });
    });

    test('notification should be send single header', done => {
      const metadata = {
        name: "pkg-test"
      };

      const configMultipleHeader = _.cloneDeep(config);
      configMultipleHeader.notify.headers = {
        'Content-Type': 'application/json'
      };

      notify(metadata, configMultipleHeader).then(function (body) {
        const jsonBody = JSON.parse(body);
        assert.ok(`New package published: * ${metadata.name}*` === jsonBody.message,
          'Body notify message should be equal');
        done();
      }, function (err) {
        assert.fail(err);
        done();
      });
    });

    test(
      'notification should be send multiple notifications endpoints',
      done => {
        const metadata = {
          name: "pkg-test"
        };
        // let notificationsCounter = 0;

        const multipleNotificationsEndpoint = {
          notify: []
        };

        for (let i = 0; i < 10; i++) {
          const notificationSettings = _.cloneDeep(config.notify);
          // basically we allow al notifications
          notificationSettings.packagePattern = /^pkg-test$/;
          // notificationSettings.packagePatternFlags = 'i';
          multipleNotificationsEndpoint.notify.push(notificationSettings);
        }

      notify(metadata, multipleNotificationsEndpoint).then(function (body) {
        body.forEach(function(notification) {
          const jsonBody = JSON.parse(notification);
          assert.ok(`New package published: * ${metadata.name}*` === jsonBody.message,
            'Body notify message should be equal');
        });
        done();
      }, function (err) {
        assert.fail(err);
        done();
      });
    });

    test('notification should fails', done => {
      const metadata = {
        name: "pkg-test"
      };
      const configFail = _.cloneDeep(config);
      configFail.notify.endpoint = "http://localhost:55550/api/notify/bad";

      notify(metadata, configFail).then(function () {
        assert.equal(false, 'This service should fails with status code 400');
        done();
      }, function (err) {
        assert.ok('Bad Request' === err, 'The error message should be "Bad Request');
        done();
      });
    });

  });
}
