Merged mongomapper and master

This commit is contained in:
ilya 2010-06-25 00:11:45 -04:00
commit 179af4fbfa
15 changed files with 96 additions and 63 deletions

View file

@ -14,8 +14,9 @@ module ApplicationHelper
def parse_sender_object_from_xml(xml)
sender_id = parse_sender_id_from_xml(xml)
Person.where(:email => sender_id).first
end
Friend.where(:email => sender_id).first
end
def parse_body_contents_from_xml(xml)
doc = Nokogiri::XML(xml) { |cfg| cfg.noblanks }
@ -24,11 +25,13 @@ module ApplicationHelper
def parse_posts_from_xml(xml)
posts = []
sender = parse_sender_object_from_xml(xml)
body = parse_body_contents_from_xml(xml)
body.children.each do |post|
begin
object = post.name.camelize.constantize.from_xml post.to_s
posts << object if object.is_a? Post
object.person = sender
posts << object if object.is_a? Post
rescue
puts "Not a real type: #{post.to_s}"
end
@ -37,12 +40,10 @@ module ApplicationHelper
end
def store_posts_from_xml(xml)
sender_object = parse_sender_object_from_xml(xml)
posts = parse_posts_from_xml(xml)
posts.each do |p|
p.person = sender_object
p.save
p.save unless p.person.nil?
end
end

View file

@ -13,5 +13,8 @@ class Person
many :posts, :class_name => 'Post', :foreign_key => :person_id
validates_presence_of :email, :real_name
# def newest(type = nil)
# type.constantize.where(:person_id => id).last
# end
end

View file

@ -26,6 +26,19 @@ class Post
yield self
end
def self.newest(person = nil)
return self.last if person.nil?
self.where(:person_id => person.id).sort(:created_at.desc)
end
def self.my_newest
self.newest(User.first)
end
def self.newest_by_email(email)
self.where(:person_id => Person.where(:email => email).first.id).last
end
protected
def send_to_view

View file

@ -9,8 +9,8 @@ class StatusMessage < Post
validates_presence_of :message
def self.my_newest
StatusMessage.where(:person_id => User.first.id).sort(:created_at.desc).first
def ==(other)
(self.message == other.message) && (self.person.email == other.person.email)
end
end

View file

@ -1,17 +1,17 @@
module Diaspora
module Webhooks
include ApplicationHelper
def self.included(klass)
klass.class_eval do
after_save :notify_friends
@@queue = MessageHandler.new
def notify_friends
#if self.owner == User.first.email
if mine? self
xml = Post.build_xml_for(self)
@@queue.add_post_request( friends_with_permissions, xml )
@@queue.process
#end
end
end
def prep_webhook
@ -24,7 +24,7 @@ module Diaspora
def self.build_xml_for(posts)
xml = "<XML>"
#xml += Post.generate_header
xml += Post.generate_header
xml += "<posts>"
posts.each {|x| xml << x.prep_webhook}
xml += "</posts>"

View file

@ -1,5 +0,0 @@
#!/usr/bin/env ruby
`sprinkle -s config/sprinkle/provision.rb -v`
`cap deploy:setup`
`cap deploy:cold`
puts 'bababababa bababababa'

View file

@ -61,7 +61,7 @@ describe StatusMessagesController do
get :index
StatusMessage.all.each do |message|
response.body.include?(message.message).should be true
response.body.include?(message.owner).should be true
response.body.include?(message.person.email).should be true
end
end
end

View file

@ -29,6 +29,4 @@ Factory.define :bookmark do |b|
end
Factory.define :post do |p|
p.source "New York Times"
p.sequence(:snippet) {|n| "This is some information #{n}"}
end

View file

