You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
7.2 KiB

  1. require 'rails_helper'
  2. RSpec.describe ActivityPub::OutboxesController, type: :controller do
  3. let!(:account) { Fabricate(:account) }
  4. shared_examples 'cachable response' do
  5. it 'does not set cookies' do
  6. expect(response.cookies).to be_empty
  7. expect(response.headers['Set-Cookies']).to be nil
  8. end
  9. it 'does not set sessions' do
  10. response
  11. expect(session).to be_empty
  12. end
  13. it 'returns public Cache-Control header' do
  14. expect(response.headers['Cache-Control']).to include 'public'
  15. end
  16. end
  17. before do
  18. Fabricate(:status, account: account, visibility: :public)
  19. Fabricate(:status, account: account, visibility: :unlisted)
  20. Fabricate(:status, account: account, visibility: :private)
  21. Fabricate(:status, account: account, visibility: :direct)
  22. Fabricate(:status, account: account, visibility: :limited)
  23. end
  24. before do
  25. allow(controller).to receive(:signed_request_account).and_return(remote_account)
  26. end
  27. describe 'GET #show' do
  28. context 'without signature' do
  29. let(:remote_account) { nil }
  30. subject(:response) { get :show, params: { account_username: account.username, page: page } }
  31. subject(:body) { body_as_json }
  32. context 'with page not requested' do
  33. let(:page) { nil }
  34. it 'returns http success' do
  35. expect(response).to have_http_status(200)
  36. end
  37. it 'returns application/activity+json' do
  38. expect(response.content_type).to eq 'application/activity+json'
  39. end
  40. it 'returns totalItems' do
  41. expect(body[:totalItems]).to eq 4
  42. end
  43. it_behaves_like 'cachable response'
  44. context 'when account is permanently suspended' do
  45. before do
  46. account.suspend!
  47. account.deletion_request.destroy
  48. end
  49. it 'returns http gone' do
  50. expect(response).to have_http_status(410)
  51. end
  52. end
  53. context 'when account is temporarily suspended' do
  54. before do
  55. account.suspend!
  56. end
  57. it 'returns http forbidden' do
  58. expect(response).to have_http_status(403)
  59. end
  60. end
  61. end
  62. context 'with page requested' do
  63. let(:page) { 'true' }
  64. it 'returns http success' do
  65. expect(response).to have_http_status(200)
  66. end
  67. it 'returns application/activity+json' do
  68. expect(response.content_type).to eq 'application/activity+json'
  69. end
  70. it 'returns orderedItems with public or unlisted statuses' do
  71. expect(body[:orderedItems]).to be_an Array
  72. expect(body[:orderedItems].size).to eq 2
  73. expect(body[:orderedItems].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) }).to be true
  74. end
  75. it_behaves_like 'cachable response'
  76. context 'when account is permanently suspended' do
  77. before do
  78. account.suspend!
  79. account.deletion_request.destroy
  80. end
  81. it 'returns http gone' do
  82. expect(response).to have_http_status(410)
  83. end
  84. end
  85. context 'when account is temporarily suspended' do
  86. before do
  87. account.suspend!
  88. end
  89. it 'returns http forbidden' do
  90. expect(response).to have_http_status(403)
  91. end
  92. end
  93. end
  94. end
  95. context 'with signature' do
  96. let(:remote_account) { Fabricate(:account, domain: 'example.com') }
  97. let(:page) { 'true' }
  98. context 'when signed request account does not follow account' do
  99. before do
  100. get :show, params: { account_username: account.username, page: page }
  101. end
  102. it 'returns http success' do
  103. expect(response).to have_http_status(200)
  104. end
  105. it 'returns application/activity+json' do
  106. expect(response.content_type).to eq 'application/activity+json'
  107. end
  108. it 'returns orderedItems with public or unlisted statuses' do
  109. json = body_as_json
  110. expect(json[:orderedItems]).to be_an Array
  111. expect(json[:orderedItems].size).to eq 2
  112. expect(json[:orderedItems].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) }).to be true
  113. end
  114. it 'returns private Cache-Control header' do
  115. expect(response.headers['Cache-Control']).to eq 'max-age=0, private'
  116. end
  117. end
  118. context 'when signed request account follows account' do
  119. before do
  120. remote_account.follow!(account)
  121. get :show, params: { account_username: account.username, page: page }
  122. end
  123. it 'returns http success' do
  124. expect(response).to have_http_status(200)
  125. end
  126. it 'returns application/activity+json' do
  127. expect(response.content_type).to eq 'application/activity+json'
  128. end
  129. it 'returns orderedItems with private statuses' do
  130. json = body_as_json
  131. expect(json[:orderedItems]).to be_an Array
  132. expect(json[:orderedItems].size).to eq 3
  133. expect(json[:orderedItems].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:to].include?(account_followers_url(account, ActionMailer::Base.default_url_options)) }).to be true
  134. end
  135. it 'returns private Cache-Control header' do
  136. expect(response.headers['Cache-Control']).to eq 'max-age=0, private'
  137. end
  138. end
  139. context 'when signed request account is blocked' do
  140. before do
  141. account.block!(remote_account)
  142. get :show, params: { account_username: account.username, page: page }
  143. end
  144. it 'returns http success' do
  145. expect(response).to have_http_status(200)
  146. end
  147. it 'returns application/activity+json' do
  148. expect(response.content_type).to eq 'application/activity+json'
  149. end
  150. it 'returns empty orderedItems' do
  151. json = body_as_json
  152. expect(json[:orderedItems]).to be_an Array
  153. expect(json[:orderedItems].size).to eq 0
  154. end
  155. it 'returns private Cache-Control header' do
  156. expect(response.headers['Cache-Control']).to eq 'max-age=0, private'
  157. end
  158. end
  159. context 'when signed request account is domain blocked' do
  160. before do
  161. account.block_domain!(remote_account.domain)
  162. get :show, params: { account_username: account.username, page: page }
  163. end
  164. it 'returns http success' do
  165. expect(response).to have_http_status(200)
  166. end
  167. it 'returns application/activity+json' do
  168. expect(response.content_type).to eq 'application/activity+json'
  169. end
  170. it 'returns empty orderedItems' do
  171. json = body_as_json
  172. expect(json[:orderedItems]).to be_an Array
  173. expect(json[:orderedItems].size).to eq 0
  174. end
  175. it 'returns private Cache-Control header' do
  176. expect(response.headers['Cache-Control']).to eq 'max-age=0, private'
  177. end
  178. end
  179. end
  180. end
  181. end