mirror of
https://github.com/discourse/discourse.git
synced 2024-12-12 03:23:43 +08:00
8b67a534a0
Sometimes we get Maps URL containing a zoom level as a float (17.5z and not 17z) but this doesn’t work with our current onebox implementation. While Google accepts those float zoom levels, it removes automatically the floating part in the URL (thus when visiting a Maps URL containing 17.5z, the URL will be rewritten shortly after as 17z). When putting a float zoom level in an embedded URL, this actually breaks (Maps API returns a 400 error). This patch addresses the issue by allowing the onebox engine to match on a zoom level expressed as a float but we only keep the integer part thus rendering properly maps.
89 lines
3.8 KiB
Ruby
89 lines
3.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe Onebox::Engine::GoogleMapsOnebox do
|
|
URLS = {
|
|
short: {
|
|
test: "https://goo.gl/maps/rEG3D",
|
|
redirect: [302, :long],
|
|
expect:
|
|
"https://maps.google.de/maps?sll=40.689249,-74.0445&sspn=0.0062479,0.0109864&cid=4667599994556318251&q=Statue+of+Liberty+National+Monument&output=embed&dg=ntvb&ll=40.689249,-74.0445&spn=0.0062479,0.0109864",
|
|
},
|
|
long: {
|
|
test:
|
|
"https://www.google.de/maps/place/Statue+of+Liberty+National+Monument/@40.689249,-74.0445,17z/data=!3m1!4b1!4m2!3m1!1s0x89c25090129c363d:0x40c6a5770d25022b",
|
|
redirect: [301, :canonical],
|
|
expect:
|
|
"https://maps.google.de/maps?sll=40.689249,-74.0445&sspn=0.0062479,0.0109864&cid=4667599994556318251&q=Statue+of+Liberty+National+Monument&output=embed&dg=ntvb&ll=40.689249,-74.0445&spn=0.0062479,0.0109864",
|
|
},
|
|
canonical: {
|
|
test:
|
|
"https://maps.google.de/maps?sll=40.689249,-74.0445&sspn=0.0062479,0.0109864&cid=4667599994556318251&q=Statue+of+Liberty+National+Monument&output=classic&dg=ntvb",
|
|
expect:
|
|
"https://maps.google.de/maps?sll=40.689249,-74.0445&sspn=0.0062479,0.0109864&cid=4667599994556318251&q=Statue+of+Liberty+National+Monument&output=embed&dg=ntvb&ll=40.689249,-74.0445&spn=0.0062479,0.0109864",
|
|
},
|
|
custom: {
|
|
test: "https://www.google.com/maps/d/edit?mid=zPYyZFrHi1MU.kX85W_Y2y2_E",
|
|
expect: "https://www.google.com/maps/d/embed?mid=zPYyZFrHi1MU.kX85W_Y2y2_E",
|
|
},
|
|
streetview: {
|
|
test:
|
|
"https://www.google.com/maps/@46.414384,10.013947,3a,75y,232.83h,99.08t/data=!3m5!1e1!3m3!1s9WgYUb5quXDjqqFd3DWI6A!2e0!3e5?hl=de",
|
|
expect:
|
|
"https://www.google.com/maps/embed?pb=!3m2!2sen!4v0!6m8!1m7!1s9WgYUb5quXDjqqFd3DWI6A!2m2!1d46.414384!2d10.013947!3f232.83!4f9.908!5f0.75",
|
|
streetview: true,
|
|
},
|
|
unresolveable: {
|
|
test:
|
|
"https://www.google.com/maps/place/Den+Abattoir/@51.2285173,4.4336702,17.5z/data=!4m7!1m4!3m3!1s0x47c3f7a5ac48e237:0x63d716018f584a33!2zUGnDqXRyYWlu!3b1!3m1!1s0x0000000000000000:0xfbfac0c41c32471a",
|
|
redirect: [
|
|
302,
|
|
"https://www.google.com/maps/place/Den+Abattoir/@51.2285173,4.4336702,17.5z/data=!4m7!1m4!3m3!1s0x47c3f7a5ac48e237:0x63d716018f584a33!2zUGnDqXRyYWlu!3b1!3m1!1s0x0000000000000000:0xfbfac0c41c32471a?dg=dbrw&newdg=1",
|
|
],
|
|
expect:
|
|
"https://maps.google.com/maps?ll=51.2285173,4.4336702&z=17&output=embed&dg=ntvb&q=Den+Abattoir&cid=18157036796216755994",
|
|
},
|
|
satellite: {
|
|
test: "https://www.google.de/maps/@40.6894264,-74.0449146,758m/data=!3m1!1e3",
|
|
redirect: [
|
|
302,
|
|
"https://www.google.de/maps/@40.6894264,-74.0449146,758m/data=!3m1!1e3?dg=dbrw&newdg=1",
|
|
],
|
|
expect: "https://maps.google.com/maps?ll=40.6894264,-74.0449146&z=16&output=embed&dg=ntvb",
|
|
},
|
|
}
|
|
|
|
# Register URL redirects
|
|
before do
|
|
URLS.values.each do |t|
|
|
status, location = *t[:redirect]
|
|
location = URLS[location][:test] if location.is_a? Symbol
|
|
|
|
stub_request(:head, t[:test]).to_return(status: status, headers: { location: location })
|
|
end
|
|
end
|
|
|
|
# Prevent sleep from wasting our time when we test with strange redirects
|
|
subject do
|
|
described_class
|
|
.send(:allocate)
|
|
.tap do |obj|
|
|
obj.stubs(:sleep)
|
|
obj.send(:initialize, link)
|
|
end
|
|
end
|
|
|
|
let(:data) { Onebox::Helpers.symbolize_keys(subject.send(:data)) }
|
|
let(:link) { |example| URLS[example.metadata[:urltype] || :short][:test] }
|
|
|
|
include_context "an engine", urltype: :short
|
|
|
|
URLS.each do |kind, t|
|
|
it "processes #{kind.to_s} url correctly", urltype: kind do
|
|
expect(subject.url).to eq t[:expect]
|
|
expect(subject.streetview?).to t[:streetview] ? be_truthy : be_falsey
|
|
expect(subject.to_html).to include("<iframe")
|
|
expect(subject.placeholder_html).to include("placeholder-icon map")
|
|
end
|
|
end
|
|
end
|