diaspora/spec/workers/gather_open_graph_data_spec.rb
Jonne Haß 74a6f42501 Bye opengraph_parser, hi open_graph_reader
opengraph_parser is basically unmainted, issues are ignored
or deliberately closed without fixing. It pollutes the global
namespace and has no verification of correctness.

The opengraph gem has basically the same issues, not really maintained,
unreleased patches on master since over a year, not really smart either.

So I created my own version and while at it, why not strive try to be
complete and robust, although it's still a work in progress.

This also improves general URL detection by parsing them
from the message after stripping markdown.

An additional dependency was added to support
fetching sites that require cookies to work at all.
For the same reason Faraday's default redirect limit was
bumped.
2014-12-08 02:01:31 +01:00

91 lines
3.8 KiB
Ruby

require 'spec_helper'
describe Workers::GatherOpenGraphData do
before do
@ogsite_title = 'Homepage'
@ogsite_type = 'website'
@ogsite_image = 'http://www.we-support-open-graph.com/img/something.png'
@ogsite_url = 'http://www.we-support-open-graph.com'
@ogsite_description = 'Homepage'
@ogsite_body =
"<html><head><title>#{@ogsite_title}</title>
<meta property=\"og:title\" content=\"#{@ogsite_title}\"/>
<meta property=\"og:type\" content=\"#{@ogsite_type}\" />
<meta property=\"og:image\" content=\"#{@ogsite_image}\" />
<meta property=\"og:url\" content=\"#{@ogsite_url}\" />
<meta property=\"og:description\" content=\"#{@ogsite_description}\" />
</head><body></body></html>"
@oglong_title = "D" * 256
@oglong_url = 'http://www.we-are-too-long.com'
@oglong_body =
"<html><head><title>#{@oglong_title}</title>
<meta property=\"og:title\" content=\"#{@oglong_title}\"/>
<meta property=\"og:type\" content=\"#{@ogsite_type}\" />
<meta property=\"og:image\" content=\"#{@ogsite_image}\" />
<meta property=\"og:url\" content=\"#{@oglong_url}\" />
<meta property=\"og:description\" content=\"#{@ogsite_description}\" />
</head><body></body></html>"
@no_open_graph_url = 'http://www.we-do-not-support-open-graph.com/index.html'
@status_message = FactoryGirl.create(:status_message)
stub_request(:head, @ogsite_url).to_return(status: 200, body: "", headers: {'Content-Type' => 'text/html; utf-8'})
stub_request(:get, @ogsite_url).to_return(status: 200, body: @ogsite_body, headers: {'Content-Type' => 'text/html; utf-8'})
stub_request(:head, @no_open_graph_url).to_return(status: 200, body: "", headers: {'Content-Type' => 'text/html; utf-8'})
stub_request(:get, @no_open_graph_url).to_return(:status => 200, :body => '<html><head><title>Hi</title><body>hello there</body></html>', headers: {'Content-Type' => 'text/html; utf-8'})
stub_request(:head, @oglong_url).to_return(status: 200, body: "", headers: {'Content-Type' => 'text/html; utf-8'})
stub_request(:get, @oglong_url).to_return(status: 200, body: @oglong_body, headers: {'Content-Type' => 'text/html; utf-8'})
end
describe '.perform' do
it 'requests not data from the internet' do
Workers::GatherOpenGraphData.new.perform(@status_message.id, @ogsite_url)
expect(a_request(:get, @ogsite_url)).to have_been_made
end
it 'requests not data from the internet only once' do
2.times do |n|
Workers::GatherOpenGraphData.new.perform(@status_message.id, @ogsite_url)
end
expect(a_request(:get, @ogsite_url)).to have_been_made.times(1)
end
it 'creates one cache entry' do
Workers::GatherOpenGraphData.new.perform(@status_message.id, @ogsite_url)
ogc = OpenGraphCache.find_by_url(@ogsite_url)
expect(ogc.title).to eq(@ogsite_title)
expect(ogc.ob_type).to eq(@ogsite_type)
expect(ogc.image).to eq(@ogsite_image)
expect(ogc.url).to eq(@ogsite_url)
expect(ogc.description).to eq(@ogsite_description)
Workers::GatherOpenGraphData.new.perform(@status_message.id, @ogsite_url)
expect(OpenGraphCache.where(url: @ogsite_url).count).to eq(1)
end
it 'creates no cache entry for unsupported pages' do
Workers::GatherOpenGraphData.new.perform(@status_message.id, @no_open_graph_url)
expect(OpenGraphCache.find_by_url(@no_open_graph_url)).to be_nil
end
it 'gracefully handles a deleted post' do
expect {
Workers::GatherOpenGraphData.new.perform(0, @ogsite_url)
}.to_not raise_error
end
it 'truncates + inserts titles that are too long' do
Workers::GatherOpenGraphData.new.perform(@status_message.id, @oglong_url)
ogc = OpenGraphCache.find_by_url(@oglong_url)
expect(ogc).to be_truthy
expect(ogc.title.length).to be <= 255
end
end
end