end
def process_hashtag(tag, status)
+ return if tag['name'].blank?
+
hashtag = tag['name'].gsub(/\A#/, '').mb_chars.downcase
hashtag = Tag.where(name: hashtag).first_or_initialize(name: hashtag)
end
def process_mention(tag, status)
+ return if tag['href'].blank?
+
account = account_from_uri(tag['href'])
account = FetchRemoteAccountService.new.call(tag['href']) if account.nil?
return if account.nil?
end
def process_emoji(tag, _status)
+ return if tag['name'].blank? || tag['href'].blank?
+
shortcode = tag['name'].delete(':')
emoji = CustomEmoji.find_by(shortcode: shortcode, domain: @account.domain)
return unless @object['attachment'].is_a?(Array)
@object['attachment'].each do |attachment|
- next if unsupported_media_type?(attachment['mediaType'])
+ next if unsupported_media_type?(attachment['mediaType']) || attachment['url'].blank?
href = Addressable::URI.parse(attachment['url']).normalize.to_s
media_attachment = MediaAttachment.create(status: status, account: status.account, remote_url: href)
media_attachment.file_remote_url = href
media_attachment.save
end
+ rescue Addressable::URI::InvalidURIError => e
+ Rails.logger.debug e
end
def resolve_thread(status)
def conversation_from_uri(uri)
return nil if uri.nil?
return Conversation.find_by(id: OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')) if OStatus::TagManager.instance.local_id?(uri)
- Conversation.find_by(uri: uri) || Conversation.create!(uri: uri)
+ Conversation.find_by(uri: uri) || Conversation.create(uri: uri)
end
def visibility_from_audience
end
end
+ context 'with mentions missing href' do
+ let(:object_json) do
+ {
+ id: 'bar',
+ type: 'Note',
+ content: 'Lorem ipsum',
+ tag: [
+ {
+ type: 'Mention',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+ expect(status).to_not be_nil
+ end
+ end
+
context 'with media attachments' do
let(:object_json) do
{
end
end
+ context 'with media attachments missing url' do
+ let(:object_json) do
+ {
+ id: 'bar',
+ type: 'Note',
+ content: 'Lorem ipsum',
+ attachment: [
+ {
+ type: 'Document',
+ mime_type: 'image/png',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+ expect(status).to_not be_nil
+ end
+ end
+
context 'with hashtags' do
let(:object_json) do
{
end
end
+ context 'with hashtags missing name' do
+ let(:object_json) do
+ {
+ id: 'bar',
+ type: 'Note',
+ content: 'Lorem ipsum',
+ tag: [
+ {
+ type: 'Hashtag',
+ href: 'http://example.com/blah',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+ expect(status).to_not be_nil
+ end
+ end
+
context 'with emojis' do
let(:object_json) do
{
expect(status.emojis.map(&:shortcode)).to include('tinking')
end
end
+
+ context 'with emojis missing name' do
+ let(:object_json) do
+ {
+ id: 'bar',
+ type: 'Note',
+ content: 'Lorem ipsum :tinking:',
+ tag: [
+ {
+ type: 'Emoji',
+ href: 'http://example.com/emoji.png',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+ expect(status).to_not be_nil
+ end
+ end
+
+ context 'with emojis missing href' do
+ let(:object_json) do
+ {
+ id: 'bar',
+ type: 'Note',
+ content: 'Lorem ipsum :tinking:',
+ tag: [
+ {
+ type: 'Emoji',
+ name: 'tinking',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+ expect(status).to_not be_nil
+ end
+ end
end
end