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.

168 lines
5.0 KiB

  1. # frozen_string_literal: true
  2. require 'rails_helper'
  3. RSpec.describe ActivityPub::CollectionsController, type: :controller do
  4. let!(:account) { Fabricate(:account) }
  5. let(:remote_account) { nil }
  6. shared_examples 'cachable response' do
  7. it 'does not set cookies' do
  8. expect(response.cookies).to be_empty
  9. expect(response.headers['Set-Cookies']).to be nil
  10. end
  11. it 'does not set sessions' do
  12. response
  13. expect(session).to be_empty
  14. end
  15. it 'returns public Cache-Control header' do
  16. expect(response.headers['Cache-Control']).to include 'public'
  17. end
  18. end
  19. before do
  20. allow(controller).to receive(:signed_request_account).and_return(remote_account)
  21. Fabricate(:status_pin, account: account)
  22. Fabricate(:status_pin, account: account)
  23. Fabricate(:status, account: account, visibility: :private)
  24. end
  25. describe 'GET #show' do
  26. context 'when id is "featured"' do
  27. context 'without signature' do
  28. let(:remote_account) { nil }
  29. subject(:response) { get :show, params: { id: 'featured', account_username: account.username } }
  30. subject(:body) { body_as_json }
  31. it 'returns http success' do
  32. expect(response).to have_http_status(200)
  33. end
  34. it 'returns application/activity+json' do
  35. expect(response.media_type).to eq 'application/activity+json'
  36. end
  37. it_behaves_like 'cachable response'
  38. it 'returns orderedItems with pinned statuses' do
  39. expect(body[:orderedItems]).to be_an Array
  40. expect(body[:orderedItems].size).to eq 2
  41. end
  42. context 'when account is permanently suspended' do
  43. before do
  44. account.suspend!
  45. account.deletion_request.destroy
  46. end
  47. it 'returns http gone' do
  48. expect(response).to have_http_status(410)
  49. end
  50. end
  51. context 'when account is temporarily suspended' do
  52. before do
  53. account.suspend!
  54. end
  55. it 'returns http forbidden' do
  56. expect(response).to have_http_status(403)
  57. end
  58. end
  59. end
  60. context 'with signature' do
  61. let(:remote_account) { Fabricate(:account, domain: 'example.com') }
  62. context do
  63. before do
  64. get :show, params: { id: 'featured', account_username: account.username }
  65. end
  66. it 'returns http success' do
  67. expect(response).to have_http_status(200)
  68. end
  69. it 'returns application/activity+json' do
  70. expect(response.media_type).to eq 'application/activity+json'
  71. end
  72. it_behaves_like 'cachable response'
  73. it 'returns orderedItems with pinned statuses' do
  74. json = body_as_json
  75. expect(json[:orderedItems]).to be_an Array
  76. expect(json[:orderedItems].size).to eq 2
  77. end
  78. end
  79. context 'in authorized fetch mode' do
  80. before do
  81. allow(controller).to receive(:authorized_fetch_mode?).and_return(true)
  82. end
  83. context 'when signed request account is blocked' do
  84. before do
  85. account.block!(remote_account)
  86. get :show, params: { id: 'featured', account_username: account.username }
  87. end
  88. it 'returns http success' do
  89. expect(response).to have_http_status(200)
  90. end
  91. it 'returns application/activity+json' do
  92. expect(response.media_type).to eq 'application/activity+json'
  93. end
  94. it 'returns private Cache-Control header' do
  95. expect(response.headers['Cache-Control']).to include 'private'
  96. end
  97. it 'returns empty orderedItems' do
  98. json = body_as_json
  99. expect(json[:orderedItems]).to be_an Array
  100. expect(json[:orderedItems].size).to eq 0
  101. end
  102. end
  103. context 'when signed request account is domain blocked' do
  104. before do
  105. account.block_domain!(remote_account.domain)
  106. get :show, params: { id: 'featured', account_username: account.username }
  107. end
  108. it 'returns http success' do
  109. expect(response).to have_http_status(200)
  110. end
  111. it 'returns application/activity+json' do
  112. expect(response.media_type).to eq 'application/activity+json'
  113. end
  114. it 'returns private Cache-Control header' do
  115. expect(response.headers['Cache-Control']).to include 'private'
  116. end
  117. it 'returns empty orderedItems' do
  118. json = body_as_json
  119. expect(json[:orderedItems]).to be_an Array
  120. expect(json[:orderedItems].size).to eq 0
  121. end
  122. end
  123. end
  124. end
  125. end
  126. context 'when id is not "featured"' do
  127. it 'returns http not found' do
  128. get :show, params: { id: 'hoge', account_username: account.username }
  129. expect(response).to have_http_status(404)
  130. end
  131. end
  132. end
  133. end