about summary refs log tree commit diff
path: root/spec/lib/activitypub/activity/reject_spec.rb
blob: 5e0f09bfe8db08197edd248f8ef418165bd1e6b7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# frozen_string_literal: true

require 'rails_helper'

RSpec.describe ActivityPub::Activity::Reject do
  let(:sender)    { Fabricate(:account) }
  let(:recipient) { Fabricate(:account) }
  let(:object_json) do
    {
      id: 'bar',
      type: 'Follow',
      actor: ActivityPub::TagManager.instance.uri_for(recipient),
      object: ActivityPub::TagManager.instance.uri_for(sender),
    }
  end

  let(:json) do
    {
      '@context': 'https://www.w3.org/ns/activitystreams',
      id: 'foo',
      type: 'Reject',
      actor: ActivityPub::TagManager.instance.uri_for(sender),
      object: object_json,
    }.with_indifferent_access
  end

  describe '#perform' do
    subject { described_class.new(json, sender) }

    context 'rejecting a pending follow request by target' do
      before do
        Fabricate(:follow_request, account: recipient, target_account: sender)
        subject.perform
      end

      it 'does not create a follow relationship' do
        expect(recipient.following?(sender)).to be false
      end

      it 'removes the follow request' do
        expect(recipient.requested?(sender)).to be false
      end
    end

    context 'rejecting a pending follow request by uri' do
      before do
        Fabricate(:follow_request, account: recipient, target_account: sender, uri: 'bar')
        subject.perform
      end

      it 'does not create a follow relationship' do
        expect(recipient.following?(sender)).to be false
      end

      it 'removes the follow request' do
        expect(recipient.requested?(sender)).to be false
      end
    end

    context 'rejecting a pending follow request by uri only' do
      let(:object_json) { 'bar' }

      before do
        Fabricate(:follow_request, account: recipient, target_account: sender, uri: 'bar')
        subject.perform
      end

      it 'does not create a follow relationship' do
        expect(recipient.following?(sender)).to be false
      end

      it 'removes the follow request' do
        expect(recipient.requested?(sender)).to be false
      end
    end

    context 'rejecting an existing follow relationship by target' do
      before do
        Fabricate(:follow, account: recipient, target_account: sender)
        subject.perform
      end

      it 'removes the follow relationship' do
        expect(recipient.following?(sender)).to be false
      end

      it 'does not create a follow request' do
        expect(recipient.requested?(sender)).to be false
      end
    end

    context 'rejecting an existing follow relationship by uri' do
      before do
        Fabricate(:follow, account: recipient, target_account: sender, uri: 'bar')
        subject.perform
      end

      it 'removes the follow relationship' do
        expect(recipient.following?(sender)).to be false
      end

      it 'does not create a follow request' do
        expect(recipient.requested?(sender)).to be false
      end
    end

    context 'rejecting an existing follow relationship by uri only' do
      let(:object_json) { 'bar' }

      before do
        Fabricate(:follow, account: recipient, target_account: sender, uri: 'bar')
        subject.perform
      end

      it 'removes the follow relationship' do
        expect(recipient.following?(sender)).to be false
      end

      it 'does not create a follow request' do
        expect(recipient.requested?(sender)).to be false
      end
    end
  end

  context 'given a relay' do
    subject { described_class.new(json, sender) }

    let!(:relay) { Fabricate(:relay, state: :pending, follow_activity_id: 'https://abc-123/456') }

    let(:json) do
      {
        '@context': 'https://www.w3.org/ns/activitystreams',
        id: 'foo',
        type: 'Reject',
        actor: ActivityPub::TagManager.instance.uri_for(sender),
        object: {
          id: 'https://abc-123/456',
          type: 'Follow',
          actor: ActivityPub::TagManager.instance.uri_for(recipient),
          object: ActivityPub::TagManager.instance.uri_for(sender),
        },
      }.with_indifferent_access
    end

    it 'marks the relay as rejected' do
      subject.perform
      expect(relay.reload.rejected?).to be true
    end
  end
end