* moved shareable_resolver into new controller, and made tests

This commit is contained in:
Seth Call 2014-02-06 21:02:04 +00:00
parent caa565470d
commit 9598c06e1f
17 changed files with 123 additions and 19 deletions

View File

@ -64,6 +64,7 @@ module JamRuby
self.share_token = ShareToken.new
self.share_token.token = token
self.share_token.shareable_type = "recording"
self.share_token.shareable_id = self.id
end
end
end

View File

@ -40,6 +40,11 @@ module JamRuby
validate :creator_is_musician
validate :no_new_playback_while_playing
before_create :create_uuid
def create_uuid
#self.id = SecureRandom.uuid
end
def before_destroy
self.mount.destroy if self.mount
end

View File

@ -160,6 +160,9 @@ module JamRuby
private
def generate_share_token
self.id = music_session.id # unify music_session.id and music_session_history.id
token = loop do
token = SecureRandom.urlsafe_base64(SHARE_TOKEN_LENGTH, false)
token = remove_non_alpha_num(token)
@ -170,6 +173,8 @@ module JamRuby
self.share_token = ShareToken.new
self.share_token.token = token
self.share_token.shareable_type = "session"
self.share_token.shareable_id = self.id
self.share_token.save!
end
end

View File

@ -21,6 +21,7 @@ module JamRuby
validates :sound, :inclusion => {:in => SOUND}
validates :client_id, :presence => true # not a connection relation on purpose
validates :track_id, :presence => true # not a track relation on purpose
validates :client_track_id, :presence => true
validates :md5, :presence => true, :if => :upload_starting?
validates :length, length: {minimum: 1, maximum: 1024 * 1024 * 256 }, if: :upload_starting? # 256 megs max. is this reasonable? surely...

View File

@ -1,5 +1,7 @@
module JamRuby
class ShareToken < ActiveRecord::Base
belongs_to :shareable, :polymorphic => true
end
end

View File

@ -32,7 +32,7 @@ FactoryGirl.define do
end
end
factory :music_session, :class => JamRuby::MusicSession do
factory :music_session_no_history, :class => JamRuby::MusicSession do
sequence(:description) { |n| "Music Session #{n}" }
fan_chat true
fan_access true
@ -42,8 +42,16 @@ FactoryGirl.define do
genres [JamRuby::Genre.first]
association :creator, :factory => :user
factory :music_session_with_mount do
factory :music_session do
after(:create) { |session|
MusicSessionHistory.save(session)
}
factory :music_session_with_mount do
association :mount, :factory => :icecast_mount
end
end
end
@ -109,14 +117,45 @@ FactoryGirl.define do
end
factory :recorded_track, :class => JamRuby::RecordedTrack do
instrument JamRuby::Instrument.first
sound 'stereo'
sequence(:client_id) { |n| "client_id-#{n}"}
sequence(:track_id) { |n| "track_id-#{n}"}
sequence(:client_track_id) { |n| "client_track_id-#{n}"}
md5 'abc'
length 1
fully_uploaded true
association :user, factory: :user
association :recording, factory: :recording
end
factory :instrument, :class => JamRuby::Instrument do
end
factory :recording, :class => JamRuby::Recording do
association :owner, factory: :user
association :music_session, factory: :music_session
factory :recording_with_track do
before(:create) { |recording|
recording.recorded_tracks << FactoryGirl.create(:recorded_track, recording: recording, user: recording.owner)
}
end
end
factory :claimed_recording, :class => JamRuby::ClaimedRecording do
sequence(:name) { |n| "name-#{n}" }
sequence(:description) { |n| "description-#{n}" }
is_public true
is_downloadable true
association :genre, factory: :genre
association :user, factory: :user
before(:create) { |claimed_recording|
claimed_recording.recording = FactoryGirl.create(:recording_with_track, owner: claimed_recording.user)
}
end
factory :musician_instrument, :class => JamRuby::MusicianInstrument do

View File

@ -120,7 +120,7 @@ describe 'Band search' do
it "by now playing" do
# should get 1 result with 1 active session
session = make_session(@band3)
FactoryGirl.create(:music_session_history, :music_session => session)
#FactoryGirl.create(:music_session_history, :music_session => session)
results = Search.band_filter({ :orderby => 'playing' })
expect(results.results.count).to be 1
@ -129,7 +129,7 @@ describe 'Band search' do
# should get 2 results with 2 active sessions
# sort order should be created_at DESC
session = make_session(@band4)
FactoryGirl.create(:music_session_history, :music_session => session)
#FactoryGirl.create(:music_session_history, :music_session => session)
results = Search.band_filter({ :orderby => 'playing' })
expect(results.results.count).to be 2
expect(results.results[0].id).to eq(@band4.id)

View File

