Files
ubicloud/spec/routes/web/spec_helper.rb
Jeremy Evans 9510ea2cdd Add authentication to admin site
This adds a Rodauth configuration to the admin site. The Rodauth
configuration requires password+WebAuthn authentication. It
supports changing passwords, but not resetting passwords, and
it does not support creating accounts.  To create an account
on the admin site, you need to run the following code in pry:

```ruby
CloverAdmin.create_admin_account("your-user-name")
```

This will create a random password, add the account to the
datbaase, and return the password. You can then login to the
admin site using the username and password, after which you
will be prompted to setup WebAuthn authentication. After
setting up WebAuthn authentication, you can change your
password (alternatively, pass a password of your choice
as a second argument to CloverAdmin.create_admin_account).

Took me a while to figure out that you need to use
Capybara.default_host= to set the host name, otherwise,
you get broken behavior when using visit. Since that only
should be set for requests to the admin site, this sets
the default_host back to the default in the after hook.
2025-07-18 16:49:27 -07:00

95 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
Capybara.default_host = "http://www.example.com"
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
click_button "Sign in"
fill_in "Password", with: password
click_button "Sign in"
expect(page.title).to end_with("Dashboard")
end
end)
end