diff --git a/lib/utils/member-info-utils-test-data.js b/lib/utils/member-info-utils-test-data.js new file mode 100644 index 000000000..b1356331a --- /dev/null +++ b/lib/utils/member-info-utils-test-data.js @@ -0,0 +1,215 @@ +// @flow + +import type { RawThreadInfo } from '../types/minimally-encoded-thread-permissions-types.js'; + +const rawThreadInfoWithMemberPermissions: any = { + minimallyEncoded: true, + id: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|1', + type: 12, + name: 'GENESIS', + description: + 'This is the first community on Comm. In the future it will be possible to create chats outside of a community, but for now all of these chats get set with GENESIS as their parent. GENESIS is hosted on Ashoat’s keyserver.', + color: '008f83', + creationTime: 3764, + parentThreadID: null, + containingThreadID: null, + community: null, + members: [ + { + id: '83814', + role: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83795', + permissions: '3', + isSender: false, + minimallyEncoded: true, + }, + { + id: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38', + role: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83820', + permissions: '2f7fff', + isSender: true, + minimallyEncoded: true, + }, + { + id: '83814', + role: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83820', + permissions: '3027f', + isSender: false, + minimallyEncoded: true, + }, + ], + roles: { + '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83795': { + id: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83795', + name: 'Members', + permissions: ['000', '010', '005', '015', '0a7'], + minimallyEncoded: true, + specialRole: 1, + }, + '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83796': { + id: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83796', + name: 'Admins', + permissions: [ + '000', + '010', + '020', + '100', + '110', + '030', + '040', + '060', + '050', + '120', + '080', + '090', + '070', + '0d0', + '0e0', + '130', + '140', + '150', + '160', + '004', + '014', + '0a6', + '0a8', + '024', + '034', + '044', + '064', + '054', + '124', + '086', + '096', + '0c4', + '074', + '0b4', + '0d4', + '0e4', + '134', + '156', + '0c0', + ], + minimallyEncoded: true, + specialRole: 2, + }, + }, + currentUser: { + role: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83795', + permissions: '3', + subscription: { + home: true, + pushNotifs: true, + }, + unread: false, + minimallyEncoded: true, + }, + repliesCount: 0, + pinnedCount: 0, +}; + +const rawThreadInfoSansMemberPermissions: RawThreadInfo = { + minimallyEncoded: true, + id: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|1', + type: 12, + name: 'GENESIS', + description: + 'This is the first community on Comm. In the future it will be possible to create chats outside of a community, but for now all of these chats get set with GENESIS as their parent. GENESIS is hosted on Ashoat’s keyserver.', + color: '008f83', + creationTime: 3764, + parentThreadID: null, + containingThreadID: null, + community: null, + members: [ + { + id: '83814', + role: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83795', + isSender: false, + minimallyEncoded: true, + }, + { + id: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38', + role: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83820', + isSender: true, + minimallyEncoded: true, + }, + { + id: '83814', + role: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83820', + isSender: false, + minimallyEncoded: true, + }, + ], + roles: { + '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83795': { + id: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83795', + name: 'Members', + permissions: ['000', '010', '005', '015', '0a7'], + minimallyEncoded: true, + specialRole: 1, + }, + '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83796': { + id: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83796', + name: 'Admins', + permissions: [ + '000', + '010', + '020', + '100', + '110', + '030', + '040', + '060', + '050', + '120', + '080', + '090', + '070', + '0d0', + '0e0', + '130', + '140', + '150', + '160', + '004', + '014', + '0a6', + '0a8', + '024', + '034', + '044', + '064', + '054', + '124', + '086', + '096', + '0c4', + '074', + '0b4', + '0d4', + '0e4', + '134', + '156', + '0c0', + ], + minimallyEncoded: true, + specialRole: 2, + }, + }, + currentUser: { + role: '76F9CE14-9106-4DD3-A69C-CFDC8E9CAC38|83795', + permissions: '3', + subscription: { + home: true, + pushNotifs: true, + }, + unread: false, + minimallyEncoded: true, + }, + repliesCount: 0, + pinnedCount: 0, +}; + +export { + rawThreadInfoWithMemberPermissions, + rawThreadInfoSansMemberPermissions, +}; diff --git a/lib/utils/member-info-utils.js b/lib/utils/member-info-utils.js index 045b70ad4..f2959f9fa 100644 --- a/lib/utils/member-info-utils.js +++ b/lib/utils/member-info-utils.js @@ -1,15 +1,33 @@ // @flow import type { MemberInfoSansPermissions, MemberInfoWithPermissions, + ThinRawThreadInfo, } from '../types/minimally-encoded-thread-permissions-types.js'; function stripPermissionsFromMemberInfo( memberInfo: MemberInfoWithPermissions, ): MemberInfoSansPermissions { const { permissions, ...rest } = memberInfo; return rest; } -export { stripPermissionsFromMemberInfo }; +export type ThinRawThreadInfoWithPermissions = $ReadOnly<{ + ...ThinRawThreadInfo, + +members: $ReadOnlyArray, +}>; + +function stripMemberPermissionsFromRawThreadInfo( + rawThreadInfo: ThinRawThreadInfoWithPermissions, +): ThinRawThreadInfo { + return { + ...rawThreadInfo, + members: rawThreadInfo.members.map(stripPermissionsFromMemberInfo), + }; +} + +export { + stripPermissionsFromMemberInfo, + stripMemberPermissionsFromRawThreadInfo, +}; diff --git a/lib/utils/member-info-utils.test.js b/lib/utils/member-info-utils.test.js index 88eb2f518..aa382b1c0 100644 --- a/lib/utils/member-info-utils.test.js +++ b/lib/utils/member-info-utils.test.js @@ -1,29 +1,48 @@ // @flow -import { stripPermissionsFromMemberInfo } from './member-info-utils.js'; +import { + rawThreadInfoSansMemberPermissions, + rawThreadInfoWithMemberPermissions, +} from './member-info-utils-test-data.js'; +import { + stripMemberPermissionsFromRawThreadInfo, + stripPermissionsFromMemberInfo, +} from './member-info-utils.js'; import type { MemberInfoSansPermissions, MemberInfoWithPermissions, + RawThreadInfo, } from '../types/minimally-encoded-thread-permissions-types.js'; describe('stripPermissionsFromMemberInfo', () => { test('should produce valid MemberInfoSansPermissions', () => { const memberInfoWithPermissions: MemberInfoWithPermissions = { id: '1', role: '2', isSender: true, minimallyEncoded: true, permissions: '3', }; const memberInfoSansPermissions: MemberInfoSansPermissions = stripPermissionsFromMemberInfo(memberInfoWithPermissions); expect(memberInfoSansPermissions).toEqual({ id: '1', role: '2', isSender: true, minimallyEncoded: true, }); }); }); + +describe('stripMemberPermissionsFromRawThreadInfo', () => { + test('should produce valid RawThreadInfo', () => { + const strippedRawThreadInfo: RawThreadInfo = + stripMemberPermissionsFromRawThreadInfo( + rawThreadInfoWithMemberPermissions, + ); + + expect(strippedRawThreadInfo).toEqual(rawThreadInfoSansMemberPermissions); + }); +});