diff --git a/runweb b/runweb index 459c28606..8bb4a626d 100755 --- a/runweb +++ b/runweb @@ -1,5 +1,6 @@ #!/bin/bash pushd web +# run jam-web rails server bundle exec rails s popd diff --git a/web/spec/features/in_session_spec.rb b/web/spec/features/in_session_spec.rb index f6341ce3a..9bd595f2d 100644 --- a/web/spec/features/in_session_spec.rb +++ b/web/spec/features/in_session_spec.rb @@ -71,17 +71,6 @@ describe "In a Session", :js => true, :type => :feature, :capybara_feature => tr #in_client(others[0]) {page.save_screenshot('tmp/partys_all_here_now.png')} end - it "a user can change the genre and the change will be seen by another participant" do - pending "...it doesn't work this way, but i will reuse this pattern" - create_join_session(user, [finder]) - in_client(user) do - @new_genre = change_session_genre - end - in_client(finder) do - expect(get_session_genre).to include(@new_genre) - end - end - it "a user can change the genre and the Find Session screen will be updated" do create_session(user) in_client(finder) { sign_in_poltergeist finder } @@ -94,5 +83,4 @@ describe "In a Session", :js => true, :type => :feature, :capybara_feature => tr end end end - end diff --git a/web/spec/features/recordings_spec.rb b/web/spec/features/recordings_spec.rb index 54845f0be..c28ef056a 100644 --- a/web/spec/features/recordings_spec.rb +++ b/web/spec/features/recordings_spec.rb @@ -12,6 +12,7 @@ describe "Session Recordings", :js => true, :type => :feature, :capybara_feature let(:creator) { FactoryGirl.create(:user) } let(:joiner1) { FactoryGirl.create(:user) } + let(:some_genre) { random_genre } before(:each) do MusicSession.delete_all @@ -19,96 +20,37 @@ describe "Session Recordings", :js => true, :type => :feature, :capybara_feature # creates a recording, and stops it, and confirms the 'Finished Recording' dialog shows for both it "creator start/stop" do - create_join_session(creator, [joiner1]) + start_recording_with(creator, [joiner1]) - in_client(creator) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Stop Recording' - end + in_client(creator) { stop_recording } - in_client(joiner1) do - find('#notification').should have_content 'started a recording' - find('#recording-status').should have_content 'Stop Recording' - end - - in_client(creator) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') - end - - in_client(joiner1) do - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') - end + check_recording_finished_for([creator, joiner1]) end # confirms that anyone can start/stop a recording it "creator starts and other stops" do - create_join_session(creator, [joiner1]) + start_recording_with(creator, [joiner1]) - in_client(creator) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Stop Recording' - end + in_client(joiner1) { stop_recording } - in_client(joiner1) do - find('#notification').should have_content 'started a recording' - find('#recording-status').should have_content 'Stop Recording' - end - - in_client(joiner1) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') - end - - in_client(creator) do - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') - end + check_recording_finished_for([creator, joiner1]) end # confirms that a formal leave (by hitting the 'Leave' button) will result in a good recording it "creator starts and then leaves" do - create_join_session(creator, [joiner1]) - - in_client(creator) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Stop Recording' - end - - in_client(joiner1) do - find('#notification').should have_content 'started a recording' - find('#recording-status').should have_content 'Stop Recording' - end + start_recording_with(creator, [joiner1]) in_client(creator) do find('#session-leave').trigger(:click) expect(page).to have_selector('h2', text: 'feed') - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') end - in_client(joiner1) do - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') - end + check_recording_finished_for [creator, joiner1] end # confirms that if someone leaves 'ugly' (without calling 'Leave' REST API), that the recording is junked it "creator starts and then abruptly leave" do - create_join_session(creator, [joiner1]) - - in_client(creator) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Stop Recording' - end - - in_client(joiner1) do - find('#notification').should have_content 'started a recording' - find('#recording-status').should have_content 'Stop Recording' - end + start_recording_with(creator, [joiner1]) in_client(creator) do visit "/downloads" # kills websocket, looking like an abrupt leave @@ -124,91 +66,32 @@ describe "Session Recordings", :js => true, :type => :feature, :capybara_feature it "creator starts/stops, with 3 total participants" do joiner2 = FactoryGirl.create(:user) - create_join_session(creator, [joiner1, joiner2]) + start_recording_with(creator, [joiner1, joiner2]) in_client(creator) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Stop Recording' + stop_recording end - in_client(joiner1) do - find('#recording-status').should have_content 'Stop Recording' - end - - in_client(joiner2) do - find('#recording-status').should have_content 'Stop Recording' - end - - in_client(creator) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') - end - - in_client(joiner1) do - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') - end - - in_client(joiner2) do - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') - end + check_recording_finished_for [creator, joiner1, joiner2] end it "creator starts with session leave to stop, with 3 total participants" do joiner2 = FactoryGirl.create(:user) - create_join_session(creator, [joiner1, joiner2]) - - in_client(creator) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Stop Recording' - end - - in_client(joiner1) do - find('#recording-status').should have_content 'Stop Recording' - end - - in_client(joiner2) do - find('#recording-status').should have_content 'Stop Recording' - end + start_recording_with(creator, [joiner1, joiner2]) in_client(creator) do find('#session-leave').trigger(:click) expect(page).to have_selector('h2', text: 'feed') - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') end - in_client(joiner1) do - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') - end - - in_client(joiner2) do - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') - end + check_recording_finished_for [creator, joiner1, joiner2] end # confirms that if someone leaves 'ugly' (without calling 'Leave' REST API), that the recording is junked with 3 participants it "creator starts and then abruptly leave with 3 participants" do joiner2 = FactoryGirl.create(:user) - create_join_session(creator, [joiner1, joiner2]) - - in_client(creator) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Stop Recording' - end - - in_client(joiner1) do - find('#recording-status').should have_content 'Stop Recording' - end - - in_client(joiner2) do - find('#recording-status').should have_content 'Stop Recording' - end + start_recording_with(creator, [joiner1, joiner2]) in_client(creator) do visit "/downloads" # kills websocket, looking like an abrupt leave @@ -234,23 +117,14 @@ describe "Session Recordings", :js => true, :type => :feature, :capybara_feature RecordedTrack.delete_all ClaimedRecording.delete_all - create_join_session(creator, [joiner1]) - - in_client(creator) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Stop Recording' - end + start_recording_with(creator, [joiner1], some_genre) in_client(joiner1) do - find('#notification').should have_content 'started a recording' - find('#recording-status').should have_content 'Stop Recording' + stop_recording end - in_client(creator) do - find('#recording-start-stop').trigger(:click) - find('#recording-status').should have_content 'Make a Recording' - should have_selector('h1', text: 'recording finished') - end + @users = [creator, joiner1] + check_recording_finished_for @users end it "discard the recording" do @@ -277,43 +151,64 @@ describe "Session Recordings", :js => true, :type => :feature, :capybara_feature end end - it "claim recording" do - in_client(creator) do - find('#recording-finished-dialog h1') - fill_in "claim-recording-name", with: "my recording" - fill_in "claim-recording-description", with: "my description" - find('#keep-session-recording').trigger(:click) - should have_no_selector('h1', text: 'recording finished') + it "claim recording with unique names/descriptions" do + @users.each do |user| + name = "#{user.name}'s recording" + desc = "#{user.name}'s description" - music_session = MusicSession.first() - recording = music_session.recordings.first() - claimed_recording = ClaimedRecording.find_by_user_id(creator.id) - claimed_recording.name.should == "my recording" - claimed_recording.description.should == "my description" - claimed_recording.is_public.should be_true - claimed_recording.is_downloadable.should be_true - claimed_recording.genre = music_session.genres[0] - - end - - in_client(joiner1) do - find('#recording-finished-dialog h1') - fill_in "claim-recording-name", with: "my recording" - fill_in "claim-recording-description", with: "my description" - find('#keep-session-recording').trigger(:click) - should have_no_selector('h1', text: 'recording finished') - - music_session = MusicSession.first() - recording = music_session.recordings.first() - claimed_recording = ClaimedRecording.find_by_user_id(joiner1.id) - claimed_recording.name.should == "my recording" - claimed_recording.description.should == "my description" - claimed_recording.is_public.should be_true - claimed_recording.is_downloadable.should be_true - claimed_recording.genre = music_session.genres[0] + in_client(user) do + claim_recording(name, desc) + music_session = MusicSession.first() + recording = music_session.recordings.first() + claimed_recording = ClaimedRecording.find_by_user_id(user.id) + claimed_recording.name.should == name + claimed_recording.description.should == desc + claimed_recording.is_public.should be_true + claimed_recording.is_downloadable.should be_true + claimed_recording.genre = music_session.genres[0] + end end end + it "a 'Recording Name' is required" do + @users.each do |user| + in_client(user) do + find('#recording-finished-dialog h1') + fill_in "claim-recording-name", with: '' + fill_in "claim-recording-description", with: "my description" + find('#keep-session-recording').trigger(:click) + should have_content("can't be blank") + save_screenshot("tmp/name#{user.name}.png") + end + end + end + + it "a 'Description' is optional" do + @users.each do |user| + in_client(user) do + claim_recording("my recording", '') + music_session = MusicSession.first() + recording = music_session.recordings.first() + claimed_recording = ClaimedRecording.find_by_user_id(user.id) + claimed_recording.name.should == "my recording" + claimed_recording.description.should == '' + claimed_recording.is_public.should be_true + claimed_recording.is_downloadable.should be_true + claimed_recording.genre = music_session.genres[0] + end + end + end + + it "genre is pre-set with the genre selected for the session" do + @users.each do |user| + in_client(user) do + find('#recording-finished-dialog h1') + g = selected_genres('#recording-finished-dialog div.genre-selector') + expect(some_genre).to match(%r{#{g}}i) + end + end + end end end + diff --git a/web/spec/spec_helper.rb b/web/spec/spec_helper.rb index 3e637b07e..968e32400 100644 --- a/web/spec/spec_helper.rb +++ b/web/spec/spec_helper.rb @@ -96,16 +96,25 @@ Spork.prefork do config.include Requests::JsonHelpers, type: :request config.include Requests::FeatureHelpers, type: :feature + config.include Snapshot config.before(:suite) do end + config.before(:all) do + set_up_snapshot + end + config.before(:each) do if example.metadata[:js] page.driver.resize(1920, 1080) page.driver.headers = { 'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0' } end + + if example.metadata[:snap] + snapshot_example + end end config.before(:each, :js => true) do @@ -133,6 +142,10 @@ Spork.prefork do puts "response.status = #{response.status}, response.body = " + response.body end end + + config.after(:all) do + tear_down_snapshot + end end end diff --git a/web/spec/support/snapshot.rb b/web/spec/support/snapshot.rb new file mode 100644 index 000000000..50ff51b4c --- /dev/null +++ b/web/spec/support/snapshot.rb @@ -0,0 +1,28 @@ +module Snapshot + + def set_up_snapshot(filepath = 'tmp/snapshots.html') + @size = [1280, 720] #arbitrary + @file = File.new(filepath, "w+") + @file.puts "" + @file.puts "

