1
0
Fork 0
forked from fedi/mastodon

Fix RSS feeds not being cachable (#14368)

* Add tests for some cachable responses

This only covers responses that we should have managed to make cachable
so far. It's not the case of all responses that should be cachable in
the end.

* Fix RSS feeds not being cachable
This commit is contained in:
ThibG 2020-07-22 11:44:02 +02:00 committed by GitHub
parent bcf85b5208
commit f55dd193f9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 88 additions and 37 deletions

View file

@ -55,7 +55,7 @@ class ApplicationController < ActionController::Base
end end
def store_current_location def store_current_location
store_location_for(:user, request.url) unless request.format == :json store_location_for(:user, request.url) unless [:json, :rss].include?(request.format&.to_sym)
end end
def require_admin! def require_admin!

View file

@ -5,6 +5,21 @@ RSpec.describe AccountsController, type: :controller do
let(:account) { Fabricate(:user).account } let(:account) { Fabricate(:user).account }
shared_examples 'cachable response' do
it 'does not set cookies' do
expect(response.cookies).to be_empty
expect(response.headers['Set-Cookies']).to be nil
end
it 'does not set sessions' do
expect(session).to be_empty
end
it 'returns public Cache-Control header' do
expect(response.headers['Cache-Control']).to include 'public'
end
end
describe 'GET #show' do describe 'GET #show' do
let(:format) { 'html' } let(:format) { 'html' }
@ -323,9 +338,7 @@ RSpec.describe AccountsController, type: :controller do
expect(response.content_type).to eq 'application/activity+json' expect(response.content_type).to eq 'application/activity+json'
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
it 'renders account' do it 'renders account' do
json = body_as_json json = body_as_json
@ -343,9 +356,7 @@ RSpec.describe AccountsController, type: :controller do
expect(response.content_type).to eq 'application/activity+json' expect(response.content_type).to eq 'application/activity+json'
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
it 'returns Vary header with Signature' do it 'returns Vary header with Signature' do
expect(response.headers['Vary']).to include 'Signature' expect(response.headers['Vary']).to include 'Signature'
@ -401,9 +412,7 @@ RSpec.describe AccountsController, type: :controller do
expect(response.content_type).to eq 'application/activity+json' expect(response.content_type).to eq 'application/activity+json'
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
it 'renders account' do it 'renders account' do
json = body_as_json json = body_as_json
@ -447,9 +456,7 @@ RSpec.describe AccountsController, type: :controller do
expect(response).to have_http_status(200) expect(response).to have_http_status(200)
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
end end
context do context do

View file

@ -6,6 +6,21 @@ RSpec.describe ActivityPub::CollectionsController, type: :controller do
let!(:account) { Fabricate(:account) } let!(:account) { Fabricate(:account) }
let(:remote_account) { nil } let(:remote_account) { nil }
shared_examples 'cachable response' do
it 'does not set cookies' do
expect(response.cookies).to be_empty
expect(response.headers['Set-Cookies']).to be nil
end
it 'does not set sessions' do
expect(session).to be_empty
end
it 'returns public Cache-Control header' do
expect(response.headers['Cache-Control']).to include 'public'
end
end
before do before do
allow(controller).to receive(:signed_request_account).and_return(remote_account) allow(controller).to receive(:signed_request_account).and_return(remote_account)
@ -31,9 +46,7 @@ RSpec.describe ActivityPub::CollectionsController, type: :controller do
expect(response.content_type).to eq 'application/activity+json' expect(response.content_type).to eq 'application/activity+json'
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
it 'returns orderedItems with pinned statuses' do it 'returns orderedItems with pinned statuses' do
json = body_as_json json = body_as_json
@ -58,9 +71,7 @@ RSpec.describe ActivityPub::CollectionsController, type: :controller do
expect(response.content_type).to eq 'application/activity+json' expect(response.content_type).to eq 'application/activity+json'
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
it 'returns orderedItems with pinned statuses' do it 'returns orderedItems with pinned statuses' do
json = body_as_json json = body_as_json

View file

@ -3,6 +3,21 @@ require 'rails_helper'
RSpec.describe ActivityPub::OutboxesController, type: :controller do RSpec.describe ActivityPub::OutboxesController, type: :controller do
let!(:account) { Fabricate(:account) } let!(:account) { Fabricate(:account) }
shared_examples 'cachable response' do
it 'does not set cookies' do
expect(response.cookies).to be_empty
expect(response.headers['Set-Cookies']).to be nil
end
it 'does not set sessions' do
expect(session).to be_empty
end
it 'returns public Cache-Control header' do
expect(response.headers['Cache-Control']).to include 'public'
end
end
before do before do
Fabricate(:status, account: account, visibility: :public) Fabricate(:status, account: account, visibility: :public)
Fabricate(:status, account: account, visibility: :unlisted) Fabricate(:status, account: account, visibility: :unlisted)
@ -39,9 +54,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do
expect(json[:totalItems]).to eq 4 expect(json[:totalItems]).to eq 4
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
end end
context 'with page requested' do context 'with page requested' do
@ -62,9 +75,7 @@ RSpec.describe ActivityPub::OutboxesController, type: :controller do
expect(json[:orderedItems].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) }).to be true expect(json[:orderedItems].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) }).to be true
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
end end
end end

