tunnckoCore/koa-ip-filter

View on GitHub
test.js

Summary

Maintainability
A
0 mins
Test Coverage
/*!
 * koa-ip-filter <https://github.com/tunnckoCore/koa-ip-filter>
 *
 * Copyright (c) 2015-2016 Charlike Mike Reagent, contributors.
 * Released under the MIT license.
 */

/* jshint asi:true, esnext:true */

'use strict'

var test = require('mukla')
var ipFilter = require('./index')
var request = require('supertest')
var helloWorld = require('koa-hello-world')
var koa = require('koa')

function middleware (fn) {
  return koa().use(fn).use(helloWorld()).callback()
}

test('should yield next middleware if no `opts.filter` given', function (done) {
  var server = middleware(ipFilter())

  request(server)
    .get('/')
    .expect(200, 'Hello World')
    .end(done)
})

test('should have `opts.id` and it should be binded to koa this', function (done) {
  var server = middleware(ipFilter({
    id: function _id_ (ctx) {
      this.set('x-github-username', 'tunnckoCore')
      return ctx.request.header['x-koaip']
    }
  }))

  request(server).get('/')
    .expect('x-github-username', 'tunnckoCore')
    .expect(200)
    .expect('Hello World')
    .end(done)
})

test('should `403 Forbidden` if not match to `opts.filter`', function (done) {
  var server = middleware(ipFilter({
    id: function () {
      return this.request.header['x-koaip']
    },
    filter: '1.2.3.*'
  }))

  request(server).get('/').set('x-koaip', '4.4.8.8')
    .expect('403 Forbidden').expect(403, done)
})

test('should `403 Forbidden` if IP is in blacklist', function (done) {
  request(middleware(ipFilter({
    id: function () {
      return this.request.header['x-koaip']
    },
    filter: ['*', '!89.???.30.*']
  })))
    .get('/').set('x-koaip', '89.111.30.8')
    .expect(403, '403 Forbidden')
    .end(done)
})

test('should `200 OK` if not in blacklist range', function (done) {
  var mw = ipFilter({
    id: function () {
      var header = this.request.header['x-koaip']
      return header
    },
    // it can be double star - globstar
    // or *.*.*.*
    filter: ['*.*.*.*', '!111.??.244.*']
  })
  request(middleware(mw))
    .get('/')
    .set('x-koaip', '4.4.8.8')
    .expect(200, 'Hello World')
    .end(done)
})

test('should support custom message for 403 Forbidden', function (done) {
  var server = middleware(ipFilter({
    id: function () {
      return this.request.header['x-koaip']
    },
    filter: ['*', '!89.???.30.*'],
    forbidden: '403, Get out of here!'
  }))

  request(server)
    .get('/')
    .set('x-koaip', '89.111.30.8')
    .expect(403, '403, Get out of here!')
    .end(done)
})

test('should be able `opts.forbidden` to be function', function (done) {
  var server = middleware(ipFilter({
    id: function () {
      return this.request.header['x-koaip']
    },
    filter: '123.225.23.120',
    forbidden: function (ctx) {
      this.set('X-Forbidden', 'Can be function')
      ctx.set('X-Seriously', 'yes')
      return 'opts.forbidden can be function'
    }
  }))

  request(server)
    .get('/')
    .set('x-koaip', '55.55.55.55')
    .expect('X-Forbidden', 'Can be function')
    .expect('X-Seriously', 'yes')
    .expect(403, 'opts.forbidden can be function')
    .end(done)
})

test('should have `this.filter` and `this.identifier` in next middleware', function (done) {
  var ok = false
  var server = koa()
  .use(ipFilter({
    // it can be double star - globstar
    // or *.*.*.*
    filter: ['**', '!213.15.*']
  }))
  .use(helloWorld())
  .use(function * (next) {
    test.ok(this.filter, 'should have `this.filter` in next')
    test.ok(this.identifier, 'should have `this.identifier` in next')
    test.equal(typeof this.filter, 'function', 'should have `this.filter` method')
    test.equal(typeof this.identifier, 'string', 'should have `this.identifier`')
    ok = true
    yield next
  })

  request(server.callback())
    .get('/')
    .set('x-koaip', '7.7.7.7')
    .expect(200, 'Hello World')
    .end(function (err) {
      test.ifError(err)
      test.equal(ok, true)
      done()
    })
})

test('should not have `this.filter` if no `opts.filter` given', function (done) {
  var ok = false
  var server = koa().use(ipFilter()).use(helloWorld()).use(function * (next) {
    test.ok(!this.filter, 'should not have `this.filter` in next')
    test.ok(!this.identifier, 'should not have `this.identifier` in next')
    ok = true
    yield next
  }).callback()

  request(server)
    .get('/')
    .expect('Hello World')
    .expect(200, function (err) {
      test.ifError(err)
      test.equal(ok, true)
      done()
    })
})