@ -4,38 +4,61 @@ include ApplicationHelper
describe ApplicationHelper do
before do
@user = Factory.create(:user, :email => "bob@aol.com")
@user = Factory.create(:user, :email => "bob@aol.com")
@friend =Factory.create(:friend, :email => "bill@gates.com")
end
it "should store objects sent from xml" do
it "should not store posts from me" do
status_messages = []
10.times { status_messages << Factory.build(:status_message)}
10.times { status_messages << Factory.build(:status_message, :person => @user)}
xml = Post.build_xml_for(status_messages)
store_posts_from_xml(xml)
StatusMessage.count.should == 10
StatusMessage.count.should == 0
end
it 'should discard posts where it does not know the type' do
xml = "<XML>
<head>
<sender>
<email>#{User.first.email}</email>
<email>#{Friend.first.email}</email>
</sender>
</head><posts>
<post><status_message>\n <message>Here is another message</message>\n <owner>a@a.com</owner>\n <snippet>a@a.com</snippet>\n <source>a@a.com</source>\n</status_message></post> <post><not_a_real_type></not_a_real_type></post> <post><status_message>\n <message>HEY DUDE</message>\n <owner>a@a.com</owner>\n <snippet>a@a.com</snippet>\n <source>a@a.com</source>\n</status_message></post>
</posts></XML>"
store_posts_from_xml(xml)
Post.count.should == 2
Post.first.person.email.should == Friend.first.email
end
it "should reject xml with no sender" do
xml = "<XML>
<head>
</head><posts>
<post><status_message>\n <message>Here is another message</message>\n <owner>a@a.com</owner>\n <snippet>a@a.com</snippet>\n <source>a@a.com</source>\n</status_message></post>
<post><friend></friend></post>
<post><status_message>\n <message>HEY DUDE</message>\n <owner>a@a.com</owner>\n <snippet>a@a.com</snippet>\n <source>a@a.com</source>\n</status_message></post>
</posts></XML>"
store_posts_from_xml(xml)
Post.count.should == 0
end
it "should reject xml with a sender not in the database" do
xml = "<XML>
<head>
<sender>
<email>foo@example.com</email>
</sender>
</head><posts>
<post><status_message>\n <message>Here is another message</message>\n <owner>a@a.com</owner>\n <snippet>a@a.com</snippet>\n <source>a@a.com</source>\n</status_message></post>
<post><friend></friend></post>
<post><status_message>\n <message>HEY DUDE</message>\n <owner>a@a.com</owner>\n <snippet>a@a.com</snippet>\n <source>a@a.com</source>\n</status_message></post>
</posts></XML>"
store_posts_from_xml(xml)
Post.count.should == 0
end
it 'should discard types which are not of type post' do
xml = "<XML>
<head>
<sender>
<email>#{User.first.email}</email>
<email>#{Friend.first.email}</email>
</sender>
</head><posts>
<post><status_message>\n <message>Here is another message</message>\n <owner>a@a.com</owner>\n <snippet>a@a.com</snippet>\n <source>a@a.com</source>\n</status_message></post>
@ -44,6 +67,7 @@ describe ApplicationHelper do
</posts></XML>"
store_posts_from_xml(xml)
Post.count.should == 2
Post.first.person.email.should == Friend.first.email
end
@ -58,9 +82,6 @@ describe ApplicationHelper do
parse_sender_id_from_xml(@xml).should == @user.email
end
it 'should be able to retrieve the sender\'s local Person object' do
parse_sender_object_from_xml(@xml).should == @user
end
it 'should be able to parse the body\'s contents' do
body = parse_body_contents_from_xml(@xml).to_s

View file

@ -67,7 +67,8 @@ describe Diaspora do
it "should check that it does not send a friends post to an owners friends" do
Post.stub(:build_xml_for).and_return(true)
Post.should_not_receive(:build_xml_for)
Factory.create(:status_message, :owner => "nottheowner@post.com")
Factory.create(:status_message, :person => Factory.create(:friend))
end
it "should ensure one url is created for every friend" do

View file

@ -16,24 +16,30 @@ describe Blog do
it "should add an owner if none is present" do
b = Factory.create(:blog)
b.owner.should == "bob@aol.com"
b.person.email.should == "bob@aol.com"
end
describe "newest" do
before do
(2..4).each { Factory.create(:blog, :owner => "some@dudes.com") }
@friend_one = Factory.create(:friend, :email => "some@dudes.com")
@friend_two = Factory.create(:friend, :email => "other@dudes.com")
(2..4).each { Factory.create(:blog, :person => @friend_one) }
(5..8).each { Factory.create(:blog) }
(9..11).each { Factory.create(:blog, :owner => "other@dudes.com") }
(9..11).each { Factory.create(:blog, :person => @friend_two) }
Factory.create(:status_message)
Factory.create(:bookmark)
end
it "should give the most recent blog title and body from owner" do
blog = Blog.my_newest
blog = Blog.newest(User.first)
blog.class.should == Blog
blog.title.should == "bobby's 8 penguins"
blog.body.should == "jimmy's huge 8 whales"
end
it "should give the most recent blog body for a given email" do
blog = Blog.newest("some@dudes.com")
blog = Blog.newest_by_email("some@dudes.com")
blog.class.should == Blog
blog.title.should == "bobby's 14 penguins"
blog.body.should == "jimmy's huge 14 whales"
end

