diff --git a/lib/diaspora/exporter.rb b/lib/diaspora/exporter.rb index b560f729c..c6971348f 100644 --- a/lib/diaspora/exporter.rb +++ b/lib/diaspora/exporter.rb @@ -14,36 +14,45 @@ module Diaspora module XML def execute(user) builder = Nokogiri::XML::Builder.new do |xml| - xml.user { - xml.username user.username - xml.parent << user.person.to_xml - xml.serialized_private_key user.serialized_private_key - + xml.export { + xml.user { + xml.username user.username + xml.serialized_private_key user.serialized_private_key + + xml.parent << user.person.to_xml + } xml.aspects { user.aspects.each do |aspect| + puts aspect.people.inspect xml.aspect { - xml.id_ aspect.id + xml._id aspect.id xml.name aspect.name - - xml.people { + + xml.person_ids { aspect.people.each do |person| - xml.person person.to_xml + xml.person_id person.id end } - xml.posts { - aspect.posts.find_all_by_person_id(user.person.id).each do |post| - post_doc = post.to_xml - - post.comments.each do |comment| - post_doc << comment.to_xml - end - xml.post post_doc + xml.post_ids { + aspect.posts.each do |post| + xml.post_id post.id end } } end } + xml.posts { + user.raw_visible_posts.find_all_by_person_id(user.person.id).each do |post| + #post_doc = post.to_xml + + #post.comments.each do |comment| + # post_doc << comment.to_xml + #end + + xml.post post.to_xml + end + } } end diff --git a/lib/diaspora/importer.rb b/lib/diaspora/importer.rb index b8eb4d60c..b214d8007 100644 --- a/lib/diaspora/importer.rb +++ b/lib/diaspora/importer.rb @@ -12,9 +12,54 @@ module Diaspora module Importers module XML - def execute(user) + def execute(xml) + doc = Nokogiri::XML.parse(xml) + user, person = parse_user(doc) + user + + end + + def parse_user(doc) + user = User.new + user_doc = doc.xpath('/export/user') + user.username = user_doc.xpath('//user/username').text + user.serialized_private_key= user_doc.xpath('//user/serialized_private_key').text + person = Person.from_xml(user_doc.xpath('//user/person').to_s) + [user, person] + end + + def parse_aspects(doc) + aspects = [] + aspect_doc = doc.xpath('/export/aspects/aspect') + + aspect_doc.each do |x| + + puts x.to_s + puts; puts + + + aspect = Aspect.new + + aspect.id = x.xpath('//aspect/_id').text + aspect.name = x.xpath('//aspect/name').text + + aspect.post_ids = x.xpath('//aspect/post_ids/post_id').collect(&:text) + aspects << aspect + end + + aspects + + end + + def parse_people(doc) + end + + + def parse_posts(doc) + end + end end diff --git a/spec/lib/importer_spec.rb b/spec/lib/importer_spec.rb index 35b1e8b90..d6d067243 100644 --- a/spec/lib/importer_spec.rb +++ b/spec/lib/importer_spec.rb @@ -28,6 +28,7 @@ describe Diaspora::Importer do let!(:aspect6) { user3.aspect(:name => "Cats") } let!(:aspect7) { user4.aspect(:name => "Dogs") } let!(:aspect8) { user5.aspect(:name => "Hamsters") } + let!(:aspect9) { user5.aspect(:name => "Gophers") } # User1 posts one status messages to aspects (1-4), two other users post message to one aspect let(:status_message1) { user1.post(:status_message, :message => "One", :public => true, :to => aspect1.id) } @@ -36,21 +37,28 @@ describe Diaspora::Importer do let(:status_message4) { user1.post(:status_message, :message => "Four", :public => false, :to => aspect4.id) } let(:status_message5) { user2.post(:status_message, :message => "Five", :public => false, :to => aspect5.id) } let(:status_message6) { user3.post(:status_message, :message => "Six", :public => false, :to => aspect6.id) } + let(:status_message7) { user5.post(:status_message, :message => "Seven", :public => false, :to => aspect9.id) } before(:all) do - # Friend users + # Friend users with user1 friend_users( user1, aspect1, user2, aspect5 ) friend_users( user1, aspect2, user3, aspect6 ) friend_users( user1, aspect3, user4, aspect7 ) friend_users( user1, aspect4, user5, aspect8 ) - # Generate status messages and receive + # Friend users 4 and 5 + friend_users( user5, aspect9, user4, aspect7 ) + + # Generate status messages and receive for user1 user2.receive status_message1.to_diaspora_xml user3.receive status_message2.to_diaspora_xml user4.receive status_message3.to_diaspora_xml user5.receive status_message4.to_diaspora_xml user1.receive status_message5.to_diaspora_xml user1.receive status_message6.to_diaspora_xml + + # Generate status message and recieve between user4 and user5 + user4.receive status_message7.to_diaspora_xml end it 'should gut check this test' do @@ -67,6 +75,75 @@ describe Diaspora::Importer do user1.raw_visible_posts.count.should be 6 user1.raw_visible_posts.find_all_by_person_id(user1.person.id).count.should be 4 + user1.raw_visible_posts.find_all_by_person_id(user1.person.id).should_not include status_message7 + end + + context 'importing a user' do + + before(:all) do + # Generate exported XML for user1 + exporter = Diaspora::Exporter.new(Diaspora::Exporters::XML) + @xml = exporter.execute(user1) + @old_user = user1 + @old_aspects = user1.aspects + # Remove user1 from the server + user1.aspects.each( &:delete ) + user1.raw_visible_posts.find_all_by_person_id(user1.person.id).each( &:delete ) + user1.delete + + @importer = Diaspora::Importer.new(Diaspora::Importers::XML) + @doc = Nokogiri::XML::parse(@xml) + end + + it 'should import a user' do + user = @importer.execute(@xml) + + user.class.should == User + + end + + describe '#parse_user' do + before do + @user, @person = @importer.parse_user(@doc) + end + + it 'should set username' do + @user.username.should == @old_user.username + end + + it 'should set private key' do + @user.serialized_private_key.should == @old_user.serialized_private_key + end + + it 'should ensure a match between persons public and private keys' do + pending + end + end + + describe '#parse_aspects' do + before do + @aspects = @importer.parse_aspects(@doc) + end + + it 'should return an array' do + @aspects.count.should == 6 + end + + it 'should should have post ids' do + puts @aspects.inspect + @aspects.any?{|x| x.post_ids.count > 0}.should be true + end + + end + + describe '#parse_posts' do + it 'should have a users personal posts' do + pending + @user.raw_visible_posts.find_all_by_person_id(user1.person.id).count.should be 4 + end + end + + end end