anyTV/anytv-node-quota

View on GitHub
test/middleware.js

Summary

Maintainability
A
3 hrs
Test Coverage
'use strict'

const httpMocks = require('node-mocks-http')
const chai = require('chai')
const _ = require('lodash')
const quotaMiddleware = require('../src/middleware')

const assert = chai.assert
const emptyCallback = () => null

const mock_database = {
    'cid1' : {
        'default': {
            client_id: 'cid1',
            quota_usage: 0,
            limit: 10,
        }
    },
    'cid2' : {
        'default': {
            client_id: 'cid2',
            quota_usage: 10,
            limit: 10,
        }
    }
}

const store = {
    set_db: function(db) {
        this.db = db

        return this
    },
    get_db: function() {
        return this.db
    },
    get_client_id: function(access_token, callback) {
        let client = access_token

        if (!client.length) {
            return callback('Client not found', null)
        }

        callback(null, client)
    },
    increment_usage: function(client_id, service, weight, callback = () => null) {
        this.db[client_id][service].quota_usage = this.db[client_id][service].quota_usage + weight

        callback(null, null)
    },
    exceed_limit: function(client_id, service, callback = () => null) {
        let is_exceed = this.db[client_id][service].limit <= this.db[client_id][service].quota_usage

        callback(null, is_exceed)
    },
    log_request(client_id, service, weight, path, callback = () => null) {
        callback()
    }
}

describe('Middleware', () => {
    it('should set default weight', () => {
        let res = httpMocks.createResponse()
        let req = httpMocks.createRequest({
            headers: {
                Authorization: 'Bearer cid1'
            }
        })

        let db = _.clone(mock_database)
        let middleware = quotaMiddleware(store.set_db(db))

        middleware(req, res, () => {
            assert.typeOf(res.anytv_quota.weight, 'number')

            res.json({success: true})
        })

        res.on('end', () => {
            let data = JSON.parse(res._getData())
            assert.typeOf(data.success, 'boolean')
            assert.equal(data.success, true)
        })
    })

    it('should have default weight of 0', () => {
        let res = httpMocks.createResponse()
        let req = httpMocks.createRequest({
            headers: {
                Authorization: 'Bearer cid1'
            }
        })

        let db = _.clone(mock_database)
        let middleware = quotaMiddleware(store.set_db(db))

        middleware(req, res, () => {
            assert.equal(res.anytv_quota.weight, 0)

            res.json({success: true})
        })

        let data = JSON.parse(res._getData())
        assert.typeOf(data.success, 'boolean')
        assert.equal(data.success, true)
    })

    it('should bind new method "set_weight"', () => {
        let res = httpMocks.createResponse()
        let req = httpMocks.createRequest({
            headers: {
                Authorization: 'Bearer cid1'
            }
        })

        let db = _.clone(mock_database)
        let middleware = quotaMiddleware(store.set_db(db))

        middleware(req, res, () => {
            assert.typeOf(res.anytv_quota.set_weight, 'function')
            res.json({success: true})
        })

        let data = JSON.parse(res._getData())
        assert.typeOf(data.success, 'boolean')
        assert.equal(data.success, true)
    })

    it('should succeed if limit not yet meet', () => {
        let res = httpMocks.createResponse()
        let req = httpMocks.createRequest({
            headers: {
                Authorization: 'Bearer cid1'
            }
        })

        let db = _.clone(mock_database)
        let middleware = quotaMiddleware(store.set_db(db))

        middleware(req, res, () => {
            res.json({success: true})
        })

        let data = JSON.parse(res._getData())
        assert.typeOf(data.success, 'boolean')
        assert.equal(data.success, true)
    })

    it('should error if limit is exceeded', () => {
        let res = httpMocks.createResponse()
        let req = httpMocks.createRequest({
            headers: {
                Authorization: 'Bearer cid2'
            }
        })

        let db = _.clone(mock_database)
        let middleware = quotaMiddleware(store.set_db(db))

        middleware(req, res, () => {
            res.anytv_quota.set_weight(10)
            res.json({success: true})
        })

        let data = res._getData()
        assert.typeOf(data.error, 'string')
        assert.equal(data.error, 'Quota exceeded.')
    })

    it('should increment quota usage', () => {
        let db = _.clone(mock_database)
        let middleware = quotaMiddleware(store.set_db(db))

        // first request increment 2
        let res = httpMocks.createResponse()
        let req = httpMocks.createRequest({
            headers: {
                Authorization: 'Bearer cid1'
            }
        })

        middleware(req, res, () => {
            res.anytv_quota.set_weight(2)
            res.json({success: true})
        })

        let data = JSON.parse(res._getData())
        assert.typeOf(data.success, 'boolean')
        assert.equal(data.success, true)
        assert.equal(db['cid1']['default'].quota_usage, 2)

        // second request increment 5
        res = httpMocks.createResponse()
        req = httpMocks.createRequest({
            headers: {
                Authorization: 'Bearer cid1'
            }
        })

        middleware(req, res, () => {
            res.anytv_quota.set_weight(5)
            res.json({success: true})
        })

        data = JSON.parse(res._getData())
        assert.typeOf(data.success, 'boolean')
        assert.equal(data.success, true)
        assert.equal(db['cid1']['default'].quota_usage, 7)
    })
})