-
Notifications
You must be signed in to change notification settings - Fork 25
/
UserAccessor.spec.js
182 lines (147 loc) · 7.59 KB
/
UserAccessor.spec.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
// @flow
import { utils } from '@tanker/crypto';
import { InvalidArgument } from '@tanker/errors';
import { createIdentity, getPublicIdentity, _deserializePublicIdentity, type PublicPermanentIdentity } from '@tanker/identity';
import { expect, sinon } from '@tanker/test-utils';
import { makeUserStoreBuilder } from './UserStoreBuilder';
import UserAccessor from '../Users/UserAccessor';
import makeUint8Array from './makeUint8Array';
import Trustchain from '../Trustchain/Trustchain';
class StubTrustchain {
sync = () => null;
updateUserStore = () => null;
_trustchainStore = {
_trustchainId: null,
};
verifyDevice = () => null;
}
async function makeTestUsers({ onUpdateUserStore } = {}) {
const stubTrustchain = new StubTrustchain();
const me = makeUint8Array('fake author', 32);
const { builder, generator, userStore } = await makeUserStoreBuilder();
stubTrustchain._trustchainStore._trustchainId = generator.trustchainId; // eslint-disable-line no-underscore-dangle
if (onUpdateUserStore)
stubTrustchain.updateUserStore = onUpdateUserStore({ builder, generator, userStore });
const stubs = {
sync: sinon.stub(stubTrustchain, 'sync'),
updateUserStore: sinon.stub(stubTrustchain, 'updateUserStore'),
};
const trustchain: Trustchain = (stubTrustchain: any);
const users = new UserAccessor(userStore, trustchain, generator.trustchainId, me);
// add a user just in case... (can catch bugs)
await builder.newUserCreationV3('germaine');
return {
builder,
generator,
userStore,
users,
stubTrustchain,
stubs,
};
}
describe('Users', () => {
describe('findUser', () => {
it('returns a user', async () => {
const { users, builder } = await makeTestUsers();
const alice = await builder.newUserCreationV3('alice');
const user = await users.findUser(alice.entry.user_id);
expect(user && user.userId).to.deep.equal(alice.entry.user_id);
});
it('fetches a user', async () => {
const { users, stubs } = await makeTestUsers();
const hashedBobId = new Uint8Array(32);
await users.findUser(hashedBobId);
expect(stubs.sync.withArgs([hashedBobId]).calledOnce).to.be.true;
expect(stubs.updateUserStore.withArgs([hashedBobId]).calledOnce).to.be.true;
});
it('returns a fetched user', async () => {
const { users, generator, builder, stubs } = await makeTestUsers();
const hashedBobId = generator.userId('bob');
stubs.updateUserStore.callsFake(async () => {
await builder.newUserCreationV3('bob');
});
const user = await users.findUser(hashedBobId);
expect(user && user.userId).to.deep.equal(hashedBobId);
});
});
describe('findUsers', () => {
it('fetches users', async () => {
const { users, stubs, generator, builder } = await makeTestUsers();
const hashedBobId = generator.userId('bob');
const hashedAliceId = generator.userId('alice');
const merlin = await builder.newUserCreationV3('merlin');
await users.findUsers({ hashedUserIds: [merlin.entry.user_id, hashedBobId, hashedAliceId] });
expect(stubs.sync.withArgs([merlin.entry.user_id, hashedBobId, hashedAliceId]).calledOnce).to.be.true;
expect(stubs.updateUserStore.withArgs([merlin.entry.user_id, hashedBobId, hashedAliceId]).calledOnce).to.be.true;
});
it('returns users', async () => {
const { users, builder } = await makeTestUsers();
const alice = await builder.newUserCreationV3('alice');
const bob = await builder.newUserCreationV3('bob');
const hashedUserIds = [alice.entry.user_id, bob.entry.user_id];
const retUsers = await users.findUsers({ hashedUserIds });
const retUserIds = retUsers.map(u => utils.toBase64(u.userId));
const expectedUserIds = hashedUserIds.map(id => utils.toBase64(id));
expect(retUserIds).to.have.members(expectedUserIds);
});
it('returns all users including fetched ones', async () => {
const { users, stubs, generator, builder } = await makeTestUsers();
const hashedBobId = generator.userId('bob');
const hashedAliceId = generator.userId('alice');
const merlin = await builder.newUserCreationV3('charlie');
const merlette = await builder.newUserCreationV3('john');
stubs.updateUserStore.callsFake(async () => {
await builder.newUserCreationV3('bob');
await builder.newUserCreationV3('alice');
});
const hashedUserIds = [merlin.entry.user_id, merlette.entry.user_id, hashedBobId, hashedAliceId];
const retUsers = await users.findUsers({ hashedUserIds });
const retUserIds = retUsers.map(u => utils.toBase64(u.userId));
const expectedUserIds = hashedUserIds.map(id => utils.toBase64(id));
expect(retUserIds).to.have.members(expectedUserIds);
});
});
describe('getUsers', () => {
const toPublicIdentity = async (identity): Promise<PublicPermanentIdentity> => {
const publicIdentity = await getPublicIdentity(identity);
return (_deserializePublicIdentity(publicIdentity): any);
};
const toPublicIdentities = (list): Promise<Array<PublicPermanentIdentity>> => Promise.all(list.map(toPublicIdentity));
it('returns users', async () => {
const { users, builder, generator } = await makeTestUsers();
const alice = await builder.newUserCreationV3('alice');
const bob = await builder.newUserCreationV3('bob');
const aliceIdentity = await createIdentity(utils.toBase64(generator.trustchainId), utils.toBase64(generator.appSignKeys.privateKey), 'alice');
const bobIdentity = await createIdentity(utils.toBase64(generator.trustchainId), utils.toBase64(generator.appSignKeys.privateKey), 'bob');
const publicIdentities = await toPublicIdentities([aliceIdentity, bobIdentity]);
const retUsers = await users.getUsers({ publicIdentities });
const retUserIds = retUsers.map(u => utils.toBase64(u.userId));
const expectedUserIds = [alice, bob].map(u => utils.toBase64(u.entry.user_id));
expect(retUserIds).to.have.members(expectedUserIds);
});
it('throws InvalidArgument as appropriate', async () => {
const { users, builder, generator } = await makeTestUsers();
await builder.newUserCreationV3('alice');
await builder.newUserCreationV3('bob');
const aliceIdentity = await createIdentity(utils.toBase64(generator.trustchainId), utils.toBase64(generator.appSignKeys.privateKey), 'alice');
const bobIdentity = await createIdentity(utils.toBase64(generator.trustchainId), utils.toBase64(generator.appSignKeys.privateKey), 'bob');
const casperUnregisteredIdentity = await createIdentity(utils.toBase64(generator.trustchainId), utils.toBase64(generator.appSignKeys.privateKey), 'casper');
const publicIdentities = await toPublicIdentities([aliceIdentity, bobIdentity, casperUnregisteredIdentity]);
await expect(users.getUsers({ publicIdentities })).to.be.rejectedWith(InvalidArgument);
});
});
describe('getDevicePublicEncryptionKey', () => {
it('returns device public encryption key', async () => {
const { users, builder } = await makeTestUsers();
const alice = await builder.newUserCreationV3('alice');
const expected = alice.device.encryptionKeys.publicKey;
const devicePublicEncryptionKey = await users.getDevicePublicEncryptionKey(alice.device.id);
expect(devicePublicEncryptionKey).to.deep.equal(expected);
});
it('returns null if device does not exist', async () => {
const { users, builder } = await makeTestUsers();
await builder.newUserCreationV3('alice');
expect(await users.getDevicePublicEncryptionKey(new Uint8Array(0))).to.be.equal(null);
});
});
});