Merge branch 'develop' of bitbucket.org:jamkazam/jam-cloud into develop

This commit is contained in:
Brian Smith 2014-01-05 08:26:29 -05:00
commit 5d2ef909ce
6 changed files with 199 additions and 198 deletions

1
runweb
View File

@ -1,5 +1,6 @@
#!/bin/bash
pushd web
# run jam-web rails server
bundle exec rails s
popd

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 "<HTML><BODY BGCOLOR=grey>"
@file.puts "<H1>Snapshot #{ENV["BUILD_NUMBER"]} - #{@size[0]}x#{@size[1]}</H1>"
end
def snapshot_example
page.driver.resize(@size[0], @size[1])
@file.puts "<H3>Example name: #{get_description}</H3><BR><BR>"
end
def snap!(title = get_description)
base64 = page.driver.render_base64(:png)
@file.puts '<H3>' + title + '</H3>'
@file.puts '<img alt="' + title +'" src="data:image/png;base64,' + base64 + '" />'
@file.puts '<BR><BR><BR>'
end
def tear_down_snapshot
@file.puts "</BODY></HTML>"
@file.close()
end
end

View File

@ -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