openstreetmap-website/test/test_helper.rb
Andy Allan 2c21dd4906 Silence the simplecov output message
It's very rare for the information in this message to be useful or
actionable when running the tests, so it's best to silence the message.
2019-03-06 09:54:05 +01:00

174 lines
6.4 KiB
Ruby

require "coveralls"
Coveralls.wear!("rails")
# Override the simplecov output message, since it is mostly unwanted noise
module SimpleCov
module Formatter
class HTMLFormatter
def output_message(_result); end
end
end
end
# Output both the local simplecov html and the coveralls report
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
[SimpleCov::Formatter::HTMLFormatter,
Coveralls::SimpleCov::Formatter]
)
ENV["RAILS_ENV"] = "test"
require_relative "../config/environment"
require "rails/test_help"
require "webmock/minitest"
WebMock.disable_net_connect!(:allow_localhost => true)
module ActiveSupport
class TestCase
include FactoryBot::Syntax::Methods
include ActiveJob::TestHelper
##
# takes a block which is executed in the context of a different
# ActionController instance. this is used so that code can call methods
# on the node controller whilst testing the old_node controller.
def with_controller(new_controller)
controller_save = @controller
begin
@controller = new_controller
yield
ensure
@controller = controller_save
end
end
##
# work round minitest insanity that causes it to tell you
# to use assert_nil to test for nil, which is fine if you're
# comparing to a nil constant but not if you're comparing
# an expression that might be nil sometimes
def assert_equal_allowing_nil(exp, act, msg = nil)
if exp.nil?
assert_nil act, msg
else
assert_equal exp, act, msg
end
end
##
# for some reason assert_equal a, b fails when the relations are
# actually equal, so this method manually checks the fields...
def assert_relations_are_equal(a, b)
assert_not_nil a, "first relation is not allowed to be nil"
assert_not_nil b, "second relation #{a.id} is not allowed to be nil"
assert_equal a.id, b.id, "relation IDs"
assert_equal a.changeset_id, b.changeset_id, "changeset ID on relation #{a.id}"
assert_equal a.visible, b.visible, "visible on relation #{a.id}, #{a.visible.inspect} != #{b.visible.inspect}"
assert_equal a.version, b.version, "version on relation #{a.id}"
assert_equal a.tags, b.tags, "tags on relation #{a.id}"
assert_equal a.members, b.members, "member references on relation #{a.id}"
end
##
# for some reason assert_equal a, b fails when the ways are actually
# equal, so this method manually checks the fields...
def assert_ways_are_equal(a, b)
assert_not_nil a, "first way is not allowed to be nil"
assert_not_nil b, "second way #{a.id} is not allowed to be nil"
assert_equal a.id, b.id, "way IDs"
assert_equal a.changeset_id, b.changeset_id, "changeset ID on way #{a.id}"
assert_equal a.visible, b.visible, "visible on way #{a.id}, #{a.visible.inspect} != #{b.visible.inspect}"
assert_equal a.version, b.version, "version on way #{a.id}"
assert_equal a.tags, b.tags, "tags on way #{a.id}"
assert_equal a.nds, b.nds, "node references on way #{a.id}"
end
##
# for some reason a==b is false, but there doesn't seem to be any
# difference between the nodes, so i'm checking all the attributes
# manually and blaming it on ActiveRecord
def assert_nodes_are_equal(a, b)
assert_equal a.id, b.id, "node IDs"
assert_equal a.latitude, b.latitude, "latitude on node #{a.id}"
assert_equal a.longitude, b.longitude, "longitude on node #{a.id}"
assert_equal a.changeset_id, b.changeset_id, "changeset ID on node #{a.id}"
assert_equal a.visible, b.visible, "visible on node #{a.id}"
assert_equal a.version, b.version, "version on node #{a.id}"
assert_equal a.tags, b.tags, "tags on node #{a.id}"
end
##
# set request headers for HTTP basic authentication
def basic_authorization(user, pass)
@request.env["HTTP_AUTHORIZATION"] = format("Basic %{auth}", :auth => Base64.encode64("#{user}:#{pass}"))
end
##
# set request readers to ask for a particular error format
def error_format(format)
@request.env["HTTP_X_ERROR_FORMAT"] = format
end
##
# Used to check that the error header and the forbidden responses are given
# when the owner of the changset has their data not marked as public
def assert_require_public_data(msg = "Shouldn't be able to use API when the user's data is not public")
assert_response :forbidden, msg
assert_equal @response.headers["Error"], "You must make your edits public to upload new data", "Wrong error message"
end
##
# Not sure this is the best response we could give
def assert_inactive_user(msg = "an inactive user shouldn't be able to access the API")
assert_response :unauthorized, msg
# assert_equal @response.headers['Error'], ""
end
##
# Check for missing translations in an HTML response
def assert_no_missing_translations(msg = "")
assert_select "span[class=translation_missing]", false, "Missing translation #{msg}"
end
##
# execute a block with a given set of HTTP responses stubbed
def with_http_stubs(stubs_file)
stubs = YAML.load_file(File.expand_path("../http/#{stubs_file}.yml", __FILE__))
stubs.each do |url, response|
stub_request(:get, Regexp.new(Regexp.quote(url))).to_return(:status => response["code"], :body => response["body"])
end
yield
end
def stub_gravatar_request(email, status = 200, body = nil)
hash = ::Digest::MD5.hexdigest(email.downcase)
url = "https://www.gravatar.com/avatar/#{hash}?d=404"
stub_request(:get, url).and_return(:status => status, :body => body)
end
def stub_hostip_requests
# Controller tests and integration tests use different IPs
stub_request(:get, "https://api.hostip.info/country.php?ip=0.0.0.0")
stub_request(:get, "https://api.hostip.info/country.php?ip=127.0.0.1")
end
def email_text_parts(message)
message.parts.each_with_object([]) do |part, text_parts|
if part.content_type.start_with?("text/")
text_parts.push(part)
elsif part.multipart?
text_parts.concat(email_text_parts(part))
end
end
end
def sign_in_as(user)
stub_hostip_requests
visit login_path
fill_in "username", :with => user.email
fill_in "password", :with => "test"
click_on "Login", :match => :first
end
end
end