@ -3,7 +3,7 @@ require 'spec_helper'
describe MusicSessionHistory do
let(:some_user) { FactoryGirl.create(:user) }
let(:music_session) { FactoryGirl.create(:music_session) }
let(:music_session) { FactoryGirl.create(:music_session_no_history) }
let(:history) { FactoryGirl.create(:music_session_history, :music_session => music_session) }
let(:user_history1) { FactoryGirl.create(:music_session_user_history, :history => history, :user => music_session.creator) }
let(:user_history2) { FactoryGirl.create(:music_session_user_history, :history => history, :user => some_user) }

View File

@ -3,7 +3,7 @@ require 'spec_helper'
describe MusicSessionUserHistory do
let(:some_user) { FactoryGirl.create(:user) }
let(:music_session) { FactoryGirl.create(:music_session) }
let(:music_session) { FactoryGirl.create(:music_session_no_history) }
let(:history) { FactoryGirl.create(:music_session_history, :music_session => music_session) }
let(:user_history1) { FactoryGirl.create(:music_session_user_history, :history => history, :user => music_session.creator) }
let(:user_history2) { FactoryGirl.create(:music_session_user_history, :history => history, :user => some_user) }

View File

@ -0,0 +1,28 @@
require 'spec_helper'
describe ShareToken do
let(:user) { FactoryGirl.create(:user) }
let(:music_session) {FactoryGirl.create(:music_session) }
let(:claimed_recording) {FactoryGirl.create(:claimed_recording) }
before(:each) do
ShareToken.delete_all
end
it "can reference a music session" do
music_session.touch # should create a MSH, and a token, too
ShareToken.count.should == 1
token = ShareToken.find_by_shareable_id!(music_session.id)
token.shareable_id.should == music_session.id
token.shareable_type.should == 'session'
end
it "can reference a claimed recording" do
claimed_recording.touch # should create a share token
ShareToken.count.should == 2 # one for MSH, one for recording
token = ShareToken.find_by_shareable_id!(claimed_recording.id)
token.shareable_type.should == 'recording'
end
end

View File

@ -30,6 +30,7 @@ ActiveRecord::Base.add_observer UserObserver.instance
ActiveRecord::Base.add_observer FeedbackObserver.instance
ActiveRecord::Base.add_observer RecordedTrackObserver.instance
RecordedTrack.observers.disable :all # only a few tests want this observer active
# put ActionMailer into test mode
ActionMailer::Base.delivery_method = :test

View File

@ -40,7 +40,9 @@ gem 'amqp', '0.9.8'
gem 'logging-rails', :require => 'logging/rails'
gem 'omniauth', '1.1.1'
gem 'omniauth-facebook', '1.4.1'
gem 'omniauth-twitter'
gem 'omniauth-google-oauth2', '0.2.1'
gem 'twitter'
gem 'fb_graph', '2.5.9'
gem 'sendgrid', '1.1.0'
gem 'recaptcha', '0.3.4'

View File

@ -1,4 +1,4 @@
class ApiSearchController < ApiController
class ApiSessionsController < ApiController
def login
user = User.authenticate(params[:email], params[:password])

View File

@ -0,0 +1,14 @@
class ShareTokensController < ApplicationController
respond_to :html
def shareable_resolver
share_token = ShareToken.find_by_token!(params[:id])
# TODO: clean this up later to truly use polymorphic associations
if share_token.shareable_type == "session"
redirect_to music_session_detail(share_token.shareable_id)
else
redirect_to recording_detail(share_token.shareable_id)
end
end
end

View File

@ -44,14 +44,4 @@ class SpikesController < ApplicationController
render :layout => 'web'
end
def shareable_resolver
share_token = ShareToken.find_by_token(params[:id])
# TODO: clean this up later to truly use polymorphic associations
if share_token.shareable_type == "session"
msh = MusicSessionHistory.find(share_token.shareable_id)
redirect_to "/sessions/#{msh.music_session_id}"
else
redirect_to "/recordings/#{share_token.shareable_id}"
end
end
end

View File

@ -63,7 +63,9 @@ SampleApp::Application.routes.draw do
match '/facebook_invite', to: 'spikes#facebook_invite'
match '/gmail_contacts', to: 'spikes#gmail_contacts'
match '/listen_in', to: 'spikes#listen_in'
match '/:id', to: 'spikes#shareable_resolver'
# share tokens
match '/s/:id', to: 'share_tokens#shareable_resolver'
# password reset
match '/request_reset_password' => 'users#request_reset_password', :via => :get

View File

@ -0,0 +1,14 @@
require 'spec_helper'
describe ApiSharedTokenController do
render_views
let(:user) { FactoryGirl.create(:user) }
let(:music_session) {FactoryGirl.create(:music_session, user: user) }
it "resolves music session" do
music_session.touch
get :shareable_resolver, :id => ShareToken.find_by_shareable_id!(music_session.id).token
end
end