Files
railsgoat/spec/support/capybara_shared.rb
T
Ken Johnson 7712f5867f 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>
2026-01-04 11:09:14 -05:00

59 lines
2.3 KiB
Ruby

# frozen_string_literal: true
# By default this will return true, and thus all of the Capybara specs will
# fail until a developer using the site for training has patched up all of
# the vulnerabilities.
#
# However, RailsGoat maintainers need the Capybara features to pass to indicate
# changes to the site have not inadvertently removed or fixed any vulnerabilities
# since the whole point is to provide a site for a developer to fix.
$displayed_spec_notice = false
def verifying_fixed?
maintainer_env_name = "RAILSGOAT_MAINTAINER"
result = !ENV[maintainer_env_name]
if !$displayed_spec_notice && result
puts <<-NOTICE
******************************************************************************
You are running the RailsGoat Capybara Specs in Training mode. These specs
are supposed to fail, indicating vulnerabilities exist. They contain spoilers,
so do not read the code in spec/vulnerabilities if your goal is to learn more
about patching the vulnerabilities. You should fix the vulnerabilities in the
application in order to get these specs to pass**. You can use them to measure
your progress.
These same specs will pass if you set the #{maintainer_env_name} ENV variable.
**NOTE: The RSpec pending feature is used to toggle the outcome of these specs
between Training mode and RailsGoat Maintainer mode. When the vulnerabilities
are removed, the specs will pass instead. Try to get a fully passing suite.
******************************************************************************
NOTICE
$displayed_spec_notice = true
end
result
end
def login(user)
visit "/"
fill_in "email", with: user.email
fill_in "password", with: user.clear_password
click_button "Login"
end
# Configure Selenium with headless Chrome for JavaScript testing
# This works across macOS, Linux, and Windows without requiring Firefox
Capybara.register_driver :selenium_chrome_headless do |app|
options = Selenium::WebDriver::Chrome::Options.new
options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--window-size=1920,1080")
Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end
Capybara.javascript_driver = :selenium_chrome_headless