diff --git a/app/controllers/invitations_controller.rb b/app/controllers/invitations_controller.rb index 03567166e6eabf550afc6f8fa256734f07791650..89c774ffd8934af75eb5c9c55bc7659f909fc4eb 100644 --- a/app/controllers/invitations_controller.rb +++ b/app/controllers/invitations_controller.rb @@ -4,7 +4,7 @@ class InvitationsController < Devise::InvitationsController - before_filter :check_token, :only => [:edit] + before_filter :check_token, :only => [:edit] def create @@ -27,7 +27,7 @@ class InvitationsController < Devise::InvitationsController flash[:notice] = I18n.t('invitations.create.sent') + good_emails.join(', ') end - redirect_to :back + redirect_to :back end def update diff --git a/app/models/user.rb b/app/models/user.rb index 781bf83043c63baf41277e9a302634e69ccdb98c..7979cbed2c8ddebb9d69ceafdc86347958271ab7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -10,7 +10,7 @@ class User include Diaspora::UserModules include Encryptor::Private include ActionView::Helpers::TextHelper - + plugin MongoMapper::Devise devise :invitable, :database_authenticatable, :registerable, @@ -141,17 +141,6 @@ class User end ######## Posting ######## - 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 - add_to_streams(post, opts[:to]) - dispatch_post(post, :to => opts[:to]) - end - post - end - def build_post(class_name, opts = {}) opts[:person] = self.person opts[:diaspora_handle] = opts[:person].diaspora_handle @@ -168,7 +157,7 @@ class User push_to_aspects(post, aspects_from_ids(aspect_ids)) if post.public && post.respond_to?(:message) - + if opts[:url] && post.photos.count > 0 message = truncate(post.message, :length => (140 - (opts[:url].length + 1))) @@ -201,14 +190,14 @@ class User if twitter_consumer_secret.blank? || twitter_consumer_secret.blank? Rails.logger.info "you have a blank twitter key or secret.... you should look into that" end - + Twitter.configure do |config| config.consumer_key = twitter_key config.consumer_secret = twitter_consumer_secret config.oauth_token = service.access_token config.oauth_token_secret = service.access_secret end - + Twitter.update(message) end @@ -273,7 +262,7 @@ class User # calling nil? performs a necessary evaluation. if person.owner_id Rails.logger.info("event=push_to_person route=local sender=#{self.diaspora_handle} recipient=#{person.diaspora_handle} payload_type=#{post.class}") - Jobs::Receive.perform(person.owner_id, post.to_diaspora_xml, self.person.id) + Resque.enqueue(Jobs::Receive, person.owner_id, post.to_diaspora_xml, self.person.id) else xml = salmon.xml_for person Rails.logger.info("event=push_to_person route=remote sender=#{self.diaspora_handle} recipient=#{person.diaspora_handle} payload_type=#{post.class}") @@ -281,24 +270,12 @@ class User end end - - def salmon(post) created_salmon = Salmon::SalmonSlap.create(self, post.to_diaspora_xml) created_salmon end ######## Commenting ######## - def comment(text, options = {}) - comment = build_comment(text, options) - - if comment.save - raise 'MongoMapper failed to catch a failed save' unless comment.id - dispatch_comment comment - end - comment - end - def build_comment(text, options = {}) comment = Comment.new(:person_id => self.person.id, :diaspora_handle => self.person.diaspora_handle, @@ -321,7 +298,7 @@ class User #push DOWNSTREAM (to original audience) Rails.logger.info "event=dispatch_comment direction=downstream user=#{self.diaspora_handle} comment=#{comment.id}" aspects = aspects_with_post(comment.post_id) - + #just socket to local users, as the comment has already #been associated and saved by post owner # (we'll push to all of their aspects for now, the comment won't diff --git a/spec/controllers/publics_controller_spec.rb b/spec/controllers/publics_controller_spec.rb index 52284f429a2e9c71bcddbf5df8dc3f7917bb6487..58a6e1b062f04caf6b99c5702acb90a99c65bcdd 100644 --- a/spec/controllers/publics_controller_spec.rb +++ b/spec/controllers/publics_controller_spec.rb @@ -14,7 +14,6 @@ describe PublicsController do let(:xml) { "<walruses></walruses>" } context 'success cases' do it 'should 200 on successful receipt of a request' do - Resque.should_receive(:enqueue) post :receive, :id =>user.person.id, :xml => xml response.code.should == '200' end diff --git a/spec/helper_methods.rb b/spec/helper_methods.rb index c4718aa1d1abb83342c84ee7767ff6a4b51ae123..722a199e6e056da9249e5fabf6927b60f099428f 100644 --- a/spec/helper_methods.rb +++ b/spec/helper_methods.rb @@ -22,27 +22,37 @@ module HelperMethods user.stub!(:push_to_person) end + def fantasy_resque + former_value = $process_queue + $process_queue = true + result = yield + $process_queue = former_value + result + end + def connect_users(user1, aspect1, user2, aspect2) - user1.send_contact_request_to(user2.person, aspect1) + fantasy_resque do + user1.send_contact_request_to(user2.person, aspect1) - user1.reload - aspect1.reload - user2.reload - aspect2.reload + user1.reload + aspect1.reload + user2.reload + aspect2.reload - new_request = user2.pending_requests.find_by_from_id!(user1.person.id) + new_request = user2.pending_requests.find_by_from_id!(user1.person.id) - user1.reload - aspect1.reload - user2.reload - aspect2.reload + user1.reload + aspect1.reload + user2.reload + aspect2.reload - user2.accept_and_respond( new_request.id, aspect2.id) + user2.accept_and_respond( new_request.id, aspect2.id) - user1.reload - aspect1.reload - user2.reload - aspect2.reload + user1.reload + aspect1.reload + user2.reload + aspect2.reload + end end def stub_success(address = 'abc@example.com', opts = {}) diff --git a/spec/lib/diaspora/exporter_spec.rb b/spec/lib/diaspora/exporter_spec.rb index 538d58c07f0f01edc26691c163f9d2fbed26c33d..00791fd3b143f82e976c505e3cc7a638768e17ab 100644 --- a/spec/lib/diaspora/exporter_spec.rb +++ b/spec/lib/diaspora/exporter_spec.rb @@ -7,57 +7,63 @@ require File.join(Rails.root, 'lib/diaspora/exporter') describe Diaspora::Exporter do - let!(:user1) { make_user } - let!(:user2) { make_user } - let!(:user3) { make_user } - - let!(:aspect) { user1.aspects.create(:name => "Old Work") } - let(:aspect1) { user1.aspects.create(:name => "Work") } - let(:aspect2) { user2.aspects.create(:name => "Family") } - let(:aspect3) { user3.aspects.create(:name => "Pivots") } - - let!(:status_message1) { user1.post(:status_message, :message => "One", :public => true, :to => aspect1.id) } - let!(:status_message2) { user1.post(:status_message, :message => "Two", :public => true, :to => aspect1.id) } - let!(:status_message3) { user2.post(:status_message, :message => "Three", :public => false, :to => aspect2.id) } + before do + @user1 = make_user + @user2 = make_user + @user3 = make_user + + @aspect = @user1.aspects.create(:name => "Old Work") + @aspect1 = @user1.aspects.create(:name => "Work") + @aspect2 = @user2.aspects.create(:name => "Family") + @aspect3 = @user3.aspects.create(:name => "Pivots") + + @status_message1 = @user1.post(:status_message, :message => "One", :public => true, :to => @aspect1.id) + @status_message2 = @user1.post(:status_message, :message => "Two", :public => true, :to => @aspect1.id) + @status_message3 = @user2.post(:status_message, :message => "Three", :public => false, :to => @aspect2.id) + + @user1.reload + @user2.reload + end - let(:exported) { Nokogiri::XML(Diaspora::Exporter.new(Diaspora::Exporters::XML).execute(user1)) } + def exported + Nokogiri::XML(Diaspora::Exporter.new(Diaspora::Exporters::XML).execute(@user1)) + end context '<user/>' do - let(:user_xml) {exported.xpath('//user').to_s} + before do + @user_xml = exported.xpath('//user').to_s + end it 'should include a users private key' do - user_xml.to_s.should include user1.serialized_private_key + @user_xml.to_s.should include @user1.serialized_private_key end end context '<aspects/>' do - let(:aspects_xml) {exported.xpath('//aspects').to_s} - it 'should include the aspect name' do - - end it 'should include the post_ids' do - aspects_xml.should include status_message1.id.to_s - aspects_xml.should include status_message2.id.to_s + aspects_xml = exported.xpath('//aspects').to_s + aspects_xml.should include @status_message1.id.to_s + aspects_xml.should include @status_message2.id.to_s end end context '<contacts/>' do before do - connect_users(user1, aspect1, user3, aspect3) - user1.add_person_to_aspect(user3.person.id, aspect.id) - user1.reload + connect_users(@user1, @aspect1, @user3, @aspect3) + @user1.add_person_to_aspect(@user3.person.id, @aspect.id) + @user1.reload end let(:contacts_xml) {exported.xpath('//contacts').to_s} it 'should include a person id' do - contacts_xml.should include user3.person.id.to_s + contacts_xml.should include @user3.person.id.to_s end it 'should include an aspects names of all aspects they are in' do #contact specific xml needs to be tested - user1.contacts.find_by_person_id(user3.person.id).aspects.count.should > 0 - user1.contacts.find_by_person_id(user3.person.id).aspects.each { |aspect| + @user1.contacts.find_by_person_id(@user3.person.id).aspects.count.should > 0 + @user1.contacts.find_by_person_id(@user3.person.id).aspects.each { |aspect| contacts_xml.should include aspect.name } end @@ -66,38 +72,38 @@ describe Diaspora::Exporter do context '<people/>' do let(:people_xml) {exported.xpath('//people').to_s} before do - connect_users(user1, aspect1, user3, aspect3) - user1.reload + connect_users(@user1, @aspect1, @user3, @aspect3) + @user1.reload end it 'should include persons id' do - people_xml.should include user3.person.id.to_s + people_xml.should include @user3.person.id.to_s end it 'should include their profile' do - people_xml.should include user3.person.profile.first_name - people_xml.should include user3.person.profile.last_name + people_xml.should include @user3.person.profile.first_name + people_xml.should include @user3.person.profile.last_name end - + it 'should include their public key' do - people_xml.should include user3.person.exported_key + people_xml.should include @user3.person.exported_key end it 'should include their diaspora handle' do - people_xml.should include user3.person.diaspora_handle + people_xml.should include @user3.person.diaspora_handle end end context '<posts>' do let(:posts_xml) {exported.xpath('//posts').to_s} it 'should include many posts xml' do - posts_xml.should include status_message1.message - posts_xml.should include status_message2.message - posts_xml.should_not include status_message3.message + posts_xml.should include @status_message1.message + posts_xml.should include @status_message2.message + posts_xml.should_not include @status_message3.message end - + it 'should include post created at time' do doc = Nokogiri::XML::parse(posts_xml) - Time.parse(doc.xpath('//posts/status_message/created_at').first.text).should == status_message1.created_at + Time.parse(doc.xpath('//posts/status_message/created_at').first.text).should == @status_message1.created_at end end end diff --git a/spec/lib/diaspora/parser_spec.rb b/spec/lib/diaspora/parser_spec.rb index 1f74d6c2517b6744199a61e795e2ca986b3bc477..f8baa96cdd9d8bbb59859943ca949c284d5f132a 100644 --- a/spec/lib/diaspora/parser_spec.rb +++ b/spec/lib/diaspora/parser_spec.rb @@ -49,7 +49,7 @@ describe Diaspora::Parser do Person.should_receive(:by_account_identifier).twice.and_return(new_person) - lambda { + lambda { user.receive_salmon xml }.should change(Person, :count).by(1) end @@ -60,8 +60,9 @@ describe Diaspora::Parser do it "should activate the Person if I initiated a request to that url" do user.send_contact_request_to(user2.person, aspect) request = user2.reload.pending_requests.find_by_to_id!(user2.person.id) - user2.accept_and_respond(request.id, aspect2.id) - + fantasy_resque do + user2.accept_and_respond(request.id, aspect2.id) + end user.reload aspect.reload new_contact = user.contact_for(user2.person) diff --git a/spec/misc_spec.rb b/spec/misc_spec.rb index 414d8e3c19e921a0ca1919d1754a3f28a663b194..1db1d671f1604212a2eb444695e4cc99c1dc429d 100644 --- a/spec/misc_spec.rb +++ b/spec/misc_spec.rb @@ -29,7 +29,7 @@ describe 'making sure the spec runner works' do User.count.should == 2 new_user.id.should_not == second_user.id end - + end describe 'factories' do @@ -37,7 +37,7 @@ describe 'making sure the spec runner works' do it 'does not save a built user' do Factory.build(:user).persisted?.should be_false end - + it 'does not save a built person' do Factory.build(:person).persisted?.should be_false end diff --git a/spec/models/user/posting_spec.rb b/spec/models/user/posting_spec.rb index be42ddbd525ef62341e92df2e57055e795b0237b..48b8ba604d1a819499458ecdea6f4faf6a847178 100644 --- a/spec/models/user/posting_spec.rb +++ b/spec/models/user/posting_spec.rb @@ -203,8 +203,22 @@ describe User do user.push_to_people(post, [user2.person, user3.person, remote_person]) end - end + describe '#push_to_person' do + before do + @salmon = user.salmon(post) + @xml = post.to_diaspora_xml + end + it 'enqueues receive for local contacts' do + Resque.should_receive(:enqueue).with(Jobs::Receive, user2.id, @xml, user.person.id) + user.push_to_person(@salmon, post, user2.person) + end + it 'calls the MessageHandler for remote contacts' do + person = Factory.create(:person) + MessageHandler.should_receive(:add_post_request).once + user.push_to_person(@salmon, post, person) + end + end end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index e67237c3303ae359e5022c8f7334e327e2a8ac23..3e2cc23976da09d118db70987948a1850698f134 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -15,7 +15,7 @@ require 'webmock/rspec' include Devise::TestHelpers include WebMock::API include HelperMethods - +# # Requires supporting files with custom matchers and macros, etc, # in ./support/ and its subdirectories. Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f} @@ -41,25 +41,57 @@ end module Resque def enqueue(klass, *args) - true + if $process_queue + klass.send(:perform, *args) + else + true + end end end -class User -def send_contact_request_to(desired_contact, aspect) - request = Request.instantiate(:to => desired_contact, - :from => self.person, - :into => aspect) - if request.save! - dispatch_request request +ImageUploader.enable_processing = false +class User + def send_contact_request_to(desired_contact, aspect) + fantasy_resque do + request = Request.instantiate(:to => desired_contact, + :from => self.person, + :into => aspect) + if request.save! + dispatch_request request + end + request + end + end + + def post(class_name, opts = {}) + fantasy_resque do + p = build_post(class_name, opts) + if p.save! + raise 'MongoMapper failed to catch a failed save' unless p.id + + self.aspects.reload + + add_to_streams(p, opts[:to]) + dispatch_post(p, :to => opts[:to]) + end + p + end + end + + def comment(text, options = {}) + fantasy_resque do + c = build_comment(text, options) + if c.save! + raise 'MongoMapper failed to catch a failed save' unless c.id + dispatch_comment(c) + end + c end - request end end -ImageUploader.enable_processing = false - + class FakeHttpRequest def initialize(callback_wanted) @callback = callback_wanted @@ -82,12 +114,12 @@ class FakeHttpRequest self end - def post(opts = nil); - self + def post(opts = nil); + self end def get(opts = nil) - self + self end def publish(opts = nil)