demarches-normaliennes/spec/views/users/dossiers/index.html.haml_spec.rb
Colin Darie 75c22bc7d4
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.
2023-12-04 15:31:47 +01:00

163 lines
5.3 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

describe 'users/dossiers/index', type: :view do
let(:user) { create(:user) }
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(: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 |config|
allow(view).to receive(:new_demarche_url).and_return('#')
allow(controller).to receive(:current_user) { user }
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))
assign(:dossiers_traites, Kaminari.paginate_array(user_dossiers).page(1))
assign(:dossier_transferes, Kaminari.paginate_array([]).page(1))
assign(:dossiers_close_to_expiration, Kaminari.paginate_array([]).page(1))
assign(:dossiers, Kaminari.paginate_array(user_dossiers).page(1))
assign(:statut, statut)
assign(:filter, filter)
assign(:all_dossiers_uniq_procedures_count, 0)
render if !config.metadata[:caching]
end
it 'affiche les dossiers' do
expect(rendered).to have_selector('.card', count: 3)
end
it 'affiche les informations des dossiers' do
dossier = user_dossiers.first
expect(rendered).to have_text(dossier_brouillon.id.to_s)
expect(rendered).to have_text(dossier_brouillon.procedure.libelle)
expect(rendered).to have_link(dossier_brouillon.procedure.libelle, href: brouillon_dossier_path(dossier_brouillon))
expect(rendered).to have_text(dossier_en_construction.id.to_s)
expect(rendered).to have_text(dossier_en_construction.procedure.libelle)
expect(rendered).to have_link(dossier_en_construction.procedure.libelle, href: dossier_path(dossier_en_construction))
end
it 'naffiche pas une alerte pour continuer à remplir un dossier' do
expect(rendered).not_to have_selector('.fr-callout', count: 1)
end
context 'quand il y a un dossier en brouillon récemment mis à jour' do
before do
assign(:first_brouillon_recently_updated, dossier_brouillon)
render
end
it 'affiche une alerte pour continuer à remplir un dossier' do
expect(rendered).to have_selector('.fr-callout', count: 1)
expect(rendered).to have_link(href: brouillon_dossier_path(dossier_brouillon))
end
end
context 'quand il ny a aucun dossier' do
let(:user_dossiers) { [] }
let(:dossiers_invites) { [] }
it 'naffiche pas la table' do
expect(rendered).not_to have_selector('.dossiers-table')
end
it 'affiche un message' do
expect(rendered).to have_text('Aucun dossier')
end
end
context 'quand il ny a pas de dossiers invités' do
let(:dossiers_invites) { [] }
it 'affiche un titre adapté' do
expect(rendered).to have_selector('h1', text: 'Mes dossiers')
end
it 'naffiche la barre donglets' do
expect(rendered).to have_selector('nav.fr-tabs')
end
end
context 'quand il y a des dossiers invités' do
let(:dossiers_invites) { create_list(:dossier, 1) }
it 'affiche un titre adapté' do
expect(rendered).to have_selector('h1', text: 'Mes dossiers')
end
it 'affiche la barre donglets' do
expect(rendered).to have_selector('nav.fr-tabs')
expect(rendered).to have_selector('nav.fr-tabs li', count: 5)
expect(rendered).to have_selector('nav.fr-tabs li.active', count: 1)
end
end
context 'where there is a traite dossier' do
let(:dossiers_traites) { create_list(:dossier, 1) }
it "displays the hide by user at button" 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