decidim-dev/lib/decidim/dev/test/map_server.rb
# frozen_string_literal: true
module Decidim
module Dev
module Test
# The test map server serves all map related requests for the app.
#
# Works as a rack middleware that is mounted to the Rails app during
# tests (at the decidim-dev module's engine).
class MapServer
def self.host
"http://#{hostname}:#{Capybara.server_port}"
end
def self.hostname
"maps.lvh.me"
end
def self.url(endpoint)
case endpoint
when :tiles
"#{host}/maptiles/{z}/{x}/{y}.png"
when :static
"#{host}/static"
when :autocomplete
"#{host}/photon_api"
end
end
def initialize(app)
@app = app
end
def call(env)
request = Rack::Request.new(env)
return @app.call(env) unless request.host == self.class.hostname
if (match = request.path.match(%r{^/maptiles/([0-9]+)/([0-9]+)/([0-9]+).png$}))
return serve_maptiles(request, { z: match[1], x: match[2], y: match[3] })
elsif request.path == "/static"
return serve_static(request)
elsif request.path == "/photon_api"
return serve_autocomplete(request)
end
not_found
end
private
def tile_image_content
@tile_image_content ||= File.read(Decidim::Dev.asset("icon.png"))
end
def serve_maptiles(_request, _properties)
[200, { "Content-Type" => "image/png" }, [tile_image_content]]
end
def serve_static(_request)
[200, { "Content-Type" => "image/png" }, [tile_image_content]]
end
def serve_autocomplete(_request)
photon_response = {
features: [
{
properties: {
name: "Park",
street: "Street1",
housenumber: "1",
postcode: "123456",
city: "City1",
state: "State1",
country: "Country1"
},
geometry: {
coordinates: [2.234, 1.123]
}
},
{
properties: {
street: "Street2",
postcode: "654321",
city: "City2",
country: "Country2"
},
geometry: {
coordinates: [4.456, 3.345]
}
},
{
properties: {
street: "Street3",
housenumber: "3",
postcode: "142536",
city: "City3",
country: "Country3"
},
geometry: {
coordinates: [6.678, 5.567]
}
}
]
}.tap do |response|
Decidim::Map::Provider::Autocomplete::Test.stubs.length.positive? &&
response[:features] = Decidim::Map::Provider::Autocomplete::Test.stubs
end
[
200,
{
"Content-Type" => "application/json",
"Access-Control-Allow-Origin" => "*"
},
[photon_response.to_json.to_s]
]
end
def not_found
[404, { "Content-Type" => "text/plain" }, ["Not found."]]
end
end
end
end
end