Skip to content

Commit

Permalink
Merge pull request #9148 from hwillson/issue-9140
Browse files Browse the repository at this point in the history
Make sure Accounts login only sets 1 onReconnect callback
  • Loading branch information
abernix committed Sep 28, 2017
2 parents 8a627c1 + c5f642c commit 01b5487
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 14 deletions.
7 changes: 7 additions & 0 deletions packages/accounts-base/accounts_client.js
Expand Up @@ -281,6 +281,13 @@ Ap.callLoginMethod = function (options) {
// already logged in they will still get logged in on reconnect.
// See issue #4970.
} else {
// First clear out any previously set Acccounts login onReconnect
// callback (to make sure we don't keep piling up duplicate callbacks,
// which would then all be triggered when reconnecting).
if (self._reconnectStopper) {
self._reconnectStopper.stop();
}

self._reconnectStopper = DDP.onReconnect(function (conn) {
if (conn != self.connection) {
return;
Expand Down
53 changes: 39 additions & 14 deletions packages/accounts-base/accounts_reconnect_tests.js
Expand Up @@ -7,36 +7,32 @@ if (Meteor.isServer) {
}

if (Meteor.isClient) {
const loginAsUser1 = (onUser1LoggedIn) => {
Accounts.createUser({
username: `testuser1-${Random.id()}`,
password: `password1-${Random.id()}`
}, onUser1LoggedIn);
};

Tinytest.addAsync('accounts - reconnect auto-login', function(test, done) {
var onReconnectCalls = 0;
var reconnectHandler = function () {
onReconnectCalls++;
};
Meteor.connection.onReconnect = reconnectHandler;

var username1 = 'testuser1-' + Random.id();

var username2 = 'testuser2-' + Random.id();
var password1 = 'password1-' + Random.id();
var password2 = 'password2-' + Random.id();
var timeoutHandle;
var onLoginStopper;

loginAsUser1();

function loginAsUser1() {
Accounts.createUser({
username: username1,
password: password1
}, onUser1LoggedIn);
}

function onUser1LoggedIn(err) {
loginAsUser1((err) => {
test.isUndefined(err, 'Unexpected error logging in as user1');
Accounts.createUser({
username: username2,
password: password2
}, onUser2LoggedIn);
}
});

function onUser2LoggedIn(err) {
test.isUndefined(err, 'Unexpected error logging in as user2');
Expand Down Expand Up @@ -81,4 +77,33 @@ if (Meteor.isClient) {
done();
}
});

// Make sure that when a logged in user is disconnected then reconnected,
// they still only have one Accounts login onReconnect callback set.
// Addresses: https://github.com/meteor/meteor/issues/9140
Tinytest.addAsync(
'accounts - verify single onReconnect callback',
function (test, done) {
loginAsUser1((err) => {
test.isUndefined(err, 'Unexpected error logging in as user1');
test.equal(
Object.keys(DDP._reconnectHook.callbacks).length,
1,
'Only one onReconnect callback should be registered'
);
Meteor.disconnect();
test.isFalse(Meteor.status().connected);
Meteor.reconnect();
setTimeout(() => {
test.isTrue(Meteor.status().connected);
test.equal(
Object.keys(DDP._reconnectHook.callbacks).length,
1,
'Only one onReconnect callback should be registered'
);
done();
}, 1000);
});
}
);
}

0 comments on commit 01b5487

Please sign in to comment.