jam-cloud/web/spec/requests/user_progression_spec.rb

173 lines
7.7 KiB
Ruby

require 'spec_helper'
# user progression is achieved by different aspects of the code working together in a cross-cutting fashion.
# due to this, it's nice to have a single place where all the parts of user progression are tested
# https://jamkazam.atlassian.net/wiki/pages/viewpage.action?pageId=3375145
describe "User Progression", :type => :api do
include Rack::Test::Methods
subject { page }
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
describe "user progression" do
let(:user) { FactoryGirl.create(:user) }
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
login(user)
end
it "downloaded_client" do
user.first_downloaded_client_at.should be_nil
post "/api/users/progression/downloaded_client"
last_response.status.should eql(200)
JSON.parse(last_response.body).should eql({ })
user.reload
user.first_downloaded_client_at.should_not be_nil
end
it "downloaded_client twice" do
post "/api/users/progression/downloaded_client"
user.reload
first = user.first_downloaded_client_at
post "/api/users/progression/downloaded_client"
user.reload
user.first_downloaded_client_at.should == first
end
it "qualified gear" do
user.first_certified_gear_at.should be_nil
post "/api/users/progression/certified_gear.json", { :success => true}.to_json, "CONTENT_TYPE" => 'application/json'
last_response.status.should eql(200)
JSON.parse(last_response.body).should eql({ })
user.reload
user.first_certified_gear_at.should_not be_nil
user.last_failed_certified_gear_at.should be_nil
user.last_failed_certified_gear_reason.should be_nil
end
it "failed qualified gear" do
user.first_certified_gear_at.should be_nil
post "/api/users/progression/certified_gear.json", { :success => false, :reason => "latency=30"}.to_json, "CONTENT_TYPE" => 'application/json'
last_response.status.should eql(200)
JSON.parse(last_response.body).should eql({ })
user.reload
user.first_certified_gear_at.should be_nil
user.last_failed_certified_gear_at.should_not be_nil
user.last_failed_certified_gear_reason.should == "latency=30"
end
it "social promoted" do
user.first_social_promoted_at.should be_nil
post "/api/users/progression/social_promoted"
last_response.status.should eql(200)
JSON.parse(last_response.body).should eql({ })
user.reload
user.first_social_promoted_at.should_not be_nil
end
it "joined any session" do
user.first_music_session_at.should be_nil
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1", :client_id => "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)
user.reload
user.first_music_session_at.should_not be_nil
end
it "ran client" do
user.first_ran_client_at.should be_nil
# change user-agent to look like the real client, and see ran_client flag set
post '/sessions', {"session[email]" => user.email, "session[password]" => user.password}, { "HTTP_USER_AGENT" => " JamKazam " }
user.reload
user.first_ran_client_at.should_not be_nil
end
it "real session" do
# to make a real session, we need a session at least 15 minutes long and containting 3 concurrent users
user2 = FactoryGirl.create(:user)
user3 = FactoryGirl.create(:user)
user.first_real_music_session_at.should be_nil
client = FactoryGirl.create(:connection, :user => user, :ip_address => "1.1.1.1", :client_id => "1_1")
client2 = FactoryGirl.create(:connection, :user => user2, :ip_address => "1.1.1.2", :client_id => "1_2")
client3 = FactoryGirl.create(:connection, :user => user3, :ip_address => "1.1.1.3", :client_id => "1_3")
post '/api/sessions.json', defopts.merge({:client_id => client.client_id}).to_json, "CONTENT_TYPE" => 'application/json'
last_response.status.should eql(201)
music_session = JSON.parse(last_response.body)
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)
login(user3)
post "/api/sessions/#{music_session["id"]}/participants.json", { :client_id => client3.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)
# instrument the created_at of the music_history field to be at the beginning of time, so that we cross the 15 minute threshold of a 'real session
history1 = MusicSessionUserHistory.where(:user_id => user.id, :music_session_id => music_session["id"]).first
history2 = MusicSessionUserHistory.where(:user_id => user2.id, :music_session_id => music_session["id"]).first
history3 = MusicSessionUserHistory.where(:user_id => user3.id, :music_session_id => music_session["id"]).first
history1.should_not be_nil
history2.should_not be_nil
history3.should_not be_nil
history1.created_at = Time.at(0)
history2.created_at = Time.at(0)
history3.created_at = Time.at(0)
history1.save
history2.save
history3.save
# now log out of the session for all 3 users
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)
login(user3)
delete "/api/participants/#{client3.client_id}.json", '', "CONTENT_TYPE" => 'application/json'
last_response.status.should eql(204)
user.reload
user2.reload
user3.reload
user.first_real_music_session_at.should_not be_nil
user2.first_real_music_session_at.should_not be_nil
user3.first_real_music_session_at.should_not be_nil
end
it "invites user" do
user.first_invited_at.should be_nil
post '/api/invited_users.json', {:emails => ['tester@jamkazam.com'], :note => "please join"}.to_json, "CONTENT_TYPE" => 'application/json'
last_response.status.should eql(200)
user.reload
user.first_invited_at.should_not be_nil
end
it "good session" do
user = FactoryGirl.create(:user)
user.first_good_music_session_at.should be_nil
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)
expect(msuh).to_not eq(nil)
login(user)
post "/api/participant_histories/#{msuh.client_id}/rating.json", { :rating => 1 }.to_json, "CONTENT_TYPE" => "application/json"
user.reload
user.first_good_music_session_at.should_not be_nil
end
end
end