2012-08-31 03:01:52 +00:00
include ApplicationHelper
2013-12-21 15:12:25 +00:00
# holds a single test's session name's, mapped to pooled session names
$capybara_session_mapper = { }
# called in before (or after) test, to make sure each test run has it's own map of session names
def reset_session_mapper
$capybara_session_mapper . clear
2013-01-31 05:43:26 +00:00
end
2013-12-21 15:12:25 +00:00
# manages the mapped session name
def mapped_session_name ( session_name )
return :default if session_name == :default # special treatment for the built-in session
$capybara_session_mapper [ session_name ] || = $capybara_session_mapper . length
end
# in place of ever using Capybara.session_name directly,
# this utility is used to handle the mapping of session names in a way across all tests runs
def in_client ( name )
session_name = name . class == JamRuby :: User ? name . id : name
2013-10-16 06:15:34 +00:00
2013-12-21 15:12:25 +00:00
Capybara . session_name = mapped_session_name ( session_name )
2013-10-16 06:15:34 +00:00
yield
end
2013-12-21 15:12:25 +00:00
def cookie_jar
Capybara . current_session . driver . browser . current_session . instance_variable_get ( :@rack_mock_session ) . cookie_jar
end
2014-01-07 19:40:26 +00:00
2014-01-07 22:32:16 +00:00
#see also ruby/spec/support/utilities.rb
JAMKAZAM_TESTING_BUCKET = 'jamkazam-testing' #at least, this is the name given in jam-ruby
2014-01-07 19:40:26 +00:00
def wipe_s3_test_bucket
2014-01-07 22:32:16 +00:00
s3 = AWS :: S3 . new ( :access_key_id = > Rails . application . config . aws_access_key_id ,
:secret_access_key = > Rails . application . config . aws_secret_access_key )
2014-01-07 19:40:26 +00:00
test_bucket = s3 . buckets [ JAMKAZAM_TESTING_BUCKET ]
if test_bucket . name == JAMKAZAM_TESTING_BUCKET
2014-02-02 01:30:23 +00:00
test_bucket . objects . each do | obj |
obj . delete
end
2014-01-07 19:40:26 +00:00
end
end
2013-12-21 15:12:25 +00:00
2012-08-31 03:01:52 +00:00
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 "
2012-08-31 03:01:52 +00:00
# Sign in when not using Capybara as well.
2013-01-31 05:43:26 +00:00
cookie_jar [ :remember_token ] = user . remember_token
2013-05-15 01:26:27 +00:00
end
def sign_in_poltergeist ( user )
visit signin_path
2014-02-20 07:45:51 +00:00
fill_in " session_email " , with : user . email
fill_in " session_password " , with : user . password
2013-05-15 01:26:27 +00:00
click_button " SIGN IN "
2013-05-15 20:53:19 +00:00
2013-05-20 18:23:49 +00:00
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
2013-10-16 06:15:34 +00:00
end
2013-10-21 22:13:53 +00:00
2013-10-22 17:38:21 +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
2013-11-13 06:58:28 +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
2013-11-16 14:05:23 +00:00
# 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
2013-11-16 14:05:23 +00:00
should have_no_selector ( '.curtain' )
2013-11-05 03:00:43 +00:00
end
2013-11-13 06:58:28 +00:00
def wait_to_see_my_track
within ( 'div.session-mytracks' ) { first ( 'div.session-track.track' ) }
end
2013-11-05 03:00:43 +00:00
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
2014-01-05 02:42:05 +00:00
def get_description
description = example . metadata [ :description_args ]
if description . kind_of? ( Array )
description = description [ 0 ]
end
return description
end
2014-02-10 22:43:09 +00:00
# will select the value from a easydropdown'ed select element
def jk_select ( text , select )
# the approach here is to find the hidden select element, and work way back up to the elements that need to be interacted with
find ( select , :visible = > false ) . find ( :xpath , 'ancestor::div[contains(@class, "dropdown easydropdown")]' ) . trigger ( :click )
find ( select , :visible = > false ) . find ( :xpath , 'ancestor::div[contains(@class, "dropdown-wrapper") and contains(@class, "easydropdown-wrapper") and contains(@class, "open")]' ) . find ( 'li' , text : text ) . trigger ( :click )
# works, but is 'cheating' because of visible = false
#select(genre, :from => 'genres', :visible => false)
end
2014-01-05 02:42:05 +00:00
2013-11-05 03:00:43 +00:00
# takes, or creates, a unique session description which is returned for subsequent calls to join_session to use
# in finding this session)
2014-01-05 02:42:05 +00:00
def create_session ( creator = FactoryGirl . create ( :user ) , unique_session_desc = nil , genre = nil )
unique_session_desc || = " create_join_session #{ SecureRandom . urlsafe_base64 } "
genre || = 'Rock'
2013-11-05 03:00:43 +00:00
# create session in one client
in_client ( creator ) do
2013-12-30 18:34:15 +00:00
page . driver . resize ( 1500 , 800 ) # makes sure all the elements are visible
2013-11-05 03:00:43 +00:00
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 )
2014-02-10 22:43:09 +00:00
#select(genre, :from => 'genres', :visible => false) # this works, but is 'cheating' because easydropdown hides the native select element
jk_select ( genre , '#create-session-form select[name="genres"]' )
2014-02-18 18:53:16 +00:00
jk_select ( 'Public' , '#create-session-form select#musician-access' )
jk_select ( 'Public' , '#create-session-form select#fan-access' )
find ( '#create-session-form div.musician-access-false.iradio_minimal' ) . trigger ( :click )
2013-11-05 03:00:43 +00:00
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' )
2014-02-24 21:49:38 +00:00
find ( '#session-screen .session-mytracks .session-track' )
2013-11-05 03:00:43 +00:00
end
2014-01-05 02:42:05 +00:00
return creator , unique_session_desc , genre
2013-11-05 03:00:43 +00:00
end
# this code assumes that there are no music sessions in the database. it should fail on the
2013-12-14 23:53:18 +00:00
# find('.join-link') call if > 1 session exists because capybara will complain of multiple matches
2013-11-05 03:00:43 +00:00
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' )
2014-02-24 21:49:38 +00:00
find ( '#session-screen .session-mytracks .session-track' )
2013-11-05 03:00:43 +00:00
end
end
2013-12-14 23:53:18 +00:00
2014-01-05 02:42:05 +00:00
def create_join_session ( creator , joiners = [ ] , genre = nil )
creator , unique_session_desc = create_session ( creator , nil , genre )
2013-11-05 03:00:43 +00:00
# find session in second client
joiners . each do | joiner |
join_session ( joiner , unique_session_desc )
end
2013-11-12 04:57:04 +00:00
end
2014-02-23 03:12:12 +00:00
def formal_leave_by user
in_client ( user ) do
find ( '#session-leave' ) . trigger ( :click )
2014-02-25 03:25:34 +00:00
#find('#btn-accept-leave-session').trigger(:click)
2014-02-23 03:12:12 +00:00
expect ( page ) . to have_selector ( 'h2' , text : 'feed' )
end
end
2014-01-05 02:42:05 +00:00
def start_recording_with ( creator , joiners = [ ] , genre = nil )
create_join_session ( creator , joiners , genre )
in_client ( creator ) do
find ( '#recording-start-stop' ) . trigger ( :click )
find ( '#recording-status' ) . should have_content 'Stop Recording'
end
joiners . each do | joiner |
in_client ( joiner ) do
find ( '#notification' ) . should have_content 'started a recording'
find ( '#recording-status' ) . should have_content 'Stop Recording'
end
end
end
def stop_recording
find ( '#recording-start-stop' ) . trigger ( :click )
end
def assert_recording_finished
find ( '#recording-status' ) . should have_content 'Make a Recording'
should have_selector ( 'h1' , text : 'recording finished' )
end
def check_recording_finished_for ( users = [ ] )
users . each do | user |
in_client ( user ) do
assert_recording_finished
end
end
end
def claim_recording ( name , description )
find ( '#recording-finished-dialog h1' )
fill_in " claim-recording-name " , with : name
fill_in " claim-recording-description " , with : description
find ( '#keep-session-recording' ) . trigger ( :click )
should have_no_selector ( 'h1' , text : 'recording finished' )
end
2013-11-12 04:57:04 +00:00
2013-12-14 23:53:18 +00:00
def set_session_as_private ( )
find ( '#session-settings-button' ) . trigger ( :click )
within ( '#session-settings-dialog' ) do
2013-11-12 04:57:04 +00:00
select ( 'Private' , :from = > 'session-settings-musician-access' )
find ( '#session-settings-dialog-submit' ) . trigger ( :click )
end
end
2013-12-14 23:53:18 +00:00
def set_session_as_public ( )
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 )
2013-11-12 04:57:04 +00:00
end
2013-11-13 06:58:28 +00:00
end
2013-12-14 23:53:18 +00:00
def get_options ( selector )
2014-02-10 22:43:09 +00:00
find ( selector , :visible = > false ) . all ( 'option' , :visible = > false ) . collect ( & :text ) . uniq
2013-12-14 23:53:18 +00:00
end
2014-01-05 02:42:05 +00:00
def selected_genres ( selector = '#session-settings-genre' )
2014-02-10 22:43:09 +00:00
page . evaluate_script ( " JK.GenreSelectorHelper.getSelectedGenres(' #{ selector } ') " )
2014-01-05 02:42:05 +00:00
end
def random_genre
[ 'African' ,
'Ambient' ,
'Asian' ,
'Blues' ,
'Classical' ,
'Country' ,
'Electronic' ,
'Folk' ,
'Hip Hop' ,
'Jazz' ,
'Latin' ,
'Metal' ,
'Pop' ,
'R&B' ,
'Reggae' ,
'Religious' ,
'Rock' ,
'Ska' ,
'Other' ] . sample
2013-12-14 23:53:18 +00:00
end
def change_session_genre #randomly just change it
here = 'select.genre-list'
#wait_for_ajax
find ( '#session-settings-button' ) . trigger ( :click )
within ( '#session-settings-dialog' ) do
wait_for_ajax
@new_genre = get_options ( here ) . - ( [ " Select Genre " ] ) . - ( selected_genres ) . sample . to_s
2014-02-10 22:43:09 +00:00
jk_select ( @new_genre , '#session-settings-dialog select[name="genres"]' )
2013-12-14 23:53:18 +00:00
wait_for_ajax
find ( '#session-settings-dialog-submit' ) . trigger ( :click )
end
return @new_genre
end
def get_session_genre
here = 'select.genre-list'
find ( '#session-settings-button' ) . trigger ( :click )
wait_for_ajax
@current_genres = selected_genres
find ( '#session-settings-dialog-submit' ) . trigger ( :click )
return @current_genres . join ( " " )
end
def find_session_contains? ( text )
visit " /client # /findSession "
wait_for_ajax
within ( '#find-session-form' ) do
expect ( page ) . to have_text ( text )
end
end
2013-11-13 06:58:28 +00:00
def assert_all_tracks_seen ( users = [ ] )
users . each do | user |
in_client ( user ) do
users . reject { | u | u == user } . each do | other |
2014-02-24 21:49:38 +00:00
find ( 'div.track-label' , text : other . name )
2013-11-13 06:58:28 +00:00
#puts user.name + " is able to see " + other.name + "\'s track"
end
end
end
2014-01-05 02:42:05 +00:00
end
def show_user_menu
page . execute_script ( " $('ul.shortcuts').show() " )
#page.execute_script("JK.UserDropdown.menuHoverIn()")
2014-02-10 22:43:09 +00:00
end
# wait for the easydropdown version of the specified select element to become visible
def wait_for_easydropdown ( select )
find ( select , :visible = > false ) . find ( :xpath , 'ancestor::div[contains(@class, "dropdown easydropdown")]' )
2013-10-21 22:13:53 +00:00
end