jam-cloud/web/spec/support/utilities.rb

183 lines
5.4 KiB
Ruby
Raw Normal View History

include ApplicationHelper
2013-01-31 05:43:26 +00:00
def cookie_jar
Capybara.current_session.driver.browser.current_session.instance_variable_get(:@rack_mock_session).cookie_jar
2013-01-31 05:43:26 +00:00
end
def in_client(name) # to assist multiple-client RSpec/Capybara testing
Capybara.session_name = name.class == JamRuby::User ? name.id : name
yield
end
def sign_in(user)
visit signin_path
fill_in "Email", with: user.email
fill_in "Password", with: user.password
2013-01-29 02:24:25 +00:00
click_button "SIGN IN"
# Sign in when not using Capybara as well.
2013-01-31 05:43:26 +00:00
cookie_jar[:remember_token] = user.remember_token
end
def sign_in_poltergeist(user)
visit signin_path
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "SIGN IN"
if Capybara.javascript_driver == :poltergeist
page.driver.set_cookie(:remember_token, user.remember_token)
else
page.driver.browser.manage.add_cookie :name => :remember_token, :value => user.remember_token
end
end
2013-10-21 22:13:53 +00:00
def sign_out()
if Capybara.javascript_driver == :poltergeist
page.driver.remove_cookie(:remember_token)
else
page.driver.browser.manage.remove_cookie :name => :remember_token
end
end
2013-10-21 22:13:53 +00:00
def leave_music_session_sleep_delay
# add a buffer to ensure WSG has enough time to expire
sleep_dur = (Rails.application.config.websocket_gateway_connect_time_stale +
Rails.application.config.websocket_gateway_connect_time_expire) * 1.4
sleep sleep_dur
end
2013-10-21 22:13:53 +00:00
def wait_for_ajax(wait=Capybara.default_wait_time)
wait = wait * 10 #(because we sleep .1)
counter = 0
while page.execute_script("$.active").to_i > 0
counter += 1
sleep(0.1)
raise "AJAX request took longer than #{wait} seconds." if counter >= wait
end
end
# waits until the user object has been requested, which comes after the 'curtain' is lifted
# and after a call to /api/user/:id for the current user is called initially
def wait_until_user(wait=Capybara.default_wait_time)
wait = wait * 10 #(because we sleep .1)
counter = 0
# while page.execute_script("$('.curtain').is(:visible)") == "true"
# counter += 1
# sleep(0.1)
# raise "Waiting for user to populate took longer than #{wait} seconds." if counter >= wait
# end
2013-10-21 22:13:53 +00:00
end
def wait_until_curtain_gone
should have_no_selector('.curtain')
end
def wait_to_see_my_track
within('div.session-mytracks') {first('div.session-track.track')}
end
def determine_test_name(metadata, test_name_buffer = '')
description = metadata[:description_args]
if description.kind_of?(Array)
description = description[0]
end
if metadata.has_key? :example_group
return determine_test_name(metadata[:example_group], "#{description} #{test_name_buffer}")
else
return "#{description} #{test_name_buffer}"
end
end
# takes, or creates, a unique session description which is returned for subsequent calls to join_session to use
# in finding this session)
def create_session(creator = FactoryGirl.create(:user), unique_session_desc = "create_join_session #{SecureRandom.urlsafe_base64}")
# create session in one client
in_client(creator) do
page.driver.resize(1500, 600) # makes sure all the elements are visible
sign_in_poltergeist creator
wait_until_curtain_gone
visit "/client#/createSession"
expect(page).to have_selector('h2', text: 'session info')
within('#create-session-form') do
fill_in('description', :with => unique_session_desc)
select('Rock', :from => 'genres')
find('div.intellectual-property ins').trigger(:click)
find('#btn-create-session').trigger(:click) # fails if page width is low
end
# verify that the in-session page is showing
expect(page).to have_selector('h2', text: 'my tracks')
end
return creator, unique_session_desc
end
# this code assumes that there are no music sessions in the database. it should fail on the
# find('.join-link') call if > 1 session exists because capybara will complain of multile matches
def join_session(joiner, unique_session_desc)
in_client(joiner) do
sign_in_poltergeist joiner
wait_until_curtain_gone
visit "/client#/findSession"
# verify the session description is seen by second client
expect(page).to have_text(unique_session_desc)
find('.join-link').trigger(:click)
find('#btn-accept-terms').trigger(:click)
expect(page).to have_selector('h2', text: 'my tracks')
end
end
def create_join_session(creator, joiners=[])
creator, unique_session_desc = create_session(creator)
# find session in second client
joiners.each do |joiner|
join_session(joiner, unique_session_desc)
end
end
def set_session_as_private(session_owner)
in_client(session_owner) do
find('#session-settings-button').trigger(:click)
within('#session-settings-dialog') do
select('Private', :from => 'session-settings-musician-access')
find('#session-settings-dialog-submit').trigger(:click)
end
end
end
def set_session_as_public(session_owner)
in_client(session_owner) do
find('#session-settings-button').trigger(:click)
within('#session-settings-dialog') do
select('Public', :from => 'session-settings-musician-access')
find('#session-settings-dialog-submit').trigger(:click)
end
end
end
def assert_all_tracks_seen(users=[])
users.each do |user|
in_client(user) do
users.reject {|u| u==user}.each do |other|
expect(page).to have_selector('div.track-label', text: other.name)
#puts user.name + " is able to see " + other.name + "\'s track"
end
end
end
2013-10-21 22:13:53 +00:00
end