UNPKG

fastly-purge

Version:

Node.js' Fastly Purging API implementation

320 lines (273 loc) 12.9 kB
'use strict'; var assert = require('assert'); var nock = require('nock'); var FastlyPurge = require('../'); describe('FastlyPurge', function() { var FAKE_API_KEY = 'wadus'; var FAKE_SERVICE_ID = 'wadus_service_id'; var FAKE_SURROGATE_KEY = 'wadus_key'; var FAKE_PURGE_HOST = 'http://example.com'; var FAKE_PURGE_PATH = '/image.jpg'; var FAKE_PURGE_URL = FAKE_PURGE_HOST + FAKE_PURGE_PATH; describe('instant purge', function() { var fastlyPurge = new FastlyPurge(FAKE_API_KEY); it('should purge URL with no Fastly headers', function(done) { var scope = nock(FAKE_PURGE_HOST) .intercept(FAKE_PURGE_PATH, 'PURGE') .matchHeader('Fastly-Key', undefined) .matchHeader('Fastly-Soft-Purge', undefined) .reply(200, { status:'ok', id:'108-1391560174-974124' }); fastlyPurge.url(FAKE_PURGE_URL, function(err, result) { assert.ok(!err); assert.ok(result); assert.equal(result.status, 'ok'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); it('should purge SERVICE with Fastly API key header', function(done) { var purgePath = '/service/' + FAKE_SERVICE_ID + '/purge_all'; var scope = nock(FastlyPurge.FASTLY_API_ENDPOINT) .post(purgePath) .matchHeader('Fastly-Key', FAKE_API_KEY) .matchHeader('Fastly-Soft-Purge', undefined) .matchHeader('Accept', 'application/json') .reply(200, { status:'ok' }); fastlyPurge.service(FAKE_SERVICE_ID, function(err, result) { assert.ok(!err, err && err.message); assert.ok(result); assert.equal(result.status, 'ok'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); it('should purge by surrogate KEY with Fastly API key header', function(done) { var purgePath = '/service/' + FAKE_SERVICE_ID + '/purge/' + FAKE_SURROGATE_KEY; var scope = nock(FastlyPurge.FASTLY_API_ENDPOINT) .post(purgePath) .matchHeader('Fastly-Key', FAKE_API_KEY) .matchHeader('Fastly-Soft-Purge', undefined) .matchHeader('Accept', 'application/json') .reply(200, { status:'ok' }); fastlyPurge.key(FAKE_SERVICE_ID, FAKE_SURROGATE_KEY, function(err, result) { assert.ok(!err, err && err.message); assert.ok(result); assert.equal(result.status, 'ok'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); }); describe('soft purge', function() { var fastlyPurge = new FastlyPurge(FAKE_API_KEY, { softPurge: true }); it('should purge URL with Fastly soft purge header but no API key', function(done) { var scope = nock(FAKE_PURGE_HOST) .intercept(FAKE_PURGE_PATH, 'PURGE') .matchHeader('Fastly-Key', undefined) .matchHeader('Fastly-Soft-Purge', 1) .reply(200, { status:'ok', id:'108-1391560174-974124' }); fastlyPurge.url(FAKE_PURGE_URL, function(err, result) { assert.ok(!err); assert.ok(result); assert.equal(result.status, 'ok'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); it('should purge SERVICE with Fastly API key header but no soft purge', function(done) { var purgePath = '/service/' + FAKE_SERVICE_ID + '/purge_all'; var scope = nock(FastlyPurge.FASTLY_API_ENDPOINT) .post(purgePath) .matchHeader('Fastly-Key', FAKE_API_KEY) .matchHeader('Fastly-Soft-Purge', undefined) .matchHeader('Accept', 'application/json') .reply(200, { status:'ok' }); fastlyPurge.service(FAKE_SERVICE_ID, {}, function(err, result) { assert.ok(!err, err && err.message); assert.ok(result); assert.equal(result.status, 'ok'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); it('should purge by surrogate KEY with Fastly API key and soft purge header', function(done) { var purgePath = '/service/' + FAKE_SERVICE_ID + '/purge/' + FAKE_SURROGATE_KEY; var scope = nock(FastlyPurge.FASTLY_API_ENDPOINT) .post(purgePath) .matchHeader('Fastly-Key', FAKE_API_KEY) .matchHeader('Fastly-Soft-Purge', 1) .matchHeader('Accept', 'application/json') .reply(200, { status:'ok' }); fastlyPurge.key(FAKE_SERVICE_ID, FAKE_SURROGATE_KEY, function(err, result) { assert.ok(!err, err && err.message); assert.ok(result); assert.equal(result.status, 'ok'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); }); describe('override soft purge for instant purge', function() { var fastlyPurge = new FastlyPurge(FAKE_API_KEY, { softPurge: true }); it('should purge URL with NO Fastly soft purge header', function(done) { var scope = nock(FAKE_PURGE_HOST) .intercept(FAKE_PURGE_PATH, 'PURGE') .matchHeader('Fastly-Key', undefined) .matchHeader('Fastly-Soft-Purge', undefined) .reply(200, { status:'ok', id:'108-1391560174-974124' }); fastlyPurge.url(FAKE_PURGE_URL, { softPurge: false }, function(err, result) { assert.ok(!err); assert.ok(result); assert.equal(result.status, 'ok'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); it('should purge by surrogate KEY with Fastly API key but NO soft purge header', function(done) { var purgePath = '/service/' + FAKE_SERVICE_ID + '/purge/' + FAKE_SURROGATE_KEY; var scope = nock(FastlyPurge.FASTLY_API_ENDPOINT) .post(purgePath) .matchHeader('Fastly-Key', FAKE_API_KEY) .matchHeader('Fastly-Soft-Purge', undefined) .matchHeader('Accept', 'application/json') .reply(200, { status:'ok' }); fastlyPurge.key(FAKE_SERVICE_ID, FAKE_SURROGATE_KEY, { softPurge: false }, function(err, result) { assert.ok(!err, err && err.message); assert.ok(result); assert.equal(result.status, 'ok'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); }); describe('override instant purge for soft purge', function() { var fastlyPurge = new FastlyPurge(FAKE_API_KEY, { softPurge: false }); it('should purge URL with Fastly soft purge headers', function(done) { var scope = nock(FAKE_PURGE_HOST) .intercept(FAKE_PURGE_PATH, 'PURGE') .matchHeader('Fastly-Key', undefined) .matchHeader('Fastly-Soft-Purge', 1) .reply(200, { status:'ok', id:'108-1391560174-974124' }); fastlyPurge.url(FAKE_PURGE_URL, { softPurge: true }, function(err, result) { assert.ok(!err); assert.ok(result); assert.equal(result.status, 'ok'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); it('should purge by surrogate KEY with Fastly API key and soft purge header', function(done) { var purgePath = '/service/' + FAKE_SERVICE_ID + '/purge/' + FAKE_SURROGATE_KEY; var scope = nock(FastlyPurge.FASTLY_API_ENDPOINT) .post(purgePath) .matchHeader('Fastly-Key', FAKE_API_KEY) .matchHeader('Fastly-Soft-Purge', 1) .matchHeader('Accept', 'application/json') .reply(200, { status:'ok' }); fastlyPurge.key(FAKE_SERVICE_ID, FAKE_SURROGATE_KEY, { softPurge: true }, function(err, result) { assert.ok(!err, err && err.message); assert.ok(result); assert.equal(result.status, 'ok'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); }); describe('errors', function() { var fastlyPurge = new FastlyPurge(FAKE_API_KEY); it('handle http status error and body', function(done) { var purgePath = '/service/' + FAKE_SERVICE_ID + '/purge/' + FAKE_SURROGATE_KEY; var scope = nock(FastlyPurge.FASTLY_API_ENDPOINT) .post(purgePath) .matchHeader('Fastly-Key', FAKE_API_KEY) .matchHeader('Fastly-Soft-Purge', undefined) .matchHeader('Accept', 'application/json') .reply(503, 'Service Unavailable'); fastlyPurge.key(FAKE_SERVICE_ID, FAKE_SURROGATE_KEY, function(err, result) { assert.ok(!result); assert.ok(err); assert.equal(err.statusCode, 503); assert.equal(err.message, 'Service Unavailable'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); it('handle http status error and fallback body message', function(done) { var purgePath = '/service/' + FAKE_SERVICE_ID + '/purge/' + FAKE_SURROGATE_KEY; var scope = nock(FastlyPurge.FASTLY_API_ENDPOINT) .post(purgePath) .matchHeader('Fastly-Key', FAKE_API_KEY) .matchHeader('Fastly-Soft-Purge', undefined) .matchHeader('Accept', 'application/json') .reply(501); fastlyPurge.key(FAKE_SERVICE_ID, FAKE_SURROGATE_KEY, function(err, result) { assert.ok(!result); assert.ok(err); assert.equal(err.statusCode, 501); assert.equal(err.message, 'Empty response body'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); }); describe('json response', function() { var fastlyPurge = new FastlyPurge(FAKE_API_KEY); it('non application/json content type returns as plain', function(done) { var purgePath = '/service/' + FAKE_SERVICE_ID + '/purge/' + FAKE_SURROGATE_KEY; var scope = nock(FastlyPurge.FASTLY_API_ENDPOINT) .post(purgePath) .matchHeader('Fastly-Key', FAKE_API_KEY) .matchHeader('Fastly-Soft-Purge', undefined) .matchHeader('Accept', 'application/json') .reply(200, '{ "status":"ok" }'); fastlyPurge.key(FAKE_SERVICE_ID, FAKE_SURROGATE_KEY, function(err, result) { assert.ok(!err, err && err.message); assert.ok(result); assert.equal(JSON.parse(result).status, 'ok'); assert.equal(scope.pendingMocks().length, 0); done(); }); }); it('invalid application/json content type does fallback to plain', function(done) { var invalidJsonString = '{ "status":"ok" '; var purgePath = '/service/' + FAKE_SERVICE_ID + '/purge/' + FAKE_SURROGATE_KEY; var scope = nock(FastlyPurge.FASTLY_API_ENDPOINT) .post(purgePath) .matchHeader('Fastly-Key', FAKE_API_KEY) .matchHeader('Fastly-Soft-Purge', undefined) .matchHeader('Accept', 'application/json') .reply(200, '{ "status":"ok" ', { 'Content-Type': 'application/json' }); fastlyPurge.key(FAKE_SERVICE_ID, FAKE_SURROGATE_KEY, function(err, result) { assert.ok(!err, err && err.message); assert.ok(result); assert.equal(result, invalidJsonString); assert.equal(scope.pendingMocks().length, 0); done(); }); }); }); });