statuses_controller_spec.rb 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. require 'rails_helper'
  2. RSpec.describe Api::V1::StatusesController, type: :controller do
  3. render_views
  4. let(:user) { Fabricate(:user) }
  5. let(:app) { Fabricate(:application, name: 'Test app', website: 'http://testapp.com') }
  6. let(:token) { Fabricate(:accessible_access_token, resource_owner_id: user.id, application: app, scopes: scopes) }
  7. context 'with an oauth token' do
  8. before do
  9. allow(controller).to receive(:doorkeeper_token) { token }
  10. end
  11. describe 'GET #show' do
  12. let(:scopes) { 'read:statuses' }
  13. let(:status) { Fabricate(:status, account: user.account) }
  14. it 'returns http success' do
  15. get :show, params: { id: status.id }
  16. expect(response).to have_http_status(200)
  17. end
  18. context 'when post includes filtered terms' do
  19. let(:status) { Fabricate(:status, text: 'this toot is about that banned word') }
  20. before do
  21. user.account.custom_filters.create!(phrase: 'filter1', context: %w(home), action: :hide, keywords_attributes: [{ keyword: 'banned' }, { keyword: 'irrelevant' }])
  22. end
  23. it 'returns http success' do
  24. get :show, params: { id: status.id }
  25. expect(response).to have_http_status(200)
  26. end
  27. it 'returns filter information' do
  28. get :show, params: { id: status.id }
  29. json = body_as_json
  30. expect(json[:filtered][0]).to include({
  31. filter: a_hash_including({
  32. id: user.account.custom_filters.first.id.to_s,
  33. title: 'filter1',
  34. filter_action: 'hide',
  35. }),
  36. keyword_matches: ['banned'],
  37. })
  38. end
  39. end
  40. context 'when reblog includes filtered terms' do
  41. let(:status) { Fabricate(:status, reblog: Fabricate(:status, text: 'this toot is about that banned word')) }
  42. before do
  43. user.account.custom_filters.create!(phrase: 'filter1', context: %w(home), action: :hide, keywords_attributes: [{ keyword: 'banned' }, { keyword: 'irrelevant' }])
  44. end
  45. it 'returns http success' do
  46. get :show, params: { id: status.id }
  47. expect(response).to have_http_status(200)
  48. end
  49. it 'returns filter information' do
  50. get :show, params: { id: status.id }
  51. json = body_as_json
  52. expect(json[:reblog][:filtered][0]).to include({
  53. filter: a_hash_including({
  54. id: user.account.custom_filters.first.id.to_s,
  55. title: 'filter1',
  56. filter_action: 'hide',
  57. }),
  58. keyword_matches: ['banned'],
  59. })
  60. end
  61. end
  62. end
  63. describe 'GET #context' do
  64. let(:scopes) { 'read:statuses' }
  65. let(:status) { Fabricate(:status, account: user.account) }
  66. before do
  67. Fabricate(:status, account: user.account, thread: status)
  68. end
  69. it 'returns http success' do
  70. get :context, params: { id: status.id }
  71. expect(response).to have_http_status(200)
  72. end
  73. end
  74. describe 'POST #create' do
  75. let(:scopes) { 'write:statuses' }
  76. context do
  77. before do
  78. post :create, params: { status: 'Hello world' }
  79. end
  80. it 'returns http success' do
  81. expect(response).to have_http_status(200)
  82. end
  83. it 'returns rate limit headers' do
  84. expect(response.headers['X-RateLimit-Limit']).to eq RateLimiter::FAMILIES[:statuses][:limit].to_s
  85. expect(response.headers['X-RateLimit-Remaining']).to eq (RateLimiter::FAMILIES[:statuses][:limit] - 1).to_s
  86. end
  87. end
  88. context 'with missing parameters' do
  89. before do
  90. post :create, params: {}
  91. end
  92. it 'returns http unprocessable entity' do
  93. expect(response).to have_http_status(422)
  94. end
  95. it 'returns rate limit headers' do
  96. expect(response.headers['X-RateLimit-Limit']).to eq RateLimiter::FAMILIES[:statuses][:limit].to_s
  97. end
  98. end
  99. context 'when exceeding rate limit' do
  100. before do
  101. rate_limiter = RateLimiter.new(user.account, family: :statuses)
  102. 300.times { rate_limiter.record! }
  103. post :create, params: { status: 'Hello world' }
  104. end
  105. it 'returns http too many requests' do
  106. expect(response).to have_http_status(429)
  107. end
  108. it 'returns rate limit headers' do
  109. expect(response.headers['X-RateLimit-Limit']).to eq RateLimiter::FAMILIES[:statuses][:limit].to_s
  110. expect(response.headers['X-RateLimit-Remaining']).to eq '0'
  111. end
  112. end
  113. end
  114. describe 'DELETE #destroy' do
  115. let(:scopes) { 'write:statuses' }
  116. let(:status) { Fabricate(:status, account: user.account) }
  117. before do
  118. post :destroy, params: { id: status.id }
  119. end
  120. it 'returns http success' do
  121. expect(response).to have_http_status(200)
  122. end
  123. it 'removes the status' do
  124. expect(Status.find_by(id: status.id)).to be nil
  125. end
  126. end
  127. describe 'PUT #update' do
  128. let(:scopes) { 'write:statuses' }
  129. let(:status) { Fabricate(:status, account: user.account) }
  130. before do
  131. put :update, params: { id: status.id, status: 'I am updated' }
  132. end
  133. it 'returns http success' do
  134. expect(response).to have_http_status(200)
  135. end
  136. it 'updates the status' do
  137. expect(status.reload.text).to eq 'I am updated'
  138. end
  139. end
  140. end
  141. context 'without an oauth token' do
  142. before do
  143. allow(controller).to receive(:doorkeeper_token) { nil }
  144. end
  145. context 'with a private status' do
  146. let(:status) { Fabricate(:status, account: user.account, visibility: :private) }
  147. describe 'GET #show' do
  148. it 'returns http unauthorized' do
  149. get :show, params: { id: status.id }
  150. expect(response).to have_http_status(404)
  151. end
  152. end
  153. describe 'GET #context' do
  154. before do
  155. Fabricate(:status, account: user.account, thread: status)
  156. end
  157. it 'returns http unauthorized' do
  158. get :context, params: { id: status.id }
  159. expect(response).to have_http_status(404)
  160. end
  161. end
  162. end
  163. context 'with a public status' do
  164. let(:status) { Fabricate(:status, account: user.account, visibility: :public) }
  165. describe 'GET #show' do
  166. it 'returns http success' do
  167. get :show, params: { id: status.id }
  168. expect(response).to have_http_status(200)
  169. end
  170. end
  171. describe 'GET #context' do
  172. before do
  173. Fabricate(:status, account: user.account, thread: status)
  174. end
  175. it 'returns http success' do
  176. get :context, params: { id: status.id }
  177. expect(response).to have_http_status(200)
  178. end
  179. end
  180. end
  181. end
  182. end