feathers-service-verify-reset
Version:
Adds user email verification and password reset capabilities to local feathers-authentication
240 lines (201 loc) • 7.09 kB
JavaScript
/* global assert, describe, it */
/* eslint no-shadow: 0, no-var: 0, one-var: 0, one-var-declaration-per-line: 0,
no-param-reassign: 0, no-unused-vars: 0 */
const assert = require('chai').assert;
const feathersStubs = require('./../test/helpers/feathersStubs');
const verifyResetService = require('../lib/index').service;
// user DB
const usersDb = [
{ _id: 'a', email: 'a', username: 'john a' },
{ _id: 'b', email: 'b', username: 'john b' },
{ _id: 'c', email: 'c', username: 'john b' },
];
// Tests
['_id', 'id'].forEach(idType => {
['paginated', 'non-paginated'].forEach(pagination => {
describe(`checkUniqueness ${pagination} ${idType}`, () => {
const ifNonPaginated = pagination === 'non-paginated';
describe('standard', () => {
var db;
var app;
var users;
var verifyReset;
beforeEach(() => {
db = clone(usersDb);
app = feathersStubs.app();
users = feathersStubs.users(app, db, ifNonPaginated, idType);
verifyResetService().call(app); // define and attach verifyReset service
verifyReset = app.service('verifyReset'); // get handle to verifyReset
});
it('returns a promise', () => {
const res = verifyReset.create({
action: 'unique',
value: { username: 'john a' },
})
.then(() => { })
.catch(() => {});
assert.isOk(res, 'no promise returned');
assert.isFunction(res.then, 'not a function');
});
it('handles empty query', function (done) {
this.timeout(9000);
verifyReset.create({
action: 'unique',
value: {},
})
.then(() => {
done();
})
.catch(() => {
assert.fail(true, false, 'test unexpectedly failed');
});
});
it('handles empty query returning nothing', function (done) {
this.timeout(9000);
verifyReset.create({
action: 'unique',
value: { username: 'hjhjhj' },
})
.then(() => {
done();
})
.catch(() => {
assert.fail(true, false, 'test unexpectedly failed');
});
});
it('finds single query on single item', function (done) {
this.timeout(9000);
const username = 'john a';
verifyReset.create({
action: 'unique',
value: { username },
})
.then(() => {
assert.fail(true, false, 'test unexpectedly succeeded');
})
.catch(err => {
assert.equal(err.message, 'Values already taken.');
assert.equal(err.errors.username, 'Already taken.');
done();
});
});
it('handles noErrMsg option', function (done) {
this.timeout(9000);
const username = 'john a';
verifyReset.create({
action: 'unique',
value: { username },
meta: { noErrMsg: true },
})
.then(() => {
assert.fail(true, false, 'test unexpectedly succeeded');
})
.catch(err => {
assert.equal(err.message, 'Error'); // feathers default for no error message
assert.equal(err.errors.username, 'Already taken.');
done();
});
});
it('finds single query on multiple items', function (done) {
this.timeout(9000);
const username = 'john b';
verifyReset.create({
action: 'unique',
value: { username },
})
.then(() => {
assert.fail(true, false, 'test unexpectedly succeeded');
})
.catch(err => {
assert.equal(err.message, 'Values already taken.');
assert.equal(err.errors.username, 'Already taken.');
done();
});
});
it('finds multiple queries on same item', function (done) {
this.timeout(9000);
const username = 'john a';
const email = 'a';
verifyReset.create({
action: 'unique',
value: { username, email },
})
.then(() => {
assert.fail(true, false, 'test unexpectedly succeeded');
})
.catch(err => {
assert.equal(err.message, 'Values already taken.');
assert.equal(err.errors.username, 'Already taken.');
done();
});
});
it('finds multiple queries on different item', function (done) {
this.timeout(9000);
const username = 'john a';
const email = 'b';
verifyReset.create({
action: 'unique',
value: { username, email },
})
.then(() => {
assert.fail(true, false, 'test unexpectedly succeeded');
})
.catch(err => {
assert.equal(err.message, 'Values already taken.');
assert.equal(err.errors.username, 'Already taken.');
done();
});
});
it('ignores null & undefined queries', function (done) {
this.timeout(9000);
verifyReset.create({
action: 'unique',
value: { username: undefined, email: null },
})
.then(() => {
done();
})
.catch(() => {
assert.fail(true, false, 'test unexpectedly failed');
});
});
it('ignores current user on single item', function (done) {
this.timeout(9000);
const username = 'john a';
verifyReset.create({
action: 'unique',
value: { username },
ownId: 'a',
})
.then(() => {
done();
})
.catch(() => {
assert.fail(true, false, 'test unexpectedly failed');
});
});
it('cannot ignore current user on multiple items', function (done) {
this.timeout(9000);
const username = 'john b';
verifyReset.create({
action: 'unique',
value: { username },
ownId: 'b',
})
.then(() => {
assert.fail(true, false, 'test unexpectedly succeeded');
})
.catch(err => {
assert.equal(err.message, 'Values already taken.');
assert.equal(err.errors.username, 'Already taken.');
done();
});
});
});
});
});
});
// Helpers
function clone(obj) {
return JSON.parse(JSON.stringify(obj));
}