openstreetmap-website/test/test_helper.rb
Andy Allan 4d73706ff3 Refactor the gravatar email changes to use webmock stubbing
The main reason for doing this is to make the tests easier to read,
rather than having to look up both the gravatar fixture, and then
correlate that with the users fixture. Putting the expected response
code in the tests is much more explicit.
2016-10-30 11:06:35 +01:00

178 lines
6.6 KiB
Ruby

require "coveralls"
Coveralls.wear!("rails")
ENV["RAILS_ENV"] = "test"
require File.expand_path("../../config/environment", __FILE__)
require "rails/test_help"
require "webmock/minitest"
load "composite_primary_keys/fixtures.rb"
module ActiveSupport
class TestCase
include FactoryGirl::Syntax::Methods
# Load standard fixtures needed to test API methods
def self.api_fixtures
# print "setting up the api_fixtures"
fixtures :users, :user_roles
fixtures :changesets, :changeset_tags
fixtures :current_nodes, :nodes
set_fixture_class :current_nodes => Node
set_fixture_class :nodes => OldNode
fixtures :current_node_tags, :node_tags
set_fixture_class :current_node_tags => NodeTag
set_fixture_class :node_tags => OldNodeTag
fixtures :current_ways
set_fixture_class :current_ways => Way
fixtures :current_way_nodes, :current_way_tags
set_fixture_class :current_way_nodes => WayNode
set_fixture_class :current_way_tags => WayTag
fixtures :ways
set_fixture_class :ways => OldWay
fixtures :way_nodes, :way_tags
set_fixture_class :way_nodes => OldWayNode
set_fixture_class :way_tags => OldWayTag
fixtures :current_relations
set_fixture_class :current_relations => Relation
fixtures :current_relation_members, :current_relation_tags
set_fixture_class :current_relation_members => RelationMember
set_fixture_class :current_relation_tags => RelationTag
fixtures :relations
set_fixture_class :relations => OldRelation
fixtures :relation_members, :relation_tags
set_fixture_class :relation_members => OldRelationMember
set_fixture_class :relation_tags => OldRelationTag
fixtures :gpx_files, :gps_points, :gpx_file_tags
set_fixture_class :gpx_files => Trace
set_fixture_class :gps_points => Tracepoint
set_fixture_class :gpx_file_tags => Tracetag
fixtures :client_applications
fixtures :redactions
end
##
# 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
##
# 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 %s", 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
##
# set the raw body to be sent with a POST request
def content(c)
@request.env["RAW_POST_DATA"] = c.to_s
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
end
end