collections_controller_spec.rb 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. # frozen_string_literal: true
  2. require 'rails_helper'
  3. RSpec.describe ActivityPub::CollectionsController do
  4. let!(:account) { Fabricate(:account) }
  5. let!(:private_pinned) { Fabricate(:status, account: account, text: 'secret private stuff', visibility: :private) }
  6. let(:remote_account) { nil }
  7. before do
  8. allow(controller).to receive(:signed_request_actor).and_return(remote_account)
  9. Fabricate(:status_pin, account: account)
  10. Fabricate(:status_pin, account: account)
  11. Fabricate(:status_pin, account: account, status: private_pinned)
  12. Fabricate(:status, account: account, visibility: :private)
  13. end
  14. describe 'GET #show' do
  15. subject(:response) { get :show, params: { id: id, account_username: account.username } }
  16. context 'when id is "featured"' do
  17. let(:id) { 'featured' }
  18. context 'without signature' do
  19. let(:remote_account) { nil }
  20. it 'returns http success and correct media type' do
  21. expect(response).to have_http_status(200)
  22. expect(response.media_type).to eq 'application/activity+json'
  23. end
  24. it_behaves_like 'cacheable response'
  25. it 'returns orderedItems with correct items' do
  26. expect(body_as_json[:orderedItems])
  27. .to be_an(Array)
  28. .and have_attributes(size: 3)
  29. .and include(ActivityPub::TagManager.instance.uri_for(private_pinned))
  30. .and not_include(private_pinned.text)
  31. end
  32. context 'when account is permanently suspended' do
  33. before do
  34. account.suspend!
  35. account.deletion_request.destroy
  36. end
  37. it 'returns http gone' do
  38. expect(response).to have_http_status(410)
  39. end
  40. end
  41. context 'when account is temporarily suspended' do
  42. before do
  43. account.suspend!
  44. end
  45. it 'returns http forbidden' do
  46. expect(response).to have_http_status(403)
  47. end
  48. end
  49. end
  50. context 'with signature' do
  51. let(:remote_account) { Fabricate(:account, domain: 'example.com') }
  52. context 'when getting a featured resource' do
  53. it 'returns http success and correct media type' do
  54. expect(response).to have_http_status(200)
  55. expect(response.media_type).to eq 'application/activity+json'
  56. end
  57. it_behaves_like 'cacheable response'
  58. it 'returns orderedItems with expected items' do
  59. expect(body_as_json[:orderedItems])
  60. .to be_an(Array)
  61. .and have_attributes(size: 3)
  62. .and include(ActivityPub::TagManager.instance.uri_for(private_pinned))
  63. .and not_include(private_pinned.text)
  64. end
  65. end
  66. context 'with authorized fetch mode' do
  67. before do
  68. allow(controller).to receive(:authorized_fetch_mode?).and_return(true)
  69. end
  70. context 'when signed request account is blocked' do
  71. before do
  72. account.block!(remote_account)
  73. end
  74. it 'returns http success and correct media type and cache headers' do
  75. expect(response).to have_http_status(200)
  76. expect(response.media_type).to eq 'application/activity+json'
  77. expect(response.headers['Cache-Control']).to include 'private'
  78. end
  79. it 'returns empty orderedItems' do
  80. expect(body_as_json[:orderedItems])
  81. .to be_an(Array)
  82. .and have_attributes(size: 0)
  83. end
  84. end
  85. context 'when signed request account is domain blocked' do
  86. before do
  87. account.block_domain!(remote_account.domain)
  88. end
  89. it 'returns http success and correct media type and cache headers' do
  90. expect(response).to have_http_status(200)
  91. expect(response.media_type).to eq 'application/activity+json'
  92. expect(response.headers['Cache-Control']).to include 'private'
  93. end
  94. it 'returns empty orderedItems' do
  95. expect(body_as_json[:orderedItems])
  96. .to be_an(Array)
  97. .and have_attributes(size: 0)
  98. end
  99. end
  100. end
  101. end
  102. end
  103. context 'when id is not "featured"' do
  104. let(:id) { 'hoge' }
  105. it 'returns http not found' do
  106. expect(response).to have_http_status(404)
  107. end
  108. end
  109. end
  110. end