Merge tootsuite/master at 3023725936
This commit is contained in:
@ -51,7 +51,9 @@ describe Api::V1::Accounts::CredentialsController do
|
||||
|
||||
describe 'with invalid data' do
|
||||
before do
|
||||
patch :update, params: { note: 'This is too long. ' * 10 }
|
||||
note = 'This is too long. '
|
||||
note = note + 'a' * (Account::MAX_NOTE_LENGTH - note.length + 1)
|
||||
patch :update, params: { note: note }
|
||||
end
|
||||
|
||||
it 'returns http unprocessable entity' do
|
||||
|
@ -32,7 +32,7 @@ describe Api::V1::Accounts::RelationshipsController do
|
||||
json = body_as_json
|
||||
|
||||
expect(json).to be_a Enumerable
|
||||
expect(json.first[:following]).to be true
|
||||
expect(json.first[:following]).to be_truthy
|
||||
expect(json.first[:followed_by]).to be false
|
||||
end
|
||||
end
|
||||
@ -51,7 +51,7 @@ describe Api::V1::Accounts::RelationshipsController do
|
||||
|
||||
expect(json).to be_a Enumerable
|
||||
expect(json.first[:id]).to eq simon.id.to_s
|
||||
expect(json.first[:following]).to be true
|
||||
expect(json.first[:following]).to be_truthy
|
||||
expect(json.first[:followed_by]).to be false
|
||||
expect(json.first[:muting]).to be false
|
||||
expect(json.first[:requested]).to be false
|
||||
|
@ -31,10 +31,10 @@ RSpec.describe Api::V1::AccountsController, type: :controller do
|
||||
expect(response).to have_http_status(:success)
|
||||
end
|
||||
|
||||
it 'returns JSON with following=true and requested=false' do
|
||||
it 'returns JSON with following=truthy and requested=false' do
|
||||
json = body_as_json
|
||||
|
||||
expect(json[:following]).to be true
|
||||
expect(json[:following]).to be_truthy
|
||||
expect(json[:requested]).to be false
|
||||
end
|
||||
|
||||
@ -50,11 +50,11 @@ RSpec.describe Api::V1::AccountsController, type: :controller do
|
||||
expect(response).to have_http_status(:success)
|
||||
end
|
||||
|
||||
it 'returns JSON with following=false and requested=true' do
|
||||
it 'returns JSON with following=false and requested=truthy' do
|
||||
json = body_as_json
|
||||
|
||||
expect(json[:following]).to be false
|
||||
expect(json[:requested]).to be true
|
||||
expect(json[:requested]).to be_truthy
|
||||
end
|
||||
|
||||
it 'creates a follow request relation between user and target user' do
|
||||
|
@ -18,4 +18,24 @@ RSpec.describe Api::V1::MutesController, type: :controller do
|
||||
expect(response).to have_http_status(:success)
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET #details' do
|
||||
before do
|
||||
get :details, params: { limit: 1 }
|
||||
end
|
||||
|
||||
let(:mutes) { JSON.parse(response.body) }
|
||||
|
||||
it 'returns http success' do
|
||||
expect(response).to have_http_status(:success)
|
||||
end
|
||||
|
||||
it 'returns one mute' do
|
||||
expect(mutes.size).to be(1)
|
||||
end
|
||||
|
||||
it 'returns whether the mute hides notifications' do
|
||||
expect(mutes.first["hide_notifications"]).to be(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -0,0 +1,5 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Settings::KeywordMutesController, type: :controller do
|
||||
|
||||
end
|
2
spec/fabricators/glitch_keyword_mute_fabricator.rb
Normal file
2
spec/fabricators/glitch_keyword_mute_fabricator.rb
Normal file
@ -0,0 +1,2 @@
|
||||
Fabricator('Glitch::KeywordMute') do
|
||||
end
|
15
spec/helpers/settings/keyword_mutes_helper_spec.rb
Normal file
15
spec/helpers/settings/keyword_mutes_helper_spec.rb
Normal file
@ -0,0 +1,15 @@
|
||||
require 'rails_helper'
|
||||
|
||||
# Specs in this file have access to a helper object that includes
|
||||
# the Settings::KeywordMutesHelper. For example:
|
||||
#
|
||||
# describe Settings::KeywordMutesHelper do
|
||||
# describe "string concat" do
|
||||
# it "concats two strings with spaces" do
|
||||
# expect(helper.concat_strings("this","that")).to eq("this that")
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
RSpec.describe Settings::KeywordMutesHelper, type: :helper do
|
||||
pending "add some examples to (or delete) #{__FILE__}"
|
||||
end
|
@ -56,6 +56,13 @@ RSpec.describe FeedManager do
|
||||
expect(FeedManager.instance.filter?(:home, reblog, bob.id)).to be true
|
||||
end
|
||||
|
||||
it 'returns true for reblog from account with reblogs disabled' do
|
||||
status = Fabricate(:status, text: 'Hello world', account: jeff)
|
||||
reblog = Fabricate(:status, reblog: status, account: alice)
|
||||
bob.follow!(alice, reblogs: false)
|
||||
expect(FeedManager.instance.filter?(:home, reblog, bob.id)).to be true
|
||||
end
|
||||
|
||||
it 'returns false for reply by followee to another followee' do
|
||||
status = Fabricate(:status, text: 'Hello world', account: jeff)
|
||||
reply = Fabricate(:status, text: 'Nay', thread: status, account: alice)
|
||||
@ -105,6 +112,13 @@ RSpec.describe FeedManager do
|
||||
expect(FeedManager.instance.filter?(:home, status, bob.id)).to be true
|
||||
end
|
||||
|
||||
it 'returns true for status by followee mentioning muted account' do
|
||||
bob.mute!(jeff)
|
||||
bob.follow!(alice)
|
||||
status = PostStatusService.new.call(alice, 'Hey @jeff')
|
||||
expect(FeedManager.instance.filter?(:home, status, bob.id)).to be true
|
||||
end
|
||||
|
||||
it 'returns true for reblog of a personally blocked domain' do
|
||||
alice.block_domain!('example.com')
|
||||
alice.follow!(jeff)
|
||||
@ -112,6 +126,44 @@ RSpec.describe FeedManager do
|
||||
reblog = Fabricate(:status, reblog: status, account: jeff)
|
||||
expect(FeedManager.instance.filter?(:home, reblog, alice.id)).to be true
|
||||
end
|
||||
|
||||
it 'returns true for a status containing a muted keyword' do
|
||||
Fabricate('Glitch::KeywordMute', account: alice, keyword: 'take')
|
||||
status = Fabricate(:status, text: 'This is a hot take', account: bob)
|
||||
|
||||
expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true
|
||||
end
|
||||
|
||||
it 'returns true for a reply containing a muted keyword' do
|
||||
Fabricate('Glitch::KeywordMute', account: alice, keyword: 'take')
|
||||
s1 = Fabricate(:status, text: 'Something', account: alice)
|
||||
s2 = Fabricate(:status, text: 'This is a hot take', thread: s1, account: bob)
|
||||
|
||||
expect(FeedManager.instance.filter?(:home, s2, alice.id)).to be true
|
||||
end
|
||||
|
||||
it 'returns true for a status whose spoiler text contains a muted keyword' do
|
||||
Fabricate('Glitch::KeywordMute', account: alice, keyword: 'take')
|
||||
status = Fabricate(:status, spoiler_text: 'This is a hot take', account: bob)
|
||||
|
||||
expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true
|
||||
end
|
||||
|
||||
it 'returns true for a reblog containing a muted keyword' do
|
||||
Fabricate('Glitch::KeywordMute', account: alice, keyword: 'take')
|
||||
status = Fabricate(:status, text: 'This is a hot take', account: bob)
|
||||
reblog = Fabricate(:status, reblog: status, account: jeff)
|
||||
|
||||
expect(FeedManager.instance.filter?(:home, reblog, alice.id)).to be true
|
||||
end
|
||||
|
||||
it 'returns true for a reblog whose spoiler text contains a muted keyword' do
|
||||
Fabricate('Glitch::KeywordMute', account: alice, keyword: 'take')
|
||||
status = Fabricate(:status, spoiler_text: 'This is a hot take', account: bob)
|
||||
reblog = Fabricate(:status, reblog: status, account: jeff)
|
||||
|
||||
expect(FeedManager.instance.filter?(:home, reblog, alice.id)).to be true
|
||||
end
|
||||
end
|
||||
|
||||
context 'for mentions feed' do
|
||||
@ -140,6 +192,13 @@ RSpec.describe FeedManager do
|
||||
bob.follow!(alice)
|
||||
expect(FeedManager.instance.filter?(:mentions, status, bob.id)).to be false
|
||||
end
|
||||
|
||||
it 'returns true for status that contains a muted keyword' do
|
||||
Fabricate('Glitch::KeywordMute', account: bob, keyword: 'take')
|
||||
status = Fabricate(:status, text: 'This is a hot take', account: alice)
|
||||
bob.follow!(alice)
|
||||
expect(FeedManager.instance.filter?(:mentions, status, bob.id)).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -636,8 +636,8 @@ RSpec.describe Account, type: :model do
|
||||
expect(account).to model_have_error_on_field(:display_name)
|
||||
end
|
||||
|
||||
it 'is invalid if the note is longer than 160 characters' do
|
||||
account = Fabricate.build(:account, note: Faker::Lorem.characters(161))
|
||||
it 'is invalid if the note is longer than 500 characters' do
|
||||
account = Fabricate.build(:account, note: Faker::Lorem.characters(501))
|
||||
account.valid?
|
||||
expect(account).to model_have_error_on_field(:note)
|
||||
end
|
||||
@ -676,8 +676,8 @@ RSpec.describe Account, type: :model do
|
||||
expect(account).not_to model_have_error_on_field(:display_name)
|
||||
end
|
||||
|
||||
it 'is valid even if the note is longer than 160 characters' do
|
||||
account = Fabricate.build(:account, domain: 'domain', note: Faker::Lorem.characters(161))
|
||||
it 'is valid even if the note is longer than 500 characters' do
|
||||
account = Fabricate.build(:account, domain: 'domain', note: Faker::Lorem.characters(501))
|
||||
account.valid?
|
||||
expect(account).not_to model_have_error_on_field(:note)
|
||||
end
|
||||
|
@ -31,7 +31,44 @@ describe AccountInteractions do
|
||||
end
|
||||
|
||||
it 'does mute notifications' do
|
||||
expect(me.muting_notifications?(you)).to be true
|
||||
expect(me.muting_notifications?(you)).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'ignoring reblogs from an account' do
|
||||
before do
|
||||
@me = Fabricate(:account, username: 'Me')
|
||||
@you = Fabricate(:account, username: 'You')
|
||||
end
|
||||
|
||||
context 'with the reblogs option unspecified' do
|
||||
before do
|
||||
@me.follow!(@you)
|
||||
end
|
||||
|
||||
it 'defaults to showing reblogs' do
|
||||
expect(@me.muting_reblogs?(@you)).to be(false)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with the reblogs option set to false' do
|
||||
before do
|
||||
@me.follow!(@you, reblogs: false)
|
||||
end
|
||||
|
||||
it 'does mute reblogs' do
|
||||
expect(@me.muting_reblogs?(@you)).to be(true)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with the reblogs option set to true' do
|
||||
before do
|
||||
@me.follow!(@you, reblogs: true)
|
||||
end
|
||||
|
||||
it 'does not mute reblogs' do
|
||||
expect(@me.muting_reblogs?(@you)).to be(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -7,10 +7,31 @@ RSpec.describe FollowRequest, type: :model do
|
||||
let(:target_account) { Fabricate(:account) }
|
||||
|
||||
it 'calls Account#follow!, MergeWorker.perform_async, and #destroy!' do
|
||||
expect(account).to receive(:follow!).with(target_account)
|
||||
expect(account).to receive(:follow!).with(target_account, reblogs: true)
|
||||
expect(MergeWorker).to receive(:perform_async).with(target_account.id, account.id)
|
||||
expect(follow_request).to receive(:destroy!)
|
||||
follow_request.authorize!
|
||||
end
|
||||
|
||||
it 'generates a Follow' do
|
||||
follow_request = Fabricate.create(:follow_request)
|
||||
follow_request.authorize!
|
||||
target = follow_request.target_account
|
||||
expect(follow_request.account.following?(target)).to be true
|
||||
end
|
||||
|
||||
it 'correctly passes show_reblogs when true' do
|
||||
follow_request = Fabricate.create(:follow_request, show_reblogs: true)
|
||||
follow_request.authorize!
|
||||
target = follow_request.target_account
|
||||
expect(follow_request.account.muting_reblogs?(target)).to be false
|
||||
end
|
||||
|
||||
it 'correctly passes show_reblogs when false' do
|
||||
follow_request = Fabricate.create(:follow_request, show_reblogs: false)
|
||||
follow_request.authorize!
|
||||
target = follow_request.target_account
|
||||
expect(follow_request.account.muting_reblogs?(target)).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
96
spec/models/glitch/keyword_mute_spec.rb
Normal file
96
spec/models/glitch/keyword_mute_spec.rb
Normal file
@ -0,0 +1,96 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Glitch::KeywordMute, type: :model do
|
||||
let(:alice) { Fabricate(:account, username: 'alice').tap(&:save!) }
|
||||
let(:bob) { Fabricate(:account, username: 'bob').tap(&:save!) }
|
||||
|
||||
describe '.matcher_for' do
|
||||
let(:matcher) { Glitch::KeywordMute.matcher_for(alice) }
|
||||
|
||||
describe 'with no mutes' do
|
||||
before do
|
||||
Glitch::KeywordMute.delete_all
|
||||
end
|
||||
|
||||
it 'does not match' do
|
||||
expect(matcher =~ 'This is a hot take').to be_falsy
|
||||
end
|
||||
end
|
||||
|
||||
describe 'with mutes' do
|
||||
it 'does not match keywords set by a different account' do
|
||||
Glitch::KeywordMute.create!(account: bob, keyword: 'take')
|
||||
|
||||
expect(matcher =~ 'This is a hot take').to be_falsy
|
||||
end
|
||||
|
||||
it 'does not match if no keywords match the status text' do
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: 'cold')
|
||||
|
||||
expect(matcher =~ 'This is a hot take').to be_falsy
|
||||
end
|
||||
|
||||
it 'considers word boundaries when matching' do
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: 'bob', whole_word: true)
|
||||
|
||||
expect(matcher =~ 'bobcats').to be_falsy
|
||||
end
|
||||
|
||||
it 'matches substrings if whole_word is false' do
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: 'take', whole_word: false)
|
||||
|
||||
expect(matcher =~ 'This is a shiitake mushroom').to be_truthy
|
||||
end
|
||||
|
||||
it 'matches keywords at the beginning of the text' do
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: 'take')
|
||||
|
||||
expect(matcher =~ 'Take this').to be_truthy
|
||||
end
|
||||
|
||||
it 'matches keywords at the end of the text' do
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: 'take')
|
||||
|
||||
expect(matcher =~ 'This is a hot take').to be_truthy
|
||||
end
|
||||
|
||||
it 'matches if at least one keyword case-insensitively matches the text' do
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: 'hot')
|
||||
|
||||
expect(matcher =~ 'This is a HOT take').to be_truthy
|
||||
end
|
||||
|
||||
it 'maintains case-insensitivity when combining keywords into a single matcher' do
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: 'hot')
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: 'cold')
|
||||
|
||||
expect(matcher =~ 'This is a HOT take').to be_truthy
|
||||
end
|
||||
|
||||
it 'matches keywords surrounded by non-alphanumeric ornamentation' do
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: 'hot')
|
||||
|
||||
expect(matcher =~ '(hot take)').to be_truthy
|
||||
end
|
||||
|
||||
it 'escapes metacharacters in keywords' do
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: '(hot take)')
|
||||
|
||||
expect(matcher =~ '(hot take)').to be_truthy
|
||||
end
|
||||
|
||||
it 'uses case-folding rules appropriate for more than just English' do
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: 'großeltern')
|
||||
|
||||
expect(matcher =~ 'besuch der grosseltern').to be_truthy
|
||||
end
|
||||
|
||||
it 'matches keywords that are composed of multiple words' do
|
||||
Glitch::KeywordMute.create!(account: alice, keyword: 'a shiitake')
|
||||
|
||||
expect(matcher =~ 'This is a shiitake').to be_truthy
|
||||
expect(matcher =~ 'This is shiitake').to_not be_truthy
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@ -262,6 +262,55 @@ RSpec.describe Status, type: :model do
|
||||
end
|
||||
end
|
||||
|
||||
describe '.as_direct_timeline' do
|
||||
let(:account) { Fabricate(:account) }
|
||||
let(:followed) { Fabricate(:account) }
|
||||
let(:not_followed) { Fabricate(:account) }
|
||||
|
||||
before do
|
||||
Fabricate(:follow, account: account, target_account: followed)
|
||||
|
||||
@self_public_status = Fabricate(:status, account: account, visibility: :public)
|
||||
@self_direct_status = Fabricate(:status, account: account, visibility: :direct)
|
||||
@followed_public_status = Fabricate(:status, account: followed, visibility: :public)
|
||||
@followed_direct_status = Fabricate(:status, account: followed, visibility: :direct)
|
||||
@not_followed_direct_status = Fabricate(:status, account: not_followed, visibility: :direct)
|
||||
|
||||
@results = Status.as_direct_timeline(account)
|
||||
end
|
||||
|
||||
it 'does not include public statuses from self' do
|
||||
expect(@results).to_not include(@self_public_status)
|
||||
end
|
||||
|
||||
it 'includes direct statuses from self' do
|
||||
expect(@results).to include(@self_direct_status)
|
||||
end
|
||||
|
||||
it 'does not include public statuses from followed' do
|
||||
expect(@results).to_not include(@followed_public_status)
|
||||
end
|
||||
|
||||
it 'includes direct statuses mentioning recipient from followed' do
|
||||
Fabricate(:mention, account: account, status: @followed_direct_status)
|
||||
expect(@results).to include(@followed_direct_status)
|
||||
end
|
||||
|
||||
it 'does not include direct statuses not mentioning recipient from followed' do
|
||||
expect(@results).to_not include(@followed_direct_status)
|
||||
end
|
||||
|
||||
it 'includes direct statuses mentioning recipient from non-followed' do
|
||||
Fabricate(:mention, account: account, status: @not_followed_direct_status)
|
||||
expect(@results).to include(@not_followed_direct_status)
|
||||
end
|
||||
|
||||
it 'does not include direct statuses not mentioning recipient from non-followed' do
|
||||
expect(@results).to_not include(@not_followed_direct_status)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
describe '.as_public_timeline' do
|
||||
it 'only includes statuses with public visibility' do
|
||||
public_status = Fabricate(:status, visibility: :public)
|
||||
|
@ -13,8 +13,20 @@ RSpec.describe FollowService do
|
||||
subject.call(sender, bob.acct)
|
||||
end
|
||||
|
||||
it 'creates a follow request' do
|
||||
expect(FollowRequest.find_by(account: sender, target_account: bob)).to_not be_nil
|
||||
it 'creates a follow request with reblogs' do
|
||||
expect(FollowRequest.find_by(account: sender, target_account: bob, show_reblogs: true)).to_not be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe 'locked account, no reblogs' do
|
||||
let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, locked: true, username: 'bob')).account }
|
||||
|
||||
before do
|
||||
subject.call(sender, bob.acct, reblogs: false)
|
||||
end
|
||||
|
||||
it 'creates a follow request without reblogs' do
|
||||
expect(FollowRequest.find_by(account: sender, target_account: bob, show_reblogs: false)).to_not be_nil
|
||||
end
|
||||
end
|
||||
|
||||
@ -25,8 +37,22 @@ RSpec.describe FollowService do
|
||||
subject.call(sender, bob.acct)
|
||||
end
|
||||
|
||||
it 'creates a following relation' do
|
||||
it 'creates a following relation with reblogs' do
|
||||
expect(sender.following?(bob)).to be true
|
||||
expect(sender.muting_reblogs?(bob)).to be false
|
||||
end
|
||||
end
|
||||
|
||||
describe 'unlocked account, no reblogs' do
|
||||
let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
|
||||
|
||||
before do
|
||||
subject.call(sender, bob.acct, reblogs: false)
|
||||
end
|
||||
|
||||
it 'creates a following relation without reblogs' do
|
||||
expect(sender.following?(bob)).to be true
|
||||
expect(sender.muting_reblogs?(bob)).to be true
|
||||
end
|
||||
end
|
||||
|
||||
@ -42,6 +68,32 @@ RSpec.describe FollowService do
|
||||
expect(sender.following?(bob)).to be true
|
||||
end
|
||||
end
|
||||
|
||||
describe 'already followed account, turning reblogs off' do
|
||||
let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
|
||||
|
||||
before do
|
||||
sender.follow!(bob, reblogs: true)
|
||||
subject.call(sender, bob.acct, reblogs: false)
|
||||
end
|
||||
|
||||
it 'disables reblogs' do
|
||||
expect(sender.muting_reblogs?(bob)).to be true
|
||||
end
|
||||
end
|
||||
|
||||
describe 'already followed account, turning reblogs on' do
|
||||
let(:bob) { Fabricate(:user, email: 'bob@example.com', account: Fabricate(:account, username: 'bob')).account }
|
||||
|
||||
before do
|
||||
sender.follow!(bob, reblogs: false)
|
||||
subject.call(sender, bob.acct, reblogs: true)
|
||||
end
|
||||
|
||||
it 'disables reblogs' do
|
||||
expect(sender.muting_reblogs?(bob)).to be false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'remote OStatus account' do
|
||||
|
@ -48,6 +48,26 @@ RSpec.describe NotifyService do
|
||||
is_expected.to_not change(Notification, :count)
|
||||
end
|
||||
|
||||
describe 'reblogs' do
|
||||
let(:status) { Fabricate(:status, account: Fabricate(:account)) }
|
||||
let(:activity) { Fabricate(:status, account: sender, reblog: status) }
|
||||
|
||||
it 'shows reblogs by default' do
|
||||
recipient.follow!(sender)
|
||||
is_expected.to change(Notification, :count)
|
||||
end
|
||||
|
||||
it 'shows reblogs when explicitly enabled' do
|
||||
recipient.follow!(sender, reblogs: true)
|
||||
is_expected.to change(Notification, :count)
|
||||
end
|
||||
|
||||
it 'hides reblogs when disabled' do
|
||||
recipient.follow!(sender, reblogs: false)
|
||||
is_expected.to_not change(Notification, :count)
|
||||
end
|
||||
end
|
||||
|
||||
context 'for direct messages' do
|
||||
let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct)) }
|
||||
|
||||
|
@ -7,26 +7,31 @@ describe StatusLengthValidator do
|
||||
it 'does not add errors onto remote statuses'
|
||||
it 'does not add errors onto local reblogs'
|
||||
|
||||
it 'adds an error when content warning is over 500 characters' do
|
||||
status = double(spoiler_text: 'a' * 520, text: '', errors: double(add: nil), local?: true, reblog?: false)
|
||||
it 'adds an error when content warning is over MAX_CHARS characters' do
|
||||
chars = StatusLengthValidator::MAX_CHARS + 1
|
||||
status = double(spoiler_text: 'a' * chars, text: '', errors: double(add: nil), local?: true, reblog?: false)
|
||||
subject.validate(status)
|
||||
expect(status.errors).to have_received(:add)
|
||||
end
|
||||
|
||||
it 'adds an error when text is over 500 characters' do
|
||||
status = double(spoiler_text: '', text: 'a' * 520, errors: double(add: nil), local?: true, reblog?: false)
|
||||
it 'adds an error when text is over MAX_CHARS characters' do
|
||||
chars = StatusLengthValidator::MAX_CHARS + 1
|
||||
status = double(spoiler_text: '', text: 'a' * chars, errors: double(add: nil), local?: true, reblog?: false)
|
||||
subject.validate(status)
|
||||
expect(status.errors).to have_received(:add)
|
||||
end
|
||||
|
||||
it 'adds an error when text and content warning are over 500 characters total' do
|
||||
status = double(spoiler_text: 'a' * 250, text: 'b' * 251, errors: double(add: nil), local?: true, reblog?: false)
|
||||
it 'adds an error when text and content warning are over MAX_CHARS characters total' do
|
||||
chars1 = 20
|
||||
chars2 = StatusLengthValidator::MAX_CHARS + 1 - chars1
|
||||
status = double(spoiler_text: 'a' * chars1, text: 'b' * chars2, errors: double(add: nil), local?: true, reblog?: false)
|
||||
subject.validate(status)
|
||||
expect(status.errors).to have_received(:add)
|
||||
end
|
||||
|
||||
it 'counts URLs as 23 characters flat' do
|
||||
text = ('a' * 476) + " http://#{'b' * 30}.com/example"
|
||||
chars = StatusLengthValidator::MAX_CHARS - 1 - 23
|
||||
text = ('a' * chars) + " http://#{'b' * 30}.com/example"
|
||||
status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false)
|
||||
|
||||
subject.validate(status)
|
||||
@ -34,7 +39,9 @@ describe StatusLengthValidator do
|
||||
end
|
||||
|
||||
it 'counts only the front part of remote usernames' do
|
||||
text = ('a' * 475) + " @alice@#{'b' * 30}.com"
|
||||
username = '@alice'
|
||||
chars = StatusLengthValidator::MAX_CHARS - 1 - username.length
|
||||
text = ('a' * 475) + " #{username}@#{'b' * 30}.com"
|
||||
status = double(spoiler_text: '', text: text, errors: double(add: nil), local?: true, reblog?: false)
|
||||
|
||||
subject.validate(status)
|
||||
|
@ -3,6 +3,8 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe 'about/show.html.haml', without_verify_partial_doubles: true do
|
||||
let(:commit_hash) { '8925731c9869f55780644304e4420a1998e52607' }
|
||||
|
||||
before do
|
||||
allow(view).to receive(:site_hostname).and_return('example.com')
|
||||
allow(view).to receive(:site_title).and_return('example site')
|
||||
@ -16,7 +18,9 @@ describe 'about/show.html.haml', without_verify_partial_doubles: true do
|
||||
source_url: 'https://github.com/tootsuite/mastodon',
|
||||
open_registrations: false,
|
||||
thumbnail: nil,
|
||||
closed_registrations_message: 'yes')
|
||||
closed_registrations_message: 'yes',
|
||||
commit_hash: commit_hash)
|
||||
|
||||
assign(:instance_presenter, instance_presenter)
|
||||
render
|
||||
|
||||
|
Reference in New Issue
Block a user