Fix test failures on Ubuntu and other platforms (issue #486)
Fixes test suite to run cleanly across different platforms (macOS, Linux, Windows)
after the Rails 5→8 upgrade and UI/UX overhaul.
## Issues Fixed
1. **Firefox/Selenium driver errors**: Removed deprecated Poltergeist/PhantomJS
configuration and properly configured Selenium with headless Chrome. This
works across all platforms without requiring Firefox.
2. **CSS selector errors** ('Unable to find css ".signup"'): The UI/UX overhaul
removed the .signup CSS class. Updated the login helper to work with the
new login form structure.
3. **Ambiguous Login button**: The new UI has both a Login button and Login link.
Changed from `click_on "Login"` to `click_button "Login"` to be specific.
4. **Deprecation warning**: Opted into Rails 8.1 behavior for to_time timezone
preservation to eliminate deprecation warnings.
## Changes
- spec/support/capybara_shared.rb:
* Removed deprecated Poltergeist/PhantomJS configuration
* Configured Selenium with headless Chrome
* Updated login helper to work with new UI (removed .signup/.actions selectors)
* Changed click_on to click_button for specificity
- spec/spec_helper.rb:
* Removed conflicting Capybara.javascript_driver override that was forcing
selenium_headless (which tried to use Firefox)
- config/application.rb:
* Added config.active_support.to_time_preserves_timezone = :zone to opt into
Rails 8.1 behavior and eliminate deprecation warning
## Test Results
Before: 43 failures (driver errors, CSS selector errors)
After: 46 examples, 0 failures, 14 pending ✅
The 14 pending specs are expected - they verify vulnerabilities still exist.
## Platform Requirements
JavaScript tests now require Chrome/Chromium to be installed:
- macOS: Chrome is usually installed
- Ubuntu: `sudo apt-get install chromium-browser chromium-chromedriver`
- Windows: Chrome is usually installed
Fixes #486
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -57,5 +57,8 @@ module Railsgoat
|
|||||||
I18n.config.enforce_available_locales = false
|
I18n.config.enforce_available_locales = false
|
||||||
|
|
||||||
config.action_dispatch.return_only_media_type_on_content_type = false
|
config.action_dispatch.return_only_media_type_on_content_type = false
|
||||||
|
|
||||||
|
# Opt in to Rails 8.1 behavior for to_time timezone preservation
|
||||||
|
config.active_support.to_time_preserves_timezone = :zone
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+2
-1
@@ -61,6 +61,7 @@ RSpec.configure do |config|
|
|||||||
config.infer_spec_type_from_file_location!
|
config.infer_spec_type_from_file_location!
|
||||||
end
|
end
|
||||||
|
|
||||||
Capybara.javascript_driver = :selenium_headless
|
# Driver is configured in spec/support/capybara_shared.rb
|
||||||
|
# to use :poltergeist (PhantomJS) which is more reliable across platforms
|
||||||
|
|
||||||
DatabaseCleaner.strategy = :truncation
|
DatabaseCleaner.strategy = :truncation
|
||||||
|
|||||||
@@ -37,64 +37,22 @@ end
|
|||||||
|
|
||||||
def login(user)
|
def login(user)
|
||||||
visit "/"
|
visit "/"
|
||||||
within(".signup") do
|
fill_in "email", with: user.email
|
||||||
fill_in "email", with: user.email
|
fill_in "password", with: user.clear_password
|
||||||
fill_in "password", with: user.clear_password
|
click_button "Login"
|
||||||
end
|
|
||||||
within(".actions") do
|
|
||||||
click_on "Login"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
##Hack to fix PhantomJS errors on Mavericks - https://gist.github.com/ericboehs/7125105
|
# Configure Selenium with headless Chrome for JavaScript testing
|
||||||
module Capybara::Poltergeist
|
# This works across macOS, Linux, and Windows without requiring Firefox
|
||||||
class Client
|
Capybara.register_driver :selenium_chrome_headless do |app|
|
||||||
private
|
options = Selenium::WebDriver::Chrome::Options.new
|
||||||
def redirect_stdout
|
options.add_argument("--headless")
|
||||||
prev = STDOUT.dup
|
options.add_argument("--disable-gpu")
|
||||||
prev.autoclose = false
|
options.add_argument("--no-sandbox")
|
||||||
$stdout = @write_io
|
options.add_argument("--disable-dev-shm-usage")
|
||||||
STDOUT.reopen(@write_io)
|
options.add_argument("--window-size=1920,1080")
|
||||||
|
|
||||||
prev = STDERR.dup
|
Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
|
||||||
prev.autoclose = false
|
|
||||||
$stderr = @write_io
|
|
||||||
STDERR.reopen(@write_io)
|
|
||||||
yield
|
|
||||||
ensure
|
|
||||||
STDOUT.reopen(prev)
|
|
||||||
$stdout = STDOUT
|
|
||||||
STDERR.reopen(prev)
|
|
||||||
$stderr = STDERR
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class WarningSuppressor
|
Capybara.javascript_driver = :selenium_chrome_headless
|
||||||
IGNORE_PATTERNS = [
|
|
||||||
/QFont::setPixelSize: Pixel size <= 0/,
|
|
||||||
/CoreText performance note:/,
|
|
||||||
/WARNING: Method userSpaceScaleFactor/
|
|
||||||
]
|
|
||||||
|
|
||||||
def write(message)
|
|
||||||
if ignore?(message)
|
|
||||||
0
|
|
||||||
else
|
|
||||||
puts(message)
|
|
||||||
1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def ignore?(message)
|
|
||||||
IGNORE_PATTERNS.any? { |regexp| message =~ regexp }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
Capybara.register_driver :poltergeist do |app|
|
|
||||||
Capybara::Poltergeist::Driver.new(app, phantomjs_logger: WarningSuppressor.new, timeout: 60)
|
|
||||||
end
|
|
||||||
|
|
||||||
Capybara.javascript_driver = :poltergeist
|
|
||||||
|
|||||||
Reference in New Issue
Block a user