Files
ubicloud/spec/routes/web/spec_helper.rb
Jeremy Evans 60e129bd84 Fix the specs to avoid defining methods on Object
Defining methods inside RSpec.configure blocks still defines them on
Object.  Use config.include with a module to define these only in the
specs and not globally.

For matcher methods, define them in RSpec::Matchers::DSL::Matcher.
Change rubocop config to allow this inside of the RSpec.configure
blocks (technically, any constant inside any block).

Add an Object.method_added hook that raises an exception if defining
a method on object, other than Nokogiri, which is defined by the
nokogiri gem. This will result in the specs raising an error without
executing anything if you attempt to define a method on Object.
2025-05-03 03:33:24 +09:00

85 lines
2.4 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"
require "capybara/validate_html5" if ENV["CLOVER_FREEZE"] == "1"
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