132 lines
2.9 KiB
Ruby
132 lines
2.9 KiB
Ruby
|
module CommonActions
|
||
|
|
||
|
delegate :app_host, to: Capybara
|
||
|
|
||
|
# Performs a login with the given credentials and closes the clues (if present).
|
||
|
# The 'remember me' can optionally be checked.
|
||
|
#
|
||
|
# @example
|
||
|
# login(
|
||
|
# username: 'master@example.com',
|
||
|
# password: 'test',
|
||
|
# )
|
||
|
#
|
||
|
# @example
|
||
|
# login(
|
||
|
# username: 'master@example.com',
|
||
|
# password: 'test',
|
||
|
# remember_me: true,
|
||
|
# )
|
||
|
#
|
||
|
# return [nil]
|
||
|
def login(username:, password:, remember_me: false)
|
||
|
visit '/'
|
||
|
|
||
|
within('#login') do
|
||
|
fill_in 'username', with: username
|
||
|
fill_in 'password', with: password
|
||
|
|
||
|
# check via label because checkbox is hidden
|
||
|
click('.checkbox-replacement') if remember_me
|
||
|
|
||
|
# submit
|
||
|
click_button
|
||
|
end
|
||
|
|
||
|
wait(4).until_exists do
|
||
|
current_login
|
||
|
end
|
||
|
|
||
|
return if User.find_by(login: current_login).preferences[:intro]
|
||
|
|
||
|
find(:clues_close, wait: 3).in_fixed_postion.click
|
||
|
end
|
||
|
|
||
|
# Checks if the current session is logged in.
|
||
|
#
|
||
|
# @example
|
||
|
# logged_in?
|
||
|
# => true
|
||
|
#
|
||
|
# @return [true, false]
|
||
|
def logged_in?
|
||
|
current_login.present?
|
||
|
rescue Capybara::ElementNotFound
|
||
|
false
|
||
|
end
|
||
|
|
||
|
# Returns the login of the currently logged in user.
|
||
|
#
|
||
|
# @example
|
||
|
# current_login
|
||
|
# => 'master@example.com'
|
||
|
#
|
||
|
# @return [String] the login of the currently logged in user.
|
||
|
def current_login
|
||
|
find('.user-menu .user a')[:title]
|
||
|
end
|
||
|
|
||
|
# Logs out the currently logged in user.
|
||
|
#
|
||
|
# @example
|
||
|
# logout
|
||
|
#
|
||
|
def logout
|
||
|
visit('logout')
|
||
|
end
|
||
|
|
||
|
# Overwrites the Capybara::Session#visit method to allow SPA navigation.
|
||
|
# All routes not starting with `/` will be handled as SPA routes.
|
||
|
#
|
||
|
# @see Capybara::Session#visit
|
||
|
#
|
||
|
# @example
|
||
|
# visit('logout')
|
||
|
# => visited SPA route '/#logout'
|
||
|
#
|
||
|
# @example
|
||
|
# visit('/test/ui')
|
||
|
# => visited regular route '/test/ui'
|
||
|
#
|
||
|
def visit(route)
|
||
|
if !route.start_with?('/')
|
||
|
route = "/##{route}"
|
||
|
end
|
||
|
super(route)
|
||
|
end
|
||
|
|
||
|
# This method is equivalent to Capybara::RSpecMatchers#have_current_path
|
||
|
# but checks the SPA route instead of the actual path.
|
||
|
#
|
||
|
# @see Capybara::RSpecMatchers#have_current_path
|
||
|
#
|
||
|
# @example
|
||
|
# expect(page).to have_current_route('login')
|
||
|
# => checks for SPA route '/#login'
|
||
|
#
|
||
|
def have_current_route(route, **options)
|
||
|
if route.is_a?(String)
|
||
|
route = Regexp.new(Regexp.quote("/##{route}"))
|
||
|
end
|
||
|
|
||
|
options.reverse_merge!(wait: 0, url: true)
|
||
|
|
||
|
have_current_path("/##{route}", **options)
|
||
|
end
|
||
|
|
||
|
# This is a convenient wrapper method around #have_current_route
|
||
|
# which requires no previous `expect(page).to ` call.
|
||
|
#
|
||
|
# @example
|
||
|
# expect_current_routes('login')
|
||
|
# => checks for SPA route '/#login'
|
||
|
#
|
||
|
def expect_current_route(route, **options)
|
||
|
expect(page).to have_current_route(route, **options)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
RSpec.configure do |config|
|
||
|
config.include CommonActions, type: :system
|
||
|
end
|