diff --git a/lib/destroy.js b/lib/destroy.js index e1f4bd5..680dd9a 100644 --- a/lib/destroy.js +++ b/lib/destroy.js @@ -6,19 +6,26 @@ var internals = module.exports.internals = {} internals.request = require('../utils/request') internals.clearSession = require('../utils/clear-session') internals.get = require('./get') +internals.isSignedIn = require('./is-signed-in') function destroy (state) { var accountProperties = internals.get(state) - return internals.request({ - method: 'DELETE', - url: state.url + '/session/account', - headers: { - authorization: 'Session ' + state.account.session.id - } - }) + var promise = Promise.resolve() + + if (internals.isSignedIn(state)) { + promise = promise.then(function () { + internals.request({ + method: 'DELETE', + url: state.url + '/session/account', + headers: { + authorization: 'Session ' + state.account.session.id + } + }) + }) + } - .then(function () { + return promise.then(function () { internals.clearSession({ cacheKey: state.cacheKey }) diff --git a/test/integration/destroy-test.js b/test/integration/destroy-test.js index 51f2846..b3a831b 100644 --- a/test/integration/destroy-test.js +++ b/test/integration/destroy-test.js @@ -5,6 +5,7 @@ var nock = require('nock') var clone = require('lodash/clone') var signInResponse = clone(require('../fixtures/signin.json')) var simple = require('simple-mock') +var lolex = require('lolex') var baseURL = 'http://localhost:3000' var options = { @@ -60,3 +61,42 @@ test('destroy account', function (t) { .catch(t.error) }) + +test('destroy account even when session is invalid', function (t) { + store.clear() + t.plan(5) + + // mock the Date object to always return 1970-01-01T00:00:00.000Z + var clock = lolex.install(0) + var account = new Account({ + url: baseURL, + id: 'abc4567' + }) + + var signOutHandler = simple.stub() + var destroyHandler = simple.stub() + account.on('signout', signOutHandler) + account.on('destroy', destroyHandler) + + account.destroy(options) + + .then(function () { + clock.uninstall() + t.pass('destroys account') + + t.deepEqual(signOutHandler.lastCall.arg, { + createdAt: '1970-01-01T00:00:00.000Z', + id: 'abc4567' + }, '"signout" event emitted with account object') + + t.deepEqual(destroyHandler.lastCall.arg, { + createdAt: '1970-01-01T00:00:00.000Z', + id: 'abc4567' + }, '"destroy" event emitted with account object') + + t.is(signOutHandler.callCount, 1, '"signout" event emitted once') + t.is(destroyHandler.callCount, 1, '"destroy" event emitted once') + }) + + .catch(t.error) +})