diff --git a/lib/diaspora_federation/entities.rb b/lib/diaspora_federation/entities.rb index 0a1e7b8..c053164 100644 --- a/lib/diaspora_federation/entities.rb +++ b/lib/diaspora_federation/entities.rb @@ -12,6 +12,8 @@ require "diaspora_federation/entities/profile" require "diaspora_federation/entities/person" require "diaspora_federation/entities/location" require "diaspora_federation/entities/photo" +require "diaspora_federation/entities/poll_answer" +require "diaspora_federation/entities/poll" require "diaspora_federation/entities/status_message" require "diaspora_federation/entities/request" require "diaspora_federation/entities/participation" @@ -24,3 +26,4 @@ require "diaspora_federation/entities/relayable_retraction" require "diaspora_federation/entities/reshare" require "diaspora_federation/entities/retraction" require "diaspora_federation/entities/signed_retraction" +require "diaspora_federation/entities/poll_participation" diff --git a/lib/diaspora_federation/entities/poll.rb b/lib/diaspora_federation/entities/poll.rb new file mode 100644 index 0000000..310503a --- /dev/null +++ b/lib/diaspora_federation/entities/poll.rb @@ -0,0 +1,9 @@ +module DiasporaFederation + module Entities + class Poll < Entity + property :guid + property :question + entity :poll_answers, [Entities::PollAnswer] + end + end +end diff --git a/lib/diaspora_federation/entities/poll_answer.rb b/lib/diaspora_federation/entities/poll_answer.rb new file mode 100644 index 0000000..9d878f6 --- /dev/null +++ b/lib/diaspora_federation/entities/poll_answer.rb @@ -0,0 +1,8 @@ +module DiasporaFederation + module Entities + class PollAnswer < Entity + property :guid + property :answer + end + end +end diff --git a/lib/diaspora_federation/entities/poll_participation.rb b/lib/diaspora_federation/entities/poll_participation.rb new file mode 100644 index 0000000..8d671ab --- /dev/null +++ b/lib/diaspora_federation/entities/poll_participation.rb @@ -0,0 +1,11 @@ +module DiasporaFederation + module Entities + class PollParticipation < Entity + property :guid + property :parent_guid + property :parent_author_signature + property :diaspora_id, xml_name: :diaspora_handle + property :poll_answer_guid + end + end +end diff --git a/lib/diaspora_federation/entities/status_message.rb b/lib/diaspora_federation/entities/status_message.rb index 22b56ee..19b48e8 100644 --- a/lib/diaspora_federation/entities/status_message.rb +++ b/lib/diaspora_federation/entities/status_message.rb @@ -4,6 +4,7 @@ module DiasporaFederation property :raw_message entity :photos, [Entities::Photo], default: [] entity :location, Entities::Location, default: nil + entity :poll, Entities::Poll, default: nil property :guid property :diaspora_id, xml_name: :diaspora_handle property :public, default: false diff --git a/lib/diaspora_federation/validators.rb b/lib/diaspora_federation/validators.rb index 07706e4..2f5a985 100644 --- a/lib/diaspora_federation/validators.rb +++ b/lib/diaspora_federation/validators.rb @@ -52,3 +52,6 @@ require "diaspora_federation/validators/relayable_retraction_validator" require "diaspora_federation/validators/reshare_validator" require "diaspora_federation/validators/retraction_validator" require "diaspora_federation/validators/signed_retraction_validator" +require "diaspora_federation/validators/poll_answer_validator" +require "diaspora_federation/validators/poll_validator" +require "diaspora_federation/validators/poll_participation_validator" diff --git a/lib/diaspora_federation/validators/poll_answer_validator.rb b/lib/diaspora_federation/validators/poll_answer_validator.rb new file mode 100644 index 0000000..6b24e75 --- /dev/null +++ b/lib/diaspora_federation/validators/poll_answer_validator.rb @@ -0,0 +1,10 @@ +module DiasporaFederation + module Validators + class PollAnswerValidator < Validation::Validator + include Validation + + rule :guid, :guid + rule :answer, [:not_empty, length: {maximum: 255}] + end + end +end diff --git a/lib/diaspora_federation/validators/poll_participation_validator.rb b/lib/diaspora_federation/validators/poll_participation_validator.rb new file mode 100644 index 0000000..d3b9306 --- /dev/null +++ b/lib/diaspora_federation/validators/poll_participation_validator.rb @@ -0,0 +1,17 @@ +module DiasporaFederation + module Validators + class PollParticipationValidator < Validation::Validator + include Validation + + rule :guid, :guid + + rule :parent_guid, :guid + + rule :parent_author_signature, :not_empty + + rule :diaspora_id, %i(not_empty diaspora_id) + + rule :poll_answer_guid, :guid + end + end +end diff --git a/lib/diaspora_federation/validators/poll_validator.rb b/lib/diaspora_federation/validators/poll_validator.rb new file mode 100644 index 0000000..fd5384d --- /dev/null +++ b/lib/diaspora_federation/validators/poll_validator.rb @@ -0,0 +1,10 @@ +module DiasporaFederation + module Validators + class PollValidator < Validation::Validator + include Validation + + rule :guid, :guid + rule :question, [:not_empty, length: {maximum: 255}] + end + end +end diff --git a/spec/factories.rb b/spec/factories.rb index 8c188cd..d20ada5 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -5,6 +5,7 @@ def r_str end FactoryGirl.define do + initialize_with { new(attributes) } sequence(:guid) { UUID.generate :compact } sequence(:diaspora_id) {|n| "person-#{n}-#{r_str}@localhost:3000" } sequence(:public_key) { OpenSSL::PKey::RSA.generate(1024).public_key.export } @@ -53,8 +54,7 @@ FactoryGirl.define do url "http://localhost:3000/" exported_key { generate(:public_key) } profile { - DiasporaFederation::Entities::Profile.new( - FactoryGirl.attributes_for(:profile_entity, diaspora_id: diaspora_id)) + FactoryGirl.build(:profile_entity, diaspora_id: diaspora_id) } end @@ -188,4 +188,23 @@ FactoryGirl.define do sender_id { generate(:diaspora_id) } target_author_signature { generate(:signature) } end + + factory :poll_answer_entity, class: DiasporaFederation::Entities::PollAnswer do + guid + answer { "Obama is a bicycle" } + end + + factory :poll_entity, class: DiasporaFederation::Entities::Poll do + guid + question { "Select an answer" } + poll_answers { 3.times.map { FactoryGirl.build(:poll_answer_entity) } } + end + + factory :poll_participation_entity, class: DiasporaFederation::Entities::PollParticipation do + guid + parent_guid { generate(:guid) } + diaspora_id + parent_author_signature { generate(:signature) } + poll_answer_guid { generate(:guid) } + end end diff --git a/spec/lib/diaspora_federation/entities/conversation_spec.rb b/spec/lib/diaspora_federation/entities/conversation_spec.rb index efcfc45..585971f 100644 --- a/spec/lib/diaspora_federation/entities/conversation_spec.rb +++ b/spec/lib/diaspora_federation/entities/conversation_spec.rb @@ -1,18 +1,12 @@ module DiasporaFederation describe Entities::Conversation do - before do - @datetime = DateTime.now.utc - end - - let(:msg1) { Entities::Message.new(FactoryGirl.attributes_for(:message_entity)) } - let(:msg2) { Entities::Message.new(FactoryGirl.attributes_for(:message_entity)) } + let(:msg1) { FactoryGirl.build(:message_entity) } + let(:msg2) { FactoryGirl.build(:message_entity) } let(:data) { - {guid: FactoryGirl.generate(:guid), - subject: "very interesting conversation subject", - created_at: @datetime, - messages: [msg1, msg2], - diaspora_id: FactoryGirl.generate(:diaspora_id), - participant_ids: "#{FactoryGirl.generate(:diaspora_id)};#{FactoryGirl.generate(:diaspora_id)}"} + FactoryGirl.attributes_for(:conversation_entity).merge!( + messages: [msg1, msg2], + participant_ids: "#{FactoryGirl.generate(:diaspora_id)};#{FactoryGirl.generate(:diaspora_id)}" + ) } let(:xml) { diff --git a/spec/lib/diaspora_federation/entities/poll_answer_spec.rb b/spec/lib/diaspora_federation/entities/poll_answer_spec.rb new file mode 100644 index 0000000..4cb1e50 --- /dev/null +++ b/spec/lib/diaspora_federation/entities/poll_answer_spec.rb @@ -0,0 +1,18 @@ +module DiasporaFederation + describe Entities::PollAnswer do + let(:data) { FactoryGirl.attributes_for(:poll_answer_entity) } + + let(:xml) { + <<-XML + + #{data[:guid]} + #{data[:answer]} + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/poll_participation_spec.rb b/spec/lib/diaspora_federation/entities/poll_participation_spec.rb new file mode 100644 index 0000000..ac6dda7 --- /dev/null +++ b/spec/lib/diaspora_federation/entities/poll_participation_spec.rb @@ -0,0 +1,21 @@ +module DiasporaFederation + describe Entities::PollParticipation do + let(:data) { FactoryGirl.attributes_for(:poll_participation_entity) } + + let(:xml) { + <<-XML + + #{data[:guid]} + #{data[:parent_guid]} + #{data[:parent_author_signature]} + #{data[:diaspora_id]} + #{data[:poll_answer_guid]} + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/poll_spec.rb b/spec/lib/diaspora_federation/entities/poll_spec.rb new file mode 100644 index 0000000..b9572c8 --- /dev/null +++ b/spec/lib/diaspora_federation/entities/poll_spec.rb @@ -0,0 +1,19 @@ +module DiasporaFederation + describe Entities::Poll do + let(:data) { FactoryGirl.attributes_for(:poll_entity) } + + let(:xml) { + <<-XML + + #{data[:guid]} + #{data[:question]} +#{data[:poll_answers].map {|a| a.to_xml.to_s.indent(2) }.join("\n")} + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/status_message_spec.rb b/spec/lib/diaspora_federation/entities/status_message_spec.rb index dccb5e1..eb02727 100644 --- a/spec/lib/diaspora_federation/entities/status_message_spec.rb +++ b/spec/lib/diaspora_federation/entities/status_message_spec.rb @@ -1,19 +1,15 @@ module DiasporaFederation describe Entities::StatusMessage do - let(:photo1) { Entities::Photo.new(FactoryGirl.attributes_for(:photo_entity)) } - let(:photo2) { Entities::Photo.new(FactoryGirl.attributes_for(:photo_entity)) } - let(:location) { Entities::Location.new(FactoryGirl.attributes_for(:location_entity)) } + let(:photo1) { FactoryGirl.build(:photo_entity) } + let(:photo2) { FactoryGirl.build(:photo_entity) } + let(:location) { FactoryGirl.build(:location_entity) } let(:data) { - { - raw_message: "this is such an interesting text", + FactoryGirl.attributes_for(:status_message_entity).merge!( photos: [photo1, photo2], location: location, - guid: FactoryGirl.generate(:guid), - diaspora_id: FactoryGirl.generate(:diaspora_id), - public: true, - created_at: Time.zone.now, + poll: nil, provider_display_name: "something" - } + ) } let(:xml) { diff --git a/spec/lib/diaspora_federation/validators/poll_answer_validator_spec.rb b/spec/lib/diaspora_federation/validators/poll_answer_validator_spec.rb new file mode 100644 index 0000000..be1d1e5 --- /dev/null +++ b/spec/lib/diaspora_federation/validators/poll_answer_validator_spec.rb @@ -0,0 +1,21 @@ +module DiasporaFederation + describe Validators::PollAnswerValidator do + let(:entity) { :poll_answer_entity } + + it_behaves_like "a common validator" + + describe "#guid" do + it_behaves_like "a guid validator" do + let(:property) { :guid } + end + end + + describe "#answer" do + it_behaves_like "a property with a value validation/restriction" do + let(:property) { :answer } + let(:wrong_values) { [nil, "", "a" * 256] } + let(:correct_values) { ["a" * 255] } + end + end + end +end diff --git a/spec/lib/diaspora_federation/validators/poll_participation_validator_spec.rb b/spec/lib/diaspora_federation/validators/poll_participation_validator_spec.rb new file mode 100644 index 0000000..1ab876d --- /dev/null +++ b/spec/lib/diaspora_federation/validators/poll_participation_validator_spec.rb @@ -0,0 +1,26 @@ +module DiasporaFederation + describe Validators::PollParticipationValidator do + let(:entity) { :poll_participation_entity } + + it_behaves_like "a common validator" + + it_behaves_like "a diaspora id validator" do + let(:property) { :diaspora_id } + let(:mandatory) { true } + end + + %i(guid parent_guid poll_answer_guid).each do |prop| + describe "##{prop}" do + it_behaves_like "a guid validator" do + let(:property) { prop } + end + end + end + + describe "#parent_author_signature" do + it_behaves_like "a property that mustn't be empty" do + let(:property) { :parent_author_signature } + end + end + end +end diff --git a/spec/lib/diaspora_federation/validators/poll_validator_spec.rb b/spec/lib/diaspora_federation/validators/poll_validator_spec.rb new file mode 100644 index 0000000..521ea1d --- /dev/null +++ b/spec/lib/diaspora_federation/validators/poll_validator_spec.rb @@ -0,0 +1,21 @@ +module DiasporaFederation + describe Validators::PollValidator do + let(:entity) { :poll_entity } + + it_behaves_like "a common validator" + + describe "#guid" do + it_behaves_like "a guid validator" do + let(:property) { :guid } + end + end + + describe "#question" do + it_behaves_like "a property with a value validation/restriction" do + let(:property) { :question } + let(:wrong_values) { [nil, "", "a" * 256] } + let(:correct_values) { ["a" * 255] } + end + end + end +end