280 lines
7.4 KiB
TypeScript
280 lines
7.4 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 } from '../../types/ServiceId';
|
|
import { normalizeAci } from '../../util/normalizeAci';
|
|
import type { ServiceIdString } from '../../types/ServiceId';
|
|
import { getDefaultConversationWithServiceId } from '../helpers/getDefaultConversation';
|
|
|
|
import { getGroupMemberships } from '../../util/getGroupMemberships';
|
|
|
|
describe('getGroupMemberships', () => {
|
|
const normalConversation1 = getDefaultConversationWithServiceId();
|
|
const normalConversation2 = getDefaultConversationWithServiceId();
|
|
const unregisteredConversation = getDefaultConversationWithServiceId({
|
|
discoveredUnregisteredAt: Date.now(),
|
|
});
|
|
|
|
function getConversationByServiceId(
|
|
serviceId: ServiceIdString
|
|
): undefined | ConversationType {
|
|
return [
|
|
normalConversation1,
|
|
normalConversation2,
|
|
unregisteredConversation,
|
|
].find(conversation => conversation.serviceId === 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: [
|
|
{
|
|
aci: generateAci(),
|
|
isAdmin: true,
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = getGroupMemberships(
|
|
conversation,
|
|
getConversationByServiceId
|
|
).memberships;
|
|
|
|
assert.isEmpty(result);
|
|
});
|
|
|
|
it('does not filter out unregistered conversations', () => {
|
|
const conversation = {
|
|
memberships: [
|
|
{
|
|
aci: normalizeAci(unregisteredConversation.serviceId, '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: [
|
|
{
|
|
aci: normalizeAci(normalConversation2.serviceId, 'test'),
|
|
isAdmin: false,
|
|
},
|
|
{
|
|
aci: normalizeAci(normalConversation1.serviceId, '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: [{ aci: generateAci() }],
|
|
};
|
|
|
|
const result = getGroupMemberships(
|
|
conversation,
|
|
getConversationByServiceId
|
|
).pendingApprovalMemberships;
|
|
|
|
assert.isEmpty(result);
|
|
});
|
|
|
|
it('filters out unregistered conversations', () => {
|
|
const conversation = {
|
|
pendingApprovalMemberships: [
|
|
{ aci: normalizeAci(unregisteredConversation.serviceId, 'test') },
|
|
],
|
|
};
|
|
|
|
const result = getGroupMemberships(
|
|
conversation,
|
|
getConversationByServiceId
|
|
).pendingApprovalMemberships;
|
|
|
|
assert.isEmpty(result);
|
|
});
|
|
|
|
it('hydrates pending-approval memberships', () => {
|
|
const conversation = {
|
|
pendingApprovalMemberships: [
|
|
{ aci: normalizeAci(normalConversation2.serviceId, 'test') },
|
|
{ aci: normalizeAci(normalConversation1.serviceId, '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: [
|
|
{
|
|
serviceId: generateAci(),
|
|
addedByUserId: normalizeAci(normalConversation1.serviceId, 'test'),
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = getGroupMemberships(
|
|
conversation,
|
|
getConversationByServiceId
|
|
).pendingMemberships;
|
|
|
|
assert.isEmpty(result);
|
|
});
|
|
|
|
it('filters out unregistered conversations', () => {
|
|
const conversation = {
|
|
pendingMemberships: [
|
|
{
|
|
serviceId: unregisteredConversation.serviceId,
|
|
addedByUserId: normalizeAci(normalConversation1.serviceId, 'test'),
|
|
},
|
|
],
|
|
};
|
|
|
|
const result = getGroupMemberships(
|
|
conversation,
|
|
getConversationByServiceId
|
|
).pendingMemberships;
|
|
|
|
assert.isEmpty(result);
|
|
});
|
|
|
|
it('hydrates pending memberships', () => {
|
|
const abc = generateAci();
|
|
const xyz = generateAci();
|
|
|
|
const conversation = {
|
|
pendingMemberships: [
|
|
{ serviceId: normalConversation2.serviceId, addedByUserId: abc },
|
|
{ serviceId: normalConversation1.serviceId, 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 },
|
|
});
|
|
});
|
|
});
|
|
});
|