diff --git a/app/models/photo.rb b/app/models/photo.rb index 6c96e425c..1eb0aa10e 100644 --- a/app/models/photo.rb +++ b/app/models/photo.rb @@ -34,15 +34,11 @@ class Photo < Post before_destroy :ensure_user_picture def self.instantiate(params = {}) + photo = super(params) image_file = params.delete(:user_file) - person = params.delete(:person) - - photo = Photo.new(params) - photo.diaspora_handle = params[:diaspora_handle] + photo.album_id = params[:album_id] photo.image.store! image_file - photo.person = person - photo.save photo end diff --git a/app/models/user.rb b/app/models/user.rb index 48e2a05f2..9784a480f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -138,29 +138,43 @@ class User end ######## Posting ######## - def post(class_name, options = {}) - if class_name == :photo && !options[:album_id].to_s.empty? - aspect_ids = aspects_with_post(options[:album_id]) + def post(class_name, opts = {}) + post = build_post(class_name, opts) + + if post.save + raise 'MongoMapper failed to catch a failed save' unless post.id + dispatch_post(post, :to => opts[:to]) + end + post + end + + def build_post(class_name, opts = {}) + opts[:person] = self.person + opts[:diaspora_handle] = self.person.diaspora_handle + + model_class = class_name.to_s.camelize.constantize + model_class.instantiate(opts) + end + + def dispatch_post(post, opts = {}) + if post.is_a?(Photo) && post.album_id + aspect_ids = aspects_with_post(post.album_id) aspect_ids.map! { |aspect| aspect.id } else - aspect_ids = options.delete(:to) + aspect_ids = opts.delete(:to) end aspect_ids = validate_aspect_permissions(aspect_ids) - - post = build_post(class_name, options) - - if post.persisted? - Rails.logger.info("Pushing: #{post.inspect} out to aspects") - push_to_aspects(post, aspect_ids) - post.socket_to_uid(id, :aspect_ids => aspect_ids) if post.respond_to?(:socket_to_uid) - if options[:public] == true - self.services.each do |service| - self.send("post_to_#{service.provider}".to_sym, service, post.message) - end + self.raw_visible_posts << post + self.save + Rails.logger.info("Pushing: #{post.inspect} out to aspects") + push_to_aspects(post, aspect_ids) + post.socket_to_uid(id, :aspect_ids => aspect_ids) if post.respond_to?(:socket_to_uid) + if post.public + self.services.each do |service| + self.send("post_to_#{service.provider}".to_sym, service, post.message) end end - post end def post_to_facebook(service, message) @@ -203,20 +217,6 @@ class User aspect_ids end - def build_post(class_name, options = {}) - options[:person] = self.person - options[:diaspora_handle] = self.person.diaspora_handle - - model_class = class_name.to_s.camelize.constantize - post = model_class.instantiate(options) - if post.save - raise 'MongoMapper failed to catch a failed save' unless post.id - self.raw_visible_posts << post - self.save - end - post - end - def push_to_aspects(post, aspect_ids) if aspect_ids == :all || aspect_ids == "all" aspects = self.aspects diff --git a/lib/tasks/cruise.rake b/lib/tasks/cruise.rake index e3a7a65a1..91c3f31d8 100644 --- a/lib/tasks/cruise.rake +++ b/lib/tasks/cruise.rake @@ -1,10 +1,13 @@ namespace :cruise do desc "Run all specs and features" task :cruise => :environment do - system('/etc/init.d/xvfb start') + puts "Starting virtual display..." + `sh -e /etc/init.d/xvfb start` + puts "Starting specs..." system('export DISPLAY=:99.0 && export SELENIUM_SERVER_PORT=53809 && bundle exec rake') exit_status = $?.exitstatus - system('/etc/init.d/xvfb stop') + puts "Stopping virtual display..." + `sh -e /etc/init.d/xvfb stop` raise "tests failed!" unless exit_status == 0 end end diff --git a/spec/lib/websocket_spec.rb b/spec/lib/websocket_spec.rb index e3917008a..2615ac82d 100644 --- a/spec/lib/websocket_spec.rb +++ b/spec/lib/websocket_spec.rb @@ -9,6 +9,7 @@ describe Diaspora::WebSocket do @user = make_user @aspect = @user.aspects.create(:name => "losers") @post = @user.build_post(:status_message, :message => "hey", :to => @aspect.id) + @post.save end it 'should queue a job' do diff --git a/spec/models/photo_spec.rb b/spec/models/photo_spec.rb index f0e38fa42..0e2513e1d 100644 --- a/spec/models/photo_spec.rb +++ b/spec/models/photo_spec.rb @@ -42,15 +42,18 @@ describe Photo do it 'sets the persons diaspora handle' do @photo2.diaspora_handle.should == @user.person.diaspora_handle end + it 'has a constructor' do + image = File.open(@fixture_name) + photo = Photo.instantiate( + :person => @user.person, :album => @album, :user_file => image) + photo.created_at.nil?.should be true + photo.image.read.nil?.should be false + photo.album.should == @album + end + end - it 'has a constructor' do - image = File.open(@fixture_name) - photo = Photo.instantiate( - :person => @user.person, :album => @album, :user_file => image) - photo.created_at.nil?.should be false - photo.image.read.nil?.should be false - end + it 'should save a photo' do @photo.image.store! File.open(@fixture_name) diff --git a/spec/models/user/posting_spec.rb b/spec/models/user/posting_spec.rb index 734c187fc..79233cb4c 100644 --- a/spec/models/user/posting_spec.rb +++ b/spec/models/user/posting_spec.rb @@ -36,7 +36,19 @@ describe User do end end - describe '#post' do + describe '#build_post' do + it 'does not save a status_message' do + post = user.build_post(:status_message, :message => "hey", :to => aspect.id) + post.persisted?.should be_false + end + + it 'does not save an album' do + post = user.build_post(:album, :name => "hey", :to => aspect.id) + post.persisted?.should be_false + end + end + + describe '#dispatch_post' do it 'should put the post in the aspect post array' do post = user.post(:status_message, :message => "hey", :to => aspect.id) aspect.reload @@ -67,7 +79,6 @@ describe User do user.should_receive(:post_to_facebook).exactly(0).times user.post :status_message, :message => "hi", :to => "all" end - end describe '#update_post' do