From 08f219ab64f76c0623b74b78a8539c7bbf390ae6 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 12 Mar 2022 15:10:46 -0600 Subject: [PATCH] Break Mention normalizer into its own module (with tests) --- .../normalizers/__tests__/account-test.js | 20 ++++++++++++---- .../normalizers/__tests__/mention-test.js | 23 ++++++++++++++++++ .../normalizers/__tests__/status-test.js | 2 +- app/soapbox/normalizers/mention.ts | 24 +++++++++++++++++++ app/soapbox/normalizers/status.ts | 15 +----------- 5 files changed, 64 insertions(+), 20 deletions(-) create mode 100644 app/soapbox/normalizers/__tests__/mention-test.js create mode 100644 app/soapbox/normalizers/mention.ts diff --git a/app/soapbox/normalizers/__tests__/account-test.js b/app/soapbox/normalizers/__tests__/account-test.js index 81e7d9b7f..9211a1cf8 100644 --- a/app/soapbox/normalizers/__tests__/account-test.js +++ b/app/soapbox/normalizers/__tests__/account-test.js @@ -1,11 +1,21 @@ -import { fromJS } from 'immutable'; +import { Record as ImmutableRecord, fromJS } from 'immutable'; import { normalizeAccount } from '../account'; +const AVATAR_MISSING = require('images/avatar-missing.png'); + describe('normalizeAccount()', () => { - it('normalizes a mention', () => { - const avatarMissing = require('images/avatar-missing.png'); + it('adds base fields', () => { + const account = fromJS({}); + const result = normalizeAccount(account); + expect(ImmutableRecord.isRecord(result)).toBe(true); + expect(result.acct).toEqual(''); + expect(result.note).toEqual(''); + expect(result.avatar).toEqual(AVATAR_MISSING); + }); + + it('normalizes a mention', () => { const mention = fromJS({ acct: 'NEETzsche@iddqd.social', id: '9v5bw7hEGBPc9nrpzc', @@ -16,8 +26,8 @@ describe('normalizeAccount()', () => { const result = normalizeAccount(mention); expect(result.emojis).toEqual(fromJS([])); expect(result.display_name).toEqual('NEETzsche'); - expect(result.avatar).toEqual(avatarMissing); - expect(result.avatar_static).toEqual(avatarMissing); + expect(result.avatar).toEqual(AVATAR_MISSING); + expect(result.avatar_static).toEqual(AVATAR_MISSING); expect(result.verified).toBe(false); }); diff --git a/app/soapbox/normalizers/__tests__/mention-test.js b/app/soapbox/normalizers/__tests__/mention-test.js new file mode 100644 index 000000000..e429a03b1 --- /dev/null +++ b/app/soapbox/normalizers/__tests__/mention-test.js @@ -0,0 +1,23 @@ +import { Record as ImmutableRecord, fromJS } from 'immutable'; + +import { normalizeMention } from '../mention'; + +describe('normalizeMention()', () => { + it('adds base fields', () => { + const account = fromJS({}); + const result = normalizeMention(account); + + expect(ImmutableRecord.isRecord(result)).toBe(true); + expect(result.id).toEqual(''); + expect(result.acct).toEqual(''); + expect(result.username).toEqual(''); + expect(result.url).toEqual(''); + }); + + it('infers username from acct', () => { + const account = fromJS({ acct: 'alex@gleasonator.com' }); + const result = normalizeMention(account); + + expect(result.username).toEqual('alex'); + }); +}); diff --git a/app/soapbox/normalizers/__tests__/status-test.js b/app/soapbox/normalizers/__tests__/status-test.js index cd368ea0e..fc8b351f2 100644 --- a/app/soapbox/normalizers/__tests__/status-test.js +++ b/app/soapbox/normalizers/__tests__/status-test.js @@ -2,7 +2,7 @@ import { Record as ImmutableRecord, fromJS } from 'immutable'; import { normalizeStatus } from '../status'; -describe('normalizeStatus', () => { +describe('normalizeStatus()', () => { it('adds base fields', () => { const status = fromJS({}); const result = normalizeStatus(status); diff --git a/app/soapbox/normalizers/mention.ts b/app/soapbox/normalizers/mention.ts new file mode 100644 index 000000000..998202065 --- /dev/null +++ b/app/soapbox/normalizers/mention.ts @@ -0,0 +1,24 @@ +/** + * Mention normalizer: + * Converts API mentions into our internal format. + * @see {@link https://docs.joinmastodon.org/entities/mention/} + */ +import { + Map as ImmutableMap, + Record as ImmutableRecord, +} from 'immutable'; + +import { normalizeAccount } from 'soapbox/normalizers/account'; + +// https://docs.joinmastodon.org/entities/mention/ +const MentionRecord = ImmutableRecord({ + id: '', + acct: '', + username: '', + url: '', +}); + +export const normalizeMention = (mention: ImmutableMap) => { + // Simply normalize it as an account then cast it as a mention ¯\_(ツ)_/¯ + return MentionRecord(normalizeAccount(mention)); +}; diff --git a/app/soapbox/normalizers/status.ts b/app/soapbox/normalizers/status.ts index 760f53b92..a6d10aa73 100644 --- a/app/soapbox/normalizers/status.ts +++ b/app/soapbox/normalizers/status.ts @@ -11,8 +11,8 @@ import { } from 'immutable'; import emojify from 'soapbox/features/emoji/emoji'; -import { normalizeAccount } from 'soapbox/normalizers/account'; import { normalizeEmoji } from 'soapbox/normalizers/emoji'; +import { normalizeMention } from 'soapbox/normalizers/mention'; import { IStatus } from 'soapbox/types'; import { mergeDefined, makeEmojiMap } from 'soapbox/utils/normalizers'; @@ -73,14 +73,6 @@ const AttachmentRecord = ImmutableRecord({ status: null, }); -// https://docs.joinmastodon.org/entities/mention/ -const MentionRecord = ImmutableRecord({ - id: '', - acct: '', - username: '', - url: '', -}); - // https://docs.joinmastodon.org/entities/poll/ const PollRecord = ImmutableRecord({ emojis: ImmutableList(), @@ -126,11 +118,6 @@ const normalizeAttachments = (status: ImmutableMap) => { }); }; -// Normalize mentions -const normalizeMention = (mention: ImmutableMap) => { - return MentionRecord(normalizeAccount(mention)); -}; - const normalizeMentions = (status: ImmutableMap) => { return status.update('mentions', ImmutableList(), mentions => { return mentions.map(normalizeMention);