From ede7d4e8e293b1d14d7c8a3ed9a19e42e790afdc Mon Sep 17 00:00:00 2001 From: zhitomirskiyi Date: Fri, 18 Mar 2011 13:48:14 -0700 Subject: [PATCH] made the job, broke outthe save_users, still need to do lifecycle callbacks --- app/models/jobs/update_service_users.rb | 2 +- app/models/services/facebook.rb | 10 ++ .../20110318000734_create_service_users.rb | 9 +- db/schema.rb | 9 +- spec/models/jobs/update_service_users_spec.rb | 38 +----- spec/models/service_user_spec.rb | 119 +++++++++++++++++- spec/models/services/facebook_spec.rb | 102 ++------------- 7 files changed, 160 insertions(+), 129 deletions(-) diff --git a/app/models/jobs/update_service_users.rb b/app/models/jobs/update_service_users.rb index 659fb6bda..690306967 100644 --- a/app/models/jobs/update_service_users.rb +++ b/app/models/jobs/update_service_users.rb @@ -7,7 +7,7 @@ module Job class UpdateServiceUsers < Base def self.perform_delegate(service_id) service = Service.find(service_id) - response = RestClient.get("https://graph.facebook.com/me/friends", {:params => {:access_token => service.access_token}}) + service.save_friends end end end diff --git a/app/models/services/facebook.rb b/app/models/services/facebook.rb index 189b4de90..519ee6cae 100644 --- a/app/models/services/facebook.rb +++ b/app/models/services/facebook.rb @@ -62,4 +62,14 @@ class Services::Facebook < Service data_h end + + def save_friends + response = RestClient.get("https://graph.facebook.com/me/friends", {:params => + {:fields => ['name', 'id', 'picture'], :access_token => self.access_token}}) + data = JSON.parse(response.body)['data'] + data.each{ |p| + ServiceUser.create(:service_id => self.id, :name => p["name"], + :uid => p["id"], :picture_url => p["picture"]) + } + end end diff --git a/db/migrate/20110318000734_create_service_users.rb b/db/migrate/20110318000734_create_service_users.rb index 4e5a98119..30d5d907f 100644 --- a/db/migrate/20110318000734_create_service_users.rb +++ b/db/migrate/20110318000734_create_service_users.rb @@ -1,14 +1,17 @@ class CreateServiceUsers < ActiveRecord::Migration def self.up create_table :service_users do |t| - t.string :uid - t.string :name - t.integer :service_id + t.string :uid, :null => false + t.string :name, :null => false + t.string :picture_url, :null => false + t.integer :service_id, :null => false t.integer :person_id t.integer :contact_id t.integer :request_id t.timestamps end + + add_index :service_users, :service_id end def self.down diff --git a/db/schema.rb b/db/schema.rb index 7d9097f79..e036785f0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -274,9 +274,10 @@ ActiveRecord::Schema.define(:version => 20110319172136) do add_index "requests", ["sender_id"], :name => "index_requests_on_sender_id" create_table "service_users", :force => true do |t| - t.string "uid" - t.string "name" - t.integer "service_id" + t.string "uid", :null => false + t.string "name", :null => false + t.string "picture_url", :null => false + t.integer "service_id", :null => false t.integer "person_id" t.integer "contact_id" t.integer "request_id" @@ -284,6 +285,8 @@ ActiveRecord::Schema.define(:version => 20110319172136) do t.datetime "updated_at" end + add_index "service_users", ["service_id"], :name => "index_service_users_on_service_id" + create_table "services", :force => true do |t| t.string "type", :null => false t.integer "user_id", :null => false diff --git a/spec/models/jobs/update_service_users_spec.rb b/spec/models/jobs/update_service_users_spec.rb index 6c0803769..55930f4a2 100644 --- a/spec/models/jobs/update_service_users_spec.rb +++ b/spec/models/jobs/update_service_users_spec.rb @@ -6,39 +6,13 @@ describe Job::UpdateServiceUsers do @post = @user.post(:status_message, :text => "hello", :to =>@user.aspects.first.id) @service = Services::Facebook.new(:access_token => "yeah") @user.services << @service - - @user2 = Factory.create(:user_with_aspect) - @user2_fb_id = '820651' - @user2_fb_name = 'Maxwell Salzberg' - @user2_service = Services::Facebook.new(:uid => @user2_fb_id, :access_token => "yo") - @user2.services << @user2_service - @fb_list_hash = < {:access_token => @service.access_token}}).and_return(@web_mock) - Job::UpdateServiceUsers.perform(@service.id) end - it 'creates a service user objects' do - lambda{ - Job::UpdateServiceUsers.perform(@service.id) - }.should change(ServiceUser, :count).by(2) + it 'calls the update_friends for the service' do + Service.stub!(:find).and_return(@service) + @service.should_receive(:save_friends) + + Job::UpdateServiceUsers.perform(@service.id) end + end diff --git a/spec/models/service_user_spec.rb b/spec/models/service_user_spec.rb index 52ca6d048..1138621f0 100644 --- a/spec/models/service_user_spec.rb +++ b/spec/models/service_user_spec.rb @@ -1,5 +1,122 @@ require 'spec_helper' describe ServiceUser do - pending "add some examples to (or delete) #{__FILE__}" + + describe '#finder' do + before do + @user = alice + @post = @user.post(:status_message, :text => "hello", :to =>@user.aspects.first.id) + @service = Services::Facebook.new(:access_token => "yeah") + @user.services << @service + + @user2 = Factory.create(:user_with_aspect) + @user2_fb_id = '820651' + @user2_fb_name = 'Maxwell Salzberg' + @user2_service = Services::Facebook.new(:uid => @user2_fb_id, :access_token => "yo") + @user2.services << @user2_service + @fb_list_hash = < @service.id, :uid => @user2_fb_id) + su.save + su.name.should == @user2_fb_name + end + it 'contains a photo url' do + pending + end + it 'contains a FB id' do + @service.finder.include?(@user2_fb_id).should be_true + end + it 'contains a diaspora person object' do + @service.finder["#{@user2_fb_id}"][:person].should == @user2.person + end + it 'caches the profile' do + @service.finder["#{@user2_fb_id}"][:person].profile.loaded?.should be_true + end + it 'does not include the person if the search is disabled' do + p = @user2.person.profile + p.searchable = false + p.save + @service.finder["#{@user2_fb_id}"][:person].should be_nil + end + + context "request" do + before do + @request = Request.diaspora_initialize(:from => @user2.person, :to => @user.person, :into => @user2.aspects.first) + Postzord::Receiver.new(@user, :object => @request, :person => @user2.person).receive_object + Request.count.should == 1 + end + it 'contains a request object if one has been sent' do + @service.finder["#{@user2_fb_id}"][:request].should == @request + end + + it 'caches the profile' do + @service.finder["#{@user2_fb_id}"][:request].sender.profile.loaded?.should be_true + end + + it 'caches the sender' do + @service.finder["#{@user2_fb_id}"][:request].sender.loaded?.should be_true + end + + end + + it 'contains a contact object if connected' do + connect_users(@user, @user.aspects.first, @user2, @user2.aspects.first) + @service.finder["#{@user2_fb_id}"][:contact].should == @user.reload.contact_for(@user2.person) + end + + context 'only local' do + it 'does not return people who are remote' do + @service.finder(:local => true)['abc123'].should be nil + @service.finder(:local => true)["#{@user2_fb_id}"].should_not be_nil + end + end + + context 'only remote' do + it 'does not return people who are remote' do + @service.finder(:remote => true)['abc123'].should_not be nil + @service.finder(:remote => true)["#{@user2_fb_id}"].should be_nil + end + end + + context 'already invited' do + before do + @user2.invitation_service = 'facebook' + @user2.invitation_identifier = @user2_fb_id + @user2.save! + end + it 'contains an invitation if invited' do + @inv = Invitation.create(:sender => @user, :recipient => @user2, :aspect => @user.aspects.first) + @service.finder["#{@user2_fb_id}"][:invitation_id].should == @inv.id + end + it 'does not find the user with a wrong identifier' do + @user2.invitation_identifier = 'dsaofhnadsoifnsdanf' + @user2.save + + @inv = Invitation.create(:sender => @user, :recipient => @user2, :aspect => @user.aspects.first) + @service.finder["#{@user2_fb_id}"][:invitation_id].should be_nil + end + end + end + end end diff --git a/spec/models/services/facebook_spec.rb b/spec/models/services/facebook_spec.rb index 2b99e1bf8..414e5161a 100644 --- a/spec/models/services/facebook_spec.rb +++ b/spec/models/services/facebook_spec.rb @@ -27,8 +27,8 @@ describe Services::Facebook do end end - describe '#finder' do - before do + describe '#cache_friends' do + before do @user2 = Factory.create(:user_with_aspect) @user2_fb_id = '820651' @user2_fb_name = 'Maxwell Salzberg' @@ -39,11 +39,13 @@ describe Services::Facebook do "data": [ { "name": "#{@user2_fb_name}", - "id": "#{@user2_fb_id}" + "id": "#{@user2_fb_id}", + "picture": "http://cdn.fn.com/pic1.jpg" }, { "name": "Person to Invite", - "id": "abc123" + "id": "abc123", + "picture": "http://cdn.fn.com/pic1.jpg" } ] } @@ -54,93 +56,15 @@ JSON end it 'requests a friend list' do - RestClient.should_receive(:get).with("https://graph.facebook.com/me/friends", {:params => {:access_token => @service.access_token}}).and_return(@web_mock) - @service.finder + RestClient.should_receive(:get).with("https://graph.facebook.com/me/friends", {:params => + {:fields => ['name', 'id', 'picture'], :access_token => @service.access_token}}).and_return(@web_mock) + @service.save_friends end - context 'returns a hash' do - it 'returns a hash' do - @service.finder.class.should == Hash - end - it 'contains a name' do - @service.finder["#{@user2_fb_id}"][:name].should == @user2_fb_name - end - it 'contains a photo url' do - pending - end - it 'contains a FB id' do - @service.finder.include?(@user2_fb_id).should be_true - end - it 'contains a diaspora person object' do - @service.finder["#{@user2_fb_id}"][:person].should == @user2.person - end - it 'caches the profile' do - @service.finder["#{@user2_fb_id}"][:person].profile.loaded?.should be_true - end - it 'does not include the person if the search is disabled' do - p = @user2.person.profile - p.searchable = false - p.save - @service.finder["#{@user2_fb_id}"][:person].should be_nil - end - - context "request" do - before do - @request = Request.diaspora_initialize(:from => @user2.person, :to => @user.person, :into => @user2.aspects.first) - Postzord::Receiver.new(@user, :object => @request, :person => @user2.person).receive_object - Request.count.should == 1 - end - it 'contains a request object if one has been sent' do - @service.finder["#{@user2_fb_id}"][:request].should == @request - end - - it 'caches the profile' do - @service.finder["#{@user2_fb_id}"][:request].sender.profile.loaded?.should be_true - end - - it 'caches the sender' do - @service.finder["#{@user2_fb_id}"][:request].sender.loaded?.should be_true - end - - end - - it 'contains a contact object if connected' do - connect_users(@user, @user.aspects.first, @user2, @user2.aspects.first) - @service.finder["#{@user2_fb_id}"][:contact].should == @user.reload.contact_for(@user2.person) - end - - context 'only local' do - it 'does not return people who are remote' do - @service.finder(:local => true)['abc123'].should be nil - @service.finder(:local => true)["#{@user2_fb_id}"].should_not be_nil - end - end - - context 'only remote' do - it 'does not return people who are remote' do - @service.finder(:remote => true)['abc123'].should_not be nil - @service.finder(:remote => true)["#{@user2_fb_id}"].should be_nil - end - end - - context 'already invited' do - before do - @user2.invitation_service = 'facebook' - @user2.invitation_identifier = @user2_fb_id - @user2.save! - end - it 'contains an invitation if invited' do - @inv = Invitation.create(:sender => @user, :recipient => @user2, :aspect => @user.aspects.first) - @service.finder["#{@user2_fb_id}"][:invitation_id].should == @inv.id - end - it 'does not find the user with a wrong identifier' do - @user2.invitation_identifier = 'dsaofhnadsoifnsdanf' - @user2.save - - @inv = Invitation.create(:sender => @user, :recipient => @user2, :aspect => @user.aspects.first) - @service.finder["#{@user2_fb_id}"][:invitation_id].should be_nil - end - end + it 'creates a service user objects' do + lambda{ + @service.save_friends + }.should change(ServiceUser, :count).by(2) end end end