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.

148 lines
4.5 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. expect(session).to be_empty
  13. end
  14. it 'returns public Cache-Control header' do
  15. expect(response.headers['Cache-Control']).to include 'public'
  16. end
  17. end
  18. before do
  19. allow(controller).to receive(:signed_request_account).and_return(remote_account)
  20. Fabricate(:status_pin, account: account)
  21. Fabricate(:status_pin, account: account)
  22. Fabricate(:status, account: account, visibility: :private)
  23. end
  24. describe 'GET #show' do
  25. context 'when id is "featured"' do
  26. context 'without signature' do
  27. let(:remote_account) { nil }
  28. before do
  29. get :show, params: { id: 'featured', account_username: account.username }
  30. end
  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.content_type).to eq 'application/activity+json'
  36. end
  37. it_behaves_like 'cachable response'
  38. it 'returns orderedItems with pinned statuses' do
  39. json = body_as_json
  40. expect(json[:orderedItems]).to be_an Array
  41. expect(json[:orderedItems].size).to eq 2
  42. end
  43. end
  44. context 'with signature' do
  45. let(:remote_account) { Fabricate(:account, domain: 'example.com') }
  46. context do
  47. before do
  48. get :show, params: { id: 'featured', account_username: account.username }
  49. end
  50. it 'returns http success' do
  51. expect(response).to have_http_status(200)
  52. end
  53. it 'returns application/activity+json' do
  54. expect(response.content_type).to eq 'application/activity+json'
  55. end
  56. it_behaves_like 'cachable response'
  57. it 'returns orderedItems with pinned statuses' do
  58. json = body_as_json
  59. expect(json[:orderedItems]).to be_an Array
  60. expect(json[:orderedItems].size).to eq 2
  61. end
  62. end
  63. context 'in authorized fetch mode' do
  64. before do
  65. allow(controller).to receive(:authorized_fetch_mode?).and_return(true)
  66. end
  67. context 'when signed request account is blocked' do
  68. before do
  69. account.block!(remote_account)
  70. get :show, params: { id: 'featured', account_username: account.username }
  71. end
  72. it 'returns http success' do
  73. expect(response).to have_http_status(200)
  74. end
  75. it 'returns application/activity+json' do
  76. expect(response.content_type).to eq 'application/activity+json'
  77. end
  78. it 'returns private Cache-Control header' do
  79. expect(response.headers['Cache-Control']).to include 'private'
  80. end
  81. it 'returns empty orderedItems' do
  82. json = body_as_json
  83. expect(json[:orderedItems]).to be_an Array
  84. expect(json[:orderedItems].size).to eq 0
  85. end
  86. end
  87. context 'when signed request account is domain blocked' do
  88. before do
  89. account.block_domain!(remote_account.domain)
  90. get :show, params: { id: 'featured', account_username: account.username }
  91. end
  92. it 'returns http success' do
  93. expect(response).to have_http_status(200)
  94. end
  95. it 'returns application/activity+json' do
  96. expect(response.content_type).to eq 'application/activity+json'
  97. end
  98. it 'returns private Cache-Control header' do
  99. expect(response.headers['Cache-Control']).to include 'private'
  100. end
  101. it 'returns empty orderedItems' do
  102. json = body_as_json
  103. expect(json[:orderedItems]).to be_an Array
  104. expect(json[:orderedItems].size).to eq 0
  105. end
  106. end
  107. end
  108. end
  109. end
  110. context 'when id is not "featured"' do
  111. it 'returns http not found' do
  112. get :show, params: { id: 'hoge', account_username: account.username }
  113. expect(response).to have_http_status(404)
  114. end
  115. end
  116. end
  117. end