diff --git a/app/soapbox/normalizers/__tests__/status-test.js b/app/soapbox/normalizers/__tests__/status-test.js index 578e71dc4..7fc18a08d 100644 --- a/app/soapbox/normalizers/__tests__/status-test.js +++ b/app/soapbox/normalizers/__tests__/status-test.js @@ -32,30 +32,34 @@ describe('normalizeStatus', () => { it('adds mention to self in self-reply on Mastodon', () => { const status = fromJS(require('soapbox/__fixtures__/mastodon-reply-to-self.json')); - const expected = fromJS([{ + const expected = { id: '106801667066418367', username: 'benis911', acct: 'benis911', url: 'https://mastodon.social/@benis911', - }]); + }; - const result = normalizeStatus(status).get('mentions'); + const result = normalizeStatus(status).mentions; - expect(result).toEqual(expected); + expect(result.size).toBe(1); + expect(result.get(0).toJS()).toMatchObject(expected); + expect(result.get(0).id).toEqual('106801667066418367'); + expect(ImmutableRecord.isRecord(result.get(0))).toBe(true); }); it('normalizes mentions with only acct', () => { const status = fromJS({ mentions: [{ acct: 'alex@gleasonator.com' }] }); - const expected = fromJS([{ + const expected = [{ + id: '', acct: 'alex@gleasonator.com', username: 'alex', url: '', - }]); + }]; const result = normalizeStatus(status).get('mentions'); - expect(result).toEqual(expected); + expect(result.toJS()).toEqual(expected); }); it('normalizes Mitra attachments', () => { diff --git a/app/soapbox/normalizers/account.ts b/app/soapbox/normalizers/account.ts index f3006f3c2..d6e81033b 100644 --- a/app/soapbox/normalizers/account.ts +++ b/app/soapbox/normalizers/account.ts @@ -97,6 +97,13 @@ const normalizeLocation = (account: ImmutableMap) => { }); }; +// Set username from acct, if applicable +const fixUsername = (account: ImmutableMap) => { + return account.update('username', username => ( + username || (account.get('acct') || '').split('@')[0] + )); +}; + export const normalizeAccount = (account: ImmutableMap): IAccount => { return AccountRecord( account.withMutations(account => { @@ -104,6 +111,7 @@ export const normalizeAccount = (account: ImmutableMap): IAccount = normalizeVerified(account); normalizeBirthday(account); normalizeLocation(account); + fixUsername(account); }), ); }; diff --git a/app/soapbox/normalizers/status.ts b/app/soapbox/normalizers/status.ts index ad447f8d2..28ccf38e7 100644 --- a/app/soapbox/normalizers/status.ts +++ b/app/soapbox/normalizers/status.ts @@ -4,8 +4,8 @@ import { Record as ImmutableRecord, } from 'immutable'; +import { normalizeAccount } from 'soapbox/normalizers/account'; import { IStatus } from 'soapbox/types'; -import { accountToMention } from 'soapbox/utils/accounts'; import { mergeDefined } from 'soapbox/utils/normalizers'; const StatusRecord = ImmutableRecord({ @@ -79,6 +79,14 @@ const AttachmentRecord = ImmutableRecord({ url: '', }); +// https://docs.joinmastodon.org/entities/mention/ +const MentionRecord = ImmutableRecord({ + id: '', + acct: '', + username: '', + url: '', +}); + // Ensure attachments have required fields // https://docs.joinmastodon.org/entities/attachment/ const normalizeAttachment = (attachment: ImmutableMap) => { @@ -104,13 +112,7 @@ const normalizeAttachments = (status: ImmutableMap) => { // Normalize mentions const normalizeMention = (mention: ImmutableMap) => { - const base = ImmutableMap({ - acct: '', - username: (mention.get('acct') || '').split('@')[0], - url: '', - }); - - return mention.mergeWith(mergeDefined, base); + return MentionRecord(normalizeAccount(mention)); }; const normalizeMentions = (status: ImmutableMap) => { @@ -184,8 +186,8 @@ const addSelfMention = (status: ImmutableMap) => { const isSelfReply = accountId === status.get('in_reply_to_account_id'); const hasSelfMention = accountId === status.getIn(['mentions', 0, 'id']); - if (isSelfReply && !hasSelfMention) { - const mention = accountToMention(status.get('account')); + if (isSelfReply && !hasSelfMention && accountId) { + const mention = normalizeMention(status.get('account')); return status.update('mentions', ImmutableList(), mentions => ( ImmutableList([mention]).concat(mentions) )); diff --git a/app/soapbox/utils/__tests__/accounts-test.js b/app/soapbox/utils/__tests__/accounts-test.js index a9a77ffe1..15a42ec57 100644 --- a/app/soapbox/utils/__tests__/accounts-test.js +++ b/app/soapbox/utils/__tests__/accounts-test.js @@ -6,7 +6,6 @@ import { isStaff, isAdmin, isModerator, - accountToMention, } from '../accounts'; describe('getDomain', () => { @@ -116,19 +115,3 @@ describe('isModerator', () => { }); }); }); - -describe('accountToMention', () => { - it('converts the account to a mention', () => { - const account = fromJS(require('soapbox/__fixtures__/pleroma-account.json')); - - const expected = fromJS({ - id: '9v5bmRalQvjOy0ECcC', - username: 'alex', - acct: 'alex', - url: 'https://gleasonator.com/users/alex', - }); - - const result = accountToMention(account); - expect(result).toEqual(expected); - }); -}); diff --git a/app/soapbox/utils/accounts.ts b/app/soapbox/utils/accounts.ts index 2300b4363..e93138c86 100644 --- a/app/soapbox/utils/accounts.ts +++ b/app/soapbox/utils/accounts.ts @@ -62,12 +62,3 @@ export const isLocal = (account: ImmutableMap): boolean => { }; export const isRemote = (account: ImmutableMap): boolean => !isLocal(account); - -export const accountToMention = (account: ImmutableMap): ImmutableMap => { - return ImmutableMap({ - id: account.get('id'), - username: account.get('username'), - acct: account.get('acct'), - url: account.get('url'), - }); -};