diff --git a/lib/diaspora_federation/entities.rb b/lib/diaspora_federation/entities.rb index 7ab98e9..0a1e7b8 100644 --- a/lib/diaspora_federation/entities.rb +++ b/lib/diaspora_federation/entities.rb @@ -15,3 +15,12 @@ require "diaspora_federation/entities/photo" require "diaspora_federation/entities/status_message" require "diaspora_federation/entities/request" require "diaspora_federation/entities/participation" +require "diaspora_federation/entities/like" +require "diaspora_federation/entities/comment" +require "diaspora_federation/entities/account_deletion" +require "diaspora_federation/entities/message" +require "diaspora_federation/entities/conversation" +require "diaspora_federation/entities/relayable_retraction" +require "diaspora_federation/entities/reshare" +require "diaspora_federation/entities/retraction" +require "diaspora_federation/entities/signed_retraction" diff --git a/lib/diaspora_federation/entities/account_deletion.rb b/lib/diaspora_federation/entities/account_deletion.rb new file mode 100644 index 0000000..a0a81db --- /dev/null +++ b/lib/diaspora_federation/entities/account_deletion.rb @@ -0,0 +1,7 @@ +module DiasporaFederation + module Entities + class AccountDeletion < Entity + property :diaspora_id, xml_name: :diaspora_handle + end + end +end diff --git a/lib/diaspora_federation/entities/comment.rb b/lib/diaspora_federation/entities/comment.rb new file mode 100644 index 0000000..543930e --- /dev/null +++ b/lib/diaspora_federation/entities/comment.rb @@ -0,0 +1,12 @@ +module DiasporaFederation + module Entities + class Comment < Entity + property :guid + property :parent_guid + property :parent_author_signature + property :author_signature + property :text + property :diaspora_id, xml_name: :diaspora_handle + end + end +end diff --git a/lib/diaspora_federation/entities/conversation.rb b/lib/diaspora_federation/entities/conversation.rb new file mode 100644 index 0000000..e90709b --- /dev/null +++ b/lib/diaspora_federation/entities/conversation.rb @@ -0,0 +1,12 @@ +module DiasporaFederation + module Entities + class Conversation < Entity + property :guid + property :subject + property :created_at, default: -> { Time.now.utc } + entity :messages, [Entities::Message] + property :diaspora_id, xml_name: :diaspora_handle + property :participant_ids, xml_name: :participant_handles + end + end +end diff --git a/lib/diaspora_federation/entities/like.rb b/lib/diaspora_federation/entities/like.rb new file mode 100644 index 0000000..5d76188 --- /dev/null +++ b/lib/diaspora_federation/entities/like.rb @@ -0,0 +1,13 @@ +module DiasporaFederation + module Entities + class Like < Entity + property :positive + property :guid + property :target_type + property :parent_guid + property :parent_author_signature + property :author_signature + property :diaspora_id, xml_name: :diaspora_handle + end + end +end diff --git a/lib/diaspora_federation/entities/message.rb b/lib/diaspora_federation/entities/message.rb new file mode 100644 index 0000000..5eadac7 --- /dev/null +++ b/lib/diaspora_federation/entities/message.rb @@ -0,0 +1,14 @@ +module DiasporaFederation + module Entities + class Message < Entity + property :guid + property :parent_guid + property :parent_author_signature + property :author_signature + property :text + property :created_at, default: -> { Time.now.utc } + property :diaspora_id, xml_name: :diaspora_handle + property :conversation_guid + end + end +end diff --git a/lib/diaspora_federation/entities/relayable_retraction.rb b/lib/diaspora_federation/entities/relayable_retraction.rb new file mode 100644 index 0000000..11e5274 --- /dev/null +++ b/lib/diaspora_federation/entities/relayable_retraction.rb @@ -0,0 +1,11 @@ +module DiasporaFederation + module Entities + class RelayableRetraction < Entity + property :parent_author_signature + property :target_guid + property :target_type + property :sender_id, xml_name: :sender_handle + property :target_author_signature + end + end +end diff --git a/lib/diaspora_federation/entities/reshare.rb b/lib/diaspora_federation/entities/reshare.rb new file mode 100644 index 0000000..83647d7 --- /dev/null +++ b/lib/diaspora_federation/entities/reshare.rb @@ -0,0 +1,13 @@ +module DiasporaFederation + module Entities + class Reshare < Entity + property :root_diaspora_id # inconsistent, everywhere else it's "handle" + property :root_guid + property :guid + property :diaspora_id, xml_name: :diaspora_handle + property :public, default: true # always true? (we only reshare public posts) + property :created_at, default: -> { Time.now.utc } + property :provider_display_name, default: nil + end + end +end diff --git a/lib/diaspora_federation/entities/retraction.rb b/lib/diaspora_federation/entities/retraction.rb new file mode 100644 index 0000000..4c64137 --- /dev/null +++ b/lib/diaspora_federation/entities/retraction.rb @@ -0,0 +1,9 @@ +module DiasporaFederation + module Entities + class Retraction < Entity + property :post_guid + property :diaspora_id, xml_name: :diaspora_handle + property :type + end + end +end diff --git a/lib/diaspora_federation/entities/signed_retraction.rb b/lib/diaspora_federation/entities/signed_retraction.rb new file mode 100644 index 0000000..e648a02 --- /dev/null +++ b/lib/diaspora_federation/entities/signed_retraction.rb @@ -0,0 +1,10 @@ +module DiasporaFederation + module Entities + class SignedRetraction < Entity + property :target_guid + property :target_type + property :sender_id, xml_name: :sender_handle + property :target_author_signature + end + end +end diff --git a/lib/diaspora_federation/validators.rb b/lib/diaspora_federation/validators.rb index 5f4c7f3..07706e4 100644 --- a/lib/diaspora_federation/validators.rb +++ b/lib/diaspora_federation/validators.rb @@ -23,6 +23,7 @@ require "diaspora_federation/validators/rules/guid" require "diaspora_federation/validators/rules/not_nil" require "diaspora_federation/validators/rules/public_key" require "diaspora_federation/validators/rules/tag_count" +require "diaspora_federation/validators/rules/diaspora_id_count" module DiasporaFederation # Validators to perform basic sanity-checks on {DiasporaFederation::Entities federation entities}. @@ -42,3 +43,12 @@ require "diaspora_federation/validators/photo_validator" require "diaspora_federation/validators/location_validator" require "diaspora_federation/validators/status_message_validator" require "diaspora_federation/validators/participation_validator" +require "diaspora_federation/validators/like_validator" +require "diaspora_federation/validators/comment_validator" +require "diaspora_federation/validators/account_deletion_validator" +require "diaspora_federation/validators/message_validator" +require "diaspora_federation/validators/conversation_validator" +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" diff --git a/lib/diaspora_federation/validators/account_deletion_validator.rb b/lib/diaspora_federation/validators/account_deletion_validator.rb new file mode 100644 index 0000000..ad7e659 --- /dev/null +++ b/lib/diaspora_federation/validators/account_deletion_validator.rb @@ -0,0 +1,9 @@ +module DiasporaFederation + module Validators + class AccountDeletionValidator < Validation::Validator + include Validation + + rule :diaspora_id, %i(not_empty diaspora_id) + end + end +end diff --git a/lib/diaspora_federation/validators/comment_validator.rb b/lib/diaspora_federation/validators/comment_validator.rb new file mode 100644 index 0000000..9609dfb --- /dev/null +++ b/lib/diaspora_federation/validators/comment_validator.rb @@ -0,0 +1,20 @@ +module DiasporaFederation + module Validators + class CommentValidator < Validation::Validator + include Validation + + rule :guid, :guid + + rule :parent_guid, :guid + + rule :parent_author_signature, :not_empty + + rule :author_signature, :not_empty + + rule :text, [:not_empty, + length: {maximum: 65_535}] + + rule :diaspora_id, %i(not_empty diaspora_id) + end + end +end diff --git a/lib/diaspora_federation/validators/conversation_validator.rb b/lib/diaspora_federation/validators/conversation_validator.rb new file mode 100644 index 0000000..6a3036b --- /dev/null +++ b/lib/diaspora_federation/validators/conversation_validator.rb @@ -0,0 +1,13 @@ +module DiasporaFederation + module Validators + class ConversationValidator < Validation::Validator + include Validation + + rule :guid, :guid + + rule :diaspora_id, %i(not_empty diaspora_id) + + rule :participant_ids, diaspora_id_count: {maximum: 20} + end + end +end diff --git a/lib/diaspora_federation/validators/like_validator.rb b/lib/diaspora_federation/validators/like_validator.rb new file mode 100644 index 0000000..78b2a95 --- /dev/null +++ b/lib/diaspora_federation/validators/like_validator.rb @@ -0,0 +1,17 @@ +module DiasporaFederation + module Validators + class LikeValidator < Validation::Validator + include Validation + + rule :guid, :guid + + rule :parent_guid, :guid + + rule :parent_author_signature, :not_empty + + rule :author_signature, :not_empty + + rule :diaspora_id, %i(not_empty diaspora_id) + end + end +end diff --git a/lib/diaspora_federation/validators/message_validator.rb b/lib/diaspora_federation/validators/message_validator.rb new file mode 100644 index 0000000..0e9f244 --- /dev/null +++ b/lib/diaspora_federation/validators/message_validator.rb @@ -0,0 +1,19 @@ +module DiasporaFederation + module Validators + class MessageValidator < Validation::Validator + include Validation + + rule :guid, :guid + + rule :parent_guid, :guid + + rule :parent_author_signature, :not_empty + + rule :author_signature, :not_empty + + rule :diaspora_id, %i(not_empty diaspora_id) + + rule :conversation_guid, :guid + end + end +end diff --git a/lib/diaspora_federation/validators/relayable_retraction_validator.rb b/lib/diaspora_federation/validators/relayable_retraction_validator.rb new file mode 100644 index 0000000..38d5cc6 --- /dev/null +++ b/lib/diaspora_federation/validators/relayable_retraction_validator.rb @@ -0,0 +1,17 @@ +module DiasporaFederation + module Validators + class RelayableRetractionValidator < Validation::Validator + include Validation + + rule :parent_author_signature, :not_empty + + rule :target_guid, :guid + + rule :target_type, :not_empty + + rule :sender_id, %i(not_empty diaspora_id) + + rule :target_author_signature, :not_empty + end + end +end diff --git a/lib/diaspora_federation/validators/reshare_validator.rb b/lib/diaspora_federation/validators/reshare_validator.rb new file mode 100644 index 0000000..3f7f8cf --- /dev/null +++ b/lib/diaspora_federation/validators/reshare_validator.rb @@ -0,0 +1,17 @@ +module DiasporaFederation + module Validators + class ReshareValidator < Validation::Validator + include Validation + + rule :root_diaspora_id, %i(not_empty diaspora_id) + + rule :root_guid, :guid + + rule :guid, :guid + + rule :diaspora_id, %i(not_empty diaspora_id) + + rule :public, :boolean + end + end +end diff --git a/lib/diaspora_federation/validators/retraction_validator.rb b/lib/diaspora_federation/validators/retraction_validator.rb new file mode 100644 index 0000000..83897e6 --- /dev/null +++ b/lib/diaspora_federation/validators/retraction_validator.rb @@ -0,0 +1,13 @@ +module DiasporaFederation + module Validators + class RetractionValidator < Validation::Validator + include Validation + + rule :post_guid, :guid + + rule :diaspora_id, %i(not_empty diaspora_id) + + rule :type, :not_empty + end + end +end diff --git a/lib/diaspora_federation/validators/rules/diaspora_id_count.rb b/lib/diaspora_federation/validators/rules/diaspora_id_count.rb new file mode 100644 index 0000000..0a063c9 --- /dev/null +++ b/lib/diaspora_federation/validators/rules/diaspora_id_count.rb @@ -0,0 +1,32 @@ +module Validation + module Rule + # Rule for validating the number of Diaspora* ids in a string. + # The evaluated string is split at ";" and the result will be counted. + class DiasporaIdCount + attr_reader :params + + # @param [Hash] params + # @option params [Fixnum] :maximum maximum allowed id count + def initialize(params) + unless params.include?(:maximum) && params[:maximum].is_a?(Fixnum) + raise "A number has to be specified for :maximum" + end + + @params = params + end + + def error_key + :diaspora_id_count + end + + def valid_value?(value) + ids = value.split(";") + return false unless ids.count <= params[:maximum] + ids.each do |id| + return false unless DiasporaId.new.valid_value?(id) + end + true + end + end + end +end diff --git a/lib/diaspora_federation/validators/signed_retraction_validator.rb b/lib/diaspora_federation/validators/signed_retraction_validator.rb new file mode 100644 index 0000000..ebe041a --- /dev/null +++ b/lib/diaspora_federation/validators/signed_retraction_validator.rb @@ -0,0 +1,15 @@ +module DiasporaFederation + module Validators + class SignedRetractionValidator < Validation::Validator + include Validation + + rule :target_guid, :guid + + rule :target_type, :not_empty + + rule :sender_id, %i(not_empty diaspora_id) + + rule :target_author_signature, :not_empty + end + end +end diff --git a/spec/factories.rb b/spec/factories.rb index d68b25d..d2830a7 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -114,4 +114,77 @@ FactoryGirl.define do sender_id { generate(:diaspora_id) } recipient_id { generate(:diaspora_id) } end + + factory :comment_entity, class: DiasporaFederation::Entities::Comment do + guid + parent_guid { generate(:guid) } + parent_author_signature { generate(:signature) } + author_signature { generate(:signature) } + text "this is a very informative comment" + diaspora_id + end + + factory :like_entity, class: DiasporaFederation::Entities::Like do + positive 1 + guid + target_type "StatusMessage" + parent_guid { generate(:guid) } + parent_author_signature { generate(:signature) } + author_signature { generate(:signature) } + diaspora_id + end + + factory :account_deletion_entity, class: DiasporaFederation::Entities::AccountDeletion do + diaspora_id + end + + factory :conversation_entity, class: DiasporaFederation::Entities::Conversation do + guid + subject "this is a very informative subject" + created_at { DateTime.now.utc } + messages [] + diaspora_id + participant_ids { 3.times.map { generate(:diaspora_id) }.join(";") } + end + + factory :message_entity, class: DiasporaFederation::Entities::Message do + guid + parent_guid { generate(:guid) } + parent_author_signature { generate(:signature) } + author_signature { generate(:signature) } + text "this is a very informative text" + created_at { DateTime.now.utc } + diaspora_id + conversation_guid { generate(:guid) } + end + + factory :relayable_retraction_entity, class: DiasporaFederation::Entities::RelayableRetraction do + parent_author_signature { generate(:signature) } + target_guid { generate(:guid) } + target_type "StatusMessage" + sender_id { generate(:diaspora_id) } + target_author_signature { generate(:signature) } + end + + factory :reshare_entity, class: DiasporaFederation::Entities::Reshare do + root_diaspora_id { generate(:diaspora_id) } + root_guid { generate(:guid) } + guid + diaspora_id + public(true) + created_at { DateTime.now.utc } + end + + factory :retraction_entity, class: DiasporaFederation::Entities::Retraction do + post_guid { generate(:guid) } + diaspora_id + type "StatusMessage" + end + + factory :signed_retraction_entity, class: DiasporaFederation::Entities::SignedRetraction do + target_guid { generate(:guid) } + target_type "StatusMessage" + sender_id { generate(:diaspora_id) } + target_author_signature { generate(:signature) } + end end diff --git a/spec/lib/diaspora_federation/entities/account_deletion_spec.rb b/spec/lib/diaspora_federation/entities/account_deletion_spec.rb new file mode 100644 index 0000000..af9aa39 --- /dev/null +++ b/spec/lib/diaspora_federation/entities/account_deletion_spec.rb @@ -0,0 +1,17 @@ +module DiasporaFederation + describe Entities::AccountDeletion do + let(:data) { {diaspora_id: "me@goes.byebye.tld"} } + + let(:xml) { + <<-XML + + me@goes.byebye.tld + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/comment_spec.rb b/spec/lib/diaspora_federation/entities/comment_spec.rb new file mode 100644 index 0000000..06e024e --- /dev/null +++ b/spec/lib/diaspora_federation/entities/comment_spec.rb @@ -0,0 +1,29 @@ +module DiasporaFederation + describe Entities::Comment do + let(:data) { + {guid: "0123456789abcdef", + parent_guid: "fedcba9876543210", + parent_author_signature: "BBBBBB==", + author_signature: "AAAAAA==", + text: "my comment text", + diaspora_id: "bob@pod.somedomain.tld"} + } + + let(:xml) { + <<-XML + + 0123456789abcdef + fedcba9876543210 + BBBBBB== + AAAAAA== + my comment text + bob@pod.somedomain.tld + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/conversation_spec.rb b/spec/lib/diaspora_federation/entities/conversation_spec.rb new file mode 100644 index 0000000..efcfc45 --- /dev/null +++ b/spec/lib/diaspora_federation/entities/conversation_spec.rb @@ -0,0 +1,54 @@ +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(: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)}"} + } + + let(:xml) { + <<-XML + + #{data[:guid]} + #{data[:subject]} + #{data[:created_at]} + + #{msg1.guid} + #{msg1.parent_guid} + #{msg1.parent_author_signature} + #{msg1.author_signature} + #{msg1.text} + #{msg1.created_at} + #{msg1.diaspora_id} + #{msg1.conversation_guid} + + + #{msg2.guid} + #{msg2.parent_guid} + #{msg2.parent_author_signature} + #{msg2.author_signature} + #{msg2.text} + #{msg2.created_at} + #{msg2.diaspora_id} + #{msg2.conversation_guid} + + #{data[:diaspora_id]} + #{data[:participant_ids]} + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/like_spec.rb b/spec/lib/diaspora_federation/entities/like_spec.rb new file mode 100644 index 0000000..a926e71 --- /dev/null +++ b/spec/lib/diaspora_federation/entities/like_spec.rb @@ -0,0 +1,31 @@ +module DiasporaFederation + describe Entities::Like do + let(:data) { + {positive: true, + guid: "0123456789abcdef", + target_type: "Post", + parent_guid: "fedcba9876543210", + parent_author_signature: "BBBBBB==", + author_signature: "AAAAAA==", + diaspora_id: "luke@diaspora.example.tld"} + } + + let(:xml) { + <<-XML + + true + 0123456789abcdef + Post + fedcba9876543210 + BBBBBB== + AAAAAA== + luke@diaspora.example.tld + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/message_spec.rb b/spec/lib/diaspora_federation/entities/message_spec.rb new file mode 100644 index 0000000..93fb53f --- /dev/null +++ b/spec/lib/diaspora_federation/entities/message_spec.rb @@ -0,0 +1,24 @@ +module DiasporaFederation + describe Entities::Message do + let(:data) { FactoryGirl.attributes_for(:message_entity) } + + let(:xml) { + <<-XML + + #{data[:guid]} + #{data[:parent_guid]} + #{data[:parent_author_signature]} + #{data[:author_signature]} + #{data[:text]} + #{data[:created_at]} + #{data[:diaspora_id]} + #{data[:conversation_guid]} + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/relayable_retraction_spec.rb b/spec/lib/diaspora_federation/entities/relayable_retraction_spec.rb new file mode 100644 index 0000000..981fb3d --- /dev/null +++ b/spec/lib/diaspora_federation/entities/relayable_retraction_spec.rb @@ -0,0 +1,27 @@ +module DiasporaFederation + describe Entities::RelayableRetraction do + let(:data) { + {parent_author_signature: "AAAAAA=", + target_guid: "0123456789abcdef", + target_type: "Comment", + sender_id: "luke@diaspora.example.tld", + target_author_signature: "BBBBBB="} + } + + let(:xml) { + <<-XML + + AAAAAA= + 0123456789abcdef + Comment + luke@diaspora.example.tld + BBBBBB= + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/reshare_spec.rb b/spec/lib/diaspora_federation/entities/reshare_spec.rb new file mode 100644 index 0000000..ac83472 --- /dev/null +++ b/spec/lib/diaspora_federation/entities/reshare_spec.rb @@ -0,0 +1,35 @@ +module DiasporaFederation + describe Entities::Reshare do + before do + @datetime = DateTime.now.utc + end + + let(:data) { + {root_diaspora_id: "robert_root@pod.example.tld", + root_guid: "fedcba9876543210", + guid: "0123456789abcdef", + diaspora_id: "alice@diaspora.domain.tld", + public: true, + created_at: @datetime, + provider_display_name: "mobile"} + } + + let(:xml) { + <<-XML + + robert_root@pod.example.tld + fedcba9876543210 + 0123456789abcdef + alice@diaspora.domain.tld + true + #{@datetime} + mobile + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/retraction_spec.rb b/spec/lib/diaspora_federation/entities/retraction_spec.rb new file mode 100644 index 0000000..95098f1 --- /dev/null +++ b/spec/lib/diaspora_federation/entities/retraction_spec.rb @@ -0,0 +1,23 @@ +module DiasporaFederation + describe Entities::Retraction do + let(:data) { + {post_guid: "0123456789abcdef", + diaspora_id: "luke@diaspora.example.tld", + type: "StatusMessage"} + } + + let(:xml) { + <<-XML + + 0123456789abcdef + luke@diaspora.example.tld + StatusMessage + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/entities/signed_retraction_spec.rb b/spec/lib/diaspora_federation/entities/signed_retraction_spec.rb new file mode 100644 index 0000000..2fa0c76 --- /dev/null +++ b/spec/lib/diaspora_federation/entities/signed_retraction_spec.rb @@ -0,0 +1,25 @@ +module DiasporaFederation + describe Entities::SignedRetraction do + let(:data) { + {target_guid: "0123456789abcdef", + target_type: "StatusMessage", + sender_id: "luke@diaspora.example.tld", + target_author_signature: "AAAAAA=="} + } + + let(:xml) { + <<-XML + + 0123456789abcdef + StatusMessage + luke@diaspora.example.tld + AAAAAA== + +XML + } + + it_behaves_like "an Entity subclass" + + it_behaves_like "an XML Entity" + end +end diff --git a/spec/lib/diaspora_federation/validators/account_deletion_validator_spec.rb b/spec/lib/diaspora_federation/validators/account_deletion_validator_spec.rb new file mode 100644 index 0000000..4c3f834 --- /dev/null +++ b/spec/lib/diaspora_federation/validators/account_deletion_validator_spec.rb @@ -0,0 +1,12 @@ +module DiasporaFederation + describe Validators::AccountDeletionValidator do + let(:entity) { :account_deletion_entity } + + it_behaves_like "a common validator" + + it_behaves_like "a diaspora id validator" do + let(:property) { :diaspora_id } + let(:mandatory) { true } + end + end +end diff --git a/spec/lib/diaspora_federation/validators/comment_validator_spec.rb b/spec/lib/diaspora_federation/validators/comment_validator_spec.rb new file mode 100644 index 0000000..884bf69 --- /dev/null +++ b/spec/lib/diaspora_federation/validators/comment_validator_spec.rb @@ -0,0 +1,34 @@ +module DiasporaFederation + describe Validators::CommentValidator do + let(:entity) { :comment_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).each do |prop| + it_behaves_like "a guid validator" do + let(:property) { prop } + end + end + + context "#author_signature and #parent_author_signature" do + %i(author_signature parent_author_signature).each do |prop| + it_behaves_like "a property that mustn't be empty" do + let(:property) { prop } + end + end + end + + context "#text" do + it_behaves_like "a property with a value validation/restriction" do + let(:property) { :text } + let(:wrong_values) { ["", "a" * 65_536] } + let(:correct_values) { ["a" * 65_535] } + end + end + end +end diff --git a/spec/lib/diaspora_federation/validators/conversation_validator_spec.rb b/spec/lib/diaspora_federation/validators/conversation_validator_spec.rb new file mode 100644 index 0000000..3d2a550 --- /dev/null +++ b/spec/lib/diaspora_federation/validators/conversation_validator_spec.rb @@ -0,0 +1,25 @@ +module DiasporaFederation + describe Validators::ConversationValidator do + let(:entity) { :conversation_entity } + + it_behaves_like "a common validator" + + it_behaves_like "a diaspora id validator" do + let(:property) { :diaspora_id } + let(:mandatory) { true } + end + + it_behaves_like "a guid validator" do + let(:property) { :guid } + end + + context "participant_ids" do + # must not contain more than 20 participant handles + it_behaves_like "a property with a value validation/restriction" do + let(:property) { :participant_ids } + let(:wrong_values) { [21.times.map { FactoryGirl.generate(:diaspora_id) }.join(";")] } + let(:correct_values) { [20.times.map { FactoryGirl.generate(:diaspora_id) }.join(";")] } + end + end + end +end diff --git a/spec/lib/diaspora_federation/validators/like_validator_spec.rb b/spec/lib/diaspora_federation/validators/like_validator_spec.rb new file mode 100644 index 0000000..4cdaff4 --- /dev/null +++ b/spec/lib/diaspora_federation/validators/like_validator_spec.rb @@ -0,0 +1,25 @@ +module DiasporaFederation + describe Validators::LikeValidator do + let(:entity) { :like_entity } + it_behaves_like "a common validator" + + %i(guid parent_guid).each do |prop| + it_behaves_like "a guid validator" do + let(:property) { prop } + end + end + + context "#author_signature and #parent_author_signature" do + %i(author_signature parent_author_signature).each do |prop| + it_behaves_like "a property that mustn't be empty" do + let(:property) { prop } + end + end + end + + it_behaves_like "a diaspora id validator" do + let(:property) { :diaspora_id } + let(:mandatory) { true } + end + end +end diff --git a/spec/lib/diaspora_federation/validators/location_validator_spec.rb b/spec/lib/diaspora_federation/validators/location_validator_spec.rb index 40f0438..5297c2f 100644 --- a/spec/lib/diaspora_federation/validators/location_validator_spec.rb +++ b/spec/lib/diaspora_federation/validators/location_validator_spec.rb @@ -5,10 +5,8 @@ module DiasporaFederation context "#lat and #lng" do %i(lat lng).each do |prop| - it_behaves_like "a property with data-types restriction" do + it_behaves_like "a property that mustn't be empty" do let(:property) { prop } - let(:wrong_values) { [""] } - let(:correct_values) { [] } end end end diff --git a/spec/lib/diaspora_federation/validators/message_validator_spec.rb b/spec/lib/diaspora_federation/validators/message_validator_spec.rb new file mode 100644 index 0000000..120be13 --- /dev/null +++ b/spec/lib/diaspora_federation/validators/message_validator_spec.rb @@ -0,0 +1,27 @@ +module DiasporaFederation + describe Validators::MessageValidator do + let(:entity) { :message_entity } + it_behaves_like "a common validator" + + it_behaves_like "a diaspora id validator" do + let(:property) { :diaspora_id } + let(:mandatory) { true } + end + + context "#guid, #parent_guid, #conversation_guid" do + %i(guid parent_guid conversation_guid).each do |prop| + it_behaves_like "a guid validator" do + let(:property) { prop } + end + end + end + + context "#author_signature and #parent_author_signature" do + %i(author_signature parent_author_signature).each do |prop| + it_behaves_like "a property that mustn't be empty" do + let(:property) { prop } + end + end + end + end +end diff --git a/spec/lib/diaspora_federation/validators/participation_validator_spec.rb b/spec/lib/diaspora_federation/validators/participation_validator_spec.rb index a72154e..60e4cd5 100644 --- a/spec/lib/diaspora_federation/validators/participation_validator_spec.rb +++ b/spec/lib/diaspora_federation/validators/participation_validator_spec.rb @@ -19,10 +19,8 @@ module DiasporaFederation context "#target_type and #author_signature and #parent_author_signature" do %i(target_type author_signature parent_author_signature).each do |prop| - it_behaves_like "a property with data-types restriction" do + it_behaves_like "a property that mustn't be empty" do let(:property) { prop } - let(:wrong_values) { [""] } - let(:correct_values) { [] } end end end diff --git a/spec/lib/diaspora_federation/validators/person_validator_spec.rb b/spec/lib/diaspora_federation/validators/person_validator_spec.rb index 8b049e4..83640f2 100644 --- a/spec/lib/diaspora_federation/validators/person_validator_spec.rb +++ b/spec/lib/diaspora_federation/validators/person_validator_spec.rb @@ -20,7 +20,7 @@ module DiasporaFederation end describe "#profile" do - it_behaves_like "a property with data-types restriction" do + it_behaves_like "a property with a value validation/restriction" do let(:property) { :profile } let(:wrong_values) { [nil] } let(:correct_values) { [] } diff --git a/spec/lib/diaspora_federation/validators/photo_validator_spec.rb b/spec/lib/diaspora_federation/validators/photo_validator_spec.rb index 21eda89..abee4f8 100644 --- a/spec/lib/diaspora_federation/validators/photo_validator_spec.rb +++ b/spec/lib/diaspora_federation/validators/photo_validator_spec.rb @@ -23,17 +23,15 @@ module DiasporaFederation context "#remote_photo_path, #remote_photo_name" do %i(remote_photo_name remote_photo_path).each do |prop| - it_behaves_like "a property with data-types restriction" do + it_behaves_like "a property that mustn't be empty" do let(:property) { prop } - let(:wrong_values) { [""] } - let(:correct_values) { [] } end end end context "#height, #width" do %i(height width).each do |prop| - it_behaves_like "a property with data-types restriction" do + it_behaves_like "a property with a value validation/restriction" do let(:property) { prop } let(:wrong_values) { [true, :num, "asdf"] } let(:correct_values) { [123, "123"] } diff --git a/spec/lib/diaspora_federation/validators/profile_validator_spec.rb b/spec/lib/diaspora_federation/validators/profile_validator_spec.rb index 7996638..0eb7929 100644 --- a/spec/lib/diaspora_federation/validators/profile_validator_spec.rb +++ b/spec/lib/diaspora_federation/validators/profile_validator_spec.rb @@ -20,7 +20,7 @@ module DiasporaFederation %i(image_url image_url_medium image_url_small).each do |prop| describe "##{prop}" do - it_behaves_like "a property with data-types restriction" do + it_behaves_like "a property with a value validation/restriction" do let(:property) { prop } let(:wrong_values) { [] } let(:correct_values) { [nil] } @@ -54,7 +54,7 @@ module DiasporaFederation end describe "#birthday" do - it_behaves_like "a property with data-types restriction" do + it_behaves_like "a property with a value validation/restriction" do let(:property) { :birthday } let(:wrong_values) { ["asdf asdf", true, 1234] } let(:correct_values) { [nil, "", Date.parse("2013-06-29"), "2013-06-29"] } @@ -71,7 +71,7 @@ module DiasporaFederation describe "#tag_string" do # more than 5 tags are not allowed - it_behaves_like "a property with data-types restriction" do + it_behaves_like "a property with a value validation/restriction" do let(:property) { :tag_string } let(:wrong_values) { ["#i #have #too #many #tags #in #my #profile"] } let(:correct_values) { [] } diff --git a/spec/lib/diaspora_federation/validators/relayable_retraction_validator_spec.rb b/spec/lib/diaspora_federation/validators/relayable_retraction_validator_spec.rb new file mode 100644 index 0000000..8660241 --- /dev/null +++ b/spec/lib/diaspora_federation/validators/relayable_retraction_validator_spec.rb @@ -0,0 +1,23 @@ +module DiasporaFederation + describe Validators::RelayableRetractionValidator do + let(:entity) { :relayable_retraction_entity } + it_behaves_like "a common validator" + + it_behaves_like "a diaspora id validator" do + let(:property) { :sender_id } + let(:mandatory) { true } + end + + it_behaves_like "a guid validator" do + let(:property) { :target_guid } + end + + context "#parent_author_signature, #target_author_signature" do + %i(parent_author_signature target_author_signature).each do |prop| + it_behaves_like "a property that mustn't be empty" do + let(:property) { prop } + end + end + end + end +end diff --git a/spec/lib/diaspora_federation/validators/reshare_validator_spec.rb b/spec/lib/diaspora_federation/validators/reshare_validator_spec.rb new file mode 100644 index 0000000..b2dc070 --- /dev/null +++ b/spec/lib/diaspora_federation/validators/reshare_validator_spec.rb @@ -0,0 +1,27 @@ +module DiasporaFederation + describe Validators::ReshareValidator do + let(:entity) { :reshare_entity } + it_behaves_like "a common validator" + + context "#root_diaspora_id, #diaspora_id" do + %i(root_diaspora_id diaspora_id).each do |prop| + it_behaves_like "a diaspora id validator" do + let(:property) { prop } + let(:mandatory) { true } + end + end + end + + context "#root_guid, #guid" do + %i(root_guid guid).each do |prop| + it_behaves_like "a guid validator" do + let(:property) { prop } + end + end + end + + it_behaves_like "a boolean validator" do + let(:property) { :public } + end + end +end diff --git a/spec/lib/diaspora_federation/validators/retraction_validator_spec.rb b/spec/lib/diaspora_federation/validators/retraction_validator_spec.rb new file mode 100644 index 0000000..4c42c39 --- /dev/null +++ b/spec/lib/diaspora_federation/validators/retraction_validator_spec.rb @@ -0,0 +1,21 @@ +module DiasporaFederation + describe Validators::RetractionValidator do + let(:entity) { :retraction_entity } + it_behaves_like "a common validator" + + it_behaves_like "a guid validator" do + let(:property) { :post_guid } + end + + it_behaves_like "a diaspora id validator" do + let(:property) { :diaspora_id } + let(:mandatory) { true } + end + + context "#type" do + it_behaves_like "a property that mustn't be empty" do + let(:property) { :type } + end + end + end +end diff --git a/spec/lib/diaspora_federation/validators/rules/diaspora_id_count_spec.rb b/spec/lib/diaspora_federation/validators/rules/diaspora_id_count_spec.rb new file mode 100644 index 0000000..7e8ca66 --- /dev/null +++ b/spec/lib/diaspora_federation/validators/rules/diaspora_id_count_spec.rb @@ -0,0 +1,43 @@ +describe Validation::Rule::DiasporaIdCount do + let(:id_str) { 3.times.map { FactoryGirl.generate(:diaspora_id) }.join(";") } + + it "requires a parameter" do + validator = Validation::Validator.new({}) + expect { + validator.rule(:ids, :diaspora_id_count) + }.to raise_error ArgumentError + end + + it "validates less ids" do + validator = Validation::Validator.new(OpenStruct.new(ids: id_str)) + validator.rule(:ids, diaspora_id_count: {maximum: 5}) + + expect(validator).to be_valid + expect(validator.errors).to be_empty + end + + it "fails for less but non ids" do + bad_str = "user@example.com;i am a weird diaspora id @@@ ### 12345;shouldnt be reached by a rule" + validator = Validation::Validator.new(OpenStruct.new(ids: bad_str)) + validator.rule(:ids, diaspora_id_count: {maximum: 5}) + + expect(validator).not_to be_valid + expect(validator.errors).to include(:ids) + end + + it "validates exactly as many ids" do + validator = Validation::Validator.new(OpenStruct.new(ids: id_str)) + validator.rule(:ids, diaspora_id_count: {maximum: 3}) + + expect(validator).to be_valid + expect(validator.errors).to be_empty + end + + it "fails for too many ids" do + validator = Validation::Validator.new(OpenStruct.new(ids: id_str)) + validator.rule(:ids, diaspora_id_count: {maximum: 1}) + + expect(validator).not_to be_valid + expect(validator.errors).to include(:ids) + end +end diff --git a/spec/lib/diaspora_federation/validators/signed_retraction_validator_spec.rb b/spec/lib/diaspora_federation/validators/signed_retraction_validator_spec.rb new file mode 100644 index 0000000..36720eb --- /dev/null +++ b/spec/lib/diaspora_federation/validators/signed_retraction_validator_spec.rb @@ -0,0 +1,23 @@ +module DiasporaFederation + describe Validators::SignedRetractionValidator do + let(:entity) { :signed_retraction_entity } + it_behaves_like "a common validator" + + it_behaves_like "a diaspora id validator" do + let(:property) { :sender_id } + let(:mandatory) { true } + end + + it_behaves_like "a guid validator" do + let(:property) { :target_guid } + end + + context "#target_type, #target_author_signature" do + %i(target_type target_author_signature).each do |prop| + it_behaves_like "a property that mustn't be empty" do + let(:property) { prop } + end + end + end + end +end diff --git a/spec/lib/diaspora_federation/validators/web_finger_validator_spec.rb b/spec/lib/diaspora_federation/validators/web_finger_validator_spec.rb index 4e477d6..288d476 100644 --- a/spec/lib/diaspora_federation/validators/web_finger_validator_spec.rb +++ b/spec/lib/diaspora_federation/validators/web_finger_validator_spec.rb @@ -27,7 +27,7 @@ module DiasporaFederation # optional urls %i(alias_url salmon_url).each do |prop| describe "##{prop}" do - it_behaves_like "a property with data-types restriction" do + it_behaves_like "a property with a value validation/restriction" do let(:property) { prop } let(:wrong_values) { ["", "https://asdf$%.com", "example.com"] } let(:correct_values) { [nil] } diff --git a/spec/support/shared_validator_specs.rb b/spec/support/shared_validator_specs.rb index 52883d6..579beb5 100644 --- a/spec/support/shared_validator_specs.rb +++ b/spec/support/shared_validator_specs.rb @@ -16,7 +16,7 @@ shared_examples "a common validator" do end end -shared_examples "a property with data-types restriction" do +shared_examples "a property with a value validation/restriction" do it "fails if a wrong value is supplied" do wrong_values.each do |val| validator = described_class.new(entity_stub(entity, property => val)) @@ -34,6 +34,13 @@ shared_examples "a property with data-types restriction" do end end +shared_examples "a property that mustn't be empty" do + it_behaves_like "a property with a value validation/restriction" do + let(:wrong_values) { ["", nil] } + let(:correct_values) { [] } + end +end + shared_examples "a diaspora id validator" do it "must not be nil or empty if mandatory" do [nil, ""].each do |val|