UNPKG

@harishreddym/baqend

Version:

Baqend JavaScript SDK

615 lines (550 loc) 21.7 kB
'use strict'; var DB; if (typeof module !== 'undefined') { require('./node'); DB = require('../lib'); } describe('Test user and roles', function () { var emf, db; var RENEW_TIMEOUT = 2000; this.timeout(RENEW_TIMEOUT * 5); before(function () { emf = new DB.EntityManagerFactory({ host: env.TEST_SERVER, tokenStorage: helper.rootTokenStorage }); return emf.createEntityManager().ready().then(function () { var userEntity = emf.metamodel.entity('User'); if (!userEntity.getAttribute('email')) { userEntity.addAttribute(new DB.metamodel.SingularAttribute('email', emf.metamodel.baseType(String))); return emf.metamodel.save(); } }); }); beforeEach(function () { db = emf.createEntityManager(); return db.ready(); }); describe('user factory', function () { it('should have methods', function () { expect(db.User).be.ok; expect(db.User.register).be.ok; expect(db.User.login).be.ok; expect(db.User.logout).be.ok; expect(db.User.newPassword).be.ok; }); it('should not share the tokenStorage with the emf', function () { expect(db.tokenStorage).not.equal(emf.tokenStorage); }); it('should share the tokenStorage with the emf if createEm is true', function () { var db = emf.createEntityManager(true); expect(db.tokenStorage).equal(emf.tokenStorage); }); it('should register and login a new user', function () { var login = helper.makeLogin(); return db.User.register(login, 'secret').then(function (user) { expect(user).be.ok; expect(user instanceof DB.binding.User).be.true; expect(user.id).be.ok; expect(user.version).be.ok; expect(user._metadata.isPersistent).be.true; expect(user._metadata.isDirty).be.false; expect(user.username).equals(login); expect(user.password).be.undefined; expect(user).equals(db.User.me); expect(db.token).be.ok; }); }); it('should not set token and me when loginOption is NO_LOGIN', function () { var user = new db.User({ username: helper.makeLogin(), email: 'test@mail.de' }); return db.User.register(user, 'secret', db.User.LoginOption.NO_LOGIN).then(function () { expect(db.me).not.ok; expect(db.token).not.ok; }); }); it('should register user from object', function () { var user = new db.User({ username: helper.makeLogin(), email: 'test@mail.de' }); return db.User.register(user, 'secret').then(function (loaded) { expect(loaded.username).eqls(user.username); expect(loaded.email).eqls('test@mail.de'); }); }); it('should fail to register if username is missing', function () { var user = { foobar: helper.makeLogin() }; return expect(db.User.register(user, 'secret')).be.rejected; }); it('should logout an user', function () { var login = helper.makeLogin(); return db.User.register(login, 'secret').then(function (user) { return db.User.logout(); }).then(function () { expect(db.User.me).be.null; expect(db.token).be.null; }); }); it('should not register a user twice', function () { var login = helper.makeLogin(); var promise = db.User.register(login, 'secret').then(function (user) { expect(user.username).be.equals(login); }); expect(function () { db.User.register(login, 'secret'); }).throw(Error); return promise; }); it('should not register an existing user', function () { var login = helper.makeLogin(); return db.User.register(login, 'secret').then(function (user) { return db.User.logout(); }).then(function () { return expect(db.User.register(login, 'secret')).be.rejected; }).then(function () { expect(db.token).be.null; expect(db.User.me).be.null; }); }); it('should login with valid credentials', function () { var login = helper.makeLogin(); var user; return db.User.register(login, 'secret').then(function (u) { user = u; expect(user).be.ok; expect(user instanceof DB.binding.User).be.true; expect(user.id).be.ok; expect(user.version).be.ok; expect(user._metadata.isPersistent).be.true; expect(user._metadata.isDirty).be.false; expect(user.username).equals(login); expect(user.password).be.undefined; expect(user).equals(db.User.me); expect(db.token).be.ok; return db.User.logout(); }).then(function () { return db.User.login(login, 'secret'); }).then(function (u) { expect(user).equals(u); }); }); it('should not login an unknown user', function () { var login = helper.makeLogin(); expect(db.User.login(login, 'secret')).be.rejected; }); it('should not login with invalid credentials', function () { var login = helper.makeLogin(); return db.User.register(login, 'secret').then(function (u) { return db.User.logout(); }).then(function () { return expect(db.User.login(login, 'hackit')).be.rejected; }); }); it('should not login twice', function () { var login = helper.makeLogin(); return db.User.register(login, 'secret').then(function (u) { expect(function () { db.User.login(login, 'secret'); }).throw(Error); }).then(function () { return db.User.logout(); }).then(function () { return db.User.login(login, 'secret'); }) .then(function () { expect(function () { db.User.login(login, 'secret'); }).throw(Error); }); }); it('should logout user', function () { var login = helper.makeLogin(); return db.User.register(login, 'secret').then(function () { expect(db.token).be.ok; expect(db.User.me).be.ok; return db.logout(); }).then(function () { expect(db.token).be.null; expect(db.User.me).be.null; }); }); it('should renew user token', function () { var login = helper.makeLogin(); var oldToken; return db.User.register(login, 'secret').then(function () { return helper.sleep(RENEW_TIMEOUT); }).then(function () { expect(db.token).be.ok; oldToken = db.token; return db.renew(); }).then(function () { expect(db.token).not.eqls(oldToken); }); }); it('should not old cached user tokens from a renewal', function () { var login = helper.makeLogin(); var oldToken; return db.User.register(login, 'secret').then(function () { return helper.sleep(RENEW_TIMEOUT); }).then(function () { expect(db.token).be.ok; oldToken = db.token; // create a browser cached object, with a renewed token return db.renew(); }).then(function () { // renew by side effect var newToken = db.token; expect(db.token).not.eqls(oldToken); db.token = oldToken; expect(db.token).eqls(newToken); }); }); it('should change password', function () { var oldLogin = helper.makeLogin(); var oldToken; return db.User.register(oldLogin, 'secret').then(function () { oldToken = db.token; return helper.sleep(RENEW_TIMEOUT); }).then(function () { return db.me.newPassword('secret', 'newSecret'); }).then(function () { expect(oldToken).not.eqls(db.token); return db.User.logout(); }) .then(function () { return db.User.login(oldLogin, 'newSecret'); }) .then(function () { return db.User.logout(); }) .then(function () { return expect(db.User.login(oldLogin, 'secret')).be.rejected; }); }); it('should keep user login when newPassword is called with invalid credentials', function () { var oldLogin = helper.makeLogin(); var oldToken; return db.User.register(oldLogin, 'secret').then(function () { oldToken = db.token; return helper.sleep(RENEW_TIMEOUT); }).then(function () { return expect(db.me.newPassword('wrong-secret', 'newSecret')).rejectedWith('User name or password is incorrect'); }).then(function () { expect(oldToken).eqls(db.token); expect(db.me.username).eqls(oldLogin); }); }); it('should be allowed to change password as root', function () { var oldLogin = helper.makeLogin(); var oldToken; return db.User.register(oldLogin, 'secret').then(function () { return db.User.logout(); }).then(function () { return db.User.login('root', 'root'); }).then(function () { oldToken = db.token; expect(db.me.username).eqls('root'); return db.User.newPassword(oldLogin, '', 'newSecret'); }) .then(function () { expect(db.me.username).eqls('root'); expect(db.token).eqls(oldToken); return db.User.logout(); }) .then(function () { return expect(db.User.login(oldLogin, 'newSecret')).be.fulfilled.then(function () { return db.User.logout(); }); }) .then(function () { return expect(db.User.login(oldLogin, 'secret')).be.rejected; }); }); it('should not be allowed to insert user', function () { var name = helper.makeLogin(); var newUser = db.User.fromJSON({ username: name, }); return expect(newUser.save()).be.rejected; }); it('should not be allowed to register with an empty password', function () { return expect(db.User.register(helper.makeLogin(), '')).be.rejected; }); it('should fail change username with email verification disabled', function () { var login = helper.makeLogin().concat('@baqend.com'); var newLogin = helper.makeLogin().concat('@baqend.com'); return db.User.register(login, 'secret').then(function () { return db.User.logout(); }).then(function () { return db.User.login('root', 'root'); }).then(function () { expect(db.me.username).eqls('root'); return expect(db.User.changeUsername(login, newLogin, 'secret')).be.rejectedWith('Email verification not enabled'); }); }); it('should create api token for root', function () { return db.User.login('root', 'root').then(function () { return db.User.me.requestAPIToken(); }).then(function (apiToken) { expect(apiToken).not.be.null; return db.User.requestAPIToken(db.User.me); }).then(function (apiToken) { expect(apiToken).not.be.null; return db.User.requestAPIToken('1'); }) .then(function (apiToken) { expect(apiToken).not.be.null; }); }); it('should create api token for other user', function () { var user = helper.makeLogin(); var regUser; return db.User.register(user, 'secret', db.User.LoginOption.NO_LOGIN).then(function (usr) { regUser = usr; return db.User.login('root', 'root'); }).then(function () { return db.User.requestAPIToken(regUser); }).then(function (apiToken) { expect(apiToken).not.be.null; return db.User.requestAPIToken(regUser.id); }) .then(function (apiToken) { expect(apiToken).not.be.null; }); }); it('should only be allowed for admins to create API token', function () { var user = helper.makeLogin(); return db.User.register(user, 'secret').then(function () { return expect(db.User.me.requestAPIToken()).be.rejected; }); }); it('should only be allowed for admins to revoke tokens', function () { var user = helper.makeLogin(); return db.User.register(user, 'secret').then(function () { return expect(db.User.revokeAllTokens(db.User.me)).be.rejected; }); }); it('should return a new token if revoking own tokens', function () { var token; return db.User.login('root', 'root').then(function () { return helper.sleep(1000); }).then(function () { token = db.token; return db.User.revokeAllTokens(db.User.me); }).then(function () { expect(token).not.equal(db.token); }); }); }); describe('on global DB', function () { before(function () { if (!DB.isReady) { DB.connect(env.TEST_SERVER); } return DB.ready().then(function () { return DB.User.logout(); }); }); afterEach(function () { return DB.User.logout(); }); it('should remove token if password has been changed', function () { var login = helper.makeLogin(); return DB.User.register(login, 'secret').then(function () { return helper.sleep(RENEW_TIMEOUT); }).then(function () { return db.User.login(login, 'secret'); }).then(function () { return db.User.me.newPassword('secret', 'newSecret'); }) .then(function () { expect(DB.tokenStorage.token).be.ok; return DB.renew(); }) .then(function () { expect(DB.tokenStorage.token).be.null; expect(DB.User.me).be.null; expect(DB.token).be.null; }); }); it('should fail change username with email verification disabled', function () { var login = helper.makeLogin().concat('@baqend.com'); var newLogin = helper.makeLogin().concat('@baqend.com'); return db.User.register(login, 'secret').then(function () { return db.User.logout(); }).then(function () { return db.User.login('root', 'root'); }).then(function () { expect(db.me.username).eqls('root'); return expect(db.User.me.changeUsername(newLogin, 'secret')).be.rejectedWith('Email verification not enabled'); }); }); it('should remove token if token is invalid', function () { var login = helper.makeLogin(); return DB.User.register(login, 'secret').then(function () { var token = DB.tokenStorage.token; expect(token).be.ok; DB.tokenStorage.update(token.substring(0, token.length - 1) + (token.substr(token.length - 1, token.length) === '0' ? '1' : '0')); return DB.renew(); }).then(function (user) { expect(user).be.null; expect(DB.tokenStorage.token).be.null; expect(DB.User.me).be.null; expect(DB.token).be.null; }); }); it('should not remove token if not global', function () { var login = helper.makeLogin(); var oldToken; return DB.User.register(login, 'secret').then(function () { return db.User.login(login, 'secret'); }).then(function () { expect(DB.token).be.ok; oldToken = DB.token; db.token = db.token.replace(/.{1}$/, db.token.substr(db.token.length - 1, db.token.length) === '0' ? '1' : '0'); return db.renew(); }).then(function (user) { expect(user).be.null; expect(DB.token).eqls(oldToken); }); }); it('should use global storage if tokenStorage is true', function () { var login = helper.makeLogin(); return DB.User.register(login, 'secret').then(function () { expect(DB.tokenStorage).eqls(DB.entityManagerFactory.tokenStorage); expect(DB.me).be.ok; expect(DB.token).be.ok; return DB.renew(); }); }); it('should remove token by logout if tokenStorage is true', function () { var login = helper.makeLogin(); return DB.User.register(login, 'secret').then(function () { expect(DB.tokenStorage).eqls(DB.entityManagerFactory.tokenStorage); expect(DB.me).be.ok; expect(DB.token).be.ok; return DB.logout(); }).then(function () { return expect(DB.renew()).become(null); }); }); it('should autologin on when tokenStorage is true', function () { var login = helper.makeLogin(); return DB.User.register(login, 'secret').then(function () { var db = new DB.EntityManagerFactory(env.TEST_SERVER).createEntityManager(true); return db.ready().then(function () { expect(db.me).be.ok; expect(db.token).be.ok; }); }); }); it('should not autologin when tokenStorage is false', function () { var login = helper.makeLogin(); return DB.User.register(login, 'secret').then(function () { var db = new DB.EntityManagerFactory(env.TEST_SERVER).createEntityManager(); return db.ready().then(function () { expect(db.me).be.not.ok; expect(db.token).be.not.ok; }); }); }); if (typeof localStorage !== 'undefined') { it('should save token in session storage when register loginOption is false', function () { var user = new DB.User({ username: helper.makeLogin() }); return DB.User.register(user, 'secret', false).then(function (u) { expect(u.username).eqls(user.username); expect(localStorage.getItem('BAT:' + db.connection.origin)).be.not.ok; expect(sessionStorage.getItem('BAT:' + db.connection.origin)).be.ok; }); }); it('should save token in local storage when register loginOption is true', function () { var user = new DB.User({ username: helper.makeLogin() }); return DB.User.register(user, 'secret', true).then(function (u) { expect(u.username).eqls(user.username); expect(localStorage.getItem('BAT:' + db.connection.origin)).be.ok; expect(sessionStorage.getItem('BAT:' + db.connection.origin)).be.not.ok; }); }); it('should save token in session storage when login loginOption is false', function () { var username = helper.makeLogin(); var user = new DB.User({ username: username }); return DB.User.register(user, 'secret', db.User.LoginOption.NO_LOGIN).then(function () { return DB.User.login(username, 'secret', false); }).then(function (u) { expect(u.username).eqls(user.username); expect(localStorage.getItem('BAT:' + db.connection.origin)).be.not.ok; expect(sessionStorage.getItem('BAT:' + db.connection.origin)).be.ok; }); }); it('should save token in local storage when login loginOption is true', function () { var username = helper.makeLogin(); var user = new DB.User({ username: username }); return DB.User.register(user, 'secret', db.User.LoginOption.NO_LOGIN).then(function () { return DB.User.login(username, 'secret', true); }).then(function (u) { expect(u.username).eqls(user.username); expect(localStorage.getItem('BAT:' + db.connection.origin)).be.ok; expect(sessionStorage.getItem('BAT:' + db.connection.origin)).be.not.ok; }); }); it('should remove token after logout', function () { var username = helper.makeLogin(); var user = new DB.User({ username: username }); return DB.User.register(user, 'secret').then(function () { expect(DB.User.me).be.ok; expect(localStorage.getItem('BAT:' + db.connection.origin)).be.ok; return DB.User.logout(); }).then(function () { expect(DB.User.me).be.null; expect(DB.token).be.null; expect(localStorage.getItem('BAT:' + db.connection.origin)).be.not.ok; expect(sessionStorage.getItem('BAT:' + db.connection.origin)).be.not.ok; }); }); } }); describe('roles', function () { var user1, user2, user3; beforeEach(function () { user1 = new db.User(); user1.username = helper.makeLogin(); user2 = new db.User(); user2.username = helper.makeLogin(); user3 = new db.User(); user3.username = helper.makeLogin(); return db.User.register(user1, user1.username, db.User.LoginOption.NO_LOGIN).then(function (usr) { user1 = usr; return db.User.register(user2, user2.username, db.User.LoginOption.NO_LOGIN); }).then(function (usr) { user2 = usr; return db.User.register(user3, user3.username, db.User.LoginOption.NO_LOGIN); }).then(function (usr) { user3 = usr; }); }); it('should save and load', function () { var role = new db.Role(); role.addUser(user1); role.addUser(user3); expect(role.hasUser(user1)).be.true; expect(role.hasUser(user2)).be.false; expect(role.hasUser(user3)).be.true; return role.insert().then(function () { expect(role.hasUser(user1)).be.true; expect(role.hasUser(user2)).be.false; expect(role.hasUser(user3)).be.true; role.removeUser(user1); role.addUser(user2); return role.save(); }).then(function () { expect(role.hasUser(user1)).be.false; expect(role.hasUser(user2)).be.true; expect(role.hasUser(user3)).be.true; }); }); it('should renew token', function () { var login = helper.makeLogin(); var oldToken; return db.User.register(login, 'secret').then(function () { return helper.sleep(RENEW_TIMEOUT); }).then(function () { oldToken = db.token; var role = new db.Role(); role.addUser(user1); return role.insert(); }).then(function () { expect(oldToken).not.eqls(db.token); }); }); }); });