Snapshot #{ENV["BUILD_NUMBER"]} - #{@size[0]}x#{@size[1]}

" + end + + def snapshot_example + page.driver.resize(@size[0], @size[1]) + @file.puts "

Example name: #{get_description}



" + end + + def snap!(title = get_description) + base64 = page.driver.render_base64(:png) + @file.puts '

' + title + '

' + @file.puts '' + title +'' + @file.puts '


' + end + + def tear_down_snapshot + @file.puts "" + @file.close() + end + +end + diff --git a/web/spec/support/utilities.rb b/web/spec/support/utilities.rb index 10f37a345..c8a076009 100644 --- a/web/spec/support/utilities.rb +++ b/web/spec/support/utilities.rb @@ -115,9 +115,20 @@ def determine_test_name(metadata, test_name_buffer = '') end end +def get_description + description = example.metadata[:description_args] + if description.kind_of?(Array) + description = description[0] + end + return description +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}") +def create_session(creator = FactoryGirl.create(:user), unique_session_desc = nil, genre = nil) + unique_session_desc ||= "create_join_session #{SecureRandom.urlsafe_base64}" + genre ||= 'Rock' # create session in one client in_client(creator) do @@ -129,7 +140,7 @@ def create_session(creator = FactoryGirl.create(:user), unique_session_desc = "c within('#create-session-form') do fill_in('description', :with => unique_session_desc) - select('Rock', :from => 'genres') + select(genre, :from => 'genres') find('div.intellectual-property ins').trigger(:click) find('#btn-create-session').trigger(:click) # fails if page width is low end @@ -138,7 +149,7 @@ def create_session(creator = FactoryGirl.create(:user), unique_session_desc = "c expect(page).to have_selector('h2', text: 'my tracks') end - return creator, unique_session_desc + return creator, unique_session_desc, genre end @@ -161,8 +172,8 @@ def join_session(joiner, unique_session_desc) end -def create_join_session(creator, joiners=[]) - creator, unique_session_desc = create_session(creator) +def create_join_session(creator, joiners=[], genre=nil) + creator, unique_session_desc = create_session(creator, nil, genre) # find session in second client joiners.each do |joiner| @@ -170,6 +181,44 @@ def create_join_session(creator, joiners=[]) end end +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 def set_session_as_private() find('#session-settings-button').trigger(:click) @@ -191,8 +240,30 @@ def get_options(selector) return find(selector).all('option').collect(&:text).uniq end -def selected_genres - return page.evaluate_script("JK.GenreSelectorHelper.getSelectedGenres('#session-settings-genre')") +def selected_genres(selector='#session-settings-genre') + return page.evaluate_script("JK.GenreSelectorHelper.getSelectedGenres('#{selector}')") +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 end def change_session_genre #randomly just change it @@ -235,4 +306,9 @@ def assert_all_tracks_seen(users=[]) end end end +end + +def show_user_menu + page.execute_script("$('ul.shortcuts').show()") + #page.execute_script("JK.UserDropdown.menuHoverIn()") end \ No newline at end of file