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.

188 lines
6.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. expect(session).to be_empty
  11. end
  12. it 'returns public Cache-Control header' do
  13. expect(response.headers['Cache-Control']).to include 'public'
  14. end
  15. end
  16. before do
  17. Fabricate(:status, account: account, visibility: :public)
  18. Fabricate(:status, account: account, visibility: :unlisted)
  19. Fabricate(:status, account: account, visibility: :private)
  20. Fabricate(:status, account: account, visibility: :direct)
  21. Fabricate(:status, account: account, visibility: :limited)
  22. end
  23. before do
  24. allow(controller).to receive(:signed_request_account).and_return(remote_account)
  25. end
  26. describe 'GET #show' do
  27. context 'without signature' do
  28. let(:remote_account) { nil }
  29. before do
  30. get :show, params: { account_username: account.username, page: page }
  31. end
  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. json = body_as_json
  42. expect(json[:totalItems]).to eq 4
  43. end
  44. it_behaves_like 'cachable response'
  45. end
  46. context 'with page requested' do
  47. let(:page) { 'true' }
  48. it 'returns http success' do
  49. expect(response).to have_http_status(200)
  50. end
  51. it 'returns application/activity+json' do
  52. expect(response.content_type).to eq 'application/activity+json'
  53. end
  54. it 'returns orderedItems with public or unlisted statuses' do
  55. json = body_as_json
  56. expect(json[:orderedItems]).to be_an Array
  57. expect(json[:orderedItems].size).to eq 2
  58. expect(json[:orderedItems].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) }).to be true
  59. end
  60. it_behaves_like 'cachable response'
  61. end
  62. end
  63. context 'with signature' do
  64. let(:remote_account) { Fabricate(:account, domain: 'example.com') }
  65. let(:page) { 'true' }
  66. context 'when signed request account does not follow account' do
  67. before do
  68. get :show, params: { account_username: account.username, page: page }
  69. end
  70. it 'returns http success' do
  71. expect(response).to have_http_status(200)
  72. end
  73. it 'returns application/activity+json' do
  74. expect(response.content_type).to eq 'application/activity+json'
  75. end
  76. it 'returns orderedItems with public or unlisted statuses' do
  77. json = body_as_json
  78. expect(json[:orderedItems]).to be_an Array
  79. expect(json[:orderedItems].size).to eq 2
  80. expect(json[:orderedItems].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) }).to be true
  81. end
  82. it 'returns private Cache-Control header' do
  83. expect(response.headers['Cache-Control']).to eq 'max-age=0, private'
  84. end
  85. end
  86. context 'when signed request account follows account' do
  87. before do
  88. remote_account.follow!(account)
  89. get :show, params: { account_username: account.username, page: page }
  90. end
  91. it 'returns http success' do
  92. expect(response).to have_http_status(200)
  93. end
  94. it 'returns application/activity+json' do
  95. expect(response.content_type).to eq 'application/activity+json'
  96. end
  97. it 'returns orderedItems with private statuses' do
  98. json = body_as_json
  99. expect(json[:orderedItems]).to be_an Array
  100. expect(json[:orderedItems].size).to eq 3
  101. 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
  102. end
  103. it 'returns private Cache-Control header' do
  104. expect(response.headers['Cache-Control']).to eq 'max-age=0, private'
  105. end
  106. end
  107. context 'when signed request account is blocked' do
  108. before do
  109. account.block!(remote_account)
  110. get :show, params: { account_username: account.username, page: page }
  111. end
  112. it 'returns http success' do
  113. expect(response).to have_http_status(200)
  114. end
  115. it 'returns application/activity+json' do
  116. expect(response.content_type).to eq 'application/activity+json'
  117. end
  118. it 'returns empty orderedItems' do
  119. json = body_as_json
  120. expect(json[:orderedItems]).to be_an Array
  121. expect(json[:orderedItems].size).to eq 0
  122. end
  123. it 'returns private Cache-Control header' do
  124. expect(response.headers['Cache-Control']).to eq 'max-age=0, private'
  125. end
  126. end
  127. context 'when signed request account is domain blocked' do
  128. before do
  129. account.block_domain!(remote_account.domain)
  130. get :show, params: { account_username: account.username, page: page }
  131. end
  132. it 'returns http success' do
  133. expect(response).to have_http_status(200)
  134. end
  135. it 'returns application/activity+json' do
  136. expect(response.content_type).to eq 'application/activity+json'
  137. end
  138. it 'returns empty orderedItems' do
  139. json = body_as_json
  140. expect(json[:orderedItems]).to be_an Array
  141. expect(json[:orderedItems].size).to eq 0
  142. end
  143. it 'returns private Cache-Control header' do
  144. expect(response.headers['Cache-Control']).to eq 'max-age=0, private'
  145. end
  146. end
  147. end
  148. end
  149. end