move_spec.rb 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # frozen_string_literal: true
  2. require 'rails_helper'
  3. RSpec.describe ActivityPub::Activity::Move do
  4. let(:follower) { Fabricate(:account) }
  5. let(:old_account) { Fabricate(:account, uri: 'https://example.org/alice', domain: 'example.org', protocol: :activitypub, inbox_url: 'https://example.org/inbox') }
  6. let(:new_account) { Fabricate(:account, uri: 'https://example.com/alice', domain: 'example.com', protocol: :activitypub, inbox_url: 'https://example.com/inbox', also_known_as: also_known_as) }
  7. let(:also_known_as) { [old_account.uri] }
  8. let(:returned_account) { new_account }
  9. let(:json) do
  10. {
  11. '@context': 'https://www.w3.org/ns/activitystreams',
  12. id: 'foo',
  13. type: 'Move',
  14. actor: old_account.uri,
  15. object: old_account.uri,
  16. target: new_account.uri,
  17. }.with_indifferent_access
  18. end
  19. before do
  20. follower.follow!(old_account)
  21. stub_request(:post, old_account.inbox_url).to_return(status: 200)
  22. stub_request(:post, new_account.inbox_url).to_return(status: 200)
  23. service_stub = instance_double(ActivityPub::FetchRemoteAccountService)
  24. allow(ActivityPub::FetchRemoteAccountService).to receive(:new).and_return(service_stub)
  25. allow(service_stub).to receive(:call).and_return(returned_account)
  26. end
  27. describe '#perform' do
  28. subject { described_class.new(json, old_account) }
  29. before do
  30. subject.perform
  31. end
  32. context 'when all conditions are met' do
  33. it 'sets moved account on old account' do
  34. expect(old_account.reload.moved_to_account_id).to eq new_account.id
  35. end
  36. it 'makes followers unfollow old account' do
  37. expect(follower.following?(old_account)).to be false
  38. end
  39. it 'makes followers follow-request the new account' do
  40. expect(follower.requested?(new_account)).to be true
  41. end
  42. end
  43. context "when the new account can't be resolved" do
  44. let(:returned_account) { nil }
  45. it 'does not set moved account on old account' do
  46. expect(old_account.reload.moved_to_account_id).to be_nil
  47. end
  48. it 'does not make followers unfollow old account' do
  49. expect(follower.following?(old_account)).to be true
  50. end
  51. it 'does not make followers follow-request the new account' do
  52. expect(follower.requested?(new_account)).to be false
  53. end
  54. end
  55. context 'when the new account does not references the old account' do
  56. let(:also_known_as) { [] }
  57. it 'does not set moved account on old account' do
  58. expect(old_account.reload.moved_to_account_id).to be_nil
  59. end
  60. it 'does not make followers unfollow old account' do
  61. expect(follower.following?(old_account)).to be true
  62. end
  63. it 'does not make followers follow-request the new account' do
  64. expect(follower.requested?(new_account)).to be false
  65. end
  66. end
  67. context 'when a Move has been recently processed' do
  68. around do |example|
  69. redis.set("move_in_progress:#{old_account.id}", true, nx: true, ex: 7.days.seconds)
  70. example.run
  71. redis.del("move_in_progress:#{old_account.id}")
  72. end
  73. it 'does not set moved account on old account' do
  74. expect(old_account.reload.moved_to_account_id).to be_nil
  75. end
  76. it 'does not make followers unfollow old account' do
  77. expect(follower.following?(old_account)).to be true
  78. end
  79. it 'does not make followers follow-request the new account' do
  80. expect(follower.requested?(new_account)).to be false
  81. end
  82. end
  83. end
  84. end