|
|
|
@ -1,6 +1,554 @@ |
|
|
|
|
require 'rails_helper' |
|
|
|
|
|
|
|
|
|
describe AccountInteractions do |
|
|
|
|
let(:account) { Fabricate(:account, username: 'account') } |
|
|
|
|
let(:account_id) { account.id } |
|
|
|
|
let(:account_ids) { [account_id] } |
|
|
|
|
let(:target_account) { Fabricate(:account, username: 'target') } |
|
|
|
|
let(:target_account_id) { target_account.id } |
|
|
|
|
let(:target_account_ids) { [target_account_id] } |
|
|
|
|
|
|
|
|
|
describe '.following_map' do |
|
|
|
|
subject { Account.following_map(target_account_ids, account_id) } |
|
|
|
|
|
|
|
|
|
context 'account with Follow' do |
|
|
|
|
it 'returns { target_account_id => true }' do |
|
|
|
|
Fabricate(:follow, account: account, target_account: target_account) |
|
|
|
|
is_expected.to eq(target_account_id => true) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'account without Follow' do |
|
|
|
|
it 'returns {}' do |
|
|
|
|
is_expected.to eq({}) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '.followed_by_map' do |
|
|
|
|
subject { Account.followed_by_map(target_account_ids, account_id) } |
|
|
|
|
|
|
|
|
|
context 'account with Follow' do |
|
|
|
|
it 'returns { target_account_id => true }' do |
|
|
|
|
Fabricate(:follow, account: target_account, target_account: account) |
|
|
|
|
is_expected.to eq(target_account_id => true) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'account without Follow' do |
|
|
|
|
it 'returns {}' do |
|
|
|
|
is_expected.to eq({}) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '.blocking_map' do |
|
|
|
|
subject { Account.blocking_map(target_account_ids, account_id) } |
|
|
|
|
|
|
|
|
|
context 'account with Block' do |
|
|
|
|
it 'returns { target_account_id => true }' do |
|
|
|
|
Fabricate(:block, account: account, target_account: target_account) |
|
|
|
|
is_expected.to eq(target_account_id => true) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'account without Block' do |
|
|
|
|
it 'returns {}' do |
|
|
|
|
is_expected.to eq({}) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '.muting_map' do |
|
|
|
|
subject { Account.muting_map(target_account_ids, account_id) } |
|
|
|
|
|
|
|
|
|
context 'account with Mute' do |
|
|
|
|
before do |
|
|
|
|
Fabricate(:mute, target_account: target_account, account: account, hide_notifications: hide) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'if Mute#hide_notifications?' do |
|
|
|
|
let(:hide) { true } |
|
|
|
|
|
|
|
|
|
it 'returns { target_account_id => { notifications: true } }' do |
|
|
|
|
is_expected.to eq(target_account_id => { notifications: true }) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'unless Mute#hide_notifications?' do |
|
|
|
|
let(:hide) { false } |
|
|
|
|
|
|
|
|
|
it 'returns { target_account_id => { notifications: false } }' do |
|
|
|
|
is_expected.to eq(target_account_id => { notifications: false }) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'account without Mute' do |
|
|
|
|
it 'returns {}' do |
|
|
|
|
is_expected.to eq({}) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#follow!' do |
|
|
|
|
it 'creates and returns Follow' do |
|
|
|
|
expect do |
|
|
|
|
expect(account.follow!(target_account)).to be_kind_of Follow |
|
|
|
|
end.to change { account.following.count }.by 1 |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#block' do |
|
|
|
|
it 'creates and returns Block' do |
|
|
|
|
expect do |
|
|
|
|
expect(account.block!(target_account)).to be_kind_of Block |
|
|
|
|
end.to change { account.block_relationships.count }.by 1 |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#mute!' do |
|
|
|
|
context 'Mute does not exist yet' do |
|
|
|
|
context 'arg :notifications is nil' do |
|
|
|
|
let(:arg_notifications) { nil } |
|
|
|
|
|
|
|
|
|
it 'creates Mute, and returns nil' do |
|
|
|
|
expect do |
|
|
|
|
expect(account.mute!(target_account, notifications: arg_notifications)).to be nil |
|
|
|
|
end.to change { account.mute_relationships.count }.by 1 |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'arg :notifications is false' do |
|
|
|
|
let(:arg_notifications) { false } |
|
|
|
|
|
|
|
|
|
it 'creates Mute, and returns nil' do |
|
|
|
|
expect do |
|
|
|
|
expect(account.mute!(target_account, notifications: arg_notifications)).to be nil |
|
|
|
|
end.to change { account.mute_relationships.count }.by 1 |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'arg :notifications is true' do |
|
|
|
|
let(:arg_notifications) { true } |
|
|
|
|
|
|
|
|
|
it 'creates Mute, and returns nil' do |
|
|
|
|
expect do |
|
|
|
|
expect(account.mute!(target_account, notifications: arg_notifications)).to be nil |
|
|
|
|
end.to change { account.mute_relationships.count }.by 1 |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'Mute already exists' do |
|
|
|
|
before do |
|
|
|
|
account.mute_relationships << mute |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
let(:mute) do |
|
|
|
|
Fabricate(:mute, |
|
|
|
|
account: account, |
|
|
|
|
target_account: target_account, |
|
|
|
|
hide_notifications: hide_notifications) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'mute.hide_notifications is true' do |
|
|
|
|
let(:hide_notifications) { true } |
|
|
|
|
|
|
|
|
|
context 'arg :notifications is nil' do |
|
|
|
|
let(:arg_notifications) { nil } |
|
|
|
|
|
|
|
|
|
it 'returns nil without updating mute.hide_notifications' do |
|
|
|
|
expect do |
|
|
|
|
expect(account.mute!(target_account, notifications: arg_notifications)).to be nil |
|
|
|
|
mute = account.mute_relationships.find_by(target_account: target_account) |
|
|
|
|
expect(mute.hide_notifications?).to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'arg :notifications is false' do |
|
|
|
|
let(:arg_notifications) { false } |
|
|
|
|
|
|
|
|
|
it 'returns true, and updates mute.hide_notifications false' do |
|
|
|
|
expect do |
|
|
|
|
expect(account.mute!(target_account, notifications: arg_notifications)).to be true |
|
|
|
|
mute = account.mute_relationships.find_by(target_account: target_account) |
|
|
|
|
expect(mute.hide_notifications?).to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'arg :notifications is true' do |
|
|
|
|
let(:arg_notifications) { true } |
|
|
|
|
|
|
|
|
|
it 'returns nil without updating mute.hide_notifications' do |
|
|
|
|
expect do |
|
|
|
|
expect(account.mute!(target_account, notifications: arg_notifications)).to be nil |
|
|
|
|
mute = account.mute_relationships.find_by(target_account: target_account) |
|
|
|
|
expect(mute.hide_notifications?).to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'mute.hide_notifications is false' do |
|
|
|
|
let(:hide_notifications) { false } |
|
|
|
|
|
|
|
|
|
context 'arg :notifications is nil' do |
|
|
|
|
let(:arg_notifications) { nil } |
|
|
|
|
|
|
|
|
|
it 'returns true, and updates mute.hide_notifications true' do |
|
|
|
|
expect do |
|
|
|
|
expect(account.mute!(target_account, notifications: arg_notifications)).to be true |
|
|
|
|
mute = account.mute_relationships.find_by(target_account: target_account) |
|
|
|
|
expect(mute.hide_notifications?).to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'arg :notifications is false' do |
|
|
|
|
let(:arg_notifications) { false } |
|
|
|
|
|
|
|
|
|
it 'returns nil without updating mute.hide_notifications' do |
|
|
|
|
expect do |
|
|
|
|
expect(account.mute!(target_account, notifications: arg_notifications)).to be nil |
|
|
|
|
mute = account.mute_relationships.find_by(target_account: target_account) |
|
|
|
|
expect(mute.hide_notifications?).to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'arg :notifications is true' do |
|
|
|
|
let(:arg_notifications) { true } |
|
|
|
|
|
|
|
|
|
it 'returns true, and updates mute.hide_notifications true' do |
|
|
|
|
expect do |
|
|
|
|
expect(account.mute!(target_account, notifications: arg_notifications)).to be true |
|
|
|
|
mute = account.mute_relationships.find_by(target_account: target_account) |
|
|
|
|
expect(mute.hide_notifications?).to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#mute_conversation!' do |
|
|
|
|
let(:conversation) { Fabricate(:conversation) } |
|
|
|
|
|
|
|
|
|
subject { account.mute_conversation!(conversation) } |
|
|
|
|
|
|
|
|
|
it 'creates and returns ConversationMute' do |
|
|
|
|
expect do |
|
|
|
|
is_expected.to be_kind_of ConversationMute |
|
|
|
|
end.to change { account.conversation_mutes.count }.by 1 |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#block_domain!' do |
|
|
|
|
let(:domain_block) { Fabricate(:domain_block) } |
|
|
|
|
|
|
|
|
|
subject { account.block_domain!(domain_block) } |
|
|
|
|
|
|
|
|
|
it 'creates and returns AccountDomainBlock' do |
|
|
|
|
expect do |
|
|
|
|
is_expected.to be_kind_of AccountDomainBlock |
|
|
|
|
end.to change { account.domain_blocks.count }.by 1 |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#unfollow!' do |
|
|
|
|
subject { account.unfollow!(target_account) } |
|
|
|
|
|
|
|
|
|
context 'following target_account' do |
|
|
|
|
it 'returns destroyed Follow' do |
|
|
|
|
account.active_relationships.create(target_account: target_account) |
|
|
|
|
is_expected.to be_kind_of Follow |
|
|
|
|
expect(subject).to be_destroyed |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not following target_account' do |
|
|
|
|
it 'returns nil' do |
|
|
|
|
is_expected.to be_nil |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#unblock!' do |
|
|
|
|
subject { account.unblock!(target_account) } |
|
|
|
|
|
|
|
|
|
context 'blocking target_account' do |
|
|
|
|
it 'returns destroyed Block' do |
|
|
|
|
account.block_relationships.create(target_account: target_account) |
|
|
|
|
is_expected.to be_kind_of Block |
|
|
|
|
expect(subject).to be_destroyed |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not blocking target_account' do |
|
|
|
|
it 'returns nil' do |
|
|
|
|
is_expected.to be_nil |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#unmute!' do |
|
|
|
|
subject { account.unmute!(target_account) } |
|
|
|
|
|
|
|
|
|
context 'muting target_account' do |
|
|
|
|
it 'returns destroyed Mute' do |
|
|
|
|
account.mute_relationships.create(target_account: target_account) |
|
|
|
|
is_expected.to be_kind_of Mute |
|
|
|
|
expect(subject).to be_destroyed |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not muting target_account' do |
|
|
|
|
it 'returns nil' do |
|
|
|
|
is_expected.to be_nil |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#unmute_conversation!' do |
|
|
|
|
let(:conversation) { Fabricate(:conversation) } |
|
|
|
|
|
|
|
|
|
subject { account.unmute_conversation!(conversation) } |
|
|
|
|
|
|
|
|
|
context 'muting the conversation' do |
|
|
|
|
it 'returns destroyed ConversationMute' do |
|
|
|
|
account.conversation_mutes.create(conversation: conversation) |
|
|
|
|
is_expected.to be_kind_of ConversationMute |
|
|
|
|
expect(subject).to be_destroyed |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not muting the conversation' do |
|
|
|
|
it 'returns nil' do |
|
|
|
|
is_expected.to be nil |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#unblock_domain!' do |
|
|
|
|
let(:domain) { 'example.com' } |
|
|
|
|
|
|
|
|
|
subject { account.unblock_domain!(domain) } |
|
|
|
|
|
|
|
|
|
context 'blocking the domain' do |
|
|
|
|
it 'returns destroyed AccountDomainBlock' do |
|
|
|
|
account_domain_block = Fabricate(:account_domain_block, domain: domain) |
|
|
|
|
account.domain_blocks << account_domain_block |
|
|
|
|
is_expected.to be_kind_of AccountDomainBlock |
|
|
|
|
expect(subject).to be_destroyed |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'unblocking the domain' do |
|
|
|
|
it 'returns nil' do |
|
|
|
|
is_expected.to be_nil |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#following?' do |
|
|
|
|
subject { account.following?(target_account) } |
|
|
|
|
|
|
|
|
|
context 'following target_account' do |
|
|
|
|
it 'returns true' do |
|
|
|
|
account.active_relationships.create(target_account: target_account) |
|
|
|
|
is_expected.to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not following target_account' do |
|
|
|
|
it 'returns false' do |
|
|
|
|
is_expected.to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#blocking?' do |
|
|
|
|
subject { account.blocking?(target_account) } |
|
|
|
|
|
|
|
|
|
context 'blocking target_account' do |
|
|
|
|
it 'returns true' do |
|
|
|
|
account.block_relationships.create(target_account: target_account) |
|
|
|
|
is_expected.to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not blocking target_account' do |
|
|
|
|
it 'returns false' do |
|
|
|
|
is_expected.to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#domain_blocking?' do |
|
|
|
|
let(:domain) { 'example.com' } |
|
|
|
|
|
|
|
|
|
subject { account.domain_blocking?(domain) } |
|
|
|
|
|
|
|
|
|
context 'blocking the domain' do |
|
|
|
|
it' returns true' do |
|
|
|
|
account_domain_block = Fabricate(:account_domain_block, domain: domain) |
|
|
|
|
account.domain_blocks << account_domain_block |
|
|
|
|
is_expected.to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not blocking the domain' do |
|
|
|
|
it 'returns false' do |
|
|
|
|
is_expected.to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#muting?' do |
|
|
|
|
subject { account.muting?(target_account) } |
|
|
|
|
|
|
|
|
|
context 'muting target_account' do |
|
|
|
|
it 'returns true' do |
|
|
|
|
mute = Fabricate(:mute, account: account, target_account: target_account) |
|
|
|
|
account.mute_relationships << mute |
|
|
|
|
is_expected.to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not muting target_account' do |
|
|
|
|
it 'returns false' do |
|
|
|
|
is_expected.to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#muting_conversation?' do |
|
|
|
|
let(:conversation) { Fabricate(:conversation) } |
|
|
|
|
|
|
|
|
|
subject { account.muting_conversation?(conversation) } |
|
|
|
|
|
|
|
|
|
context 'muting the conversation' do |
|
|
|
|
it 'returns true' do |
|
|
|
|
account.conversation_mutes.create(conversation: conversation) |
|
|
|
|
is_expected.to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not muting the conversation' do |
|
|
|
|
it 'returns false' do |
|
|
|
|
is_expected.to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#muting_notifications?' do |
|
|
|
|
before do |
|
|
|
|
mute = Fabricate(:mute, target_account: target_account, account: account, hide_notifications: hide) |
|
|
|
|
account.mute_relationships << mute |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
subject { account.muting_notifications?(target_account) } |
|
|
|
|
|
|
|
|
|
context 'muting notifications of target_account' do |
|
|
|
|
let(:hide) { true } |
|
|
|
|
|
|
|
|
|
it 'returns true' do |
|
|
|
|
is_expected.to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not muting notifications of target_account' do |
|
|
|
|
let(:hide) { false } |
|
|
|
|
|
|
|
|
|
it 'returns false' do |
|
|
|
|
is_expected.to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#requested?' do |
|
|
|
|
subject { account.requested?(target_account) } |
|
|
|
|
|
|
|
|
|
context 'requested by target_account' do |
|
|
|
|
it 'returns true' do |
|
|
|
|
Fabricate(:follow_request, account: account, target_account: target_account) |
|
|
|
|
is_expected.to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not requested by target_account' do |
|
|
|
|
it 'returns false' do |
|
|
|
|
is_expected.to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#favourited?' do |
|
|
|
|
let(:status) { Fabricate(:status, account: account, favourites: favourites) } |
|
|
|
|
|
|
|
|
|
subject { account.favourited?(status) } |
|
|
|
|
|
|
|
|
|
context 'favorited' do |
|
|
|
|
let(:favourites) { [Fabricate(:favourite, account: account)] } |
|
|
|
|
|
|
|
|
|
it 'returns true' do |
|
|
|
|
is_expected.to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not favorited' do |
|
|
|
|
let(:favourites) { [] } |
|
|
|
|
|
|
|
|
|
it 'returns false' do |
|
|
|
|
is_expected.to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#reblogged?' do |
|
|
|
|
let(:status) { Fabricate(:status, account: account, reblogs: reblogs) } |
|
|
|
|
|
|
|
|
|
subject { account.reblogged?(status) } |
|
|
|
|
|
|
|
|
|
context 'reblogged' do |
|
|
|
|
let(:reblogs) { [Fabricate(:status, account: account)] } |
|
|
|
|
|
|
|
|
|
it 'returns true' do |
|
|
|
|
is_expected.to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not reblogged' do |
|
|
|
|
let(:reblogs) { [] } |
|
|
|
|
|
|
|
|
|
it 'returns false' do |
|
|
|
|
is_expected.to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe '#pinned?' do |
|
|
|
|
let(:status) { Fabricate(:status, account: account) } |
|
|
|
|
|
|
|
|
|
subject { account.pinned?(status) } |
|
|
|
|
|
|
|
|
|
context 'pinned' do |
|
|
|
|
it 'returns true' do |
|
|
|
|
Fabricate(:status_pin, account: account, status: status) |
|
|
|
|
is_expected.to be true |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
context 'not pinned' do |
|
|
|
|
it 'returns false' do |
|
|
|
|
is_expected.to be false |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
describe 'muting an account' do |
|
|
|
|
let(:me) { Fabricate(:account, username: 'Me') } |
|
|
|
|
let(:you) { Fabricate(:account, username: 'You') } |
|
|
|
|