Files
ubicloud/spec/routes/web/spec_helper.rb
Jeremy Evans dd9a51da2e Fix required="true" attributes
Add a custom validator looking for {required,checked}={true,false}
attributes. This found numerous cases.

Add an html_attrs method that handles required/checked attributes
properly, skipping them if the value is false, and using them
without a value if the value is true.

Change all attribute handling to use html_attrs to fix the issue.
2025-05-13 06:24:13 +09:00

93 lines
2.6 KiB
Ruby

# frozen_string_literal: true
require_relative "../spec_helper"
Warning.ignore(:mismatched_indentations, File.expand_path("coverage/views")) if defined?(SimpleCov)
css_file = File.expand_path("../../../assets/css/app.css", __dir__)
File.write(css_file, "") unless File.file?(css_file)
require "capybara"
require "capybara/rspec"
if ENV["CLOVER_FREEZE"] == "1"
require "capybara/validate_html5"
Capybara.custom_html_validation do |doc, &block|
css = "*[required=true], *[required=false], input[checked=true], input[checked=false]"
doc.css(css).map(&block)
end
end
Gem.suffix_pattern
Capybara.app = Clover.app
Capybara.exact = true
module RackTestPlus
include Rack::Test::Methods
def app
Capybara.app
end
end
# Work around Middleware should not call #each error.
# Fix bugs with cookies, because the default behavior
# reuses the rack env of the last request, which is not valid.
class Capybara::RackTest::Browser
remove_method :refresh
def refresh
visit last_request.fullpath
end
end
RSpec.configure do |config|
config.include RackTestPlus
config.include Capybara::DSL
config.after do
Capybara.reset_sessions!
Capybara.use_default_driver
end
class RSpec::Matchers::DSL::Matcher
def self.flash_message_matcher(expected_type, expected_message)
match do |page|
next false unless page.has_css?("#flash-#{expected_type}")
actual_message = page.find_by_id("flash-#{expected_type}").text
if expected_message.is_a?(String)
actual_message == expected_message
else
actual_message =~ expected_message
end
end
failure_message do |page|
<<~MESSAGE
#{"expected: ".rjust(16)}#{expected_type} - #{expected_message}
#{"actual error: ".rjust(16)}#{page.has_css?("#flash-error") ? page.find_by_id("flash-error").text : "(no error message)"}
#{"actual notice: ".rjust(16)}#{page.has_css?("#flash-notice") ? page.find_by_id("flash-notice").text : "(no notice message)"}
MESSAGE
end
end
end
RSpec::Matchers.define :have_flash_notice do |expected_message|
flash_message_matcher(:notice, expected_message)
end
RSpec::Matchers.define :have_flash_error do |expected_message|
flash_message_matcher(:error, expected_message)
end
config.include(Module.new do
def login(email = TEST_USER_EMAIL, password = TEST_USER_PASSWORD)
visit "/login"
fill_in "Email Address", with: email
fill_in "Password", with: password
click_button "Sign in"
expect(page.title).to end_with("Dashboard")
end
end)
end