Files
nairobi/spec/system/nested_documentable_spec.rb
taitus 472e244103 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.
2025-06-09 17:32:41 +02:00

322 lines
10 KiB
Ruby

require "rails_helper"
describe "Nested documentable" do
factories = [
:budget_investment,
:dashboard_action,
:proposal
]
let(:factory) { factories.sample }
let!(:documentable) { create(factory) }
let!(:user) { create(:user, :level_two) }
let(:path) do
case factory
when :budget_investment
[
new_budget_investment_path(budget_id: documentable.budget_id),
new_management_budget_investment_path(budget_id: documentable.budget_id)
].sample
when :dashboard_action then new_admin_dashboard_action_path
when :proposal
[
new_proposal_path,
edit_proposal_path(id: documentable.id)
].sample
end
end
let(:submit_button_text) do
case factory
when :budget_investment then "Create Investment"
when :dashboard_action then "Save"
when :proposal
if edit_path?(path)
"Save changes"
else
"Create proposal"
end
end
end
let(:notice_text) do
case factory
when :budget_investment then "Budget Investment created successfully."
when :dashboard_action then "Action created successfully"
when :proposal
if edit_path?(path)
"Proposal updated successfully"
else
"Proposal created successfully"
end
end
end
context "New and edit path" do
describe "When allow attached documents setting is enabled" do
before do
Setting["uploads.documents.max_amount"] = 1
create(:administrator, user: user) if admin_section?(path)
documentable.update!(author: user) if edit_path?(path)
end
scenario "Shows or hides new document link depending on max documents limit" do
do_login_for(user, management: management_section?(path))
visit path
expect(page).to have_link "Add new document"
documentable_attach_new_file(file_fixture("empty.pdf"))
expect(page).not_to have_link "Add new document"
click_link "Remove document"
expect(page).to have_link "Add new document"
end
scenario "Shows or hides max documents warning depending on max documents limit" do
do_login_for(user, management: management_section?(path))
visit path
expect(page).not_to have_css ".max-documents-notice"
expect(page).not_to have_content "Remove document"
documentable_attach_new_file(file_fixture("empty.pdf"))
expect(page).to have_css ".max-documents-notice"
click_link "Remove document"
expect(page).not_to have_css ".max-documents-notice"
end
scenario "Should update file name and title after choosing a file with no title defined" do
do_login_for(user, management: management_section?(path))
visit path
documentable_attach_new_file(file_fixture("empty.pdf"))
expect(page).to have_css ".file-name", text: "empty.pdf"
expect(page).to have_field("Title", with: "empty.pdf")
end
scenario "Should not change existing titles except when removing the document" do
do_login_for(user, management: management_section?(path))
visit path
click_link "Add new document"
expect(page).not_to have_link "Add new document"
within "#nested-documents" do
fill_in "Title", with: "My Title"
attach_file "Choose document", file_fixture("empty.pdf")
expect(page).to have_css ".loading-bar.complete"
expect(page).to have_field "Title", with: "My Title"
click_link "Remove document"
expect(page).not_to have_css ".document-fields"
expect(page).not_to have_field "Title"
end
click_link "Add new document"
within "#nested-documents" do
expect(page).to have_field "Title", with: ""
expect(page).not_to have_field "Title", with: "My Title"
end
end
scenario "Should update document cached_attachment field after valid file upload" do
do_login_for(user, management: management_section?(path))
visit path
click_link "Add new document"
cached_attachment_field = find("input[name$='[cached_attachment]']", visible: :hidden)
expect(cached_attachment_field.value).to be_empty
attach_file "Choose document", file_fixture("empty.pdf")
expect(page).to have_css(".loading-bar.complete")
expect(cached_attachment_field.value).not_to be_empty
end
scenario "Should not update document cached_attachment field after invalid file upload" do
do_login_for(user, management: management_section?(path))
visit path
documentable_attach_new_file(file_fixture("logo_header.gif"), success: false)
cached_attachment_field = find("input[name$='[cached_attachment]']", visible: :hidden)
expect(cached_attachment_field.value).to be_empty
end
scenario "Should show document errors after documentable submit with empty document fields" do
do_login_for(user, management: management_section?(path))
visit path
click_link "Add new document"
click_button submit_button_text
within "#nested-documents .document-fields" do
expect(page).to have_content("can't be blank", count: 2)
end
end
scenario "Should show successful notice when resource filled correctly without any nested documents" do
do_login_for(user, management: management_section?(path))
visit path
fill_in_required_fields(factory, path)
click_button submit_button_text
expect(page).to have_content notice_text
end
scenario "Should show successful notice when resource filled correctly and after valid file uploads" do
Setting["uploads.documents.max_amount"] = 3
do_login_for(user, management: management_section?(path))
visit path
fill_in_required_fields(factory, path)
%w[clippy empty logo].each do |filename|
click_link "Add new document"
attach_file "Choose document", file_fixture("#{filename}.pdf")
within all(".document-fields").last do
expect(page).to have_css ".loading-bar.complete"
end
end
expect(page).not_to have_link "Add new document"
click_button submit_button_text
expect(page).to have_content notice_text
if factory != :dashboard_action
within "#documents" do
expect(page).to have_content "Documents (3)"
expect(page).to have_link href: /.pdf\Z/, count: 3
expect(page).to have_link text: "empty.pdf"
expect(page).to have_css "a[rel=nofollow]"
expect(page).to have_link text: "clippy.pdf"
expect(page).to have_css "a[rel=nofollow]"
expect(page).to have_link text: "logo.pdf"
expect(page).to have_css "a[rel=nofollow]"
expect(page).not_to have_css "a[target=_blank]"
end
end
end
describe "Metadata" do
let(:factory) { (factories - [:dashboard_action]).sample }
scenario "download document without metadata" do
do_login_for(user, management: management_section?(path))
visit path
fill_in_required_fields(factory, path)
documentable_attach_new_file(file_fixture("logo_with_metadata.pdf"))
click_button submit_button_text
expect(page).to have_content notice_text
io = URI.parse(find_link(text: "PDF")[:href]).open
reader = PDF::Reader.new(io)
expect(reader.info[:Keywords]).not_to eq "Test Metadata"
expect(reader.info[:Author]).not_to eq "Test Developer"
expect(reader.info[:Title]).not_to eq "logo_with_metadata.pdf"
expect(reader.info[:Producer]).not_to eq "Test Producer"
expect(reader.info).to eq({})
end
end
end
describe "Only for edit path" do
let!(:proposal) { create(:proposal, author: user) }
scenario "Should show persisted documents and remove nested_field" do
Setting["uploads.documents.max_amount"] = 1
create(:document, documentable: proposal)
login_as user
visit edit_proposal_path(proposal)
expect(page).not_to have_link "Add new document"
expect(page).to have_css ".document-fields", count: 1
click_link "Remove document"
expect(page).to have_link "Add new document"
expect(page).not_to have_css ".document-fields"
end
scenario "Same attachment URL after editing the title" do
login_as user
visit edit_proposal_path(proposal)
documentable_attach_new_file(file_fixture("empty.pdf"))
within_fieldset("Documents") { fill_in "Title", with: "Original" }
click_button "Save changes"
expect(page).to have_content "Proposal updated successfully"
original_url = find_link(text: "Original")[:href]
visit edit_proposal_path(proposal)
within_fieldset("Documents") { fill_in "Title", with: "Updated" }
click_button "Save changes"
expect(page).to have_content "Proposal updated successfully"
expect(find_link(text: "Updated")[:href]).to eq original_url
end
end
describe "When allow attached documents setting is disabled" do
before { Setting["feature.allow_attached_documents"] = false }
scenario "Add new document button should not be available" do
do_login_for(user, management: management_section?(path))
visit path
expect(page).not_to have_content("Add new document")
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