signal-desktop/ts/test-both/util/getGroupMemberships_test.ts
Fedor Indutny 366b875fd2 Introduce Service Id Types
Co-authored-by: Scott Nonnenberg <scott@signal.org>
2023-08-21 09:30:32 -07:00

279 lines
7.3 KiB
TypeScript

// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { assert } from 'chai';
import type { ConversationType } from '../../state/ducks/conversations';
import { generateAci, normalizeAci } from '../../types/ServiceId';
import type { ServiceIdString } from '../../types/ServiceId';
import { getDefaultConversationWithUuid } from '../helpers/getDefaultConversation';
import { getGroupMemberships } from '../../util/getGroupMemberships';
describe('getGroupMemberships', () => {
const normalConversation1 = getDefaultConversationWithUuid();
const normalConversation2 = getDefaultConversationWithUuid();
const unregisteredConversation = getDefaultConversationWithUuid({
discoveredUnregisteredAt: Date.now(),
});
function getConversationByServiceId(
serviceId: ServiceIdString
): undefined | ConversationType {
return [
normalConversation1,
normalConversation2,
unregisteredConversation,
].find(conversation => conversation.uuid === serviceId);
}
describe('memberships', () => {
it('returns an empty array if passed undefined', () => {
const conversation = {};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).memberships;
assert.isEmpty(result);
});
it('returns an empty array if passed an empty array', () => {
const conversation = { memberships: [] };
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).memberships;
assert.isEmpty(result);
});
it("filters out conversation IDs that don't exist", () => {
const conversation = {
memberships: [
{
uuid: generateAci(),
isAdmin: true,
},
],
};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).memberships;
assert.isEmpty(result);
});
it('does not filter out unregistered conversations', () => {
const conversation = {
memberships: [
{
uuid: normalizeAci(unregisteredConversation.uuid, 'test'),
isAdmin: true,
},
],
};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).memberships;
assert.lengthOf(result, 1);
assert.deepEqual(result[0], {
isAdmin: true,
member: unregisteredConversation,
});
});
it('hydrates memberships', () => {
const conversation = {
memberships: [
{
uuid: normalizeAci(normalConversation2.uuid, 'test'),
isAdmin: false,
},
{
uuid: normalizeAci(normalConversation1.uuid, 'test'),
isAdmin: true,
},
],
};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).memberships;
assert.lengthOf(result, 2);
assert.deepEqual(result[0], {
isAdmin: false,
member: normalConversation2,
});
assert.deepEqual(result[1], {
isAdmin: true,
member: normalConversation1,
});
});
});
describe('pendingApprovalMemberships', () => {
it('returns an empty array if passed undefined', () => {
const conversation = {};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).pendingApprovalMemberships;
assert.isEmpty(result);
});
it('returns an empty array if passed an empty array', () => {
const conversation = { pendingApprovalMemberships: [] };
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).pendingApprovalMemberships;
assert.isEmpty(result);
});
it("filters out conversation IDs that don't exist", () => {
const conversation = {
pendingApprovalMemberships: [{ uuid: generateAci() }],
};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).pendingApprovalMemberships;
assert.isEmpty(result);
});
it('filters out unregistered conversations', () => {
const conversation = {
pendingApprovalMemberships: [
{ uuid: normalizeAci(unregisteredConversation.uuid, 'test') },
],
};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).pendingApprovalMemberships;
assert.isEmpty(result);
});
it('hydrates pending-approval memberships', () => {
const conversation = {
pendingApprovalMemberships: [
{ uuid: normalizeAci(normalConversation2.uuid, 'test') },
{ uuid: normalizeAci(normalConversation1.uuid, 'test') },
],
};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).pendingApprovalMemberships;
assert.lengthOf(result, 2);
assert.deepEqual(result[0], { member: normalConversation2 });
assert.deepEqual(result[1], { member: normalConversation1 });
});
});
describe('pendingMemberships', () => {
it('returns an empty array if passed undefined', () => {
const conversation = {};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).pendingMemberships;
assert.isEmpty(result);
});
it('returns an empty array if passed an empty array', () => {
const conversation = { pendingMemberships: [] };
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).pendingMemberships;
assert.isEmpty(result);
});
it("filters out conversation IDs that don't exist", () => {
const conversation = {
pendingMemberships: [
{
uuid: generateAci(),
addedByUserId: normalizeAci(normalConversation1.uuid, 'test'),
},
],
};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).pendingMemberships;
assert.isEmpty(result);
});
it('filters out unregistered conversations', () => {
const conversation = {
pendingMemberships: [
{
uuid: unregisteredConversation.uuid,
addedByUserId: normalizeAci(normalConversation1.uuid, 'test'),
},
],
};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).pendingMemberships;
assert.isEmpty(result);
});
it('hydrates pending memberships', () => {
const abc = generateAci();
const xyz = generateAci();
const conversation = {
pendingMemberships: [
{ uuid: normalConversation2.uuid, addedByUserId: abc },
{ uuid: normalConversation1.uuid, addedByUserId: xyz },
],
};
const result = getGroupMemberships(
conversation,
getConversationByServiceId
).pendingMemberships;
assert.lengthOf(result, 2);
assert.deepEqual(result[0], {
member: normalConversation2,
metadata: { addedByUserId: abc },
});
assert.deepEqual(result[1], {
member: normalConversation1,
metadata: { addedByUserId: xyz },
});
});
});
});