From 472e2441036b59c17dec5799a57a3405f9667163 Mon Sep 17 00:00:00 2001 From: taitus Date: Mon, 19 May 2025 11:21:10 +0200 Subject: [PATCH] Move tests related with attached documents from documentable shared specs to nested documentable file Note that we moved some system tests to component tests, since they don't involve user interaction and can be fully covered at the component level. --- .../documents/document_component_spec.rb | 37 ++++++++++ spec/shared/system/documentable.rb | 74 ------------------- spec/system/budgets/investments_spec.rb | 5 -- spec/system/nested_documentable_spec.rb | 31 ++++++++ spec/system/proposals_spec.rb | 2 - 5 files changed, 68 insertions(+), 81 deletions(-) create mode 100644 spec/components/documents/document_component_spec.rb delete mode 100644 spec/shared/system/documentable.rb diff --git a/spec/components/documents/document_component_spec.rb b/spec/components/documents/document_component_spec.rb new file mode 100644 index 000000000..eff800cba --- /dev/null +++ b/spec/components/documents/document_component_spec.rb @@ -0,0 +1,37 @@ +require "rails_helper" + +describe Documents::DocumentComponent do + let(:user) { create(:user) } + let(:proposal) { create(:proposal, author: user) } + let(:document) { create(:document, documentable: proposal) } + let(:component) { Documents::DocumentComponent.new(document, show_destroy_link: true) } + + describe "Delete document button" do + it "is not shown when no user is logged in" do + render_inline component + + expect(page).not_to have_button "Delete document" + end + + it "is shown when the author is logged in" do + sign_in(user) + render_inline component + + expect(page).to have_button "Delete document" + end + + it "is not shown when an administrator that isn't the author is logged in", :admin do + render_inline component + + expect(page).not_to have_button "Delete document" + end + + it "is not shown when a user that isn't the author is logged in" do + login_as(create(:user)) + + render_inline component + + expect(page).not_to have_button "Delete document" + end + end +end diff --git a/spec/shared/system/documentable.rb b/spec/shared/system/documentable.rb deleted file mode 100644 index fd69a383b..000000000 --- a/spec/shared/system/documentable.rb +++ /dev/null @@ -1,74 +0,0 @@ -shared_examples "documentable" do |documentable_factory_name, documentable_path, documentable_path_arguments| - let(:user) { create(:user) } - let(:arguments) { {} } - let(:documentable) { create(documentable_factory_name, author: user) } - let!(:document) { create(:document, documentable: documentable, user: documentable.author) } - - before do - documentable_path_arguments.each do |argument_name, path_to_value| - arguments.merge!("#{argument_name}": documentable.send(path_to_value)) - end - end - - context "Show documents" do - describe "Destroy action" do - scenario "Should not be able when no user logged in" do - visit send(documentable_path, arguments) - - expect(page).not_to have_button "Delete document" - end - - scenario "Should be able when documentable author is logged in" do - login_as documentable.author - visit send(documentable_path, arguments) - - expect(page).to have_button "Delete document" - end - - scenario "Administrators cannot destroy documentables they have not authored", :admin do - visit send(documentable_path, arguments) - - expect(page).not_to have_button "Delete document" - end - - scenario "Users cannot destroy documentables they have not authored" do - login_as(create(:user)) - visit send(documentable_path, arguments) - - expect(page).not_to have_button "Delete document" - end - end - - describe "When allow attached documents setting is disabled" do - before do - Setting["feature.allow_attached_documents"] = false - end - - scenario "Documents list should not be available" do - login_as(create(:user)) - visit send(documentable_path, arguments) - - expect(page).not_to have_css("#documents") - end - end - end - - context "Destroy" do - scenario "Should show success notice after successful document upload" do - login_as documentable.author - - visit send(documentable_path, arguments) - - within "#document_#{document.id}" do - accept_confirm { click_button "Delete document" } - end - - expect(page).to have_content "Document was deleted successfully." - expect(page).not_to have_content "Documents (0)" - - within "##{ActionView::RecordIdentifier.dom_id(documentable)}" do - expect(page).to have_css "h1", text: documentable.title - end - end - end -end diff --git a/spec/system/budgets/investments_spec.rb b/spec/system/budgets/investments_spec.rb index 642ef7826..e4fd1c897 100644 --- a/spec/system/budgets/investments_spec.rb +++ b/spec/system/budgets/investments_spec.rb @@ -1110,11 +1110,6 @@ describe "Budget Investments" do "budget_investment_path", { budget_id: "budget_id", id: "id" } - it_behaves_like "documentable", - "budget_investment", - "budget_investment_path", - { budget_id: "budget_id", id: "id" } - it_behaves_like "mappable", "budget_investment", "investment", diff --git a/spec/system/nested_documentable_spec.rb b/spec/system/nested_documentable_spec.rb index 7936a0f40..bf6e29d09 100644 --- a/spec/system/nested_documentable_spec.rb +++ b/spec/system/nested_documentable_spec.rb @@ -287,4 +287,35 @@ describe "Nested documentable" do end end end + + context "Show path" do + let(:factory) { (factories - [:dashboard_action]).sample } + let(:path) { polymorphic_path(documentable) } + + scenario "Documents list should not be available when allow attached documents setting is disabled" do + Setting["feature.allow_attached_documents"] = false + create(:document, documentable: documentable) + visit path + + expect(page).not_to have_css("#documents") + end + + context "Destroy" do + scenario "Should show success notice after successful document upload" do + create(:document, documentable: documentable) + documentable.update!(author: user) + login_as(user) + visit path + + accept_confirm { click_button "Delete document" } + + expect(page).to have_content "Document was deleted successfully." + expect(page).not_to have_content "Documents (0)" + + within "##{ActionView::RecordIdentifier.dom_id(documentable)}" do + expect(page).to have_css "h1", text: documentable.title + end + end + end + end end diff --git a/spec/system/proposals_spec.rb b/spec/system/proposals_spec.rb index bcb50ab13..f00a37b40 100644 --- a/spec/system/proposals_spec.rb +++ b/spec/system/proposals_spec.rb @@ -1295,8 +1295,6 @@ describe "Proposals" do it_behaves_like "imageable", "proposal", "proposal_path", { id: "id" } - it_behaves_like "documentable", "proposal", "proposal_path", { id: "id" } - it_behaves_like "mappable", "proposal", "proposal",