218 lines
5.3 KiB
TypeScript
218 lines
5.3 KiB
TypeScript
// Copyright 2022 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
import { assert } from 'chai';
|
|
import { v4 as generateUuid } from 'uuid';
|
|
|
|
import { generateAci } from '../../types/ServiceId';
|
|
import {
|
|
_isGroupChangeMessageBounceable,
|
|
_mergeGroupChangeMessages,
|
|
} from '../../groups';
|
|
|
|
describe('group message merging', () => {
|
|
const defaultMessage = {
|
|
id: generateUuid(),
|
|
conversationId: generateUuid(),
|
|
timestamp: Date.now(),
|
|
sent_at: Date.now(),
|
|
received_at: Date.now(),
|
|
};
|
|
const aci = generateAci();
|
|
|
|
describe('_isGroupChangeMessageBounceable', () => {
|
|
it('should return true for admin approval add', () => {
|
|
assert.isTrue(
|
|
_isGroupChangeMessageBounceable({
|
|
...defaultMessage,
|
|
type: 'group-v2-change',
|
|
groupV2Change: {
|
|
details: [
|
|
{
|
|
type: 'admin-approval-add-one',
|
|
aci,
|
|
},
|
|
],
|
|
},
|
|
})
|
|
);
|
|
});
|
|
|
|
it('should return true for bounce message', () => {
|
|
assert.isTrue(
|
|
_isGroupChangeMessageBounceable({
|
|
...defaultMessage,
|
|
type: 'group-v2-change',
|
|
groupV2Change: {
|
|
details: [
|
|
{
|
|
type: 'admin-approval-bounce',
|
|
times: 1,
|
|
isApprovalPending: true,
|
|
aci,
|
|
},
|
|
],
|
|
},
|
|
})
|
|
);
|
|
});
|
|
|
|
it('should return false otherwise', () => {
|
|
assert.isFalse(
|
|
_isGroupChangeMessageBounceable({
|
|
...defaultMessage,
|
|
type: 'group-v2-change',
|
|
groupV2Change: {
|
|
details: [
|
|
{
|
|
type: 'admin-approval-remove-one',
|
|
aci,
|
|
},
|
|
],
|
|
},
|
|
})
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('_mergeGroupChangeMessages', () => {
|
|
const add = {
|
|
...defaultMessage,
|
|
type: 'group-v2-change' as const,
|
|
groupV2Change: {
|
|
details: [
|
|
{
|
|
type: 'admin-approval-add-one' as const,
|
|
aci,
|
|
},
|
|
],
|
|
},
|
|
};
|
|
const remove = {
|
|
...defaultMessage,
|
|
type: 'group-v2-change' as const,
|
|
groupV2Change: {
|
|
details: [
|
|
{
|
|
type: 'admin-approval-remove-one' as const,
|
|
aci,
|
|
},
|
|
],
|
|
},
|
|
};
|
|
const addOther = {
|
|
...defaultMessage,
|
|
type: 'group-v2-change' as const,
|
|
groupV2Change: {
|
|
details: [
|
|
{
|
|
type: 'admin-approval-add-one' as const,
|
|
aci: generateAci(),
|
|
},
|
|
],
|
|
},
|
|
};
|
|
const removeOther = {
|
|
...defaultMessage,
|
|
type: 'group-v2-change' as const,
|
|
groupV2Change: {
|
|
details: [
|
|
{
|
|
type: 'admin-approval-remove-one' as const,
|
|
aci: generateAci(),
|
|
},
|
|
],
|
|
},
|
|
};
|
|
const bounce = {
|
|
...defaultMessage,
|
|
type: 'group-v2-change' as const,
|
|
groupV2Change: {
|
|
details: [
|
|
{
|
|
type: 'admin-approval-bounce' as const,
|
|
times: 1,
|
|
isApprovalPending: false,
|
|
aci,
|
|
},
|
|
],
|
|
},
|
|
};
|
|
const bounceAndAdd = {
|
|
...defaultMessage,
|
|
type: 'group-v2-change' as const,
|
|
groupV2Change: {
|
|
details: [
|
|
{
|
|
type: 'admin-approval-bounce' as const,
|
|
times: 1,
|
|
isApprovalPending: true,
|
|
aci,
|
|
},
|
|
],
|
|
},
|
|
};
|
|
|
|
it('should merge add with remove if aci matches', () => {
|
|
assert.deepStrictEqual(
|
|
_mergeGroupChangeMessages(add, remove)?.groupV2Change?.details,
|
|
[
|
|
{
|
|
isApprovalPending: false,
|
|
times: 1,
|
|
type: 'admin-approval-bounce',
|
|
aci,
|
|
},
|
|
]
|
|
);
|
|
});
|
|
|
|
it('should not merge add with remove if aci does not match', () => {
|
|
assert.isUndefined(_mergeGroupChangeMessages(add, removeOther));
|
|
});
|
|
|
|
it('should merge bounce with add if aci matches', () => {
|
|
assert.deepStrictEqual(
|
|
_mergeGroupChangeMessages(bounce, add)?.groupV2Change?.details,
|
|
[
|
|
{
|
|
isApprovalPending: true,
|
|
times: 1,
|
|
type: 'admin-approval-bounce',
|
|
aci,
|
|
},
|
|
]
|
|
);
|
|
});
|
|
|
|
it('should merge bounce and add with remove if aci matches', () => {
|
|
assert.deepStrictEqual(
|
|
_mergeGroupChangeMessages(bounceAndAdd, remove)?.groupV2Change?.details,
|
|
[
|
|
{
|
|
isApprovalPending: false,
|
|
times: 2,
|
|
type: 'admin-approval-bounce',
|
|
aci,
|
|
},
|
|
]
|
|
);
|
|
});
|
|
|
|
it('should not merge bounce with add if aci does not match', () => {
|
|
assert.isUndefined(_mergeGroupChangeMessages(bounce, addOther));
|
|
});
|
|
|
|
it('should not merge bounce and add with add', () => {
|
|
assert.isUndefined(_mergeGroupChangeMessages(bounceAndAdd, add));
|
|
});
|
|
|
|
it('should not merge bounce and add with remove if aci does not match', () => {
|
|
assert.isUndefined(_mergeGroupChangeMessages(bounceAndAdd, removeOther));
|
|
});
|
|
|
|
it('should not merge bounce with remove', () => {
|
|
assert.isUndefined(_mergeGroupChangeMessages(bounce, remove));
|
|
});
|
|
});
|
|
});
|