onebox 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +7 -452
- data/Gemfile +1 -1
- data/README.md +23 -45
- data/lib/onebox.rb +21 -13
- data/lib/onebox/engine.rb +53 -43
- data/lib/onebox/engine/amazon_onebox.rb +34 -7
- data/lib/onebox/engine/classic_google_maps_onebox.rb +37 -0
- data/lib/onebox/engine/github_blob_onebox.rb +27 -7
- data/lib/onebox/engine/github_commit_onebox.rb +8 -15
- data/lib/onebox/engine/github_gist_onebox.rb +10 -10
- data/lib/onebox/engine/github_pullrequest_onebox.rb +7 -15
- data/lib/onebox/engine/google_play_app_onebox.rb +30 -0
- data/lib/onebox/engine/html.rb +10 -1
- data/lib/onebox/engine/image_onebox.rb +13 -0
- data/lib/onebox/engine/stack_exchange_onebox.rb +25 -11
- data/lib/onebox/engine/standard_embed.rb +48 -0
- data/lib/onebox/engine/twitter_status_onebox.rb +100 -0
- data/lib/onebox/engine/whitelisted_generic_onebox.rb +223 -0
- data/lib/onebox/engine/wikipedia_onebox.rb +27 -5
- data/lib/onebox/engine/youtube_onebox.rb +22 -0
- data/lib/onebox/helpers.rb +24 -0
- data/lib/onebox/layout.rb +67 -0
- data/lib/onebox/layout_support.rb +16 -0
- data/lib/onebox/matcher.rb +6 -1
- data/lib/onebox/preview.rb +19 -6
- data/lib/onebox/version.rb +1 -1
- data/lib/onebox/view.rb +7 -12
- data/onebox.gemspec +7 -5
- data/spec/fixtures/amazon.response +1336 -2971
- data/spec/fixtures/githubblob.response +49 -921
- data/spec/fixtures/{android.response → googleplayapp.response} +1 -1
- data/spec/fixtures/stackexchange.response +1 -1889
- data/spec/fixtures/twitterstatus.response +3006 -0
- data/spec/fixtures/youtube-json.response +1 -0
- data/spec/fixtures/youtube.response +1625 -0
- data/spec/lib/onebox/engine/amazon_onebox_spec.rb +5 -20
- data/spec/lib/onebox/engine/classic_google_maps_onebox_spec.rb +28 -0
- data/spec/lib/onebox/engine/github_blob_onebox_spec.rb +6 -15
- data/spec/lib/onebox/engine/github_commit_onebox_spec.rb +14 -22
- data/spec/lib/onebox/engine/github_gist_onebox_spec.rb +6 -14
- data/spec/lib/onebox/engine/github_pullrequest_onebox_spec.rb +14 -26
- data/spec/lib/onebox/engine/google_play_app_onebox_spec.rb +28 -0
- data/spec/lib/onebox/engine/html_spec.rb +4 -6
- data/spec/lib/onebox/engine/json_spec.rb +4 -6
- data/spec/lib/onebox/engine/stack_exchange_onebox_spec.rb +4 -17
- data/spec/lib/onebox/engine/twitter_status_onebox_spec.rb +103 -0
- data/spec/lib/onebox/engine/whitelisted_generic_onebox_spec.rb +51 -0
- data/spec/lib/onebox/engine/wikipedia_onebox_spec.rb +4 -17
- data/spec/lib/onebox/engine/youtube_onebox_spec.rb +17 -0
- data/spec/lib/onebox/engine_spec.rb +35 -32
- data/spec/lib/onebox/layout_spec.rb +77 -0
- data/spec/lib/onebox/matcher_spec.rb +0 -15
- data/spec/lib/onebox/preview_spec.rb +39 -9
- data/spec/lib/onebox_spec.rb +15 -11
- data/spec/spec_helper.rb +60 -4
- data/spec/support/html_spec_helper.rb +2 -1
- data/templates/_layout.mustache +11 -4
- data/templates/amazon.mustache +4 -3
- data/templates/githubblob.mustache +7 -5
- data/templates/githubcommit.mustache +20 -11
- data/templates/githubpullrequest.mustache +19 -12
- data/templates/googleplayapp.mustache +4 -0
- data/templates/stackexchange.mustache +19 -3
- data/templates/twitterstatus.mustache +12 -0
- data/templates/whitelistedgeneric.mustache +5 -0
- data/templates/wikipedia.mustache +4 -3
- metadata +57 -166
- data/lib/onebox/engine/bliptv_onebox.rb +0 -28
- data/lib/onebox/engine/clikthrough_onebox.rb +0 -25
- data/lib/onebox/engine/college_humor_onebox.rb +0 -27
- data/lib/onebox/engine/dailymotion_onebox.rb +0 -28
- data/lib/onebox/engine/dotsub_onebox.rb +0 -27
- data/lib/onebox/engine/example_onebox.rb +0 -24
- data/lib/onebox/engine/flickr_onebox.rb +0 -26
- data/lib/onebox/engine/funny_or_die_onebox.rb +0 -28
- data/lib/onebox/engine/hulu_onebox.rb +0 -29
- data/lib/onebox/engine/imgur_image_onebox.rb +0 -26
- data/lib/onebox/engine/itunes_onebox.rb +0 -28
- data/lib/onebox/engine/kinomap_onebox.rb +0 -27
- data/lib/onebox/engine/nfb_onebox.rb +0 -28
- data/lib/onebox/engine/open_graph.rb +0 -11
- data/lib/onebox/engine/qik_onebox.rb +0 -25
- data/lib/onebox/engine/revision3_onebox.rb +0 -27
- data/lib/onebox/engine/slideshare_onebox.rb +0 -27
- data/lib/onebox/engine/sound_cloud_onebox.rb +0 -27
- data/lib/onebox/engine/spotify_onebox.rb +0 -27
- data/lib/onebox/engine/ted_onebox.rb +0 -28
- data/lib/onebox/engine/twitter_onebox.rb +0 -31
- data/lib/onebox/engine/viddler_onebox.rb +0 -28
- data/lib/onebox/engine/vimeo_onebox.rb +0 -27
- data/lib/onebox/engine/yfrog_onebox.rb +0 -28
- data/spec/fixtures/bliptv.response +0 -724
- data/spec/fixtures/clikthrough.response +0 -1472
- data/spec/fixtures/collegehumor.response +0 -1272
- data/spec/fixtures/dailymotion.response +0 -575
- data/spec/fixtures/dotsub.response +0 -1257
- data/spec/fixtures/example.response +0 -50
- data/spec/fixtures/flickr.response +0 -1292
- data/spec/fixtures/funnyordie.response +0 -2010
- data/spec/fixtures/githubgist.response +0 -468
- data/spec/fixtures/hulu.response +0 -339
- data/spec/fixtures/imguralbum.response +0 -941
- data/spec/fixtures/imgurimage.response +0 -872
- data/spec/fixtures/itunes.response +0 -402
- data/spec/fixtures/kinomap.response +0 -299
- data/spec/fixtures/nfb.response +0 -810
- data/spec/fixtures/opengraph.response +0 -27
- data/spec/fixtures/qik.response +0 -371
- data/spec/fixtures/revision3.response +0 -985
- data/spec/fixtures/rottentomatoesfresh.response +0 -3275
- data/spec/fixtures/rottentomatoesincomplete.response +0 -2313
- data/spec/fixtures/rottentomatoesrotten.response +0 -3549
- data/spec/fixtures/slideshare.response +0 -1745
- data/spec/fixtures/soundcloud.response +0 -1409
- data/spec/fixtures/spotify.response +0 -250
- data/spec/fixtures/ted.response +0 -1341
- data/spec/fixtures/twitter.response +0 -1712
- data/spec/fixtures/viddler.response +0 -442
- data/spec/fixtures/vimeo.response +0 -571
- data/spec/fixtures/yfrog.response +0 -464
- data/spec/lib/onebox/engine/bliptv_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/clikthrough_onebox_spec.rb +0 -29
- data/spec/lib/onebox/engine/college_humor_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/dailymotion_onebox_spec.rb +0 -39
- data/spec/lib/onebox/engine/dotsub_onebox_spec.rb +0 -39
- data/spec/lib/onebox/engine/example_onebox_spec.rb +0 -21
- data/spec/lib/onebox/engine/flickr_onebox_spec.rb +0 -33
- data/spec/lib/onebox/engine/funny_or_die_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/hulu_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/imgur_image_onebox_spec.rb +0 -29
- data/spec/lib/onebox/engine/itunes_onebox_spec.rb +0 -29
- data/spec/lib/onebox/engine/kinomap_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/nfb_onebox_spec.rb +0 -38
- data/spec/lib/onebox/engine/open_graph_spec.rb +0 -27
- data/spec/lib/onebox/engine/qik_onebox_spec.rb +0 -38
- data/spec/lib/onebox/engine/revision3_onebox_spec.rb +0 -39
- data/spec/lib/onebox/engine/slideshare_onebox_spec.rb +0 -33
- data/spec/lib/onebox/engine/sound_cloud_onebox_spec.rb +0 -39
- data/spec/lib/onebox/engine/spotify_onebox_spec.rb +0 -36
- data/spec/lib/onebox/engine/ted_onebox_spec.rb +0 -33
- data/spec/lib/onebox/engine/twitter_onebox_spec.rb +0 -47
- data/spec/lib/onebox/engine/viddler_onebox_spec.rb +0 -39
- data/spec/lib/onebox/engine/vimeo_onebox_spec.rb +0 -37
- data/spec/lib/onebox/engine/yfrog_onebox_spec.rb +0 -33
- data/spec/lib/onebox/view_spec.rb +0 -16
- data/templates/bliptv.mustache +0 -5
- data/templates/clikthrough.mustache +0 -4
- data/templates/collegehumor.mustache +0 -5
- data/templates/dailymotion.mustache +0 -5
- data/templates/dotsub.mustache +0 -5
- data/templates/example.mustache +0 -2
- data/templates/flickr.mustache +0 -4
- data/templates/funnyordie.mustache +0 -6
- data/templates/githubgist.mustache +0 -3
- data/templates/hulu.mustache +0 -6
- data/templates/imgurimage.mustache +0 -3
- data/templates/itunes.mustache +0 -4
- data/templates/kinomap.mustache +0 -5
- data/templates/nfb.mustache +0 -5
- data/templates/qik.mustache +0 -4
- data/templates/revision3.mustache +0 -5
- data/templates/slideshare.mustache +0 -4
- data/templates/soundcloud.mustache +0 -5
- data/templates/spotify.mustache +0 -4
- data/templates/ted.mustache +0 -5
- data/templates/twitter.mustache +0 -7
- data/templates/viddler.mustache +0 -5
- data/templates/vimeo.mustache +0 -5
- data/templates/yfrog.mustache +0 -4
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Onebox::Engine::WhitelistedGenericOnebox do
|
|
4
|
+
|
|
5
|
+
describe ".===" do
|
|
6
|
+
before do
|
|
7
|
+
described_class.whitelist = %w(eviltrout.com discourse.org)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "matches an entire domain" do
|
|
11
|
+
expect(described_class === URI('http://eviltrout.com/resource')).to eq(true)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "matches a subdomain" do
|
|
15
|
+
expect(described_class === URI('http://www.eviltrout.com/resource')).to eq(true)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "doesn't match a different domain" do
|
|
19
|
+
expect(described_class === URI('http://goodtuna.com/resource')).to eq(false)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "doesn't match the period as any character" do
|
|
23
|
+
expect(described_class === URI('http://eviltrouticom/resource')).to eq(false)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "doesn't match a prefixed domain" do
|
|
27
|
+
expect(described_class === URI('http://aneviltrout.com/resource')).to eq(false)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
describe 'rewrites' do
|
|
33
|
+
class DummyOnebox < Onebox::Engine::WhitelistedGenericOnebox
|
|
34
|
+
def generic_html
|
|
35
|
+
"<iframe src='https://youtube.com/asdf'></iframe>"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "doesn't rewrite URLs that arent in the list" do
|
|
40
|
+
Onebox::Engine::WhitelistedGenericOnebox.rewrites = []
|
|
41
|
+
DummyOnebox.new("http://youtube.com").to_html.should == "<iframe src='https://youtube.com/asdf'></iframe>"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "rewrites URLs when whitelisted" do
|
|
45
|
+
Onebox::Engine::WhitelistedGenericOnebox.rewrites = %w(youtube.com)
|
|
46
|
+
DummyOnebox.new("http://youtube.com").to_html.should == "<iframe src='//youtube.com/asdf'></iframe>"
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
end
|
|
@@ -3,31 +3,18 @@ require "spec_helper"
|
|
|
3
3
|
describe Onebox::Engine::WikipediaOnebox do
|
|
4
4
|
before(:all) do
|
|
5
5
|
@link = "http://en.wikipedia.org/wiki/Kevin_Bacon"
|
|
6
|
-
fake(@link, response(described_class.template_name))
|
|
7
6
|
end
|
|
8
|
-
before(:each) { Onebox.defaults.cache.clear }
|
|
9
|
-
|
|
10
|
-
let(:link) { @link }
|
|
11
7
|
|
|
8
|
+
include_context "engines"
|
|
12
9
|
it_behaves_like "an engine"
|
|
13
10
|
|
|
14
11
|
describe "#to_html" do
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
it "returns the product URL" do
|
|
18
|
-
expect(html).to include(link)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it "returns the article title" do
|
|
22
|
-
expect(html).to include("Kevin Bacon")
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it "returns the article img src" do
|
|
12
|
+
it "includes article image" do
|
|
26
13
|
expect(html).to include("225px-Kevin_Bacon_Comic-Con_2012.jpg")
|
|
27
14
|
end
|
|
28
15
|
|
|
29
|
-
it "
|
|
30
|
-
expect(html).to include("Kevin Norwood Bacon
|
|
16
|
+
it "includes summary" do
|
|
17
|
+
expect(html).to include("Kevin Norwood Bacon (born July 8, 1958)")
|
|
31
18
|
end
|
|
32
19
|
end
|
|
33
20
|
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Onebox::Engine::YoutubeOnebox do
|
|
4
|
+
before do
|
|
5
|
+
fake("https://www.youtube.com/watch?v=21Lk4YiASMo", response("youtube"))
|
|
6
|
+
fake("http://www.youtube.com/oembed?format=json&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D21Lk4YiASMo", response("youtube-json"))
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "should add wmode=opaque" do
|
|
10
|
+
Onebox.preview('https://www.youtube.com/watch?v=21Lk4YiASMo').to_s.should match(/wmode=opaque/)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should rewrite URLs to be agnostic" do
|
|
14
|
+
Onebox.preview('https://www.youtube.com/watch?v=21Lk4YiASMo').to_s.should match(/"\/\//)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
@@ -1,31 +1,26 @@
|
|
|
1
1
|
require "spec_helper"
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
describe Onebox::Engine do
|
|
4
|
+
class OneboxEngineExample
|
|
5
|
+
include Onebox::Engine
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
def to_html
|
|
8
|
+
"Hello #{link}"
|
|
9
|
+
end
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
def data
|
|
12
|
+
{ foo: raw[:key], url: @url }
|
|
13
|
+
end
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
layout.view.template = %|<div class="onebox"><a href="{{url}}"></a></div>|
|
|
15
|
+
def raw
|
|
16
|
+
{ key: "value" }
|
|
17
17
|
end
|
|
18
18
|
end
|
|
19
|
-
end
|
|
20
19
|
|
|
21
|
-
describe
|
|
22
|
-
|
|
23
|
-
it "returns the onebox wrapper" do
|
|
24
|
-
html = OneboxEngineExample.new("foo").to_html
|
|
25
|
-
expect(html).to include(%|class="onebox"|)
|
|
26
|
-
end
|
|
20
|
+
describe "#link" do
|
|
21
|
+
before { Onebox::View.any_instance.stub(:template) { %|this shold be a template| } }
|
|
27
22
|
|
|
28
|
-
it "
|
|
23
|
+
it "escapes `link`" do
|
|
29
24
|
html = OneboxEngineExample.new(%|http://foo.com" onscript="alert('foo')|).to_html
|
|
30
25
|
expect(html).not_to include(%|onscript="alert('foo')|)
|
|
31
26
|
end
|
|
@@ -53,13 +48,20 @@ describe Onebox::Engine do
|
|
|
53
48
|
end
|
|
54
49
|
end
|
|
55
50
|
|
|
51
|
+
describe '.placeholder_html' do
|
|
52
|
+
let(:onebox) { OneboxEngineExample.new('http://eviltrout.com') }
|
|
53
|
+
it "returns `to_html` by default" do
|
|
54
|
+
expect(onebox.to_html).to eq(onebox.placeholder_html)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
56
58
|
describe ".===" do
|
|
57
59
|
class OneboxEngineTripleEqual
|
|
58
60
|
include Onebox::Engine
|
|
59
61
|
@@matcher = /example/
|
|
60
62
|
end
|
|
61
63
|
it "returns true if argument matches the matcher" do
|
|
62
|
-
result = OneboxEngineTripleEqual === "http://www.example.com/product/5?var=foo&bar=5"
|
|
64
|
+
result = OneboxEngineTripleEqual === URI("http://www.example.com/product/5?var=foo&bar=5")
|
|
63
65
|
expect(result).to eq(true)
|
|
64
66
|
end
|
|
65
67
|
end
|
|
@@ -79,21 +81,22 @@ describe Onebox::Engine do
|
|
|
79
81
|
end
|
|
80
82
|
end
|
|
81
83
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
describe ".onebox_name" do
|
|
87
|
+
module ScopeForTemplateName
|
|
88
|
+
class TemplateNameOnebox
|
|
89
|
+
include Onebox::Engine
|
|
87
90
|
end
|
|
91
|
+
end
|
|
88
92
|
|
|
89
|
-
|
|
93
|
+
let(:onebox_name) { ScopeForTemplateName::TemplateNameOnebox.onebox_name }
|
|
90
94
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
95
|
+
it "should not include the scope" do
|
|
96
|
+
expect(onebox_name).not_to include("ScopeForTemplateName", "scopefortemplatename")
|
|
97
|
+
end
|
|
94
98
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
end
|
|
99
|
+
it "should not include the word Onebox" do
|
|
100
|
+
expect(onebox_name).not_to include("onebox", "Onebox")
|
|
98
101
|
end
|
|
99
102
|
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Onebox::Layout do
|
|
4
|
+
let(:cache) { Moneta.new(:Memory, expires: true, serializer: :json) }
|
|
5
|
+
let(:record) { {} }
|
|
6
|
+
let(:onebox) { described_class.new("amazon", record, cache) }
|
|
7
|
+
let(:html) { onebox.to_html }
|
|
8
|
+
|
|
9
|
+
describe ".template_path" do
|
|
10
|
+
let(:template_path) { onebox.template_path }
|
|
11
|
+
|
|
12
|
+
before(:each) do
|
|
13
|
+
Onebox.options.load_paths << "directory_a"
|
|
14
|
+
Onebox.options.load_paths << "directory_b"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "when template exists in directory_b" do
|
|
18
|
+
before(:each) do
|
|
19
|
+
allow_any_instance_of(described_class).to receive(:template?) do |path|
|
|
20
|
+
path == "directory_b"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "returns directory_b" do
|
|
25
|
+
expect(template_path).to eq("directory_b")
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context "when template exists in directory_a" do
|
|
30
|
+
before(:each) do
|
|
31
|
+
allow_any_instance_of(described_class).to receive(:template?) do |path|
|
|
32
|
+
path == "directory_a"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it "returns directory_a" do
|
|
37
|
+
expect(template_path).to eq("directory_a")
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context "when template doesn't exist in directory_a or directory_b" do
|
|
42
|
+
it "returns default path" do
|
|
43
|
+
expect(template_path).to include("template")
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
after(:each) do
|
|
48
|
+
Onebox.options.load_paths.pop(2)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe "#to_html" do
|
|
53
|
+
class OneboxEngineLayout
|
|
54
|
+
include Onebox::Engine
|
|
55
|
+
|
|
56
|
+
def data
|
|
57
|
+
"new content"
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "reads from cache if rendered template is cached" do
|
|
62
|
+
described_class.new("amazon", record, cache).to_html
|
|
63
|
+
expect(cache).to receive(:fetch)
|
|
64
|
+
described_class.new("amazon", record, cache).to_html
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "contains layout template" do
|
|
68
|
+
expect(html).to include(%|class="onebox|)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "contains the view" do
|
|
72
|
+
record = { link: "foo" }
|
|
73
|
+
html = described_class.new("amazon", record, cache).to_html
|
|
74
|
+
expect(html).to include(%|"foo"|)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -1,20 +1,5 @@
|
|
|
1
1
|
require "spec_helper"
|
|
2
2
|
|
|
3
3
|
describe Onebox::Matcher do
|
|
4
|
-
describe "#oneboxed" do
|
|
5
|
-
it "returns Example onebox when given example url" do
|
|
6
|
-
matcher = described_class.new("http://example.com")
|
|
7
|
-
expect(matcher.oneboxed).to be(Onebox::Engine::ExampleOnebox)
|
|
8
|
-
end
|
|
9
4
|
|
|
10
|
-
it "returns Amazon onebox when given amazon url" do
|
|
11
|
-
matcher = described_class.new("http://amazon.com")
|
|
12
|
-
expect(matcher.oneboxed).to be(Onebox::Engine::AmazonOnebox)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
it "returns Flickr onebox when given flickr url" do
|
|
16
|
-
matcher = described_class.new("http://flickr.com")
|
|
17
|
-
expect(matcher.oneboxed).to be(Onebox::Engine::FlickrOnebox)
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
5
|
end
|
|
@@ -1,23 +1,53 @@
|
|
|
1
1
|
require "spec_helper"
|
|
2
2
|
|
|
3
3
|
describe Onebox::Preview do
|
|
4
|
-
|
|
4
|
+
|
|
5
|
+
before do
|
|
6
|
+
fake("http://www.amazon.com", response("amazon"))
|
|
7
|
+
FakeWeb.register_uri(:get, "http://www.amazon.com/404-url", status: 404)
|
|
8
|
+
FakeWeb.register_uri(:get, "http://www.amazon.com/500-url", status: 500)
|
|
9
|
+
FakeWeb.register_uri(:get, "http://www.amazon.com/error-url", status: 500)
|
|
10
|
+
FakeWeb.register_uri(:get, "http://www.amazon.com/timeout-url", exception: Timeout::Error)
|
|
11
|
+
FakeWeb.register_uri(:get, "http://www.amazon.com/http-error", exception: Net::HTTPError)
|
|
12
|
+
FakeWeb.register_uri(:get, "http://www.amazon.com/error-connecting", exception: Errno::ECONNREFUSED)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
let(:preview) { described_class.new("http://www.amazon.com") }
|
|
5
16
|
|
|
6
17
|
describe "#to_s" do
|
|
7
18
|
it "returns some html if given a valid url" do
|
|
8
|
-
|
|
9
|
-
preview
|
|
10
|
-
|
|
19
|
+
title = "Knit Noro: Accessories"
|
|
20
|
+
expect(preview.to_s).to include(title)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "returns an empty string if the resource is missing" do
|
|
24
|
+
expect(described_class.new("http://www.amazon.com/404-url").to_s).to eq("")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "returns an empty string if the resource returns an error" do
|
|
28
|
+
expect(described_class.new("http://www.amazon.com/500-url").to_s).to eq("")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "returns an empty string if the resource times out" do
|
|
32
|
+
expect(described_class.new("http://www.amazon.com/timeout-url").to_s).to eq("")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "returns an empty string if there is an http error" do
|
|
36
|
+
expect(described_class.new("http://www.amazon.com/http-error").to_s).to eq("")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "returns an empty string if there is an error connecting" do
|
|
40
|
+
expect(described_class.new("http://www.amazon.com/error-connecting").to_s).to eq("")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "returns an empty string if the url is not valid" do
|
|
44
|
+
expect(described_class.new('not a url').to_s).to eq("")
|
|
11
45
|
end
|
|
12
|
-
it "returns an empty string if the resource is not found"
|
|
13
|
-
it "returns an empty string if the resource fails to load"
|
|
14
|
-
it "returns an empty string if the url is not valid"
|
|
15
46
|
end
|
|
16
47
|
|
|
17
48
|
describe "#engine" do
|
|
18
49
|
it "returns an engine" do
|
|
19
|
-
preview
|
|
20
|
-
expect(preview.send(:engine)).to be_a(Onebox::Engine)
|
|
50
|
+
expect(preview.send(:engine)).to be_an(Onebox::Engine)
|
|
21
51
|
end
|
|
22
52
|
end
|
|
23
53
|
end
|
data/spec/lib/onebox_spec.rb
CHANGED
|
@@ -2,15 +2,14 @@ require "spec_helper"
|
|
|
2
2
|
|
|
3
3
|
describe Onebox do
|
|
4
4
|
describe ".preview" do
|
|
5
|
+
let(:url) { "http://www.amazon.com" }
|
|
5
6
|
it "creates a cache that responds as expected" do
|
|
6
|
-
url = "http://www.example.com"
|
|
7
7
|
preview = Onebox.preview(url)
|
|
8
8
|
cache = preview.cache
|
|
9
9
|
expect(cache).to respond_to(:key?, :store, :fetch)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
it "stores the value in cache if it doesn't exist" do
|
|
13
|
-
url = "http://www.example.com"
|
|
14
13
|
preview = Onebox.preview(url)
|
|
15
14
|
preview.to_s
|
|
16
15
|
cache = preview.cache
|
|
@@ -18,15 +17,15 @@ describe Onebox do
|
|
|
18
17
|
end
|
|
19
18
|
|
|
20
19
|
it "replaces the cache if the cache is expired" do
|
|
21
|
-
|
|
22
|
-
preview = Onebox.preview(url, cache: Moneta.new(:Memory, expires: 100000, serializer: :json))
|
|
20
|
+
preview = Onebox.preview(url, cache: Moneta.new(:Memory, expires: 100_000, serializer: :json))
|
|
23
21
|
cache = preview.cache
|
|
24
22
|
expect(cache.fetch(url)).to be(nil)
|
|
25
23
|
end
|
|
26
24
|
end
|
|
27
25
|
|
|
28
26
|
describe "templates" do
|
|
29
|
-
let(:
|
|
27
|
+
let(:ignored) { ["templates/_layout.mustache", "templates/githubgist.mustache"] }
|
|
28
|
+
let(:templates) { Dir["templates/*.mustache"] - ignored }
|
|
30
29
|
|
|
31
30
|
def expect_templates_to_not_match(text)
|
|
32
31
|
templates.each do |template|
|
|
@@ -34,16 +33,21 @@ describe Onebox do
|
|
|
34
33
|
end
|
|
35
34
|
end
|
|
36
35
|
|
|
37
|
-
it "should not contain any triple braces" do
|
|
38
|
-
expect_templates_to_not_match(/\{\{\{/)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
36
|
it "should not contain any script tags" do
|
|
42
37
|
expect_templates_to_not_match(/<script/)
|
|
43
38
|
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe 'has_matcher?' do
|
|
42
|
+
before do
|
|
43
|
+
Onebox::Engine::WhitelistedGenericOnebox.whitelist = %w(youtube.com)
|
|
44
|
+
end
|
|
45
|
+
it "has no matcher for a made up url" do
|
|
46
|
+
expect(Onebox.has_matcher?("http://wow.com/omg/doge")).to be_false
|
|
47
|
+
end
|
|
44
48
|
|
|
45
|
-
it "
|
|
46
|
-
|
|
49
|
+
it "has a matcher for a real site" do
|
|
50
|
+
expect(Onebox.has_matcher?("http://www.youtube.com/watch?v=azaIE6QSMUs")).to be_true
|
|
47
51
|
end
|
|
48
52
|
end
|
|
49
53
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -12,20 +12,76 @@ require 'mocha/api'
|
|
|
12
12
|
require_relative "support/html_spec_helper"
|
|
13
13
|
|
|
14
14
|
RSpec.configure do |config|
|
|
15
|
+
config.before(:all) do
|
|
16
|
+
FakeWeb.allow_net_connect = false
|
|
17
|
+
end
|
|
15
18
|
config.include HTMLSpecHelper
|
|
16
19
|
end
|
|
17
20
|
|
|
21
|
+
shared_context "engines" do
|
|
22
|
+
before(:each) do
|
|
23
|
+
fake(@uri || @link, response(described_class.onebox_name))
|
|
24
|
+
@onebox = described_class.new(@link)
|
|
25
|
+
@html = @onebox.to_html
|
|
26
|
+
@data = Onebox::Helpers.symbolize_keys(@onebox.send(:data))
|
|
27
|
+
end
|
|
28
|
+
before(:each) { Onebox.options.cache.clear }
|
|
29
|
+
|
|
30
|
+
let(:onebox) { @onebox }
|
|
31
|
+
let(:html) { @html }
|
|
32
|
+
let(:data) { @data }
|
|
33
|
+
let(:link) { @link }
|
|
34
|
+
|
|
35
|
+
def escaped_data(key)
|
|
36
|
+
CGI.escapeHTML(data[key])
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
18
40
|
shared_examples_for "an engine" do
|
|
19
|
-
it "
|
|
20
|
-
expect(described_class.private_instance_methods).to include(:data
|
|
41
|
+
it "responds to data" do
|
|
42
|
+
expect(described_class.private_instance_methods).to include(:data)
|
|
21
43
|
end
|
|
22
44
|
|
|
23
|
-
it "
|
|
24
|
-
expect
|
|
45
|
+
it "responds to record" do
|
|
46
|
+
expect(described_class.private_instance_methods).to include(:record)
|
|
25
47
|
end
|
|
26
48
|
|
|
27
49
|
it "correctly matches the url" do
|
|
28
50
|
onebox = Onebox::Matcher.new(link).oneboxed
|
|
29
51
|
expect(onebox).to be(described_class)
|
|
30
52
|
end
|
|
53
|
+
|
|
54
|
+
describe "#data" do
|
|
55
|
+
it "includes title" do
|
|
56
|
+
expect(data[:title]).not_to be_nil
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "includes link" do
|
|
60
|
+
expect(data[:link]).not_to be_nil
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
shared_examples_for "a layout engine" do
|
|
66
|
+
describe "#to_html" do
|
|
67
|
+
it "includes subname" do
|
|
68
|
+
expect(html).to include(%|<aside class="onebox #{described_class.onebox_name}">|)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "includes title" do
|
|
72
|
+
expect(html).to include(escaped_data(:title))
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "includes link" do
|
|
76
|
+
expect(html).to include(%|class="link" href="#{data[:link]}|)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "includes badge" do
|
|
80
|
+
expect(html).to include(%|<strong class="name">#{data[:badge]}</strong>|)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it "includes domain" do
|
|
84
|
+
expect(html).to include(%|class="domain" href="#{escaped_data(:domain)}|)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
31
87
|
end
|