From 45a48daae08ff7054779ac81446a3813dd71ae86 Mon Sep 17 00:00:00 2001 From: Jonathan Kolyer Date: Sun, 27 Jul 2014 23:39:11 +0000 Subject: [PATCH 1/3] VRFS-1939 VRFS-1936 fixed session and scheduled musician invite dialog --- .../assets/javascripts/accounts_session_detail.js | 13 ++++++++++++- web/app/assets/javascripts/inviteMusicians.js | 4 +++- web/app/assets/javascripts/session.js | 9 ++++++++- .../views/clients/_account_session_detail.html.haml | 4 ++-- web/app/views/clients/_session.html.erb | 2 +- 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/web/app/assets/javascripts/accounts_session_detail.js b/web/app/assets/javascripts/accounts_session_detail.js index 76f9b2401..a148f4241 100644 --- a/web/app/assets/javascripts/accounts_session_detail.js +++ b/web/app/assets/javascripts/accounts_session_detail.js @@ -21,6 +21,8 @@ var $templateOpenSlots = null; var instrument_logo_map = context.JK.getInstrumentIconMap24(); var invitationDialog = null; + var inviteMusiciansUtil = null; + var friendInput=null; var LATENCY = { @@ -42,7 +44,11 @@ function inviteMusicians(e) { e.preventDefault(); - invitationDialog.showEmailDialog(); + friendInput = inviteMusiciansUtil.inviteSessionUpdate('#update-session-invite-musicians', + sessionId); + inviteMusiciansUtil.loadFriends(); + $(friendInput).show(); + // invitationDialog.showEmailDialog(); } function cancelRsvpRequest(e) { @@ -120,6 +126,7 @@ $sessionPageBtn.on('click', openSessionPage); $screen.find(".approveRsvpRequest").on('click', approveRsvpRequest); $screen.find(".declineRsvpRequest").on('click', declineRsvpRequest); + $(friendInput).focus(function() { $(this).val(''); }) $screen.find(".cancelSessionRsvp").on('click', function(e) { e.preventDefault(); @@ -393,6 +400,10 @@ $sessionDetail = $screen.find("#account-session-detail-div"); $shareUrl = $screen.find('.share-url'); invitationDialog = invitationDlg; + + inviteMusiciansUtil = new JK.InviteMusiciansUtil(JK.app); + inviteMusiciansUtil.initialize(JK.FriendSelectorDialogInstance); + $templateOpenSlots = $('#template-open-slots'); } diff --git a/web/app/assets/javascripts/inviteMusicians.js b/web/app/assets/javascripts/inviteMusicians.js index 604641e1d..60d60b067 100644 --- a/web/app/assets/javascripts/inviteMusicians.js +++ b/web/app/assets/javascripts/inviteMusicians.js @@ -59,6 +59,8 @@ addInvitation(dd.name, dd.id); }); }).fail(app.ajaxError); + + return friendInput; } this.clearSelections = function() { @@ -133,7 +135,7 @@ } else { $(friendInput).select(); - context.alert('Invitation already exists for this musician.'); + // context.alert('Invitation already exists for this musician.'); } } diff --git a/web/app/assets/javascripts/session.js b/web/app/assets/javascripts/session.js index 323a0ee84..25a5e0915 100644 --- a/web/app/assets/javascripts/session.js +++ b/web/app/assets/javascripts/session.js @@ -32,6 +32,7 @@ var playbackControls = null; var promptLeave = false; var rateSessionDialog = null; + var friendInput=null; var rest = context.JK.Rest(); @@ -133,6 +134,7 @@ .done(function(){ initializeSession(); }) + } function notifyWithUserInfo(title , text, clientId) { @@ -1354,7 +1356,10 @@ } function inviteMusicians() { - inviteMusiciansUtil.inviteSessionUpdate('#update-session-invite-musicians', sessionId); + friendInput = inviteMusiciansUtil.inviteSessionUpdate('#update-session-invite-musicians', + sessionId); + inviteMusiciansUtil.loadFriends(); + $(friendInput).show(); } function events() { @@ -1365,6 +1370,7 @@ $('#recording-start-stop').on('click', startStopRecording); $('#open-a-recording').on('click', openRecording); $('#session-invite-musicians').on('click', inviteMusicians); + $('#session-invite-musicians2').on('click', inviteMusicians); $('#track-settings').click(function() { configureTrackDialog.refresh(); configureTrackDialog.showVoiceChatPanel(true); @@ -1376,6 +1382,7 @@ .on('pause', onPause) .on('play', onPlay) .on('change-position', onChangePlayPosition); + $(friendInput).focus(function() { $(this).val(''); }) } this.initialize = function(localRecordingsDialogInstance, recordingFinishedDialogInstance, friendSelectorDialog) { diff --git a/web/app/views/clients/_account_session_detail.html.haml b/web/app/views/clients/_account_session_detail.html.haml index 6f14962e8..4d6ee95c0 100644 --- a/web/app/views/clients/_account_session_detail.html.haml +++ b/web/app/views/clients/_account_session_detail.html.haml @@ -16,7 +16,7 @@ .right %a.cancel-rsvp.button-orange{href: "#"} CANCEL RSVP %a.session-detail-page.button-orange{href: "#", rel:'external'} SESSION PAGE - %a.invite-others.button-orange{href: "#"} INVITE OTHERS + %a.invite-others.button-orange{'layout-link' => 'select-invites','href' => "#"} INVITE OTHERS .clearall #account-session-detail-div @@ -160,4 +160,4 @@ %script{type: 'text/template', id: 'template-account-session-latency'} .latency{class: "{{data.latency_style}}"} - {{data.latency_text}} \ No newline at end of file + {{data.latency_text}} diff --git a/web/app/views/clients/_session.html.erb b/web/app/views/clients/_session.html.erb index 04cdd236d..6865d987f 100644 --- a/web/app/views/clients/_session.html.erb +++ b/web/app/views/clients/_session.html.erb @@ -78,7 +78,7 @@

No Live Tracks:
- Invite Other Musicians to
+ Invite Other Musicians to
Add Live Tracks

From c28e932c2d840c7f8aa9c170a988308f46f3274c Mon Sep 17 00:00:00 2001 From: Anthony Davis Date: Mon, 28 Jul 2014 21:14:09 -0500 Subject: [PATCH 2/3] VRFS-1933 - integration tests for all ways of creating a session - might fail on Jenkins --- web/spec/features/create_session_flow_spec.rb | 49 +--- web/spec/features/create_session_spec.rb | 231 ++++++++++++++++++ web/spec/support/utilities.rb | 45 ++-- 3 files changed, 264 insertions(+), 61 deletions(-) create mode 100644 web/spec/features/create_session_spec.rb diff --git a/web/spec/features/create_session_flow_spec.rb b/web/spec/features/create_session_flow_spec.rb index f8e672f0e..d61b9f213 100644 --- a/web/spec/features/create_session_flow_spec.rb +++ b/web/spec/features/create_session_flow_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe "Create Session Flow", :js => true, :type => :feature, :capybara_feature => true do +describe "Create Session UI", :js => true, :type => :feature, :capybara_feature => true do let(:user1) { FactoryGirl.create(:user) } let(:user2) { FactoryGirl.create(:user) } @@ -13,8 +13,7 @@ describe "Create Session Flow", :js => true, :type => :feature, :capybara_featur page.driver.resize(1500, 800) # makes sure all the elements are visible emulate_client sign_in_poltergeist user1 - wait_until_curtain_gone - visit "/client#/createSession" + page.find('.createsession').trigger(:click) end end @@ -211,48 +210,4 @@ describe "Create Session Flow", :js => true, :type => :feature, :capybara_featur end end end - - context "create session flow backend" do - describe "schedule a session" do - it "schedule a session" do - schedule_session({creator: user1}) - end - - it "start a session after scheduling" do - MusicSession.delete_all - - schedule_session({creator: user1}) - - in_client(user1) do - visit "/client#/createSession" - - find('li[create-type="start-scheduled"] ins').trigger(:click) - - find('.btn-next').trigger(:click) - find('.btn-next').trigger(:click) - - expect(page).to have_selector('h2', text: 'my tracks') - find('#session-screen .session-mytracks .session-track') - end - end - end - - it "start quick session" do - page.driver.resize(1500, 800) # makes sure all the elements are visible - emulate_client - sign_in_poltergeist user1 - wait_until_curtain_gone - visit "/client#/createSession" - expect(page).to have_selector('h1', text: 'create session') - - find('li[create-type="quick-start"] ins').trigger(:click) - find('div[info-id="quick-start"]') - - find('.btn-next').trigger(:click) - find('.btn-next', text: 'START SESSION').trigger(:click) - - expect(page).to have_selector('h2', text: 'my tracks') - find('#session-screen .session-mytracks .session-track') - end - end end \ No newline at end of file diff --git a/web/spec/features/create_session_spec.rb b/web/spec/features/create_session_spec.rb new file mode 100644 index 000000000..85a839916 --- /dev/null +++ b/web/spec/features/create_session_spec.rb @@ -0,0 +1,231 @@ +require 'spec_helper' + +describe "Create Session", :js => true, :type => :feature, :capybara_feature => true do + let(:user1) { FactoryGirl.create(:user) } + let(:user2) { FactoryGirl.create(:user) } + + context "functionally test all ways to Create Session" do + + context "I have already scheduled a session..." do + let (:now) { Time.now - 5.hours } + let (:first_session) { FactoryGirl.create(:music_session, creator: user1, name: "First one", scheduled_start: now + 5.minutes) } + let (:second_session) { FactoryGirl.create(:music_session, creator: user1, name: "Second one", scheduled_start: now + 2.hours) } + let (:third_session) { FactoryGirl.create(:music_session, creator: user1, name: "Third one", scheduled_start: now + 17.days) } + let (:not_my_session) { FactoryGirl.create(:music_session, creator: user2, name: "Who cares", scheduled_start: now + 30.minutes) } + + before do + #instantiate these test sessions in non-sequential order + third_session.touch; first_session.touch; not_my_session.touch; second_session.touch; + #[first_session, second_session, third_session, not_my_session].each { |s| puts "#{s.name}: #{s.id}" } + + emulate_client + page.driver.resize(1500, 800) #purely aesthetic + sign_in_poltergeist user1 + find('.createsession').trigger(:click) + wait_for_ajax + expect(page).to have_selector 'li[create-type="start-scheduled"] ins' + end + + it "sessions are shown in schedule order on the Create Session screen" do + sleep 2 #arg + radio_buttons = page.all('ul#scheduled-session-list li') + first, second, third = *radio_buttons[0..2] + expect(first.text).to include first_session.name + expect(second.text).to include second_session.name + expect(third.text).to include third_session.name + expect(first).to have_selector 'input[checked=checked]' + expect(page).to_not have_text not_my_session.name + end + + it "future sessions can be edited from the Create Session screen" do + #pending "possible bug, does not occur when testing manually" + page.find('a#edit_scheduled_sessions').trigger(:click) + #expect(page).to have_selector "div[data-id='#{first_session.id}']" #see pending note + expect(page).to have_selector "div[data-id='#{second_session.id}']" + expect(page).to have_selector "div[data-id='#{third_session.id}']" + expect(page).to_not have_selector "div[data-id='#{not_my_session.id}']" + end + + context "...and I want to start it now" do + it "starts the first one" do + sleep 1 + find('.btn-next').trigger(:click) + sleep 1 + expect(page).to have_selector('.session-step-title', text: 'Review & Confirm') + expect(page).to have_content first_session.name + find('.btn-next').trigger(:click) + expect(page).to have_selector('h2', text: 'my tracks') + find('#session-screen .session-mytracks .session-track') + end + + context "attempt to start a session more than an hour from now" do + let (:first_session) { FactoryGirl.create(:music_session, creator: user1, scheduled_start: now + 65.minutes) } + + it "warns the user that session starts in the future, and user can start session" do + sleep 1 + find('.btn-next').trigger(:click) + sleep 1 + expect(page).to have_selector('h1', text: 'Future Session') + expect(page).to have_content "Are you sure" + find('#btn-confirm-ok', text: 'Start Session Now').trigger(:click) + sleep 1 + expect(page).to have_selector('.session-step-title', text: 'Review & Confirm') + expect(page).to have_content first_session.name + find('.btn-next').trigger(:click) + expect(page).to have_selector('h2', text: 'my tracks') + find('#session-screen .session-mytracks .session-track') + end + end + end + end + + + shared_examples_for :a_future_session do + specify "creator can see the session on Create Session page" do + in_client(creator) do + page.find('.createsession').trigger(:click) + expect(page).to have_selector('h1', text: 'create session') + sessions = page.first('ul#scheduled-session-list li') + expect(sessions.text).to include session_name + end + end + + specify "creator can see the session on Find Session page" do + in_client(creator) do + visit "/client#/findSession" + wait_until_curtain_gone + expect(page).to have_selector('#session-name-disp', text: "#{session_name} (#{session_genre})") + #expect(page).to have_selector('#session-name-disp', text: @session_genre) + end + end + + specify "another user can see the session on Find Session page" do + in_client(someone_else) do + emulate_client + page.driver.resize(1500, 800) + sign_in_poltergeist someone_else + visit "/client#/findSession" + wait_until_curtain_gone + expect(find('table#sessions-scheduled')).to have_content session_name + expect(find('table#sessions-scheduled')).to have_content session_genre + end + end + + specify "another user can RSVP to the session" do + in_client(someone_else) do + emulate_client + page.driver.resize(1500, 800) + sign_in_poltergeist someone_else + visit "/client#/findSession" + wait_until_curtain_gone + + within('table#sessions-scheduled') do + find('a.rsvp-link').trigger(:click) + end + + within('div.dialog-inner') do + find('div.session-name').should have_content session_name + find('div.slot-instructions').should have_content "Check the box(es) next to the track(s) you want to play" + # fill_in '.txtComment', with: "Looking forward to the session" + #first('div.rsvp-instruments input').trigger(:click) + sleep 1 + find('#btnSubmitRsvp').trigger(:click) + sleep 2 + end + end + end + + specify "creator can start the session" do + in_client(creator) do + page.find('.createsession').trigger(:click) + expect(page).to have_selector('h1', text: 'create session') + expect(page).to have_content session_name + find('li[create-type="start-scheduled"] ins').trigger(:click) + find('.btn-next').trigger(:click) + find('.btn-next').trigger(:click) + expect(page).to have_selector('h2', text: 'my tracks') + find('#session-screen .session-mytracks .session-track') + end + end + end + + context "I want to schedule a session for a specific future time" do + before do + MusicSession.delete_all + @creator, @session_name, @session_genre = schedule_session(creator: user1) + end + + it_should_behave_like :a_future_session do + let(:creator) { @creator } + let(:session_name) { @session_name } + let(:session_genre) { @session_genre } + let(:someone_else) { FactoryGirl.create(:user) } + end + end + + context "I want to choose the time after others RSVP to my session" do + before do + MusicSession.delete_all + @creator, @session_name, @session_genre = schedule_session(creator: user1, rsvp: true) + end + + it_should_behave_like :a_future_session do + let(:creator) { @creator } + let(:session_name) { @session_name } + let(:session_genre) { @session_genre } + let(:someone_else) { FactoryGirl.create(:user) } + end + end + + context "I want to start a new session right now for others to join" do + before do + MusicSession.delete_all + @creator, @session_name, @session_genre = schedule_session(creator: user1, immediate: true) + end + + specify "creator is in the session" do + in_client @creator do + expect(page).to have_selector('h2', text: 'my tracks') + find('#session-screen .session-mytracks .session-track') + end + end + + specify "another user can see the session on Find Session page" do + in_client(user2) do + emulate_client + page.driver.resize(1500, 800) + sign_in_poltergeist user2 + visit "/client#/findSession" + wait_until_curtain_gone + expect(find('table#sessions-scheduled')).to have_content @session_name + expect(find('table#sessions-scheduled')).to have_content @session_genre + end + end + end + + context "I want to quick start a test session just for me" do + before do + MusicSession.delete_all + @creator, @session_name, @session_genre = schedule_session(creator: user1, quickstart: true) + end + + specify "creator is in the session" do + in_client @creator do + expect(page).to have_selector('h2', text: 'my tracks') + find('#session-screen .session-mytracks .session-track') + end + end + + specify "another user does NOT see the session on Find Session page" do + in_client(user2) do + emulate_client + page.driver.resize(1500, 800) + sign_in_poltergeist user2 + visit "/client#/findSession" + wait_until_curtain_gone + expect(find('table#sessions-scheduled')).to_not have_content @session_name + end + end + end + end +end \ No newline at end of file diff --git a/web/spec/support/utilities.rb b/web/spec/support/utilities.rb index 3fa667adb..27b50ad35 100644 --- a/web/spec/support/utilities.rb +++ b/web/spec/support/utilities.rb @@ -335,6 +335,9 @@ def schedule_session(options = {}) fan_chat = options[:fan_chat].nil? ? false : options[:fan_chat] musician_access_value = 'Musicians may join by approval' fan_permission_value = 'Fans may listen, chat with each other' + rsvp = options[:rsvp] + immediate = options[:immediate] + quickstart = options[:quickstart] if musician_access && !approval_required musician_access_value = 'Musicians may join at will' @@ -356,26 +359,40 @@ def schedule_session(options = {}) expect(page).to have_selector('h1', text: 'create session') within('#create-session-form') do - - find('li[create-type="schedule-future"] ins').trigger(:click) - find('.btn-next').trigger(:click) - - jk_select(genre, '#create-session-form select[name="genres"]') - fill_in('session-name', :with => unique_session_name) - fill_in('session-description', :with => unique_session_desc) - find('.btn-next').trigger(:click) + if rsvp + find('li[create-type="rsvp"] ins').trigger(:click) + elsif immediate + find('li[create-type="immediately"] ins').trigger(:click) + elsif quickstart + find('li[create-type="quick-start"] ins').trigger(:click) + else + find('li[create-type="schedule-future"] ins').trigger(:click) + end find('.btn-next').trigger(:click) - find('div#divSessionPolicy ins').trigger(:click) - jk_select(musician_access_value, '#session-musician-access') - jk_select(fan_permission_value, '#session-fans-access') - find('.btn-next').trigger(:click) + unless quickstart + jk_select(genre, '#create-session-form select[name="genres"]') + fill_in('session-name', :with => unique_session_name) + fill_in('session-description', :with => unique_session_desc) + find('.btn-next').trigger(:click) - find('.btn-next', text: 'PUBLISH SESSION').trigger(:click) + find('.btn-next').trigger(:click) + + find('div#divSessionPolicy ins').trigger(:click) + jk_select(musician_access_value, '#session-musician-access') + jk_select(fan_permission_value, '#session-fans-access') + find('.btn-next').trigger(:click) + end + + unless quickstart || immediate + find('.btn-next', text: 'PUBLISH SESSION').trigger(:click) + else + find('.btn-next', text: 'START SESSION').trigger(:click) + end end - find('h2', text: 'create session') + # find('h2', text: 'create session') unless quickstart || immediate sleep 1 # to get rid of this, we need to verify that the URL is /client#/home.. otherwise intermittent fails end From 313616507673e2994d42184cc196b39cd5cc8064 Mon Sep 17 00:00:00 2001 From: Anthony Davis Date: Mon, 28 Jul 2014 22:04:19 -0500 Subject: [PATCH 3/3] VRFS-1933 - fixing Jenkins failures --- web/spec/features/create_session_spec.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/web/spec/features/create_session_spec.rb b/web/spec/features/create_session_spec.rb index 85a839916..4772aa869 100644 --- a/web/spec/features/create_session_spec.rb +++ b/web/spec/features/create_session_spec.rb @@ -46,7 +46,7 @@ describe "Create Session", :js => true, :type => :feature, :capybara_feature => expect(page).to_not have_selector "div[data-id='#{not_my_session.id}']" end - context "...and I want to start it now" do + context "...start it now" do it "starts the first one" do sleep 1 find('.btn-next').trigger(:click) @@ -59,12 +59,12 @@ describe "Create Session", :js => true, :type => :feature, :capybara_feature => end context "attempt to start a session more than an hour from now" do - let (:first_session) { FactoryGirl.create(:music_session, creator: user1, scheduled_start: now + 65.minutes) } + let (:first_session) { FactoryGirl.create(:music_session, creator: user1, scheduled_start: now + 75.minutes) } it "warns the user that session starts in the future, and user can start session" do sleep 1 find('.btn-next').trigger(:click) - sleep 1 + sleep 2 expect(page).to have_selector('h1', text: 'Future Session') expect(page).to have_content "Are you sure" find('#btn-confirm-ok', text: 'Start Session Now').trigger(:click) @@ -190,15 +190,15 @@ describe "Create Session", :js => true, :type => :feature, :capybara_feature => end end - specify "another user can see the session on Find Session page" do + specify "another user can see this active session on Find Session page" do in_client(user2) do emulate_client page.driver.resize(1500, 800) sign_in_poltergeist user2 visit "/client#/findSession" wait_until_curtain_gone - expect(find('table#sessions-scheduled')).to have_content @session_name - expect(find('table#sessions-scheduled')).to have_content @session_genre + expect(find('table#sessions-active')).to have_content @session_name + expect(find('table#sessions-active')).to have_content @session_genre end end end