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.
95 lines
2.6 KiB
Ruby
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
|