UNPKG

babel-plugin-async-to-promises

Version:

Transpile ES7 async/await to vanilla ES6 Promise chains

424 lines (353 loc) 11.8 kB
'use strict'; var _utils = require('./utils'); var _extend = require('extend'); var _extend2 = _interopRequireDefault(_extend); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var db = void 0; function shouldBeAdminParty(session) { session.info.should.eql({ "authentication_handlers": ["api"], "authentication_db": "test" }); session.userCtx.should.eql({ "name": null, "roles": ["_admin"] }); session.ok.should.be.ok; } function shouldNotBeLoggedIn(session) { session.info.should.eql({ authentication_handlers: ["api"], authentication_db: "test" }); session.userCtx.should.eql({ name: null, roles: [] }); session.ok.should.be.ok; } function shouldBeSuccesfulLogIn(data, roles) { var copy = (0, _extend2.default)({}, data); // irrelevant delete copy.sessionID; copy.should.eql({ "ok": true, "name": "username", "roles": roles }); } function shouldBeLoggedIn(session, roles) { session.userCtx.should.eql({ "name": "username", "roles": roles }); session.info.authenticated.should.equal("api"); } describe('SyncAuthTests', function () { beforeEach(function () { return Promise.resolve().then(function () { db = (0, _utils.setup)(); return db.useAsAuthenticationDB({ isOnlineAuthDB: false }); }).then(function (_resp) { _utils.should.not.exist(_resp); }); }); afterEach(_utils.teardown); it('should test the daemon', function () { // handled by beforeEach and afterEach }); it('should not allow stopping usage as an auth db twice', function () { return Promise.resolve().then(function () { return db.stopUsingAsAuthenticationDB(); }).then(function () { return (0, _utils.shouldThrowError)(function () { return db.stopUsingAsAuthenticationDB(); }); }).then(function () { return db.useAsAuthenticationDB(); }).then(function () {}); }); it('should not allow using a db as an auth db twice', function () { return Promise.resolve().then(function () { return (0, _utils.shouldThrowError)(function () { return db.useAsAuthenticationDB(); }); }).then(function () {}); }); it('should have working db methods', function () { var signUpData, doc, session, logInData, session2, session3, logOutData, session4, logOutData2, error; return Promise.resolve().then(function () { return db.signUp("username", "password", { roles: ["test"] }); }).then(function (_resp) { signUpData = _resp; signUpData.rev.indexOf("1-").should.equal(0); signUpData.ok.should.be.ok; signUpData.id.should.equal("org.couchdb.user:username"); return db.get("org.couchdb.user:username"); }).then(function (_resp) { doc = _resp; doc._rev.indexOf("1-").should.equal(0); doc.should.have.property("derived_key"); doc.iterations.should.equal(10); doc.name.should.equal("username"); doc.password_scheme.should.equal("pbkdf2"); doc.roles.should.eql(["test"]); doc.should.have.property("salt"); doc.type.should.equal("user"); doc.should.not.have.property("password"); return db.session(); }).then(function (_resp) { session = _resp; shouldBeAdminParty(session); return db.logIn("username", "password"); }).then(function (_resp) { logInData = _resp; shouldBeSuccesfulLogIn(logInData, ["test"]); return db.session(); }).then(function (_resp) { session2 = _resp; shouldBeLoggedIn(session2, ["test"]); return db.multiUserSession(); }).then(function (_resp) { session3 = _resp; shouldBeAdminParty(session3); return db.logOut(); }).then(function (_resp) { logOutData = _resp; logOutData.ok.should.be.ok; return db.session(); }).then(function (_resp) { session4 = _resp; shouldBeAdminParty(session4); //should also give a {ok: true} when not logged in. return db.logOut(); }).then(function (_resp) { logOutData2 = _resp; logOutData2.ok.should.be.ok; return (0, _utils.shouldThrowError)(function () { return db.logIn("username", "wrongPassword"); }); }).then(function (_resp) { error = _resp; error.status.should.equal(401); error.name.should.equal("unauthorized"); error.message.should.equal("Name or password is incorrect."); }); }); it('should support sign up without roles', function () { var result, resp2; return Promise.resolve().then(function () { return db.signUp("username", "password"); }).then(function (_resp) { result = _resp; result.ok.should.be.ok; return db.get("org.couchdb.user:username"); }).then(function (_resp) { resp2 = _resp; resp2.roles.should.eql([]); }); }); it('should validate docs', function () { var error, resp; return Promise.resolve().then(function () { return (0, _utils.shouldThrowError)(function () { return db.post({}); }); }).then(function (_resp) { error = _resp; error.status.should.equal(403); return db.bulkDocs([{}]); }).then(function (_resp) { resp = _resp; resp[0].status.should.equal(403); }); }); it('should handle conflicting logins', function () { var doc1, doc2, error; return Promise.resolve().then(function () { doc1 = { _id: "org.couchdb.user:test", _rev: "1-blabla", type: "user", name: "test", roles: [] }; doc2 = (0, _extend2.default)({}, doc1); doc2._rev = "2-something"; //generate conflict return db.bulkDocs([doc1, doc2], { new_edits: false }); }).then(function () { return (0, _utils.shouldThrowError)(function () { return db.logIn("test", "unimportant"); }); }).then(function (_resp) { error = _resp; error.status.should.equal(401); error.name.should.equal("unauthorized"); error.message.should.contain("conflict"); }); }); it('should not accept invalid session ids', function () { var err; return Promise.resolve().then(function () { return (0, _utils.shouldThrowError)(function () { return Promise.resolve().then(function () { return db.multiUserSession('invalid-session-id'); }).then(function () {}); }); }).then(function (_resp) { err = _resp; err.status.should.equal(400); err.name.should.equal('bad_request'); err.message.should.contain('Malformed'); }); }); afterEach(function () { return Promise.resolve().then(function () { return db.stopUsingAsAuthenticationDB(); }).then(function (_resp) { _utils.should.not.exist(_resp); }); }); }); describe('AsyncAuthTests', function () { beforeEach(function () { db = (0, _utils.setup)(); }); afterEach(_utils.teardown); it('should suport the basics', function (done) { function cb(err) { db.stopUsingAsAuthenticationDB(); done(err); } db.useAsAuthenticationDB(cb); }); }); describe('AsyncAuthTestsWithoutDaemon', function () { beforeEach(function () { db = (0, _utils.setup)(); }); afterEach(_utils.teardown); it('should be impossible to use the various exposed methods', function () { _utils.should.not.exist(db.signUp); _utils.should.not.exist(db.session); _utils.should.not.exist(db.logIn); _utils.should.not.exist(db.logOut); }); it('should hash admin passwords', function () { var admins, resp; return Promise.resolve().then(function () { admins = { test: "-pbkdf2-0abe2dcd23e0b6efc39004749e8d242ddefe46d1,16a1031881b31991f21a619112b1191fb1c41401be1f31d5,10", test2: "test" }; return db.hashAdminPasswords(admins); }).then(function (_resp) { resp = _resp; resp.test.should.equal(admins.test); //10 is the default amount of iterations resp.test2.indexOf("-pbkdf2-").should.equal(0); resp.test2.lastIndexOf(",10").should.equal(resp.test2.length - 3); }); }); it('should support changing admin passwords hash iterations', function () { var resp; return Promise.resolve().then(function () { return db.hashAdminPasswords({ abc: "test" }, { iterations: 11 }); }).then(function (_resp) { resp = _resp; resp.abc.indexOf("-pbkdf2-").should.equal(0); resp.abc.lastIndexOf(",11").should.equal(resp.abc.length - 3); }); }); }); describe('No automated test setup', function () { beforeEach(function () { db = (0, _utils.setup)(); }); afterEach(_utils.teardown); it('should support admin logins', function () { var opts, logInData, sessionData; return Promise.resolve().then(function () { opts = { admins: { username: '-pbkdf2-37508a1f1c5c19f38779fbe029ae99ee32988293,885e6e9e9031e391d5ef12abbb6c6aef,10' }, secret: db.generateSecret() }; return db.useAsAuthenticationDB(opts); }).then(function () { return db.multiUserSession(); }).then(function (_resp) { shouldNotBeLoggedIn(_resp); return db.multiUserLogIn('username', 'test'); }).then(function (_resp) { logInData = _resp; shouldBeSuccesfulLogIn(logInData, ['_admin']); db.stopUsingAsAuthenticationDB(); return db.useAsAuthenticationDB({/* no admins */}); }).then(function () { return db.multiUserSession(logInData.sessionID); }).then(function (_resp) { //if admins not supplied, there's no session (admin party!) shouldBeAdminParty(_resp); db.stopUsingAsAuthenticationDB(); return db.useAsAuthenticationDB(opts); }).then(function () { return db.multiUserSession(logInData.sessionID); }).then(function (_resp) { //otherwise there is sessionData = _resp; shouldBeLoggedIn(sessionData, ["_admin"]); //check if logout works (i.e. forgetting the session id.) return db.multiUserSession(); }).then(function (_resp) { shouldNotBeLoggedIn(_resp); }); }); it('should handle invalid admins field on login', function () { var admins, error; return Promise.resolve().then(function () { admins = { username: "-pbkdf2-37508a1f1c5c19f38779fbe029ae99ee32988293,885e6e9e9031e391d5ef12abbb6c6aef,10", username2: 'this-is-no-hash' }; return db.useAsAuthenticationDB({ admins: admins }); }).then(function () { return db.session(); }).then(function (_resp) { shouldNotBeLoggedIn(_resp); return (0, _utils.shouldThrowError)(function () { return db.logIn("username2", "test"); }); }).then(function (_resp) { error = _resp; error.status.should.equal(401); return db.session(); }).then(function (_resp) { shouldNotBeLoggedIn(_resp); }); }); it('should not accept timed out sessions', function () { var sessionID; return Promise.resolve().then(function () { return db.useAsAuthenticationDB({ secret: '4ed13457964f05535fbb54c0e9f77a83', timeout: 3600, admins: { // password 'test' 'jan': '-pbkdf2-2be978bc2be874f755d8899cfddad18ed78e3c09,d5513283df4f649c72757a91aa30bdde,10' } }); }).then(function () { sessionID = 'amFuOjU2Njg4MkI5OkEK3-1SRseo6yNRHfk-mmk6zOxm'; // example stolen from calculate-couchdb-session-id's test suite. That // session timed out quite a bit ago. return db.multiUserSession(sessionID); }).then(function (_resp) { shouldNotBeLoggedIn(_resp); }); }); });