const quota = require('../quota/index');
const assert = require('assert');

var exampleConfig = { 
  EdgeMicroTestProduct: {
    allow: process.env.QUOTA_ALLOW,
    interval: Number(process.env.QUOTA_INTERVAL),
    timeUnit: process.env.QUOTA_TIMEUNIT,
    bufferSize: process.env.QUOTA_BUFFERSIZE,
    uri: process.env.QUOTA_URI,
    key: process.env.QUOTA_KEY,
    secret: process.env.QUOTA_SECRET 
  }
}

describe('quota plugin', () => {
  var plugin = null;
  
  beforeEach(() => {
    var logger = {};
    var stats = {};

    plugin = quota.init.apply(null, [exampleConfig, logger, stats]);

  });
 
  it('exposes an onrequest handler', () => {
    assert.ok(plugin.onrequest);
  });

  it('will quota limit after 3 API calls', (done) => {
    var count = 0;
    var onrequest_cb = (err) => {
      count++;
      if(count == 4) {
        assert.equal(count, 4);
        assert.equal(err.message, 'exceeded quota');
        done();
      } 
    };

    var req = {
      token: {
        application_name: '0e7762f4-ea67-4cc1-ae4a-21598c35b18f',
        api_product_list: ['EdgeMicroTestProduct']       
      }
    }

    var res = {
      headers: {},
      setHeader: (key, val) => {
        res.headers[key] = val;
      }
    }

    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
  });

  it('will not quota limit before 3 API calls', (done) => {
    var count = 0;
    var onrequest_cb = (err) => {
      count++;
      if(count == 3) {
        assert.equal(count, 3);
        assert.ok(!(err instanceof Error));
        done();
      } 
    };

    var req = {
      token: {
        application_name: '0e7762f4-ea67-4cc1-ae4a-21598c35b18f',
        api_product_list: ['EdgeMicroTestProduct']       
      }
    }

    var res = {
      headers: {},
      setHeader: (key, val) => {
        res.headers[key] = val;
      }
    }

    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
    plugin.onrequest.apply(null, [req, res, onrequest_cb]);
  });
});


