~cytrogen/masto-fe

ref: 1a33f1df170c6a3dfd4c6c55741e1e62727ec9ae masto-fe/spec/requests/api/v1/statuses/favourites_spec.rb -rw-r--r-- 3.7 KiB
1a33f1df — Claire Merge pull request #2305 from ClearlyClaire/glitch-soc/merge-upstream 2 years ago
                                                                                
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
# frozen_string_literal: true

require 'rails_helper'

RSpec.describe 'Favourites' do
  let(:user)    { Fabricate(:user) }
  let(:scopes)  { 'write:favourites' }
  let(:token)   { Fabricate(:accessible_access_token, resource_owner_id: user.id, scopes: scopes) }
  let(:headers) { { 'Authorization' => "Bearer #{token.token}" } }

  describe 'POST /api/v1/statuses/:status_id/favourite' do
    subject do
      post "/api/v1/statuses/#{status.id}/favourite", headers: headers
    end

    let(:status) { Fabricate(:status) }

    it_behaves_like 'forbidden for wrong scope', 'read read:favourites'

    context 'with public status' do
      it 'favourites the status successfully', :aggregate_failures do
        subject

        expect(response).to have_http_status(200)
        expect(user.account.favourited?(status)).to be true
      end

      it 'returns json with updated attributes' do
        subject

        expect(body_as_json).to match(
          a_hash_including(id: status.id.to_s, favourites_count: 1, favourited: true)
        )
      end
    end

    context 'with private status of not-followed account' do
      let(:status) { Fabricate(:status, visibility: :private) }

      it 'returns http not found' do
        subject

        expect(response).to have_http_status(404)
      end
    end

    context 'with private status of followed account' do
      let(:status) { Fabricate(:status, visibility: :private) }

      before do
        user.account.follow!(status.account)
      end

      it 'favourites the status successfully', :aggregate_failures do
        subject

        expect(response).to have_http_status(200)
        expect(user.account.favourited?(status)).to be true
      end
    end

    context 'without an authorization header' do
      let(:headers) { {} }

      it 'returns http unauthorized' do
        subject

        expect(response).to have_http_status(401)
      end
    end
  end

  describe 'POST /api/v1/statuses/:status_id/unfavourite' do
    subject do
      post "/api/v1/statuses/#{status.id}/unfavourite", headers: headers
    end

    let(:status) { Fabricate(:status) }

    it_behaves_like 'forbidden for wrong scope', 'read read:favourites'

    context 'with public status' do
      before do
        FavouriteService.new.call(user.account, status)
      end

      it 'unfavourites the status successfully', :aggregate_failures do
        subject

        expect(response).to have_http_status(200)
        expect(user.account.favourited?(status)).to be false
      end

      it 'returns json with updated attributes' do
        subject

        expect(body_as_json).to match(
          a_hash_including(id: status.id.to_s, favourites_count: 0, favourited: false)
        )
      end
    end

    context 'when the requesting user was blocked by the status author' do
      before do
        FavouriteService.new.call(user.account, status)
        status.account.block!(user.account)
      end

      it 'unfavourites the status successfully', :aggregate_failures do
        subject

        expect(response).to have_http_status(200)
        expect(user.account.favourited?(status)).to be false
      end

      it 'returns json with updated attributes' do
        subject

        expect(body_as_json).to match(
          a_hash_including(id: status.id.to_s, favourites_count: 0, favourited: false)
        )
      end
    end

    context 'when status is not favourited' do
      it 'returns http success' do
        subject

        expect(response).to have_http_status(200)
      end
    end

    context 'with private status that was not favourited' do
      let(:status) { Fabricate(:status, visibility: :private) }

      it 'returns http not found' do
        subject

        expect(response).to have_http_status(404)
      end
    end
  end
end