jam-cloud/web/spec/features/recordings_spec.rb

281 lines
9.5 KiB
Ruby

require 'spec_helper'
describe "Session Recordings", :js => true, :type => :feature, :capybara_feature => true, :slow => true do
subject { page }
before(:all) do
Capybara.javascript_driver = :poltergeist
Capybara.current_driver = Capybara.javascript_driver
Capybara.default_max_wait_time = 30 # these tests are SLOOOOOW
end
let(:creator) { FactoryGirl.create(:user) }
let(:joiner1) { FactoryGirl.create(:user) }
let(:joiner2) { FactoryGirl.create(:user) }
let(:some_genre) { random_genre }
before(:each) do
ActiveMusicSession.delete_all
end
# creates a recording, and stops it, and confirms the 'Finished Recording' dialog shows for both
it "creator start/stop", intermittent: true do
start_recording_with(creator, [joiner1])
in_client(creator) { stop_recording }
check_recording_finished_for([creator, joiner1])
end
# confirms that anyone can start/stop a recording
it "creator starts and other stops" do
pending "popup problems"
start_recording_with(creator, [joiner1])
in_client(joiner1) { stop_recording }
check_recording_finished_for([creator])
check_recording_finished_for([joiner1])
end
# confirms that a formal leave (by hitting the 'Leave' button) will result in a good recording
it "creator starts and then leaves", intermittent: true do
start_recording_with(creator, [joiner1])
in_client(creator) do
find('.session-leave.leave').trigger(:click)
expect(page).to have_selector('h2', text: 'feed')
end
formal_leave_by creator
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
pending "shows 'recording finished'"
start_recording_with(creator, [joiner1])
in_client(creator) do
visit "/request_reset_password" # kills websocket, looking like an abrupt leave
end
in_client(joiner1) do
find('#notification').should have_content 'Recording Discarded'
find('#notification').should have_content 'did not respond to the stop signal'
find('#recording-status').should have_content 'Make Recording'
end
end
it "creator starts/stops, with 3 total participants" do
start_recording_with(creator, [joiner1, joiner2])
in_client(creator) do
stop_recording
end
check_recording_finished_for [creator, joiner1, joiner2]
end
it "creator starts with session leave to stop, with 3 total participants" do
start_recording_with(creator, [joiner1, joiner2])
formal_leave_by creator
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
pending "shows 'recording finished'"
start_recording_with(creator, [joiner1, joiner2])
in_client(creator) do
visit "/request_reset_password" # kills websocket, looking like an abrupt leave
end
in_client(joiner1) do
find('#notification').should have_content 'Recording Discarded'
find('#notification').should have_content 'did not respond to the stop signal'
find('#recording-status').should have_content 'Make Recording'
end
in_client(joiner2) do
find('#notification').should have_content 'Recording Discarded'
find('#notification').should have_content 'did not respond to the stop signal'
find('#recording-status').should have_content 'Make Recording'
end
end
# POPUP PROBLEMS
=begin
describe "mixing after the recording" do
before(:each) do
RecordedTrack.delete_all
ClaimedRecording.delete_all
MusicSession.delete_all
ActiveMusicSession.delete_all
QuickMix.delete_all
start_recording_with(creator, [joiner1], some_genre)
in_client(joiner1) do
stop_recording
end
@users = [creator, joiner1]
check_recording_finished_for @users
@music_session = ActiveMusicSession.first()
@recording = @music_session.recordings.first()
@users.each do |user|
name = "#{user.name}'s recording"
desc = "#{user.name}'s description"
in_client(user) do
claim_recording(name, desc)
claimed_recording = @recording.claimed_recordings.where(:user_id => user.id).first
expect(claimed_recording.name).to eq(name)
expect(claimed_recording.description).to eq(desc)
expect(claimed_recording.is_public).to be true
expect(claimed_recording.genre).to eq(@music_session.genre)
end
end
end
it "notifications show" do
quick_mix = QuickMix.first
quick_mix.finish(100, 'abc') # should send out notifications to all people who claimed the recording
in_client(creator) do
find('#notification h2', text: 'Recording Stream Mix Complete')
find('#notification #buttons a', text: 'SHARE').trigger(:click)
end
in_client(joiner1) do
find('#notification h2', text: 'Recording Stream Mix Complete')
find('#notification #buttons a', text: 'SHARE').trigger(:click)
find('h1', text: 'share this recording')
find('.dialog-inner a.button-orange[layout-action="close"]', text: 'X CLOSE').trigger(:click)
open_notifications
notification = Notification.where(target_user_id: joiner1.id, recording_id: @recording.id).first!
find("li[notification-id='#{notification.id}'] a#btn-notification-action", text: 'SHARE').trigger(:click)
find('h1', text: 'share this recording')
find('.dialog-inner a.button-orange[layout-action="close"]', text: 'X CLOSE').trigger(:click)
end
end
end
# creates a recording, and stops it, and confirms the 'Finished Recording' dialog shows for both
describe "Finished Recording Dialog" do
before(:each) do
RecordedTrack.delete_all
ClaimedRecording.delete_all
MusicSession.delete_all
ActiveMusicSession.delete_all
QuickMix.delete_all
start_recording_with(creator, [joiner1], some_genre)
in_client(joiner1) do
stop_recording
end
@users = [creator, joiner1]
check_recording_finished_for @users
end
it "discard the recording" do
# pending "fails intermittently on the build server"
in_client(creator) do
find('#recording-finished-dialog h1')
find('#discard-session-recording').trigger(:click)
should have_no_selector('h1', text: 'recording finished')
music_session = ActiveMusicSession.first()
recording = music_session.recordings.first()
tracks = recording.recorded_tracks_for_user(creator)
tracks.length.should == 1
tracks[0].discard.should be true
end
in_client(joiner1) do
find('#recording-finished-dialog h1')
find('#discard-session-recording').trigger(:click)
should have_no_selector('h1', text: 'recording finished')
music_session = ActiveMusicSession.first()
recording = music_session.recordings.first()
tracks = recording.recorded_tracks_for_user(joiner1)
tracks.length.should == 1
tracks[0].discard.should be true
end
end
it "claim recording with unique names/descriptions" do
# pending "intermittent failure on build server, hard to repro on local system"
@users.each do |user|
name = "#{user.name}'s recording"
desc = "#{user.name}'s description"
in_client(user) do
claim_recording(name, desc)
music_session = ActiveMusicSession.first()
recording = music_session.recordings.first()
claimed_recording = recording.claimed_recordings.where(:user_id => user.id).first
expect(claimed_recording.name).to eq(name)
expect(claimed_recording.description).to eq(desc)
expect(claimed_recording.is_public).to be true
expect(claimed_recording.genre).to eq(music_session.genre)
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
# pending "intermittent failure on build server, hard to repro on local system"
@users.each do |user|
in_client(user) do
claim_recording("my recording", '')
music_session = ActiveMusicSession.first()
recording = music_session.recordings.first()
claimed_recording = recording.claimed_recordings.where(:user_id => user.id).first
expect(claimed_recording.name).to eq("my recording")
expect(claimed_recording.description).to eq('')
expect(claimed_recording.is_public).to be true
expect(claimed_recording.genre).to eq(music_session.genre)
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
end