Files
grecia/spec/system/nested_imageable_spec.rb
taitus 12c1d77061 Extract management_budget_investment from shared nested documentable spec to system specs
Replaced 'login_as' with 'do_login_for' using 'management: management_section?' to
handle login requirements correctly for each context.

Also removed the now-unused 'documentable_fill_new_valid_budget_investment' helper
from common actions.

Note that it does not seem necessary to create an administrator with the user, as was
done in the original shared example. Also, as in the previous commit, it appears that
we do not need to set the user as the author when creating the documentable.

While reviewing this, we also noticed that the create(:administrator, user: user) call
was unnecessarily included in the nested_imageable system spec in commit cdfaec5217 when
the path is a management section. So we use this commit to remove the unnecessary condition.
2025-06-06 15:56:27 +02:00

247 lines
7.3 KiB
Ruby

require "rails_helper"
describe "Nested imageable" do
factories = [
:budget,
:budget_investment,
:future_poll_question_option,
:proposal
]
let(:factory) { factories.sample }
let!(:imageable) { create(factory) }
let!(:user) { create(:user, :level_two) }
let(:path) do
case factory
when :budget then new_admin_budgets_wizard_budget_path
when :budget_investment
[
new_budget_investment_path(budget_id: imageable.budget_id),
new_management_budget_investment_path(budget_id: imageable.budget_id)
].sample
when :future_poll_question_option then new_admin_option_image_path(option_id: imageable.id)
when :proposal then [new_proposal_path, edit_proposal_path(imageable)].sample
end
end
let(:submit_button_text) do
case factory
when :budget then "Continue to groups"
when :budget_investment then "Create Investment"
when :future_poll_question_option then "Save image"
when :proposal
if edit_path?
"Save changes"
else
"Create proposal"
end
end
end
let(:notice_text) do
case factory
when :budget then "New participatory budget created successfully!"
when :budget_investment then "Budget Investment created successfully."
when :future_poll_question_option then "Image uploaded successfully"
when :proposal
if edit_path?
"Proposal updated successfully"
else
"Proposal created successfully"
end
end
end
context "New and edit path" do
before do
create(:administrator, user: user) if admin_section?
imageable.update!(author: user) if edit_path?
do_login_for(user, management: management_section?)
visit path
end
scenario "Handles image link visibility, upload, and file updates correctly" do
expect(page).to have_css "#new_image_link"
imageable_attach_new_file(file_fixture("clippy.jpg"))
expect(page).not_to have_css "#new_image_link"
expect(page).to have_css ".file-name", text: "clippy.jpg"
within ".image-fields" do
expect(find("input[name$='[title]']").value).to eq "clippy.jpg"
end
end
scenario "Should not update image file title after choosing a file when a title is already defined" do
click_link "Add image"
input_title = find(".image-fields input[name$='[title]']")
fill_in input_title[:id], with: "Title"
attach_file "Choose image", file_fixture("clippy.jpg")
if factory == :future_poll_question_option
expect(find("input[id$='_title']").value).to eq "Title"
else
expect(find("##{factory}_image_attributes_title").value).to eq "Title"
end
end
scenario "Should update image cached_attachment field after valid file upload" do
click_link "Add image"
cached_attachment_field = find("input[name$='[cached_attachment]']", visible: :hidden)
expect(cached_attachment_field.value).to be_empty
attach_file "Choose image", file_fixture("clippy.jpg")
expect(page).to have_css(".loading-bar.complete")
expect(cached_attachment_field.value).not_to be_empty
end
scenario "Should not update image cached_attachment field after invalid file upload" do
imageable_attach_new_file(file_fixture("logo_header.png"), false)
cached_attachment_field = find("input[name$='[cached_attachment]']", visible: :hidden)
expect(cached_attachment_field.value).to be_empty
end
scenario "Should show image errors after invalid form submit" do
click_link "Add image"
click_button submit_button_text
within "#nested-image .image-fields" do
expect(page).to have_content("can't be blank", count: 2)
end
end
scenario "Render image preview after sending the form with validation errors" do
imageable_attach_new_file(file_fixture("clippy.jpg"))
within_fieldset("Descriptive image") { fill_in "Title", with: "" }
click_button submit_button_text
expect(page).to have_content "can't be blank"
expect(page).to have_css "img[src$='clippy.jpg']"
end
scenario "Should remove image after valid file upload and click on remove button" do
imageable_attach_new_file(file_fixture("clippy.jpg"))
within "#nested-image .image-fields" do
click_link "Remove image"
end
expect(page).not_to have_css "#nested-image .image-fields"
end
context "Budgets, investments and proposals" do
let(:factory) { (factories - [:future_poll_question_option]).sample }
scenario "Should show successful notice when resource filled correctly without any nested images" do
fill_in_required_fields
click_button submit_button_text
expect(page).to have_content notice_text
end
end
scenario "Should show successful notice when resource filled correctly and after valid file uploads" do
fill_in_required_fields
imageable_attach_new_file(file_fixture("clippy.jpg"))
click_button submit_button_text
expect(page).to have_content notice_text
end
scenario "Should show new image after successful creation with one uploaded file" do
fill_in_required_fields
imageable_attach_new_file(file_fixture("clippy.jpg"))
click_button submit_button_text
expect(page).to have_content notice_text
if factory == :budget
click_link "Go back to edit budget"
else
expect(page).to have_css "figure figcaption"
end
expect(page).to have_css "figure img"
end
scenario "Different URLs for different images" do
imageable_attach_new_file(file_fixture("clippy.jpg"))
original_src = find(:fieldset, "Descriptive image").find("img")[:src]
click_link "Remove image"
imageable_attach_new_file(file_fixture("custom_map.jpg"))
updated_src = find(:fieldset, "Descriptive image").find("img")[:src]
expect(updated_src).not_to eq original_src
end
end
context "Only for edit path" do
let(:proposal) { create(:proposal, :with_image, author: user) }
scenario "handles image fields correctly" do
login_as(user)
visit edit_proposal_path(proposal)
expect(page).to have_css ".image-fields", count: 1
expect(page).not_to have_css "a#new_image_link"
click_link "Remove image"
expect(page).not_to have_css ".image-fields"
expect(page).to have_link id: "new_image_link"
click_link "Add image"
expect(page).to have_css ".image-fields", count: 1, visible: :all
end
end
def fill_in_required_fields
return if edit_path?
case factory
when :budget then fill_budget
when :budget_investment then fill_budget_investment
when :proposal then fill_proposal
end
end
def fill_proposal
fill_in_new_proposal_title with: "Proposal title"
fill_in "Proposal summary", with: "Proposal summary"
check :proposal_terms_of_service
end
def fill_budget
fill_in "Name", with: "Budget name"
end
def fill_budget_investment
fill_in_new_investment_title with: "Budget investment title"
fill_in_ckeditor "Description", with: "Budget investment description"
check :budget_investment_terms_of_service
end
def admin_section?
path.starts_with?("/admin/")
end
def management_section?
path.starts_with?("/management/")
end
def edit_path?
path.ends_with?("/edit")
end
end