diff options
Diffstat (limited to 'actionpack/test/dispatch/routing_assertions_test.rb')
-rw-r--r-- | actionpack/test/dispatch/routing_assertions_test.rb | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/actionpack/test/dispatch/routing_assertions_test.rb b/actionpack/test/dispatch/routing_assertions_test.rb new file mode 100644 index 0000000000..009b6d9bc3 --- /dev/null +++ b/actionpack/test/dispatch/routing_assertions_test.rb @@ -0,0 +1,209 @@ +# frozen_string_literal: true + +require "abstract_unit" +require "rails/engine" +require "controller/fake_controllers" + +class SecureArticlesController < ArticlesController; end +class BlockArticlesController < ArticlesController; end +class QueryArticlesController < ArticlesController; end + +class SecureBooksController < BooksController; end +class BlockBooksController < BooksController; end +class QueryBooksController < BooksController; end + +class RoutingAssertionsTest < ActionController::TestCase + def setup + engine = Class.new(Rails::Engine) do + def self.name + "blog_engine" + end + end + engine.routes.draw do + resources :books + + scope "secure", constraints: { protocol: "https://" } do + resources :books, controller: "secure_books" + end + + scope "block", constraints: lambda { |r| r.ssl? } do + resources :books, controller: "block_books" + end + + scope "query", constraints: lambda { |r| r.params[:use_query] == "true" } do + resources :books, controller: "query_books" + end + end + + @routes = ActionDispatch::Routing::RouteSet.new + @routes.draw do + resources :articles + + scope "secure", constraints: { protocol: "https://" } do + resources :articles, controller: "secure_articles" + end + + scope "block", constraints: lambda { |r| r.ssl? } do + resources :articles, controller: "block_articles" + end + + scope "query", constraints: lambda { |r| r.params[:use_query] == "true" } do + resources :articles, controller: "query_articles" + end + + mount engine => "/shelf" + + get "/shelf/foo", controller: "query_articles", action: "index" + end + end + + def test_assert_generates + assert_generates("/articles", controller: "articles", action: "index") + assert_generates("/articles/1", controller: "articles", action: "show", id: "1") + end + + def test_assert_generates_with_defaults + assert_generates("/articles/1/edit", { controller: "articles", action: "edit" }, { id: "1" }) + end + + def test_assert_generates_with_extras + assert_generates("/articles", { controller: "articles", action: "index", page: "1" }, {}, { page: "1" }) + end + + def test_assert_recognizes + assert_recognizes({ controller: "articles", action: "index" }, "/articles") + assert_recognizes({ controller: "articles", action: "show", id: "1" }, "/articles/1") + end + + def test_assert_recognizes_with_extras + assert_recognizes({ controller: "articles", action: "index", page: "1" }, "/articles", page: "1") + end + + def test_assert_recognizes_with_method + assert_recognizes({ controller: "articles", action: "create" }, { path: "/articles", method: :post }) + assert_recognizes({ controller: "articles", action: "update", id: "1" }, { path: "/articles/1", method: :put }) + end + + def test_assert_recognizes_with_hash_constraint + assert_raise(Assertion) do + assert_recognizes({ controller: "secure_articles", action: "index" }, "http://test.host/secure/articles") + end + assert_recognizes({ controller: "secure_articles", action: "index", protocol: "https://" }, "https://test.host/secure/articles") + end + + def test_assert_recognizes_with_block_constraint + assert_raise(Assertion) do + assert_recognizes({ controller: "block_articles", action: "index" }, "http://test.host/block/articles") + end + assert_recognizes({ controller: "block_articles", action: "index" }, "https://test.host/block/articles") + end + + def test_assert_recognizes_with_query_constraint + assert_raise(Assertion) do + assert_recognizes({ controller: "query_articles", action: "index", use_query: "false" }, "/query/articles", use_query: "false") + end + assert_recognizes({ controller: "query_articles", action: "index", use_query: "true" }, "/query/articles", use_query: "true") + end + + def test_assert_recognizes_raises_message + err = assert_raise(Assertion) do + assert_recognizes({ controller: "secure_articles", action: "index" }, "http://test.host/secure/articles", {}, "This is a really bad msg") + end + + assert_match err.message, "This is a really bad msg" + end + + def test_assert_recognizes_with_engine + assert_recognizes({ controller: "books", action: "index" }, "/shelf/books") + assert_recognizes({ controller: "books", action: "show", id: "1" }, "/shelf/books/1") + end + + def test_assert_recognizes_with_engine_and_extras + assert_recognizes({ controller: "books", action: "index", page: "1" }, "/shelf/books", page: "1") + end + + def test_assert_recognizes_with_engine_and_method + assert_recognizes({ controller: "books", action: "create" }, { path: "/shelf/books", method: :post }) + assert_recognizes({ controller: "books", action: "update", id: "1" }, { path: "/shelf/books/1", method: :put }) + end + + def test_assert_recognizes_with_engine_and_hash_constraint + assert_raise(Assertion) do + assert_recognizes({ controller: "secure_books", action: "index" }, "http://test.host/shelf/secure/books") + end + assert_recognizes({ controller: "secure_books", action: "index", protocol: "https://" }, "https://test.host/shelf/secure/books") + end + + def test_assert_recognizes_with_engine_and_block_constraint + assert_raise(Assertion) do + assert_recognizes({ controller: "block_books", action: "index" }, "http://test.host/shelf/block/books") + end + assert_recognizes({ controller: "block_books", action: "index" }, "https://test.host/shelf/block/books") + end + + def test_assert_recognizes_with_engine_and_query_constraint + assert_raise(Assertion) do + assert_recognizes({ controller: "query_books", action: "index", use_query: "false" }, "/shelf/query/books", use_query: "false") + end + assert_recognizes({ controller: "query_books", action: "index", use_query: "true" }, "/shelf/query/books", use_query: "true") + end + + def test_assert_recognizes_raises_message_with_engine + err = assert_raise(Assertion) do + assert_recognizes({ controller: "secure_books", action: "index" }, "http://test.host/shelf/secure/books", {}, "This is a really bad msg") + end + + assert_match err.message, "This is a really bad msg" + end + + def test_assert_recognizes_continue_to_recoginize_after_it_tried_engines + assert_recognizes({ controller: "query_articles", action: "index" }, "/shelf/foo") + end + + def test_assert_routing + assert_routing("/articles", controller: "articles", action: "index") + end + + def test_assert_routing_raises_message + err = assert_raise(Assertion) do + assert_routing("/thisIsNotARoute", { controller: "articles", action: "edit", id: "1" }, { id: "1" }, {}, "This is a really bad msg") + end + + assert_match err.message, "This is a really bad msg" + end + + def test_assert_routing_with_defaults + assert_routing("/articles/1/edit", { controller: "articles", action: "edit", id: "1" }, { id: "1" }) + end + + def test_assert_routing_with_extras + assert_routing("/articles", { controller: "articles", action: "index", page: "1" }, {}, { page: "1" }) + end + + def test_assert_routing_with_hash_constraint + assert_raise(Assertion) do + assert_routing("http://test.host/secure/articles", controller: "secure_articles", action: "index") + end + assert_routing("https://test.host/secure/articles", controller: "secure_articles", action: "index", protocol: "https://") + end + + def test_assert_routing_with_block_constraint + assert_raise(Assertion) do + assert_routing("http://test.host/block/articles", controller: "block_articles", action: "index") + end + assert_routing("https://test.host/block/articles", controller: "block_articles", action: "index") + end + + def test_with_routing + with_routing do |routes| + routes.draw do + resources :articles, path: "artikel" + end + + assert_routing("/artikel", controller: "articles", action: "index") + assert_raise(Assertion) do + assert_routing("/articles", controller: "articles", action: "index") + end + end + end +end |