@towns-protocol/sdk
Version:
For more details, visit the following resources:
113 lines • 5.76 kB
JavaScript
/**
* @group main
*/
import { EncryptedDataSchema } from '@towns-protocol/proto';
import { MemberMetadata_Usernames } from '../../memberMetadata_Usernames';
import { usernameChecksum } from '../../utils';
import { create } from '@bufbuild/protobuf';
describe('memberMetadata_UsernamesTests', () => {
const streamId = 'streamid1';
let usernames;
beforeEach(() => {
usernames = new MemberMetadata_Usernames(streamId);
});
test('clientCanSetUsername', async () => {
const username = 'bob-username1';
const checksum = usernameChecksum(username, streamId);
const encryptedData = create(EncryptedDataSchema, {
ciphertext: username,
checksum: checksum,
});
usernames.addEncryptedData('eventid-1', encryptedData, 'userid-1', true, undefined, undefined, undefined);
usernames.onDecryptedContent('eventid-1', username);
expect(usernames.plaintextUsernames).toEqual(new Map([['userid-1', username]]));
});
test('clientCannotSetDuplicateUsername', async () => {
const username = 'bob-username1';
const checksum = usernameChecksum(username, streamId);
const encryptedData = create(EncryptedDataSchema, {
ciphertext: username,
checksum: checksum,
});
usernames.addEncryptedData('eventid-1', encryptedData, 'userid-1', true, undefined, undefined, undefined);
usernames.onDecryptedContent('eventid-1', username);
expect(usernames.plaintextUsernames).toEqual(new Map([['userid-1', username]]));
usernames.addEncryptedData('eventid-1', encryptedData, 'userid-2', true, undefined, undefined, undefined);
usernames.onDecryptedContent('eventid-1', username);
expect(usernames.plaintextUsernames).toEqual(new Map([['userid-1', username]]));
});
test('duplicateUsernamesAreCaseInsensitive', async () => {
const username = 'bob-username1';
const checksum = usernameChecksum(username, streamId);
const encryptedData = create(EncryptedDataSchema, {
ciphertext: username,
checksum: checksum,
});
const username2 = 'BOB-USERNAME1';
const checksum2 = usernameChecksum(username2, streamId);
const encryptedData2 = create(EncryptedDataSchema, {
ciphertext: username2,
checksum: checksum2,
});
usernames.addEncryptedData('eventid-1', encryptedData, 'userid-1', true, undefined, undefined, undefined);
usernames.onDecryptedContent('eventid-1', username);
expect(usernames.plaintextUsernames).toEqual(new Map([['userid-1', username]]));
usernames.addEncryptedData('eventid-2', encryptedData2, 'userid-2', true, undefined, undefined, undefined);
usernames.onDecryptedContent('eventid-2', username2);
expect(usernames.plaintextUsernames).toEqual(new Map([['userid-1', username]]));
});
test('usernameIsAvailableAfterChange', async () => {
const username = 'bob-username1';
const checksum = usernameChecksum(username, streamId);
const encryptedData = create(EncryptedDataSchema, {
ciphertext: username,
checksum: checksum,
});
usernames.addEncryptedData('eventid-1', encryptedData, 'userid-1', true, undefined, undefined, undefined);
usernames.onDecryptedContent('eventid-1', username);
expect(usernames.plaintextUsernames).toEqual(new Map([['userid-1', username]]));
const username2 = 'bob-username2';
const checksum2 = usernameChecksum(username2, streamId);
const encryptedData2 = create(EncryptedDataSchema, {
ciphertext: username2,
checksum: checksum2,
});
// userid-1 changes their username
usernames.addEncryptedData('eventid-2', encryptedData2, 'userid-1', true, undefined, undefined, undefined);
usernames.onDecryptedContent('eventid-2', username2);
expect(usernames.plaintextUsernames).toEqual(new Map([['userid-1', username2]]));
// userid-2 can now use the old username
usernames.addEncryptedData('eventid-1', encryptedData, 'userid-2', true, undefined, undefined, undefined);
usernames.onDecryptedContent('eventid-1', username);
expect(usernames.plaintextUsernames).toEqual(new Map([
['userid-1', username2],
['userid-2', username],
]));
});
test('clientCannotFakeChecksum', async () => {
const username = 'bob-username1';
const checksum = 'invalid-checksum';
const encryptedData = create(EncryptedDataSchema, {
ciphertext: username,
checksum: checksum,
});
usernames.addEncryptedData('eventid-1', encryptedData, 'userid-1', true, undefined, undefined, undefined);
usernames.onDecryptedContent('eventid-1', username);
expect(usernames.plaintextUsernames).toEqual(new Map([]));
});
test('encryptedFlagsAreReturnedWhenEncrypted', async () => {
const username = 'bob-username1';
const checksum = usernameChecksum(username, streamId);
const encryptedData = create(EncryptedDataSchema, {
ciphertext: username,
checksum: checksum,
});
usernames.addEncryptedData('eventid-1', encryptedData, 'userid-1', true, undefined, undefined, undefined);
const info = usernames.info('userid-1');
expect(info.usernameEncrypted).toEqual(true);
usernames.onDecryptedContent('eventid-1', username);
const infoAfterDecrypt = usernames.info('userid-1');
expect(infoAfterDecrypt.usernameEncrypted).toEqual(false);
});
});
//# sourceMappingURL=memberMetadata_Usernames.test.js.map