Files
nairobi/spec/system/nested_imageable_spec.rb
taitus 3fd2a1f498 Remove redirected_to_resource_show_or_navigate_to method
This method was removed as its logic was redundant or unnecessary:

- For "Proposal" new:
After creating a proposal, we are redirected to the "created" page, where the text
"Not now, go to my proposal" is not present, leading to a constant
`rescue Capybara::ElementNotFound`.

Instead, the "created" page shows a preview of how the proposal will look when
published and a link saying "No, I want to publish the proposal".  Since the click's
purpose was to navigate to the proposal's "show" page, and this can already be
verified on the "created" page, no additional handling is needed for this case.

- For "Proposal" edit:
After updating the proposal, we are directly redirected to the proposal's "show" page,
so no click_link logic is necessary here either.

- For "Budget":
The redirection is now handled directly with:
  `visit edit_admin_budget_path(imageable) if factory == :budget`.
2024-11-26 18:10:28 +01:00

249 lines
7.4 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? || management_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
visit edit_admin_budget_path(imageable) if factory == :budget
expect(page).to have_css "figure img"
expect(page).to have_css "figure figcaption" if show_caption_for?(factory)
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 show_caption_for?(factory)
factory != :budget
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