729 lines
33 KiB
Ruby
Executable File
729 lines
33 KiB
Ruby
Executable File
require 'spec_helper'
|
|
|
|
describe "Music Session API ", :type => :api do
|
|
|
|
include Rack::Test::Methods
|
|
|
|
subject { page }
|
|
|
|
before(:each) do
|
|
MusicSession.delete_all
|
|
end
|
|
|
|
def login(user)
|
|
post '/sessions', "session[email]" => user.email, "session[password]" => user.password
|
|
rack_mock_session.cookie_jar["remember_token"].should == user.remember_token
|
|
end
|
|
|
|
def make_friends(user1, user2)
|
|
Friendship.save(user1, user2)
|
|
end
|
|
|
|
describe "profile page" do
|
|
let(:user) { FactoryGirl.create(:user) }
|
|
|
|
# defopts are used to setup default options for the session
|
|
let(:defopts) { { :description => "a session", :fan_chat => true, :fan_access => true, :approval_required => false, :genres => ["classical"], :musician_access => true, :tracks => [{"instrument_id" => "electric guitar", "sound" => "mono", "client_track_id" => "client_track_guid"}], :legal_terms => true, :intellectual_property => true} }
|
|
before do
|
|
#sign_in user
|
|
MusicSession.delete_all
|
|
|
|
login(user)
|
|
end
|
|
|
|
it "should list no sessions" do
|
|
get '/api/sessions.json'
|
|
last_response.body.should eql('[]')
|
|
end
|
|
|
|
it "should create session" do
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1", :client_id => "1")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
|
|
# now fetch it's data
|
|
location_header = last_response.headers["Location"]
|
|
get location_header
|
|
music_session = JSON.parse(last_response.body)
|
|
|
|
get '/api/sessions.json'
|
|
music_sessions = JSON.parse(last_response.body)
|
|
music_session = music_sessions[0]
|
|
music_session["id"].should == music_sessions[0]["id"]
|
|
music_session["musician_access"].should be_true
|
|
music_session["invitations"].should == []
|
|
music_session["join_requests"].should == []
|
|
music_session["approval_required"].should be_false
|
|
music_session["fan_chat"].should be_true
|
|
music_session["fan_access"].should be_true
|
|
music_session["participants"].length.should == 1
|
|
participant = music_session["participants"][0]
|
|
participant["ip_address"].should == client.ip_address
|
|
participant["client_id"].should == client.client_id
|
|
participant["tracks"].length.should == 1
|
|
track = participant["tracks"][0]
|
|
track["instrument_id"].should == "electric guitar"
|
|
track["sound"].should == "mono"
|
|
|
|
# test session settings
|
|
get '/api/users/' + user.id + '/session_settings.json'
|
|
session_settings = JSON.parse(last_response.body)
|
|
session_settings["musician_access"].should be_true
|
|
session_settings["approval_required"].should be_false
|
|
session_settings["fan_chat"].should be_true
|
|
session_settings["fan_access"].should be_true
|
|
|
|
# test session history
|
|
get '/api/users/' + user.id + '/session_history.json'
|
|
last_response.status.should == 200
|
|
session_history = JSON.parse(last_response.body)
|
|
session_history[0]["user_id"].to_s.should == user.id
|
|
session_history[0]["band_id"].should == music_session["band_id"]
|
|
session_history[0]["description"].should == music_session["description"]
|
|
|
|
get '/api/users/' + user.id + '/session_history/' + music_session["id"] + '/users.json'
|
|
|
|
# test Track-specific APIs
|
|
get "/api/sessions/#{music_session["id"]}/tracks.json", "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 200
|
|
tracks = JSON.parse(last_response.body)
|
|
tracks.size.should == 1
|
|
tracks[0]["instrument_id"].should == "electric guitar"
|
|
tracks[0]["sound"].should == "mono"
|
|
|
|
# change instrument
|
|
post "/api/sessions/#{music_session["id"]}/tracks/#{tracks[0]["id"]}.json", { :instrument_id => "drums" }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 200
|
|
|
|
# get individual track
|
|
get "/api/sessions/#{music_session["id"]}/tracks/#{tracks[0]["id"]}.json", "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 200
|
|
updated_track = JSON.parse(last_response.body)
|
|
updated_track["instrument_id"].should == "drums"
|
|
updated_track["sound"].should == "mono"
|
|
|
|
# change sound
|
|
post "/api/sessions/#{music_session["id"]}/tracks/#{tracks[0]["id"]}.json", { :sound => "stereo" }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 200
|
|
|
|
# get individual track
|
|
get "/api/sessions/#{music_session["id"]}/tracks/#{tracks[0]["id"]}.json", "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 200
|
|
updated_track = JSON.parse(last_response.body)
|
|
updated_track["instrument_id"].should == "drums"
|
|
updated_track["sound"].should == "stereo"
|
|
|
|
# create a 2nd track for this session
|
|
conn_id = updated_track["connection_id"]
|
|
post "/api/sessions/#{music_session["id"]}/tracks.json", { :connection_id => "#{conn_id}", :instrument_id => "electric guitar", :sound => "mono", :client_track_id => "client_track_guid" }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 201
|
|
|
|
get "/api/sessions/#{music_session["id"]}/tracks.json", "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 200
|
|
tracks = JSON.parse(last_response.body)
|
|
tracks.size.should == 2
|
|
|
|
# invalid track ID
|
|
get "/api/sessions/#{music_session["id"]}/tracks/1234.json", "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 404
|
|
|
|
# delete track
|
|
delete "/api/sessions/#{music_session["id"]}/tracks/#{tracks[0]["id"]}.json"
|
|
last_response.status.should == 204
|
|
|
|
# get tracks again
|
|
get "/api/sessions/#{music_session["id"]}/tracks.json", "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 200
|
|
tracks = JSON.parse(last_response.body)
|
|
tracks.size.should == 1
|
|
end
|
|
|
|
|
|
describe "update music session properties" do
|
|
|
|
let(:user) { FactoryGirl.create(:user) }
|
|
let(:music_session) { music_session = FactoryGirl.create(:music_session, :creator => user, :description => "My Session") }
|
|
let(:client) { FactoryGirl.create(:connection, :user => user) }
|
|
|
|
it "successful" do
|
|
put "/api/sessions/#{music_session.id}.json", {:description => "you!", :musician_access => false, :fan_chat => false, :fan_access => false, :approval_required => true}.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(204)
|
|
get "/api/sessions/#{music_session.id}.json", "CONTENT_TYPE" => 'application/json'
|
|
updated_session = JSON.parse(last_response.body)
|
|
updated_session["description"].should == "you!"
|
|
updated_session["musician_access"].should be_false
|
|
updated_session["fan_chat"].should be_false
|
|
updated_session["fan_access"].should be_false
|
|
updated_session["approval_required"].should be_true
|
|
end
|
|
|
|
it "string boolean value" do
|
|
put "/api/sessions/#{music_session.id}.json", {:musician_access => "false"}.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(204)
|
|
get "/api/sessions/#{music_session.id}.json", "CONTENT_TYPE" => 'application/json'
|
|
updated_session = JSON.parse(last_response.body)
|
|
updated_session["musician_access"].should be_false
|
|
end
|
|
|
|
|
|
it "empty description not allowed" do
|
|
put "/api/sessions/#{music_session.id}.json", {:description => ""}.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(422)
|
|
end
|
|
|
|
it "updated genres" do
|
|
put "/api/sessions/#{music_session.id}.json", {:genres => ["jazz"]}.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(204)
|
|
get "/api/sessions/#{music_session.id}.json", "CONTENT_TYPE" => 'application/json'
|
|
updated_session = JSON.parse(last_response.body)
|
|
updated_session["genres"].should == ["Jazz"]
|
|
end
|
|
end
|
|
|
|
|
|
it "should add/remove member from session" do
|
|
# create the session
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
|
|
# now fetch it's data
|
|
location_header = last_response.headers["Location"]
|
|
get location_header + ".json", "CONTENT_TYPE" => 'application/json'
|
|
|
|
music_session = JSON.parse(last_response.body)
|
|
|
|
# and the creator should be in the session
|
|
music_session["participants"].length.should == 1
|
|
musician = music_session["participants"][0]
|
|
|
|
# and that musician should have the same IP address
|
|
musician["ip_address"].should == client.ip_address
|
|
|
|
# and that musician should have the correct IP address
|
|
musician["client_id"].should == client.client_id
|
|
|
|
# now delete that musician
|
|
delete "/api/participants/#{musician["client_id"]}.json", '', "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(204)
|
|
|
|
# re-fetch the session now that there is not a musician;
|
|
# we auto-delete sessions when the last person leaves
|
|
get "/api/sessions/#{music_session["id"]}.json"
|
|
last_response.status.should eql(404)
|
|
end
|
|
|
|
|
|
it "should add a second member to the session" do
|
|
|
|
user2 = FactoryGirl.create(:user)
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1")
|
|
client2 = FactoryGirl.create(:connection, :user => user2, :ip_address => "2.2.2.2")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
|
|
# now fetch it's data
|
|
music_session_uri = last_response.headers["Location"]
|
|
get music_session_uri + ".json", "CONTENT_TYPE" => 'application/json'
|
|
|
|
music_session = JSON.parse(last_response.body)
|
|
|
|
# and the creator should be in the session
|
|
music_session["participants"].length.should == 1
|
|
musician = music_session["participants"][0]
|
|
# and should have tracks
|
|
musician["tracks"].length.should == 1
|
|
musician["tracks"][0]["instrument_id"].should == 'electric guitar'
|
|
musician["tracks"][0]["sound"].should == 'mono'
|
|
musician["ip_address"].should == client.ip_address
|
|
musician["client_id"].should == client.client_id
|
|
|
|
login(user2)
|
|
post "/api/sessions/#{music_session["id"]}/participants.json", { :client_id => client2.client_id, :as_musician => true, :tracks => [{"instrument_id" => "bass guitar", "sound" => "mono", "client_track_id" => "client_track_guid"}]}.to_json, "CONTENT_TYPE" => 'application/json'
|
|
|
|
last_response.status.should eql(201)
|
|
|
|
# now fetch it's data
|
|
location_header = last_response.headers["Location"]
|
|
login(user2)
|
|
get location_header + ".json", "CONTENT_TYPE" => 'application/json'
|
|
|
|
participant = JSON.parse(last_response.body)
|
|
|
|
# and the creator should be in the session
|
|
# and should have tracks
|
|
participant["tracks"].length.should == 1
|
|
participant["tracks"][0]["instrument_id"].should == 'bass guitar'
|
|
participant["tracks"][0]["sound"].should == 'mono'
|
|
participant["ip_address"].should == client2.ip_address
|
|
participant["client_id"].should == client2.client_id
|
|
|
|
# refetch the session and make sure both participnats are accounted for
|
|
login(user2)
|
|
get music_session_uri + ".json", "CONTENT_TYPE" => 'application/json'
|
|
|
|
music_session = JSON.parse(last_response.body)
|
|
# and the creator should be in the session
|
|
music_session["participants"].length.should == 2
|
|
|
|
login(user)
|
|
delete "/api/participants/#{client.client_id}.json", '', "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(204)
|
|
login(user2)
|
|
delete "/api/participants/#{client2.client_id}.json", '', "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(204)
|
|
|
|
# re-fetch the session now that there is not a musician;
|
|
# we auto-delete sessions when the last person leaves
|
|
login(user2)
|
|
get "/api/sessions/#{music_session["id"]}.json"
|
|
last_response.status.should eql(404)
|
|
end
|
|
|
|
it "should error with no genre specified" do
|
|
# create the session
|
|
original_count = MusicSession.all().length
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id, :genres => nil}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(422)
|
|
MusicSession.all().length.should == original_count
|
|
end
|
|
|
|
it "should error with invalid genre specified" do
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1")
|
|
post '/api/sessions.json', defopts.merge({ :client_id => client.client_id, :genres => ["Junk"]}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(404)
|
|
end
|
|
|
|
it "should error with no track specified" do
|
|
original_count = MusicSession.all().length
|
|
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id, :tracks => nil}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(422)
|
|
JSON.parse(last_response.body)["errors"]["tracks"][0].should == ValidationMessages::SELECT_AT_LEAST_ONE
|
|
|
|
# check that the transaction was rolled back
|
|
MusicSession.all().length.should == original_count
|
|
end
|
|
|
|
it "should error with invalid track specified" do
|
|
original_count = MusicSession.all().length
|
|
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id, :tracks => [{"instrument_id" => "mom", "sound" => "mono", "client_track_id" => "client_track_guid"}]}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(404)
|
|
|
|
# check that the transaction was rolled back
|
|
MusicSession.all().length.should == original_count
|
|
end
|
|
|
|
it "should error with invalid sound specified" do
|
|
original_count = MusicSession.all().length
|
|
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id, :tracks => [{"instrument_id" => "electric guitar", "sound" => "mom", "client_track_id" => "client_track_guid"}]}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
|
|
last_response.status.should eql(422)
|
|
JSON.parse(last_response.body)["errors"]["tracks"][0].should == "is invalid"
|
|
|
|
# check that the transaction was rolled back
|
|
MusicSession.all().length.should == original_count
|
|
end
|
|
|
|
it "can see user_id of friend in session" do
|
|
pending
|
|
|
|
# create the session
|
|
user2 = FactoryGirl.create(:user) # in the music session
|
|
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id, :musician_access => false}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
session = JSON.parse(last_response.body)
|
|
|
|
FactoryGirl.create(:friendship, :user => user, :friend => user2)
|
|
FactoryGirl.create(:friendship, :user => user2, :friend => user)
|
|
|
|
login(user2)
|
|
get '/api/sessions.json'
|
|
last_response.status.should eql(200)
|
|
music_sessions = JSON.parse(last_response.body)
|
|
music_session = music_sessions[0]
|
|
|
|
music_session["id"].should == session["id"]
|
|
music_session["musician_access"].should == false
|
|
music_session["invitations"].should == []
|
|
music_session["participants"].length.should == 1
|
|
participant = music_session["participants"][0]
|
|
participant["ip_address"].should == client.ip_address
|
|
participant["client_id"].should == client.client_id
|
|
participant["user"]["id"].should == user.id
|
|
end
|
|
|
|
it "can see invitation_id associatied with hidden session" do
|
|
# create the session
|
|
user2 = FactoryGirl.create(:user) # in the music session
|
|
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id, :musician_access => false}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
session = JSON.parse(last_response.body)
|
|
|
|
FactoryGirl.create(:friendship, :user => user, :friend => user2)
|
|
FactoryGirl.create(:friendship, :user => user2, :friend => user)
|
|
invitation_model = FactoryGirl.create(:invitation, :sender => user, :receiver => user2, :music_session_id => session["id"] )
|
|
|
|
login(user2)
|
|
get '/api/sessions.json'
|
|
last_response.status.should eql(200)
|
|
music_sessions = JSON.parse(last_response.body)
|
|
music_session = music_sessions[0]
|
|
music_session["id"].should == session["id"]
|
|
music_session["musician_access"].should == false
|
|
|
|
# we should be able to see the invitation
|
|
music_session["invitations"].length.should == 1
|
|
invitation = music_session["invitations"][0]
|
|
invitation["id"].should == invitation_model.id
|
|
|
|
music_session["participants"].length.should == 1
|
|
participant = music_session["participants"][0]
|
|
participant["client_id"].should == client.client_id
|
|
|
|
# and see the user_id because they are friends
|
|
participant["user"]["id"].should == user.id
|
|
end
|
|
|
|
it "can't join closed music session with no invitation" do
|
|
# create the session
|
|
user2 = FactoryGirl.create(:user) # in the music session
|
|
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1", :client_id => "3")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id, :musician_access => false}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
session = JSON.parse(last_response.body)
|
|
|
|
client2 = FactoryGirl.create(:connection, :user => user2)
|
|
|
|
FactoryGirl.create(:friendship, :user => user, :friend => user2)
|
|
FactoryGirl.create(:friendship, :user => user2, :friend => user)
|
|
|
|
# users are friends, but no invitation... so we shouldn't be able to join as user 2
|
|
login(user2)
|
|
post "/api/sessions/#{session["id"]}/participants.json", { :client_id => client2.client_id, :as_musician => true, :tracks => [{"instrument_id" => "bass guitar", "sound" => "mono", "client_track_id" => "client_track_guid"}] }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(422)
|
|
join_response = JSON.parse(last_response.body)
|
|
join_response["errors"]["musician_access"].should == [ValidationMessages::INVITE_REQUIRED]
|
|
|
|
# but let's make sure if we then invite, that we can then join'
|
|
login(user)
|
|
post '/api/invitations.json', { :music_session => session["id"], :receiver => user2.id }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
|
|
login(user2)
|
|
post "/api/sessions/#{session["id"]}/participants.json", { :client_id => client2.client_id, :as_musician => true, :tracks => [{"instrument_id" => "bass guitar", "sound" => "mono", "client_track_id" => "client_track_guid"}] }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
|
|
last_response.status.should eql(201)
|
|
end
|
|
|
|
it "join_requests don't show up in session listing" do
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
|
|
location_header = last_response.headers["Location"]
|
|
get location_header
|
|
music_session = JSON.parse(last_response.body)
|
|
|
|
get '/api/sessions.json'
|
|
music_sessions = JSON.parse(last_response.body)
|
|
|
|
music_session = music_sessions[0]
|
|
music_session["id"].should == music_session["id"]
|
|
music_session["join_requests"].should == []
|
|
|
|
user2 = FactoryGirl.create(:user) # in the music session
|
|
|
|
login(user2)
|
|
|
|
# create join request
|
|
post '/api/join_requests.json', { :music_session => music_session["id"], :text => "lemme in" }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 201
|
|
|
|
location_header = last_response.headers["Location"]
|
|
login(user2)
|
|
get location_header + ".json", "CONTENT_TYPE" => 'application/json'
|
|
join_request = JSON.parse(last_response.body)
|
|
|
|
# now join_requests should still be empty, because we don't share join_requests to people outside the session
|
|
login(user2)
|
|
get '/api/sessions.json'
|
|
music_sessions = JSON.parse(last_response.body)
|
|
|
|
music_session = music_sessions[0]
|
|
music_session["id"].should == music_session["id"]
|
|
music_session["join_requests"].should be_nil
|
|
|
|
login(user)
|
|
|
|
# but for people in the session, they can see the join_requests!
|
|
get '/api/sessions.json'
|
|
music_sessions = JSON.parse(last_response.body)
|
|
|
|
music_session = music_sessions[0]
|
|
music_session["id"].should == music_session["id"]
|
|
music_session["join_requests"].length.should == 1
|
|
music_session["join_requests"][0]["id"].should == join_request["id"]
|
|
end
|
|
|
|
it "should now allow join of approval_required=true session" do
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id, :approval_required => true}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
|
|
# now fetch it's data
|
|
location_header = last_response.headers["Location"]
|
|
get location_header
|
|
music_session = JSON.parse(last_response.body)
|
|
|
|
# try to add 2nd user to session - should fail because approval is required
|
|
user2 = FactoryGirl.create(:user)
|
|
client2 = FactoryGirl.create(:connection, :user => user2, :ip_address => "2.2.2.2")
|
|
|
|
login(user2)
|
|
post "/api/sessions/#{music_session["id"]}/participants.json", { :client_id => client2.client_id, :as_musician => true, :tracks => [{"instrument_id" => "bass guitar", "sound" => "mono", "client_track_id" => "client_track_guid"}]}.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(422)
|
|
rejected_join_attempt = JSON.parse(last_response.body)
|
|
rejected_join_attempt["errors"]["approval_required"] = [ValidationMessages::INVITE_REQUIRED]
|
|
|
|
# now send up a join_request to try and get in
|
|
login(user2)
|
|
post '/api/join_requests.json', { :music_session => music_session["id"], :text => "lemme in" }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 201
|
|
|
|
location_header = last_response.headers["Location"]
|
|
login(user2)
|
|
get location_header + ".json", "CONTENT_TYPE" => 'application/json'
|
|
join_request = JSON.parse(last_response.body)
|
|
|
|
# pop back to user1 and allow user2 to get in
|
|
login(user)
|
|
post '/api/invitations.json', {:music_session => music_session["id"], :receiver => user2.id, :join_request => join_request["id"]}.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
|
|
# finally, go back to user2 and attempt to join again
|
|
login(user2)
|
|
post "/api/sessions/#{music_session["id"]}/participants.json", { :client_id => client2.client_id, :as_musician => true, :tracks => [{"instrument_id" => "bass guitar", "sound" => "mono", "client_track_id" => "client_track_guid"}]}.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
end
|
|
|
|
|
|
|
|
it "should allow create session and join session for creator" do
|
|
# this test was created to stop duplication of tracks
|
|
# but ultimately it should be fine to create a session, and then 'join' it with no ill effects
|
|
# https://jamkazam.atlassian.net/browse/VRFS-254
|
|
user.admin = true
|
|
client = FactoryGirl.create(:connection, :user => user)
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
|
|
# now fetch it's data
|
|
location_header = last_response.headers["Location"]
|
|
get location_header
|
|
music_session = JSON.parse(last_response.body)
|
|
|
|
get "/api/sessions/#{music_session["id"]}.json"
|
|
last_response.status.should eql(200)
|
|
music_session["participants"].length.should == 1
|
|
participant = music_session["participants"][0]
|
|
participant["client_id"].should == client.client_id
|
|
participant["tracks"].length.should == 1
|
|
track = participant["tracks"][0]
|
|
track["instrument_id"].should == "electric guitar"
|
|
track["sound"].should == "mono"
|
|
|
|
post "/api/sessions/#{music_session["id"]}/participants.json", { :client_id => client.client_id, :as_musician => true, :tracks => [{"instrument_id" => "electric guitar", "sound" => "mono", "client_track_id" => "client_track_guid"}]}.to_json, "CONTENT_TYPE" => 'application/json'
|
|
|
|
last_response.status.should eql(201)
|
|
|
|
get "/api/sessions/#{music_session["id"]}.json"
|
|
music_session = JSON.parse(last_response.body)
|
|
music_session["participants"].length.should == 1
|
|
participant = music_session["participants"][0]
|
|
participant["client_id"].should == client.client_id
|
|
participant["tracks"].length.should == 1 # there should only be one track, still
|
|
track = participant["tracks"][0]
|
|
track["instrument_id"].should == "electric guitar"
|
|
track["sound"].should == "mono"
|
|
end
|
|
|
|
it "can't join session that's recording" do
|
|
user = FactoryGirl.create(:user)
|
|
user2 = FactoryGirl.create(:user)
|
|
client = FactoryGirl.create(:connection, :user => user)
|
|
client2 = FactoryGirl.create(:connection, :user => user2)
|
|
instrument = FactoryGirl.create(:instrument, :description => 'a great instrument')
|
|
track = FactoryGirl.create(:track, :connection => client, :instrument => instrument)
|
|
track2 = FactoryGirl.create(:track, :connection => client2, :instrument => instrument)
|
|
|
|
# 1st user joins
|
|
login(user)
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
location_header = last_response.headers["Location"]
|
|
get location_header
|
|
music_session = JSON.parse(last_response.body)
|
|
|
|
# start a recording
|
|
post "/api/recordings/start", {:format => :json, :music_session_id => music_session['id'] }.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
|
|
# user 2 should not be able to join
|
|
login(user2)
|
|
post "/api/sessions/#{music_session["id"]}/participants.json", { :client_id => client2.client_id, :as_musician => true, :tracks => [{"instrument_id" => "electric guitar", "sound" => "mono", "client_track_id" => "client_track_guid"}]}.to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(422)
|
|
JSON.parse(last_response.body)["errors"]["music_session"][0].should == ValidationMessages::CANT_JOIN_RECORDING_SESSION
|
|
end
|
|
|
|
it "shows mount info based on fan_access" do
|
|
# create the session
|
|
server = FactoryGirl.create(:icecast_server_minimal)
|
|
user2 = FactoryGirl.create(:user) # in the music session
|
|
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.10", :client_id => "mount_info")
|
|
post '/api/sessions.json', defopts.merge({:client_id => client.client_id, :fan_access => true}).to_json, "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should eql(201)
|
|
session = JSON.parse(last_response.body)
|
|
music_session = MusicSession.find(session["id"])
|
|
session["mount"].should_not be_nil
|
|
session["mount"]["name"].should == music_session.mount.name
|
|
session["mount"]["listeners"].should == music_session.mount.listeners
|
|
session["mount"]["sourced"].should == music_session.mount.sourced
|
|
|
|
# set gfan_access to false, which should cause the mount info to hide
|
|
music_session.fan_access = false
|
|
music_session.save!
|
|
|
|
get "/api/sessions/#{session["id"]}.json"
|
|
last_response.status.should eql(200)
|
|
session = JSON.parse(last_response.body)
|
|
session["mount"].should be_nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
it "Finds a single open session" do
|
|
creator = FactoryGirl.create(:user)
|
|
session = FactoryGirl.create(:music_session, :creator => creator, :description => "My Session")
|
|
client = FactoryGirl.create(:connection, :user => creator, :music_session => session)
|
|
|
|
user = FactoryGirl.create(:user)
|
|
login(user)
|
|
|
|
get '/api/sessions', "CONTENT_TYPE" => "application/json"
|
|
last_response.status.should == 200
|
|
sessions = JSON.parse(last_response.body)
|
|
sessions.length.should == 1
|
|
sessions.first["description"].should == "My Session"
|
|
end
|
|
|
|
it "prepare for perf data upload" do
|
|
user = FactoryGirl.create(:user)
|
|
client = FactoryGirl.create(:connection, :user => user)
|
|
music_session = FactoryGirl.create(:music_session, :creator => user, :description => "My Session")
|
|
msuh = FactoryGirl.create(:music_session_user_history, :music_session_id => music_session.id, :client_id => client.client_id, :user_id => user.id)
|
|
|
|
put "/api/sessions/#{music_session.id}/perf.json?client_id=#{client.client_id}", "CONTENT_TYPE" => "application/json"
|
|
|
|
last_response.status.should == 302
|
|
redirect = last_response.headers["Location"]
|
|
|
|
put redirect + '.json', "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 200
|
|
body = JSON.parse(last_response.body)
|
|
perf_data_id = body["id"]
|
|
|
|
music_session_perf_data = MusicSessionPerfData.find(perf_data_id)
|
|
music_session_perf_data.should_not be_nil
|
|
music_session_perf_data.music_session_user_history.should == MusicSessionUserHistory.find_by_client_id(client.client_id)
|
|
end
|
|
|
|
it "rating" do
|
|
user = FactoryGirl.create(:user)
|
|
client = FactoryGirl.create(:connection, :user => user)
|
|
music_session = FactoryGirl.create(:music_session, :creator => user, :description => "My Session")
|
|
msuh = FactoryGirl.create(:music_session_user_history, :music_session_id => music_session.id, :client_id => client.client_id, :user_id => user.id)
|
|
msuh.rating.should be_nil
|
|
login(user)
|
|
post "/api/participant_histories/#{msuh.id}/rating.json", { :rating => 0 }.to_json, "CONTENT_TYPE" => "application/json"
|
|
last_response.status.should == 200
|
|
msuh.reload
|
|
msuh.rating.should == 0
|
|
end
|
|
|
|
it "track sync" do
|
|
pending "recording_session_landing broken tests"
|
|
user = FactoryGirl.create(:single_user_session)
|
|
instrument = FactoryGirl.create(:instrument, :description => 'a great instrument')
|
|
music_session = FactoryGirl.create(:music_session, :creator => user)
|
|
client = FactoryGirl.create(:connection, :user => user, :music_session => music_session)
|
|
track = FactoryGirl.create(:track, :connection => client, :instrument => instrument)
|
|
|
|
existing_track = {:id => track.id, :client_track_id => track.client_track_id, :sound => track.sound, :instrument_id => track.instrument_id }
|
|
new_track = {:client_track_id => "client_track_id1", :instrument_id => instrument.id, :sound => 'stereo'}
|
|
# let's add a new track, and leave the existing one alone
|
|
tracks = [existing_track, new_track]
|
|
login(user)
|
|
|
|
put "/api/sessions/#{music_session.id}/tracks.json", { :client_id => client.client_id, :tracks => tracks }.to_json, "CONTENT_TYPE" => "application/json"
|
|
last_response.status.should == 204
|
|
|
|
get "/api/sessions/#{music_session.id}/tracks.json", "CONTENT_TYPE" => 'application/json'
|
|
last_response.status.should == 200
|
|
tracks = JSON.parse(last_response.body)
|
|
tracks.size.should == 2
|
|
tracks[0]["id"].should == track.id
|
|
tracks[0]["instrument_id"].should == instrument.id
|
|
tracks[0]["sound"].should == "mono"
|
|
tracks[0]["client_track_id"].should == track.client_track_id
|
|
tracks[1]["instrument_id"].should == instrument.id
|
|
tracks[1]["sound"].should == "stereo"
|
|
tracks[1]["client_track_id"].should == "client_track_id1"
|
|
end
|
|
|
|
it "allows start/stop recording playback of a claimed recording" do
|
|
|
|
user = FactoryGirl.create(:user)
|
|
connection = FactoryGirl.create(:connection, :user => user)
|
|
track = FactoryGirl.create(:track, :connection => connection, :instrument => Instrument.first)
|
|
music_session = FactoryGirl.create(:music_session, :creator => user, :musician_access => true)
|
|
music_session.connections << connection
|
|
music_session.save
|
|
recording = Recording.start(music_session, user)
|
|
recording.stop
|
|
recording.reload
|
|
claimed_recording = recording.claim(user, "name", "description", Genre.first, true)
|
|
recording.reload
|
|
|
|
login(user)
|
|
post "/api/sessions/#{music_session.id}/claimed_recording/#{claimed_recording.id}/start.json", {}.to_json, "CONTENT_TYPE" => "application/json"
|
|
|
|
last_response.status.should == 201
|
|
music_session.reload
|
|
music_session.claimed_recording.should == claimed_recording
|
|
music_session.claimed_recording_initiator.should == user
|
|
|
|
post "/api/sessions/#{music_session.id}/claimed_recording/#{claimed_recording.id}/stop.json", {}.to_json, "CONTENT_TYPE" => "application/json"
|
|
|
|
last_response.status.should == 201
|
|
music_session.reload
|
|
music_session.claimed_recording.should be_nil
|
|
music_session.claimed_recording_initiator.should be_nil
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|