View file

@ -7,6 +7,21 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do
let(:remote_reply_id) { nil } let(:remote_reply_id) { nil }
let(:remote_account) { nil } let(:remote_account) { nil }
shared_examples 'cachable response' do
it 'does not set cookies' do
expect(response.cookies).to be_empty
expect(response.headers['Set-Cookies']).to be nil
end
it 'does not set sessions' do
expect(session).to be_empty
end
it 'returns public Cache-Control header' do
expect(response.headers['Cache-Control']).to include 'public'
end
end
before do before do
allow(controller).to receive(:signed_request_account).and_return(remote_account) allow(controller).to receive(:signed_request_account).and_return(remote_account)
@ -36,9 +51,7 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do
expect(response.content_type).to eq 'application/activity+json' expect(response.content_type).to eq 'application/activity+json'
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
it 'returns items with account\'s own replies' do it 'returns items with account\'s own replies' do
json = body_as_json json = body_as_json
@ -87,9 +100,7 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do
expect(response.content_type).to eq 'application/activity+json' expect(response.content_type).to eq 'application/activity+json'
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
context 'without only_other_accounts' do context 'without only_other_accounts' do
it 'returns items with account\'s own replies' do it 'returns items with account\'s own replies' do

View file

@ -5,6 +5,21 @@ require 'rails_helper'
describe StatusesController do describe StatusesController do
render_views render_views
shared_examples 'cachable response' do
it 'does not set cookies' do
expect(response.cookies).to be_empty
expect(response.headers['Set-Cookies']).to be nil
end
it 'does not set sessions' do
expect(session).to be_empty
end
it 'returns public Cache-Control header' do
expect(response.headers['Cache-Control']).to include 'public'
end
end
describe 'GET #show' do describe 'GET #show' do
let(:account) { Fabricate(:account) } let(:account) { Fabricate(:account) }
let(:status) { Fabricate(:status, account: account) } let(:status) { Fabricate(:status, account: account) }
@ -80,9 +95,7 @@ describe StatusesController do
expect(response.headers['Vary']).to eq 'Accept' expect(response.headers['Vary']).to eq 'Accept'
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
it 'returns Content-Type header' do it 'returns Content-Type header' do
expect(response.headers['Content-Type']).to include 'application/activity+json' expect(response.headers['Content-Type']).to include 'application/activity+json'
@ -470,9 +483,7 @@ describe StatusesController do
expect(response.headers['Vary']).to eq 'Accept' expect(response.headers['Vary']).to eq 'Accept'
end end
it 'returns public Cache-Control header' do it_behaves_like 'cachable response'
expect(response.headers['Cache-Control']).to include 'public'
end
it 'returns Content-Type header' do it 'returns Content-Type header' do
expect(response.headers['Content-Type']).to include 'application/activity+json' expect(response.headers['Content-Type']).to include 'application/activity+json'