7712f5867f
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>
59 lines
2.3 KiB
Ruby
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
|