DG; webhooks apply incoming posts to current friends with a silent fail on no match
This commit is contained in:
parent
523cb6f15f
commit
e6e1c22b07
4 changed files with 76 additions and 36 deletions
|
|
@ -7,25 +7,42 @@ module ApplicationHelper
|
|||
object.attributes.keys
|
||||
end
|
||||
|
||||
def store_posts_from_xml(xml)
|
||||
def parse_sender_id_from_xml(xml)
|
||||
doc = Nokogiri::XML(xml) { |cfg| cfg.noblanks }
|
||||
|
||||
#i need to check some sort of metadata field
|
||||
|
||||
doc.xpath("/XML/posts/post").each do |post| #this is the post wrapper
|
||||
post.children.each do|type| #now the text of post itself is the type
|
||||
#type object to xml is the the thing we want to from_xml
|
||||
check_and_save_post(type)
|
||||
end
|
||||
end
|
||||
doc.xpath("/XML/head/sender/email").text.to_s
|
||||
end
|
||||
|
||||
def parse_sender_object_from_xml(xml)
|
||||
sender_id = parse_sender_id_from_xml(xml)
|
||||
Person.where(:email => sender_id).first
|
||||
end
|
||||
|
||||
def check_and_save_post(type)
|
||||
begin
|
||||
object = type.name.camelize.constantize.from_xml type.to_s
|
||||
object.save if object.is_a? Post
|
||||
rescue
|
||||
puts "Not of type post"
|
||||
def parse_body_contents_from_xml(xml)
|
||||
doc = Nokogiri::XML(xml) { |cfg| cfg.noblanks }
|
||||
doc.xpath("/XML/posts/post")
|
||||
end
|
||||
|
||||
def parse_posts_from_xml(xml)
|
||||
posts = []
|
||||
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
|
||||
rescue
|
||||
puts "Not a real type: #{post.to_s}"
|
||||
end
|
||||
end
|
||||
posts
|
||||
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
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -36,11 +36,9 @@ module Diaspora
|
|||
"<head>
|
||||
<sender>
|
||||
<email>#{User.first.email}</email>
|
||||
<url>#{User.first.email}</url>
|
||||
</sender>
|
||||
</head>"
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -4,7 +4,8 @@ include ApplicationHelper
|
|||
|
||||
describe ApplicationHelper do
|
||||
before do
|
||||
Factory.create(:user)
|
||||
@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
|
||||
|
|
@ -18,17 +19,25 @@ describe ApplicationHelper do
|
|||
end
|
||||
|
||||
it 'should discard posts where it does not know the type' do
|
||||
xml = "<XML><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>
|
||||
xml = "<XML>
|
||||
<head>
|
||||
<sender>
|
||||
<email>#{User.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
|
||||
end
|
||||
|
||||
it 'should discard types which are not of type post' do
|
||||
xml = "<XML><posts>
|
||||
xml = "<XML>
|
||||
<head>
|
||||
<sender>
|
||||
<email>#{User.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><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>
|
||||
|
|
@ -38,15 +47,35 @@ describe ApplicationHelper do
|
|||
end
|
||||
|
||||
|
||||
describe "parsing a sender" do
|
||||
it 'should be able to parse the sender of a collection' do
|
||||
status_messages = []
|
||||
10.times { status_messages << Factory.build(:status_message)}
|
||||
xml = Post.build_xml_for(status_messages)
|
||||
describe "parsing compliant XML object" do
|
||||
before do
|
||||
status_messages = []
|
||||
10.times { status_messages << Factory.build(:status_message)}
|
||||
@xml = Post.build_xml_for(status_messages)
|
||||
end
|
||||
|
||||
it 'should be able to verify the sender as a friend' do
|
||||
pending
|
||||
it 'should be able to parse the sender\'s unique id' 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
|
||||
body.should_not include "<head>"
|
||||
body.should_not include "</head>"
|
||||
body.should_not include "<posts>"
|
||||
body.should_not include "</posts>"
|
||||
body.should include "<post>"
|
||||
body.should include "</post>"
|
||||
end
|
||||
|
||||
it 'should be able to extract all posts to an array' do
|
||||
posts = parse_posts_from_xml(@xml)
|
||||
posts.is_a?(Array).should be true
|
||||
posts.count.should == 10
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -29,11 +29,7 @@ describe Diaspora do
|
|||
end
|
||||
|
||||
it "should provide the owner's email" do
|
||||
@xml.should include "<email>bob@aol.com</email>"
|
||||
end
|
||||
|
||||
it "should provide the owner's url" do
|
||||
pending "user does not have url field"
|
||||
@xml.should include "<email>#{User.first.email}</email>"
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue