Skip to content

Commit a93dc89

Browse files
committed
test(events): add feature spec to ensure event edit preserves data when no changes are made
1 parent 356d19e commit a93dc89

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.feature 'Event edit preserves data', :as_user do
6+
let!(:community) { create(:community, privacy: 'public') }
7+
8+
before do
9+
configure_host_platform
10+
capybara_login_as_platform_manager
11+
end
12+
13+
scenario 'submitting the edit form without changes keeps the event unchanged', :aggregate_failures, :js do
14+
# Create an event and attach host
15+
event = create(:better_together_event, :upcoming, registration_url: 'https://example.test/register')
16+
BetterTogether::EventHost.create!(event: event, host: community)
17+
18+
# Directly visit the edit page for the event using the route helper (avoids ambiguous clicks)
19+
visit better_together.edit_event_path(event, locale: I18n.locale)
20+
21+
# Try to locate the edit form. Capybara may sometimes not consider the element visible due to JS;
22+
# prefer finding a form by id prefix, but provide a fallback that parses the page HTML and submits via JS.
23+
form = nil
24+
begin
25+
# include non-visible forms (Capybara may treat some forms as hidden during JS rendering)
26+
expect(page).to have_selector('form', wait: 10, visible: :all)
27+
forms = all('form', visible: :all)
28+
form = forms.find { |f| f[:id]&.start_with?('form_event_') } || forms.find do |f|
29+
f[:action]&.include?('/events/')
30+
end || forms.first
31+
rescue Capybara::ElementNotFound
32+
# ignore; we'll try the HTML fallback below
33+
end
34+
35+
# Capture values
36+
# Read values using input name attributes which are stable (inputs use random ids)
37+
name_value = begin
38+
find("input[name='event[name_en]']", visible: false).value
39+
rescue Capybara::ElementNotFound
40+
nil
41+
end
42+
43+
registration_value = begin
44+
find("input[name='event[registration_url]']", visible: false).value
45+
rescue Capybara::ElementNotFound
46+
nil
47+
end
48+
49+
selected_categories = all("select[name='event[category_ids][]'] option[selected]").map(&:text)
50+
51+
location_name = begin
52+
find("input[name='event[location_attributes][name]']", visible: false).value
53+
rescue Capybara::ElementNotFound
54+
nil
55+
end
56+
57+
# For ActionText translations there is a hidden input with the HTML value
58+
description_text = begin
59+
find("input[name='event[description_en]']", visible: false).value
60+
rescue Capybara::ElementNotFound
61+
''
62+
end
63+
64+
# Submit without changes using the specific event edit form to avoid ambiguous Save buttons
65+
# Prefer the form id pattern `form_event_<uuid>` which is generated in the view.
66+
# This is more stable than matching on action which may include host/port variations.
67+
if form
68+
form_action = form[:action]
69+
target_event_id = form_action.split('/').last
70+
71+
# If the form edits a different event than the created one, use that record for assertions
72+
target_event = if target_event_id == event.to_param
73+
event
74+
else
75+
BetterTogether::Event.find(target_event_id)
76+
end
77+
78+
within form do
79+
# Scope the button lookup to the form to avoid other buttons on the page
80+
if has_button?('Save Event')
81+
click_button 'Save Event'
82+
elsif has_button?(I18n.t('helpers.submit.update', model: 'Event', default: 'Update Event'))
83+
click_button I18n.t('helpers.submit.update', model: 'Event', default: 'Update Event')
84+
else
85+
# Fallback to any submit input inside the form
86+
find("input[type='submit']", match: :first).click
87+
end
88+
end
89+
else
90+
# Fallback: parse the raw HTML for a form action and submit it via JS. This bypasses Capybara visibility quirks.
91+
html = page.html
92+
match = html.match(%r{<form[^>]+action=["']([^"']*/events/([^"']+))["'][^>]*>})
93+
unless match
94+
raise Capybara::ElementNotFound, 'Could not locate event edit form on the page (no form element found)'
95+
end
96+
97+
target_event_id = match[2]
98+
target_event = if target_event_id == event.to_param
99+
event
100+
else
101+
BetterTogether::Event.find(target_event_id)
102+
end
103+
# Submit the form via JS (use %Q to allow interpolation and avoid quote collisions)
104+
page.execute_script(%[(function(){ var f = document.querySelector('form[action*="/events/#{target_event_id}"]'); if(f){ f.submit(); } })()]) # rubocop:disable Layout/LineLength
105+
106+
end
107+
108+
# Expect success flash and that we are on an event show page (not asserting exact id)
109+
expect(page).to have_content('Event was successfully updated.')
110+
111+
target_event.reload
112+
113+
expect(target_event.registration_url).to eq(registration_value) if registration_value
114+
115+
expect(target_event.name.to_s.strip).to eq(name_value.to_s.strip) if name_value
116+
117+
expect(target_event.categories.map(&:name)).to include(*selected_categories) if selected_categories.any?
118+
119+
expect(target_event.location&.name.to_s).to eq(location_name.to_s) if location_name
120+
121+
expect(target_event.description.to_s.strip).to include(description_text.strip) if description_text.present?
122+
end
123+
end

0 commit comments

Comments
 (0)