Merge tag 'v2.9.3' into hometown-2.9.3
This commit is contained in:
@ -7,16 +7,10 @@ describe ApplicationController, type: :controller do
|
||||
include Localized
|
||||
|
||||
def success
|
||||
head 200
|
||||
render plain: I18n.locale, status: 200
|
||||
end
|
||||
end
|
||||
|
||||
around do |example|
|
||||
current_locale = I18n.locale
|
||||
example.run
|
||||
I18n.locale = current_locale
|
||||
end
|
||||
|
||||
before do
|
||||
routes.draw { get 'success' => 'anonymous#success' }
|
||||
end
|
||||
@ -25,19 +19,19 @@ describe ApplicationController, type: :controller do
|
||||
it 'sets available and preferred language' do
|
||||
request.headers['Accept-Language'] = 'ca-ES, fa'
|
||||
get 'success'
|
||||
expect(I18n.locale).to eq :fa
|
||||
expect(response.body).to eq 'fa'
|
||||
end
|
||||
|
||||
it 'sets available and compatible language if none of available languages are preferred' do
|
||||
request.headers['Accept-Language'] = 'fa-IR'
|
||||
get 'success'
|
||||
expect(I18n.locale).to eq :fa
|
||||
expect(response.body).to eq 'fa'
|
||||
end
|
||||
|
||||
it 'sets default locale if none of available languages are compatible' do
|
||||
request.headers['Accept-Language'] = ''
|
||||
get 'success'
|
||||
expect(I18n.locale).to eq :en
|
||||
expect(response.body).to eq 'en'
|
||||
end
|
||||
end
|
||||
|
||||
@ -48,7 +42,7 @@ describe ApplicationController, type: :controller do
|
||||
sign_in(user)
|
||||
get 'success'
|
||||
|
||||
expect(I18n.locale).to eq :ca
|
||||
expect(response.body).to eq 'ca'
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -149,6 +149,14 @@ RSpec.describe FeedManager do
|
||||
status = Fabricate(:status, text: 'shiitake', account: jeff)
|
||||
expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true
|
||||
end
|
||||
|
||||
it 'returns true if phrase is contained in a poll option' do
|
||||
alice.custom_filters.create!(phrase: 'farts', context: %w(home public), irreversible: true)
|
||||
alice.custom_filters.create!(phrase: 'pop tarts', context: %w(home), irreversible: true)
|
||||
alice.follow!(jeff)
|
||||
status = Fabricate(:status, text: 'what do you prefer', poll: Fabricate(:poll, options: %w(farts POP TARts)), account: jeff)
|
||||
expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -239,6 +247,23 @@ RSpec.describe FeedManager do
|
||||
expect(FeedManager.instance.push_to_home(account, reblogs.last)).to be false
|
||||
end
|
||||
|
||||
it 'saves a new reblog of a recently-reblogged status when previous reblog has been deleted' do
|
||||
account = Fabricate(:account)
|
||||
reblogged = Fabricate(:status)
|
||||
old_reblog = Fabricate(:status, reblog: reblogged)
|
||||
|
||||
# The first reblog should be accepted
|
||||
expect(FeedManager.instance.push_to_home(account, old_reblog)).to be true
|
||||
|
||||
# The first reblog should be successfully removed
|
||||
expect(FeedManager.instance.unpush_from_home(account, old_reblog)).to be true
|
||||
|
||||
reblog = Fabricate(:status, reblog: reblogged)
|
||||
|
||||
# The second reblog should be accepted
|
||||
expect(FeedManager.instance.push_to_home(account, reblog)).to be true
|
||||
end
|
||||
|
||||
it 'does not save a new reblog of a multiply-reblogged-then-unreblogged status' do
|
||||
account = Fabricate(:account)
|
||||
reblogged = Fabricate(:status)
|
||||
|
@ -261,7 +261,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { ':coolcat: Beep boop' }
|
||||
|
||||
it 'converts the shortcode to an image tag' do
|
||||
is_expected.to match(/<img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/<img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -330,7 +330,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { ':coolcat: Beep boop' }
|
||||
|
||||
it 'converts the shortcode to an image tag' do
|
||||
is_expected.to match(/<p><img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/<p><img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
|
||||
@ -338,7 +338,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { 'Beep :coolcat: boop' }
|
||||
|
||||
it 'converts the shortcode to an image tag' do
|
||||
is_expected.to match(/Beep <img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/Beep <img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
|
||||
@ -354,7 +354,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { 'Beep boop :coolcat:' }
|
||||
|
||||
it 'converts the shortcode to an image tag' do
|
||||
is_expected.to match(/boop <img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/boop <img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -377,7 +377,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { '<p>:coolcat: Beep boop<br />' }
|
||||
|
||||
it 'converts the shortcode to an image tag' do
|
||||
is_expected.to match(/<p><img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/<p><img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
|
||||
@ -385,7 +385,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { '<p>Beep :coolcat: boop</p>' }
|
||||
|
||||
it 'converts the shortcode to an image tag' do
|
||||
is_expected.to match(/Beep <img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/Beep <img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
|
||||
@ -401,7 +401,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { '<p>Beep boop<br />:coolcat:</p>' }
|
||||
|
||||
it 'converts the shortcode to an image tag' do
|
||||
is_expected.to match(/<br><img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/<br><img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -500,7 +500,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { ':coolcat: Beep boop' }
|
||||
|
||||
it 'converts the shortcode to an image tag' do
|
||||
is_expected.to match(/<p><img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/<p><img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
|
||||
@ -508,7 +508,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { 'Beep :coolcat: boop' }
|
||||
|
||||
it 'converts the shortcode to an image tag' do
|
||||
is_expected.to match(/Beep <img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/Beep <img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
|
||||
@ -524,7 +524,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { 'Beep boop :coolcat:' }
|
||||
|
||||
it 'converts the shortcode to an image tag' do
|
||||
is_expected.to match(/boop <img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/boop <img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -551,7 +551,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { '<p>:coolcat: Beep boop<br />' }
|
||||
|
||||
it 'converts shortcode to image tag' do
|
||||
is_expected.to match(/<p><img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/<p><img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
|
||||
@ -559,7 +559,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { '<p>Beep :coolcat: boop</p>' }
|
||||
|
||||
it 'converts shortcode to image tag' do
|
||||
is_expected.to match(/Beep <img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/Beep <img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
|
||||
@ -575,7 +575,7 @@ RSpec.describe Formatter do
|
||||
let(:text) { '<p>Beep boop<br />:coolcat:</p>' }
|
||||
|
||||
it 'converts shortcode to image tag' do
|
||||
is_expected.to match(/<br><img draggable="false" class="emojione" alt=":coolcat:"/)
|
||||
is_expected.to match(/<br><img draggable="false" class="emojione custom-emoji" alt=":coolcat:"/)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -32,11 +32,11 @@ describe LanguageDetector do
|
||||
expect(result).to eq 'Our website is and also'
|
||||
end
|
||||
|
||||
it 'strips #hashtags from strings before detection' do
|
||||
string = 'Hey look at all the #animals and #fish'
|
||||
it 'converts #hashtags back to normal text before detection' do
|
||||
string = 'Hey look at all the #animals and #FishAndChips'
|
||||
|
||||
result = described_class.instance.send(:prepare_text, string)
|
||||
expect(result).to eq 'Hey look at all the and'
|
||||
expect(result).to eq 'Hey look at all the animals and fish and chips'
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -22,5 +22,9 @@ describe Sanitize::Config do
|
||||
it 'converts ul inside ul' do
|
||||
expect(Sanitize.fragment('<ul><li>Foo</li><li><ul><li>Bar</li><li>Baz</li></ul></li></ul>', subject)).to eq '<p>Foo<br>Bar<br>Baz</p>'
|
||||
end
|
||||
|
||||
it 'keep links in lists' do
|
||||
expect(Sanitize.fragment('<p>Check out:</p><ul><li><a href="https://joinmastodon.org" rel="nofollow noopener" target="_blank">joinmastodon.org</a></li><li>Bar</li></ul>', subject)).to eq '<p>Check out:</p><p><a href="https://joinmastodon.org" rel="nofollow noopener" target="_blank">joinmastodon.org</a><br>Bar</p>'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -3,27 +3,33 @@ require 'rails_helper'
|
||||
RSpec.describe Invite, type: :model do
|
||||
describe '#valid_for_use?' do
|
||||
it 'returns true when there are no limitations' do
|
||||
invite = Invite.new(max_uses: nil, expires_at: nil)
|
||||
invite = Fabricate(:invite, max_uses: nil, expires_at: nil)
|
||||
expect(invite.valid_for_use?).to be true
|
||||
end
|
||||
|
||||
it 'returns true when not expired' do
|
||||
invite = Invite.new(max_uses: nil, expires_at: 1.hour.from_now)
|
||||
invite = Fabricate(:invite, max_uses: nil, expires_at: 1.hour.from_now)
|
||||
expect(invite.valid_for_use?).to be true
|
||||
end
|
||||
|
||||
it 'returns false when expired' do
|
||||
invite = Invite.new(max_uses: nil, expires_at: 1.hour.ago)
|
||||
invite = Fabricate(:invite, max_uses: nil, expires_at: 1.hour.ago)
|
||||
expect(invite.valid_for_use?).to be false
|
||||
end
|
||||
|
||||
it 'returns true when uses still available' do
|
||||
invite = Invite.new(max_uses: 250, uses: 249, expires_at: nil)
|
||||
invite = Fabricate(:invite, max_uses: 250, uses: 249, expires_at: nil)
|
||||
expect(invite.valid_for_use?).to be true
|
||||
end
|
||||
|
||||
it 'returns false when maximum uses reached' do
|
||||
invite = Invite.new(max_uses: 250, uses: 250, expires_at: nil)
|
||||
invite = Fabricate(:invite, max_uses: 250, uses: 250, expires_at: nil)
|
||||
expect(invite.valid_for_use?).to be false
|
||||
end
|
||||
|
||||
it 'returns false when invite creator has been disabled' do
|
||||
invite = Fabricate(:invite, max_uses: nil, expires_at: nil)
|
||||
SuspendAccountService.new.call(invite.user.account)
|
||||
expect(invite.valid_for_use?).to be false
|
||||
end
|
||||
end
|
||||
|
@ -31,7 +31,47 @@ RSpec.describe Tag, type: :model do
|
||||
end
|
||||
|
||||
it 'matches #aesthetic' do
|
||||
expect(subject.match('this is #aesthetic')).to_not be_nil
|
||||
expect(subject.match('this is #aesthetic').to_s).to eq ' #aesthetic'
|
||||
end
|
||||
|
||||
it 'matches digits at the start' do
|
||||
expect(subject.match('hello #3d').to_s).to eq ' #3d'
|
||||
end
|
||||
|
||||
it 'matches digits in the middle' do
|
||||
expect(subject.match('hello #l33ts35k').to_s).to eq ' #l33ts35k'
|
||||
end
|
||||
|
||||
it 'matches digits at the end' do
|
||||
expect(subject.match('hello #world2016').to_s).to eq ' #world2016'
|
||||
end
|
||||
|
||||
it 'matches underscores at the beginning' do
|
||||
expect(subject.match('hello #_test').to_s).to eq ' #_test'
|
||||
end
|
||||
|
||||
it 'matches underscores at the end' do
|
||||
expect(subject.match('hello #test_').to_s).to eq ' #test_'
|
||||
end
|
||||
|
||||
it 'matches underscores in the middle' do
|
||||
expect(subject.match('hello #one_two_three').to_s).to eq ' #one_two_three'
|
||||
end
|
||||
|
||||
it 'matches middle dots' do
|
||||
expect(subject.match('hello #one·two·three').to_s).to eq ' #one·two·three'
|
||||
end
|
||||
|
||||
it 'does not match middle dots at the start' do
|
||||
expect(subject.match('hello #·one·two·three')).to be_nil
|
||||
end
|
||||
|
||||
it 'does not match middle dots at the end' do
|
||||
expect(subject.match('hello #one·two·three·').to_s).to eq ' #one·two·three'
|
||||
end
|
||||
|
||||
it 'does not match purely-numeric hashtags' do
|
||||
expect(subject.match('hello #0123456')).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
|
27
spec/serializers/activitypub/update_poll_spec.rb
Normal file
27
spec/serializers/activitypub/update_poll_spec.rb
Normal file
@ -0,0 +1,27 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe ActivityPub::UpdatePollSerializer do
|
||||
let(:account) { Fabricate(:account) }
|
||||
let(:poll) { Fabricate(:poll, account: account) }
|
||||
let!(:status) { Fabricate(:status, account: account, poll: poll) }
|
||||
|
||||
before(:each) do
|
||||
@serialization = ActiveModelSerializers::SerializableResource.new(status, serializer: ActivityPub::UpdatePollSerializer, adapter: ActivityPub::Adapter)
|
||||
end
|
||||
|
||||
subject { JSON.parse(@serialization.to_json) }
|
||||
|
||||
it 'has a Update type' do
|
||||
expect(subject['type']).to eql('Update')
|
||||
end
|
||||
|
||||
it 'has an object with Question type' do
|
||||
expect(subject['object']['type']).to eql('Question')
|
||||
end
|
||||
|
||||
it 'has the correct actor URI set' do
|
||||
expect(subject['actor']).to eql(ActivityPub::TagManager.instance.uri_for(account))
|
||||
end
|
||||
end
|
@ -0,0 +1,22 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe ActivityPub::DistributePollUpdateWorker do
|
||||
subject { described_class.new }
|
||||
|
||||
let(:account) { Fabricate(:account) }
|
||||
let(:follower) { Fabricate(:account, protocol: :activitypub, inbox_url: 'http://example.com') }
|
||||
let(:poll) { Fabricate(:poll, account: account) }
|
||||
let!(:status) { Fabricate(:status, account: account, poll: poll) }
|
||||
|
||||
describe '#perform' do
|
||||
before do
|
||||
allow(ActivityPub::DeliveryWorker).to receive(:push_bulk)
|
||||
follower.follow!(account)
|
||||
end
|
||||
|
||||
it 'delivers to followers' do
|
||||
subject.perform(status.id)
|
||||
expect(ActivityPub::DeliveryWorker).to have_received(:push_bulk).with(['http://example.com'])
|
||||
end
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user