From 67510a6811dc3d40464e270f3e99c445a3b3be40 Mon Sep 17 00:00:00 2001 From: Gabriel Grubba Date: Tue, 20 Dec 2022 11:40:28 -0300 Subject: [PATCH] wip: updating test in accounts-password --- packages/accounts-password/password_tests.js | 143 +++++++++++-------- 1 file changed, 81 insertions(+), 62 deletions(-) diff --git a/packages/accounts-password/password_tests.js b/packages/accounts-password/password_tests.js index 62f46ea871..5be698e2c2 100644 --- a/packages/accounts-password/password_tests.js +++ b/packages/accounts-password/password_tests.js @@ -30,7 +30,7 @@ if (Meteor.isServer) { ); } -if (Meteor.isClient) (() => { +if (Meteor.isClient && false) (() => { // XXX note, only one test can do login/logout things at once! for // now, that is this test. @@ -1196,68 +1196,84 @@ if (Meteor.isServer) (() => { // XXX would be nice to test // Accounts.config({forbidClientAccountCreation: true}) + //TODO[FIBERS] Continue later Tinytest.addAsync( 'passwords - login token observes get cleaned up', - (test, onComplete) => { + async test => { const username = Random.id(); - Accounts.createUser({ + await Accounts.createUser({ username: username, password: hashPassword('password') }); + const testConn = + () => new Promise( + (resolve, reject) => + makeTestConnection( + test, + (clientConn, serverConn) => resolve({ clientConn, serverConn }), + reject + ) + ) + const { clientConn, serverConn } = await testConn(); + serverConn.onClose(() => { + test.isFalse(Accounts._getUserObserve(serverConn.id)); + }) + // TODO: continue later + console.log('here is ok3'); - makeTestConnection( - test, - (clientConn, serverConn) => { - serverConn.onClose(() => { - test.isFalse(Accounts._getUserObserve(serverConn.id)); - onComplete(); - }); - const result = clientConn.call('login', { - user: {username: username}, - password: hashPassword('password') - }); - test.isTrue(result); - const token = Accounts._getAccountData(serverConn.id, 'loginToken'); - test.isTrue(token); + const result = await clientConn.callAsync('login', { + user: { username: username }, + password: hashPassword('password') + }); - // We poll here, instead of just checking `_getUserObserve` - // once, because the login method defers the creation of the - // observe, and setting up the observe yields, so we could end - // up here before the observe has been set up. + + test.isTrue(result); + const token = Accounts._getAccountData(serverConn.id, 'loginToken'); + test.isTrue(token) + console.log('here is ok'); + const simplePollAsync = + () => new Promise((resolve, reject) => simplePoll( - () => !! Accounts._getUserObserve(serverConn.id), + () => !!Accounts._getUserObserve(serverConn.id), () => { test.isTrue(Accounts._getUserObserve(serverConn.id)); clientConn.disconnect(); + resolve(); }, () => { test.fail( - `timed out waiting for user observe for connection ${serverConn.id}` + `timed out waiting for user observe for connection ${ serverConn.id }` ); - onComplete(); + reject(); } - ); - }, - onComplete - ); + ) + ) + + + // We poll here, instead of just checking `_getUserObserve` + // once, because the login method defers the creation of the + // observe, and setting up the observe yields, so we could end + // up here before the observe has been set up. + await simplePollAsync() + } ); - Tinytest.add( + Tinytest.addAsync( "passwords - reset password doesn't work if email changed after email sent", - test => { + async test => { const username = Random.id(); const email = `${username}-intercept@example.com`; - const userId = Accounts.createUser({ + const userId = await Accounts.createUser({ username: username, email: email, password: hashPassword("old-password") }); - const user = Meteor.users.findOne(userId); + const user = await Meteor.users.findOne(userId); - Accounts.sendResetPasswordEmail(userId, email); + await Accounts.sendResetPasswordEmail(userId, email); const resetPasswordEmailOptions = Meteor.call("getInterceptedEmails", email)[0]; @@ -1268,7 +1284,7 @@ if (Meteor.isServer) (() => { const resetPasswordToken = match[1]; const newEmail = `${Random.id()}-new@example.com`; - Meteor.users.update(userId, {$set: {"emails.0.address": newEmail}}); + await Meteor.users.update(userId, {$set: {"emails.0.address": newEmail}}); test.throws( () => Meteor.call("resetPassword", resetPasswordToken, hashPassword("new-password")), @@ -1326,21 +1342,21 @@ if (Meteor.isServer) (() => { ); }); - Tinytest.add( + Tinytest.addAsync( 'passwords - reset password should not work when token is expired', - test => { + async test => { const username = Random.id(); const email = `${username}-intercept@example.com`; - const userId = Accounts.createUser({ + const userId = await Accounts.createUser({ username: username, email: email, password: hashPassword("old-password") }); - const user = Meteor.users.findOne(userId); + const user = await Meteor.users.findOne(userId); - Accounts.sendResetPasswordEmail(userId, email); + await Accounts.sendResetPasswordEmail(userId, email); const resetPasswordEmailOptions = Meteor.call("getInterceptedEmails", email)[0]; @@ -1350,17 +1366,19 @@ if (Meteor.isServer) (() => { test.isTrue(match); const resetPasswordToken = match[1]; - Meteor.users.update(userId, {$set: {"services.password.reset.when": new Date(Date.now() + -5 * 24 * 3600 * 1000) }}); + await Meteor.users.update(userId, {$set: {"services.password.reset.when": new Date(Date.now() + -5 * 24 * 3600 * 1000) }}); test.throws( () => Meteor.call("resetPassword", resetPasswordToken, hashPassword("new-password")), /Token expired/ ); - test.throws( - () => Meteor.call( + await test.throwsAsync( + async () => await Meteor.callAsync( "login", - {user: {username: username}, - password: hashPassword("new-password")} + { + user: { username: username }, + password: hashPassword("new-password") + } ), /Incorrect password/); }); @@ -1394,12 +1412,12 @@ if (Meteor.isServer) (() => { Accounts._options = options }); - Tinytest.add( + Tinytest.addAsync( 'passwords - reset tokens with reasons get cleaned up', - test => { + async test => { const email = `${test.id}-intercept@example.com`; const userId = Accounts.createUser({email: email, password: hashPassword('password')}); - Accounts.sendResetPasswordEmail(userId, email); + await Accounts.sendResetPasswordEmail(userId, email); test.isTrue(!!Meteor.users.findOne(userId).services.password.reset); Accounts._expirePasswordResetTokens(new Date(), userId); @@ -1407,13 +1425,13 @@ if (Meteor.isServer) (() => { test.isUndefined(Meteor.users.findOne(userId).services.password.reset); }); - Tinytest.add( + Tinytest.addAsync( 'passwords - reset tokens without reasons get cleaned up', - test => { + async test => { const email = `${test.id}-intercept@example.com`; - const userId = Accounts.createUser({email: email, password: hashPassword('password')}); - Accounts.sendResetPasswordEmail(userId, email); - Meteor.users.update({_id: userId}, {$unset: {"services.password.reset.reason": 1}}); + const userId = await Accounts.createUser({email: email, password: hashPassword('password')}); + await Accounts.sendResetPasswordEmail(userId, email); + await Meteor.users.update({_id: userId}, {$unset: {"services.password.reset.reason": 1}}); test.isTrue(!!Meteor.users.findOne(userId).services.password.reset); test.isUndefined(Meteor.users.findOne(userId).services.password.reset.reason); @@ -1519,26 +1537,27 @@ if (Meteor.isServer) (() => { } ) - Tinytest.add( + Tinytest.addAsync( "passwords - reset tokens don't get cleaned up when enroll tokens are cleaned up", - test => { + async test => { const email = `${test.id}-intercept@example.com`; - const userId = Accounts.createUser({email: email, password: hashPassword('password')}); + const userId = await Accounts.createUser({email: email, password: hashPassword('password')}); - Accounts.sendResetPasswordEmail(userId, email); + await Accounts.sendResetPasswordEmail(userId, email); const resetToken = Meteor.users.findOne(userId).services.password.reset; test.isTrue(resetToken); - Accounts._expirePasswordEnrollTokens(new Date(), userId); + await Accounts._expirePasswordEnrollTokens(new Date(), userId); test.equal(resetToken,Meteor.users.findOne(userId).services.password.reset); } ) // We should be able to change the username - Tinytest.add("passwords - change username & findUserByUsername", test => { + Tinytest.addAsync("passwords - change username & findUserByUsername", + async test => { const username = Random.id(); const ignoreFieldName = "profile"; - const userId = Accounts.createUser({ + const userId = await Accounts.createUser({ username, [ignoreFieldName]: {name: 'foo'}, }); @@ -1546,7 +1565,7 @@ if (Meteor.isServer) (() => { test.isTrue(userId); const newUsername = Random.id(); - Accounts.setUsername(userId, newUsername); + await Accounts.setUsername(userId, newUsername); test.equal(Accounts._findUserByQuery({id: userId}).username, newUsername); @@ -1558,12 +1577,12 @@ if (Meteor.isServer) (() => { // Test default field selector const options = Accounts._options; Accounts._options = {defaultFieldSelector: {[ignoreFieldName]: 0}}; - user = Accounts.findUserByUsername(newUsername); + user = await Accounts.findUserByUsername(newUsername); test.equal(user.username, newUsername, 'username - default ignore'); test.isUndefined(user[ignoreFieldName], 'field - default ignore'); // Test default field selector over-ride - user = Accounts.findUserByUsername(newUsername, { + user = await Accounts.findUserByUsername(newUsername, { fields: { [ignoreFieldName]: 1 }