diff options
Diffstat (limited to 'actionpack/test/journey/route_test.rb')
-rw-r--r-- | actionpack/test/journey/route_test.rb | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/actionpack/test/journey/route_test.rb b/actionpack/test/journey/route_test.rb new file mode 100644 index 0000000000..a8bf4a11e2 --- /dev/null +++ b/actionpack/test/journey/route_test.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true + +require "abstract_unit" + +module ActionDispatch + module Journey + class TestRoute < ActiveSupport::TestCase + def test_initialize + app = Object.new + path = Path::Pattern.from_string "/:controller(/:action(/:id(.:format)))" + defaults = {} + route = Route.build("name", app, path, {}, [], defaults) + + assert_equal app, route.app + assert_equal path, route.path + assert_same defaults, route.defaults + end + + def test_route_adds_itself_as_memo + app = Object.new + path = Path::Pattern.from_string "/:controller(/:action(/:id(.:format)))" + defaults = {} + route = Route.build("name", app, path, {}, [], defaults) + + route.ast.grep(Nodes::Terminal).each do |node| + assert_equal route, node.memo + end + end + + def test_path_requirements_override_defaults + path = Path::Pattern.build(":name", { name: /love/ }, "/", true) + defaults = { name: "tender" } + route = Route.build("name", nil, path, {}, [], defaults) + assert_equal(/love/, route.requirements[:name]) + end + + def test_ip_address + path = Path::Pattern.from_string "/messages/:id(.:format)" + route = Route.build("name", nil, path, { ip: "192.168.1.1" }, [], + controller: "foo", action: "bar") + assert_equal "192.168.1.1", route.ip + end + + def test_default_ip + path = Path::Pattern.from_string "/messages/:id(.:format)" + route = Route.build("name", nil, path, {}, [], + controller: "foo", action: "bar") + assert_equal(//, route.ip) + end + + def test_format_with_star + path = Path::Pattern.from_string "/:controller/*extra" + route = Route.build("name", nil, path, {}, [], + controller: "foo", action: "bar") + assert_equal "/foo/himom", route.format( + controller: "foo", + extra: "himom") + end + + def test_connects_all_match + path = Path::Pattern.from_string "/:controller(/:action(/:id(.:format)))" + route = Route.build("name", nil, path, { action: "bar" }, [], controller: "foo") + + assert_equal "/foo/bar/10", route.format( + controller: "foo", + action: "bar", + id: 10) + end + + def test_extras_are_not_included_if_optional + path = Path::Pattern.from_string "/page/:id(/:action)" + route = Route.build("name", nil, path, {}, [], action: "show") + + assert_equal "/page/10", route.format(id: 10) + end + + def test_extras_are_not_included_if_optional_with_parameter + path = Path::Pattern.from_string "(/sections/:section)/pages/:id" + route = Route.build("name", nil, path, {}, [], action: "show") + + assert_equal "/pages/10", route.format(id: 10) + end + + def test_extras_are_not_included_if_optional_parameter_is_nil + path = Path::Pattern.from_string "(/sections/:section)/pages/:id" + route = Route.build("name", nil, path, {}, [], action: "show") + + assert_equal "/pages/10", route.format(id: 10, section: nil) + end + + def test_score + constraints = {} + defaults = { controller: "pages", action: "show" } + + path = Path::Pattern.from_string "/page/:id(/:action)(.:format)" + specific = Route.build "name", nil, path, constraints, [:controller, :action], defaults + + path = Path::Pattern.from_string "/:controller(/:action(/:id))(.:format)" + generic = Route.build "name", nil, path, constraints, [], {} + + knowledge = { "id" => true, "controller" => true, "action" => true } + + routes = [specific, generic] + + assert_not_equal specific.score(knowledge), generic.score(knowledge) + + found = routes.sort_by { |r| r.score(knowledge) }.last + + assert_equal specific, found + end + end + end +end |