-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathaccounts-add-service-server-tests.js
238 lines (211 loc) · 8.44 KB
/
accounts-add-service-server-tests.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
/* globals AccountsAddService, AccountsMultiple */
"use strict";
Tinytest.add(
'brettle:accounts-add-service - logged out user logging in succeeds',
function (test) {
AccountsMultiple._unregisterAll();
AccountsAddService._init();
var connection = DDP.connect(Meteor.absoluteUrl());
Meteor.users.remove({ 'services.test1.name': "testname" });
var testId = connection.call('login', { test1: "testname" }).id;
test.isNotUndefined(testId);
test.isNotNull(testId);
}
);
Tinytest.add(
'brettle:accounts-add-service - logged in user adds service merges profile',
function (test) {
AccountsMultiple._unregisterAll();
AccountsAddService._init();
var connection = DDP.connect(Meteor.absoluteUrl());
Meteor.users.remove({ 'services.test1.name': "testname"});
var testId = connection.call('login', {
test1: "testname",
docDefaults: {
username: 'testname'
}
}).id;
test.isNotUndefined(testId);
test.isNotNull(testId);
Accounts.addEmail(testId, '[email protected]');
Accounts.sendVerificationEmail(testId);
var user = Meteor.users.findOne(testId);
test.equal(user.services.email.verificationTokens.length, 1, "has token");
var oldEmailVerificationToken = user.services.email.verificationTokens[0];
test.isUndefined(user.services.test2);
Meteor.users.remove({ 'services.test2.name': "test2name"});
var newEmailVerificationToken = {
token: "newToken",
address: "newAddress",
when: new Date()
};
test.throws(function () {
connection.call('login', {
test2: "test2name",
docDefaults: {
emails: [ { address: '[email protected]' } ],
username: 'test2name',
profile: { name: 'test2name' },
services: {
email: {
verificationTokens: [newEmailVerificationToken]
}
}
}
});
}, 'Service will be added');
user = Meteor.users.findOne(testId);
test.isNotUndefined(user.services.test2, 'user.services.test2 defined');
test.isNotNull(user.services.test2, 'user.services.test2 not null');
test.equal(user.profile.name, 'test2name', 'merge profile');
test.equal(user.emails[0].address, '[email protected]', 'keep old emails');
test.equal(user.emails[1].address, '[email protected]', 'add new emails');
test.equal(user.username, 'testname', 'merge top-level non-destructively');
test.equal(user.services.email.verificationTokens,
[oldEmailVerificationToken, newEmailVerificationToken], "token added");
connection.call('logout');
var test2Id = connection.call('login', { test2: "test2name" }).id;
test.equal(test2Id, testId, 'ids match');
}
);
Tinytest.add(
'brettle:accounts-add-service - logged in user switches to existing user',
function (test) {
AccountsMultiple._unregisterAll();
AccountsAddService._init();
var connection = DDP.connect(Meteor.absoluteUrl());
Meteor.users.remove({ 'services.test2.name': "test2name"});
var test2Id = connection.call('login', { test2: "test2name" }).id;
test.isNotUndefined(test2Id);
test.isNotNull(test2Id);
// Make sure we don't just rely on the existence of the 'resume' service.
// See https://github.com/brettle/meteor-accounts-add-service/issues/1
Meteor.users.update({ 'services.test2.name': "test2name"}, {
$unset: {'services.resume': ''}
});
connection.call('logout');
Meteor.users.remove({ 'services.test1.name': "testname"});
var testId = connection.call('login', { test1: "testname" }).id;
test.isNotUndefined(testId);
test.isNotNull(testId);
var user = Meteor.users.findOne(testId);
test.equal(user.services.test1.name, 'testname');
var newTest2Id = connection.call('login', { test2: "test2name" }).id;
test.notEqual(newTest2Id, testId, 'not test id');
test.equal(newTest2Id, test2Id, 'same as original user');
user = Meteor.users.findOne(newTest2Id);
test.isUndefined(user.services.test1, 'no user.services.test1');
}
);
Tinytest.add(
'brettle:accounts-add-service - add hasLoggedIn to existing resume users',
function (test) {
AccountsMultiple._unregisterAll();
AccountsAddService._init();
var connection = DDP.connect(Meteor.absoluteUrl());
// Add a user who logged in after 0.3.5 and didn't lose his resume service
// (i.e. has services.resume and hasLoggedIn). This user should be left
// alone.
connection.call('login', { test1: "resumeYesHasLoggedInYes" });
// Add a user who didn't log in or logged in before 0.3.5 but lost his
// resume service (i.e. has neither services.resume nor hasLoggedIn). This
// user should be left alone because we can't tell which is the case.
Meteor.users.update(connection.call('login', {
test1: "resumeNoHasLoggedInNo"
}).id, {
$unset: {
hasLoggedIn: '',
'services.resume': ''
}
});
// Add a user who logged in after 0.3.5 and lost his resume service (i.e.
// doesn't have services.resume but has hasLoggedIn). This user should be
// left alone.
Meteor.users.update(connection.call('login', {
test1: "resumeNoHasLoggedInYes"
}).id, {
$unset: {
'services.resume': ''
}
});
// Add a user who logged in before 0.3.5 and didn't lose his resume service
// (i.e. has services.resume but not hasLoggedIn). This user should get
// hasLoggedIn added.
var resumeYesHasLoggedInNoId =
connection.call('login', { test1: "resumeYesHasLoggedInNo" }).id;
Meteor.users.update(resumeYesHasLoggedInNoId, {
$unset: { hasLoggedIn: '' }
});
connection.call('logout');
var usersAdded = [];
var usersRemoved = [];
var usersChanged = [];
var observer = Meteor.users.find().observeChanges({
added: function (newUserId) {
usersAdded.push(newUserId);
},
changed: function (userId, fields) {
usersChanged.push({ userId: userId, fields: fields });
},
removed: function (oldUserId) {
usersRemoved.push(oldUserId);
}
});
usersAdded = []; // Ignore the users that were there already
// Clear the control collection
AccountsAddService._migrationControl.remove({});
AccountsAddService.databaseMigrationEnabled = false;
test.isFalse(AccountsAddService._migrateDatabase(), 'migration disabled');
waitForCallbacksToFinish();
test.equal(usersAdded.length + usersRemoved.length + usersChanged.length, 0,
'no users affected when migration disabled');
AccountsAddService.databaseMigrationEnabled = true;
test.equal(AccountsAddService._migrateDatabase(), 1, '1 user updated');
waitForCallbacksToFinish();
test.equal(usersAdded.length + usersRemoved.length, 0,
'no users added/removed when migration enabled');
test.equal(usersChanged, [{
userId: resumeYesHasLoggedInNoId,
fields: {
hasLoggedIn: true
}
}], 'only updated user who has resume service but not hasLoggedIn');
// Unmigrate the user for the remainder of the test
Meteor.users.update(resumeYesHasLoggedInNoId, {
$unset: { hasLoggedIn: '' }
});
waitForCallbacksToFinish();
usersAdded = [];
usersRemoved = [];
usersChanged = [];
test.isFalse(AccountsAddService._migrateDatabase(), 'migrate only once');
waitForCallbacksToFinish();
test.equal(usersAdded.length + usersRemoved.length + usersChanged.length, 0,
'no users affected when already migrated');
AccountsAddService._migrationControl.update('addHasLoggedIn', {
$set: {
startedOn: new Date()
}
});
test.isFalse(AccountsAddService._migrateDatabase(), 'migrate in progress');
waitForCallbacksToFinish();
test.equal(usersAdded.length + usersRemoved.length + usersChanged.length, 0,
'no users affected when migration in progress');
observer.stop();
}
);
// Wait until the observeChanges callbacks have been called before returning. To
// do this, we insert into to a separate collection that we observe, and assume
// that by the time that the added callback is called on our collection, all
// other observe callbacks have already been called.
var testCollection = new Mongo.Collection("AccountsAddServiceTest");
var waitForCallbacksToFinish = Meteor.wrapAsync(function (cb) {
testCollection.remove({});
var observer = testCollection.find().observe({
added: function () {
observer.stop();
cb.call();
}
});
testCollection.insert({});
});