perf(usager): cache tabs with a simple and fast cache_key

Plutôt que d'include dans la cache_key tous les scopes utilisés par l'onglet,
(ce qui provquerait une requête par scope),
on le base simplement sur les dossiers & invitations.
Les deleted dossiers sont inclus indirectement car ça correspond à la
suppression (N-1) d'un dossier.
This commit is contained in:
Colin Darie 2023-11-30 15:37:18 +01:00
parent 9ac3775207
commit 75c22bc7d4
No known key found for this signature in database
GPG key ID: 8C76CADD40253590
2 changed files with 103 additions and 43 deletions

View file

@ -25,6 +25,7 @@
= render Dossiers::UserProcedureFilterComponent.new(procedures_for_select: @procedures_for_select)
- if @search_terms.blank?
- cache([current_user.id, @statut, current_user.dossiers, current_user.dossiers_invites], expires_in: 1.hour) do
%nav.fr-tabs{ role: 'navigation', 'aria-label': t('views.users.dossiers.secondary_menu') }
%ul.fr-tabs__list{ role: 'tablist' }
- if @user_dossiers.present?

View file

@ -3,15 +3,15 @@ describe 'users/dossiers/index', type: :view do
let(:dossier_brouillon) { create(:dossier, state: Dossier.states.fetch(:brouillon), user: user) }
let(:dossier_en_construction) { create(:dossier, state: Dossier.states.fetch(:en_construction), user: user) }
let(:dossier_termine) { create(:dossier, state: Dossier.states.fetch(:accepte), user: user) }
let(:user_dossiers) { [dossier_brouillon, dossier_en_construction, dossier_termine] }
let(:dossiers_invites) { [] }
let(:user_dossiers) { Kaminari.paginate_array([dossier_brouillon, dossier_en_construction, dossier_termine]).page(1) }
let(:statut) { 'en-cours' }
let(:filter) { DossiersFilter.new(user, ActionController::Parameters.new(random_param: 'random_param')) }
before do
before do |config|
allow(view).to receive(:new_demarche_url).and_return('#')
allow(controller).to receive(:current_user) { user }
assign(:user_dossiers, Kaminari.paginate_array(user_dossiers).page(1))
assign(:user_dossiers, user_dossiers)
assign(:dossiers_invites, Kaminari.paginate_array(dossiers_invites).page(1))
assign(:dossiers_supprimes_recemment, Kaminari.paginate_array(user_dossiers).page(1))
assign(:dossiers_supprimes_definitivement, Kaminari.paginate_array(user_dossiers).page(1))
@ -22,7 +22,8 @@ describe 'users/dossiers/index', type: :view do
assign(:statut, statut)
assign(:filter, filter)
assign(:all_dossiers_uniq_procedures_count, 0)
render
render if !config.metadata[:caching]
end
it 'affiche les dossiers' do
@ -101,4 +102,62 @@ describe 'users/dossiers/index', type: :view do
expect(rendered).to have_text("Supprimer le dossier")
end
end
context 'caching', caching: true do
it "works" do
expect(user_dossiers).to receive(:present?).once
2.times { render; user.reload }
end
it "cache key depends on statut" do
expect(user_dossiers).to receive(:present?).twice
render
assign(:statut, "termines")
user.reload
render
end
it "cache key depends on dossier updated_at" do
expect(user_dossiers).to receive(:present?).twice
render
dossier_termine.touch
user.reload
render
end
it "cache key depends on dossiers list" do
render
expect(rendered).to have_text(/3\s+en cours/)
assign(:user_dossiers, Kaminari.paginate_array(user_dossiers.concat([create(:dossier, :en_construction, user: user)])).page(1))
user.reload
render
expect(rendered).to have_text(/4\s+en cours/)
end
it "cache key dpeends on dossier invites" do
expect(user_dossiers).to receive(:present?).twice
render
create(:invite, user:)
user.reload
render
end
it "cache key depends on dossier deletion" do
expect(user_dossiers).to receive(:present?).twice
render
dossier_termine.expired_keep_track_and_destroy!
user.reload
render
end
end
end