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