View file

@ -11,7 +11,7 @@ describe Bookmark do
it "should add an owner if none is present" do
Factory.create(:user, :email => "bob@aol.com")
n = Factory.create(:bookmark)
n.owner.should == "bob@aol.com"
n.person.email.should == "bob@aol.com"
end
it 'should validate its link' do
@ -67,11 +67,10 @@ describe Bookmark do
end
it 'should marshal serialized XML to object' do
xml = "<bookmark><title>Reddit</message><link>http://reddit.com/</link><owner>bob@aol.com</owner></bookmark>"
xml = "<bookmark><title>Reddit</message><link>http://reddit.com/</link></bookmark>"
parsed = Bookmark.from_xml(xml)
parsed.title.should == "Reddit"
parsed.link.should == "http://reddit.com/"
parsed.owner.should == "bob@aol.com"
parsed.valid?.should be_true
end
end

View file

@ -8,24 +8,13 @@ describe Post do
describe 'defaults' do
before do
WebSocket.stub!(:update_clients)
@post = Factory.create(:post, :person => nil, :owner => nil, :source => nil, :snippet => nil)
@post = Factory.create(:post, :person => nil)
end
it "should associate the owner if none is present" do
@post.person.should == User.first
end
it "should add an owner if none is present" do
@post.owner.should == "bob@aol.com"
end
it "should add a source if none is present" do
@post.source.should == "bob@aol.com"
end
it "should add a snippet if none is present" do
@post.snippet.should == "bob@aol.com"
end
end

View file

@ -12,19 +12,27 @@ describe StatusMessage do
n.valid?.should be true
end
it "should add an owner if none is present" do
n = Factory.create(:status_message)
n.person.email.should == "bob@aol.com"
end
describe "newest" do
before do
@friend = Factory.build(:friend, :email => "robert@grimm.com")
(1..5).each { Factory.create(:status_message, :person => @friend) }
(6..10).each { Factory.create(:status_message) }
@person_one = Factory.create(:friend,:email => "some@dudes.com")
(1..10).each { Factory.create(:status_message, :person => @person_one) }
(1..5).each { Factory.create(:status_message) }
Factory.create(:bookmark)
Factory.create(:bookmark, :person => @person_one)
end
it "should give the most recent message from owner" do
StatusMessage.my_newest.message.should == "jimmy's 11 whales"
it "should give the most recent message from a friend" do
StatusMessage.newest(@person_one).message.should == "jimmy's 13 whales"
end
it "should give the most recent message for a given email" do
StatusMessage.newest("some@dudes.com").message.should == "jimmy's 16 whales"
StatusMessage.newest_by_email(@person_one.email).message.should == "jimmy's 28 whales"
end
end
@ -35,10 +43,9 @@ describe StatusMessage do
end
it 'should marshal serialized XML to object' do
xml = "<statusmessage><message>I hate WALRUSES!</message><owner>Bob@rob.ert</owner></statusmessage>"
xml = "<statusmessage><message>I hate WALRUSES!</message></statusmessage>"
parsed = StatusMessage.from_xml(xml)
parsed.message.should == "I hate WALRUSES!"
parsed.owner.should == "Bob@rob.ert"
parsed.valid?.should be_true
end
end

View file

@ -21,7 +21,6 @@ Rspec.configure do |config|
DatabaseCleaner.orm = "mongo_mapper"
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end
@ -32,6 +31,7 @@ Rspec.configure do |config|
config.after(:each) do
DatabaseCleaner.clean
#Factory.sequences.each{ |s| s.reset}
end