parent
cfbb89da6e
commit
e0da26c7ee
12 changed files with 200 additions and 1 deletions
|
|
@ -30,6 +30,7 @@ require "diaspora_federation/entities/poll_answer"
|
||||||
require "diaspora_federation/entities/poll"
|
require "diaspora_federation/entities/poll"
|
||||||
require "diaspora_federation/entities/poll_participation"
|
require "diaspora_federation/entities/poll_participation"
|
||||||
|
|
||||||
|
require "diaspora_federation/entities/embed"
|
||||||
require "diaspora_federation/entities/location"
|
require "diaspora_federation/entities/location"
|
||||||
|
|
||||||
require "diaspora_federation/entities/event"
|
require "diaspora_federation/entities/event"
|
||||||
|
|
|
||||||
44
lib/diaspora_federation/entities/embed.rb
Normal file
44
lib/diaspora_federation/entities/embed.rb
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
module DiasporaFederation
|
||||||
|
module Entities
|
||||||
|
# This entity is used to specify embed information about an URL that should be embedded.
|
||||||
|
#
|
||||||
|
# @see Validators::EmbedValidator
|
||||||
|
class Embed < Entity
|
||||||
|
# @!attribute [r] url
|
||||||
|
# URL that should be embedded.
|
||||||
|
# @return [String] url
|
||||||
|
property :url, :string, optional: true
|
||||||
|
|
||||||
|
# @!attribute [r] title
|
||||||
|
# The title of the embedded URL.
|
||||||
|
# @return [String] title
|
||||||
|
property :title, :string, optional: true
|
||||||
|
|
||||||
|
# @!attribute [r] description
|
||||||
|
# The description of the embedded URL.
|
||||||
|
# @return [String] description
|
||||||
|
property :description, :string, optional: true
|
||||||
|
|
||||||
|
# @!attribute [r] image
|
||||||
|
# The image of the embedded URL.
|
||||||
|
# @return [String] image
|
||||||
|
property :image, :string, optional: true
|
||||||
|
|
||||||
|
# @!attribute [r] nothing
|
||||||
|
# True, if nothing should be embedded.
|
||||||
|
# @return [String] nothing
|
||||||
|
property :nothing, :boolean, optional: true
|
||||||
|
|
||||||
|
# @return [String] string representation of this object
|
||||||
|
def to_s
|
||||||
|
"Embed#{":#{url}" if url}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def validate
|
||||||
|
super
|
||||||
|
|
||||||
|
raise ValidationError, "Either 'url' must be set or 'nothing' must be 'true'" unless nothing ^ url
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -36,6 +36,11 @@ module DiasporaFederation
|
||||||
# @return [Entities::Event] event
|
# @return [Entities::Event] event
|
||||||
entity :event, Entities::Event, optional: true
|
entity :event, Entities::Event, optional: true
|
||||||
|
|
||||||
|
# @!attribute [r] embed
|
||||||
|
# Optional embed information of an URL that should be embedded in the status message
|
||||||
|
# @return [Entities::Embed] embed
|
||||||
|
entity :embed, Entities::Embed, optional: true
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def validate
|
def validate
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
{"$ref": "#/definitions/reshare"},
|
{"$ref": "#/definitions/reshare"},
|
||||||
{"$ref": "#/definitions/profile"},
|
{"$ref": "#/definitions/profile"},
|
||||||
{"$ref": "#/definitions/location"},
|
{"$ref": "#/definitions/location"},
|
||||||
|
{"$ref": "#/definitions/embed"},
|
||||||
{"$ref": "#/definitions/photo"},
|
{"$ref": "#/definitions/photo"},
|
||||||
{"$ref": "#/definitions/poll"},
|
{"$ref": "#/definitions/poll"},
|
||||||
{"$ref": "#/definitions/poll_answer"}
|
{"$ref": "#/definitions/poll_answer"}
|
||||||
|
|
@ -373,6 +374,26 @@
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"embed": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"entity_type": {
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^embed$"
|
||||||
|
},
|
||||||
|
"entity_data": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"url": { "type": ["string", "null"] },
|
||||||
|
"title": { "type": ["string", "null"] },
|
||||||
|
"description": { "type": ["string", "null"] },
|
||||||
|
"image": { "type": ["string", "null"] },
|
||||||
|
"nothing": { "type": "boolean" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -207,6 +207,14 @@ module DiasporaFederation
|
||||||
edited_at { Time.now.utc }
|
edited_at { Time.now.utc }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Fabricator(:embed_entity, class_name: DiasporaFederation::Entities::Embed) do
|
||||||
|
url "https://example.org/"
|
||||||
|
title "Example Website"
|
||||||
|
description "This is an example!"
|
||||||
|
image "https://example.org/example.png"
|
||||||
|
nothing nil
|
||||||
|
end
|
||||||
|
|
||||||
Fabricator(:related_entity, class_name: DiasporaFederation::Entities::RelatedEntity) do
|
Fabricator(:related_entity, class_name: DiasporaFederation::Entities::RelatedEntity) do
|
||||||
author { Fabricate.sequence(:diaspora_id) }
|
author { Fabricate.sequence(:diaspora_id) }
|
||||||
local true
|
local true
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ require "diaspora_federation/validators/account_migration_validator"
|
||||||
require "diaspora_federation/validators/comment_validator"
|
require "diaspora_federation/validators/comment_validator"
|
||||||
require "diaspora_federation/validators/contact_validator"
|
require "diaspora_federation/validators/contact_validator"
|
||||||
require "diaspora_federation/validators/conversation_validator"
|
require "diaspora_federation/validators/conversation_validator"
|
||||||
|
require "diaspora_federation/validators/embed_validator"
|
||||||
require "diaspora_federation/validators/event_participation_validator"
|
require "diaspora_federation/validators/event_participation_validator"
|
||||||
require "diaspora_federation/validators/event_validator"
|
require "diaspora_federation/validators/event_validator"
|
||||||
require "diaspora_federation/validators/h_card_validator"
|
require "diaspora_federation/validators/h_card_validator"
|
||||||
|
|
|
||||||
13
lib/diaspora_federation/validators/embed_validator.rb
Normal file
13
lib/diaspora_federation/validators/embed_validator.rb
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
module DiasporaFederation
|
||||||
|
module Validators
|
||||||
|
# This validates a {Entities::Embed}.
|
||||||
|
class EmbedValidator < OptionalAwareValidator
|
||||||
|
include Validation
|
||||||
|
|
||||||
|
rule :url, :URI
|
||||||
|
rule :title, length: {maximum: 255}
|
||||||
|
rule :description, length: {maximum: 65_535}
|
||||||
|
rule :image, URI: %i[host path]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
56
spec/lib/diaspora_federation/entities/embed_spec.rb
Normal file
56
spec/lib/diaspora_federation/entities/embed_spec.rb
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
module DiasporaFederation
|
||||||
|
describe Entities::Embed do
|
||||||
|
let(:data) { Fabricate.attributes_for(:embed_entity) }
|
||||||
|
|
||||||
|
let(:xml) { <<-XML }
|
||||||
|
<embed>
|
||||||
|
<url>#{data[:url]}</url>
|
||||||
|
<title>#{data[:title]}</title>
|
||||||
|
<description>#{data[:description]}</description>
|
||||||
|
<image>#{data[:image]}</image>
|
||||||
|
</embed>
|
||||||
|
XML
|
||||||
|
|
||||||
|
let(:json) { <<-JSON }
|
||||||
|
{
|
||||||
|
"entity_type": "embed",
|
||||||
|
"entity_data": {
|
||||||
|
"url": "#{data[:url]}",
|
||||||
|
"title": "#{data[:title]}",
|
||||||
|
"description": "#{data[:description]}",
|
||||||
|
"image": "#{data[:image]}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSON
|
||||||
|
|
||||||
|
let(:string) { "Embed:#{data[:url]}" }
|
||||||
|
|
||||||
|
it_behaves_like "an Entity subclass"
|
||||||
|
|
||||||
|
it_behaves_like "an XML Entity"
|
||||||
|
|
||||||
|
it_behaves_like "a JSON Entity"
|
||||||
|
|
||||||
|
describe "#validate" do
|
||||||
|
it "allows 'url' to be set if 'nothing' is not true" do
|
||||||
|
expect { Entities::Embed.new(data) }.not_to raise_error
|
||||||
|
end
|
||||||
|
|
||||||
|
it "allows 'url' to be missing if 'nothing' is true" do
|
||||||
|
expect { Entities::Embed.new(nothing: true) }.not_to raise_error
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't allow 'url' to be set if 'nothing' is true" do
|
||||||
|
expect {
|
||||||
|
Entities::Embed.new(data.merge(nothing: true))
|
||||||
|
}.to raise_error Entity::ValidationError, "Either 'url' must be set or 'nothing' must be 'true'"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "doesn't allow 'url' to be missing if 'nothing' is not true" do
|
||||||
|
expect {
|
||||||
|
Entities::Embed.new({})
|
||||||
|
}.to raise_error Entity::ValidationError, "Either 'url' must be set or 'nothing' must be 'true'"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -10,6 +10,7 @@ module DiasporaFederation
|
||||||
location: location,
|
location: location,
|
||||||
poll: nil,
|
poll: nil,
|
||||||
event: nil,
|
event: nil,
|
||||||
|
embed: nil,
|
||||||
provider_display_name: "something"
|
provider_display_name: "something"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -137,6 +138,8 @@ XML
|
||||||
expect(parsed_instance.photos).to eq([])
|
expect(parsed_instance.photos).to eq([])
|
||||||
expect(parsed_instance.location).to be_nil
|
expect(parsed_instance.location).to be_nil
|
||||||
expect(parsed_instance.poll).to be_nil
|
expect(parsed_instance.poll).to be_nil
|
||||||
|
expect(parsed_instance.event).to be_nil
|
||||||
|
expect(parsed_instance.embed).to be_nil
|
||||||
expect(parsed_instance.public).to be_falsey
|
expect(parsed_instance.public).to be_falsey
|
||||||
expect(parsed_instance.provider_display_name).to be_nil
|
expect(parsed_instance.provider_display_name).to be_nil
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
module DiasporaFederation
|
||||||
|
describe Validators::EmbedValidator do
|
||||||
|
let(:entity) { :embed_entity }
|
||||||
|
it_behaves_like "a common validator"
|
||||||
|
|
||||||
|
describe "#url" do
|
||||||
|
it_behaves_like "a property with a value validation/restriction" do
|
||||||
|
let(:property) { :url }
|
||||||
|
let(:wrong_values) { %w[https://asdf$%.com example.com] }
|
||||||
|
let(:correct_values) { [nil, "https://example.org", "https://example.org/index.html"] }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#title" do
|
||||||
|
it_behaves_like "a length validator" do
|
||||||
|
let(:property) { :title }
|
||||||
|
let(:length) { 255 }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#description" do
|
||||||
|
it_behaves_like "a length validator" do
|
||||||
|
let(:property) { :description }
|
||||||
|
let(:length) { 65_535 }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#image" do
|
||||||
|
it_behaves_like "a property with a value validation/restriction" do
|
||||||
|
let(:property) { :image }
|
||||||
|
let(:wrong_values) { %w[https://asdf$%.com example.com] }
|
||||||
|
let(:correct_values) { [nil] }
|
||||||
|
end
|
||||||
|
|
||||||
|
it_behaves_like "a url path validator" do
|
||||||
|
let(:property) { :image }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -27,7 +27,7 @@ module DiasporaFederation
|
||||||
describe "##{prop}" do
|
describe "##{prop}" do
|
||||||
it_behaves_like "a property with a value validation/restriction" do
|
it_behaves_like "a property with a value validation/restriction" do
|
||||||
let(:property) { prop }
|
let(:property) { prop }
|
||||||
let(:wrong_values) { %w[https://asdf$.com example.com] }
|
let(:wrong_values) { %w[https://asdf$%.com example.com] }
|
||||||
let(:correct_values) { [nil] }
|
let(:correct_values) { [nil] }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -277,6 +277,13 @@ shared_examples "a url validator without path" do
|
||||||
end
|
end
|
||||||
|
|
||||||
shared_examples "a url path validator" do
|
shared_examples "a url path validator" do
|
||||||
|
it "validates url with a path" do
|
||||||
|
validator = described_class.new(entity_stub(entity, property => "https://example.com/some/path"))
|
||||||
|
|
||||||
|
expect(validator).to be_valid
|
||||||
|
expect(validator.errors).to be_empty
|
||||||
|
end
|
||||||
|
|
||||||
it "fails for url with special chars" do
|
it "fails for url with special chars" do
|
||||||
validator = described_class.new(entity_stub(entity, property => "https://asdf$%.com/some/path"))
|
validator = described_class.new(entity_stub(entity, property => "https://asdf$%.com/some/path"))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue