routing_test.rb 11.8 KB
require_relative "../test_helper"

class RoutingTest < ActionController::IntegrationTest

  def setup
    Domain.clear_cache
  end

  # home page
  ################################################################
  def test_homepage
    assert_routing('/', :controller => 'home', :action => 'index')
  end

  # user-targeted controllers (account/*, cms/*, customize/*)
  ################################################################
  def test_account_controller
    assert_routing('/account', :controller => 'account', :action => 'index')
  end

  def test_enterprise_registration_controller
    assert_routing('/enterprise_registration', :controller => 'enterprise_registration', :action => 'index')
    assert_routing('/enterprise_registration/lala', :controller => 'enterprise_registration', :action => 'lala')
  end

  def test_new_password
    assert_routing('/account/new_password/90dfhga7sadgd0as6saas', :controller => 'account', :action => 'new_password', :code => '90dfhga7sadgd0as6saas')
  end

  should 'ignore case for profiles' do
    assert_routing '/myprofile/ZE/cms', profile: 'ZE', controller: 'cms', action: 'index'
  end

  def test_cms
    assert_routing('/myprofile/ze/cms', :profile => 'ze', :controller => 'cms', :action => 'index')
  end

  def test_cms_when_identifier_has_a_dot
    assert_routing('/myprofile/ynternet.org/cms', :profile => 'ynternet.org', :controller => 'cms', :action => 'index')
  end

  def test_edit_template
    # FIXME: this is wrong
    assert_routing('/admin/edit_template', :controller => 'edit_template', :action => 'index')
  end

  def test_profile_editor
    assert_routing('/myprofile/ze', :profile => 'ze', :controller => 'profile_editor', :action => 'index')
  end

  def test_profile_editor_when_identifier_has_a_dot
    assert_routing('/myprofile/ynternet.org', :profile => 'ynternet.org', :controller => 'profile_editor', :action => 'index')
  end

  # environment administrative controllers (admin/*)
  ################################################################

  def test_admin_panel_controller
    assert_routing('/admin', :controller => 'admin_panel', :action => 'index')
  end

  def test_features_controller
    assert_routing('/admin/features', :controller => 'features', :action => 'index')
    assert_routing('/admin/features/update', :controller => 'features', :action => 'update')
  end

  def test_categories_management
    assert_routing('/admin/categories', :controller => 'categories', :action => 'index')
    assert_routing('/admin/categories/new', :controller => 'categories', :action => 'new')
    assert_routing('/admin/categories/edit/2', :controller => 'categories', :action => 'edit', :id => '2')
  end

  # platform administrative controllers (system/*)
  ################################################################

  # external public controllers
  ################################################################
  def test_content_viewer

    # profile root:
    assert_routing('/ze', :controller => 'content_viewer', :action => 'view_page', :profile => 'ze')

    # some non-root page
    assert_routing('/ze/work/2007', :controller => 'content_viewer', :action => 'view_page', :profile => 'ze', :page => 'work/2007')
  end

  def test_category_browser
    assert_routing('/cat/products/eletronics', :controller => 'search', :action => 'category_index', :category_path => 'products/eletronics')
  end

  #FIXME remove this if design_blocks is not going to be used; or uncomment otherwise;
  #def test_routing_to_controllers_inside_design_blocks_directory
  #  assert_routing('/block/cojones/favorite_links_profile/show/1', :profile => 'cojones', :controller => 'favorite_links_profile', :action => 'show', :id => '1')
  #  assert_routing('/block/cojones/favorite_links_profile/save', :profile => 'cojones', :controller => 'favorite_links_profile', :action => 'save')

  #  assert_routing('/block/cojones/list_block/show/1', :profile => 'cojones', :controller => 'list_block', :action => 'show', :id => '1')
  #end

  def test_tag_viewing
    assert_routing('/tag', :controller => 'search', :action => 'tags')
    assert_routing('/tag/umboraminhaporra', :controller => 'search', :action => 'tag', :tag => 'umboraminhaporra')
  end

  def test_view_tag_with_dot
    assert_routing('/tag/tag.withdot', :controller => 'search', :action => 'tag', :tag => 'tag.withdot')
  end

  def test_profile_routing
    assert_routing('/profile/ze', :controller => 'profile', :profile => 'ze', :action => 'index')
    assert_routing('/profile/ze/friends', :controller => 'profile', :profile => 'ze', :action => 'friends')
  end

  def test_profile_with_dot_routing
    assert_routing('/profile/ze.withdot', :controller => 'profile', :action => 'index', :profile => 'ze.withdot')
  end

  def test_profile_with_dash_routing
    assert_routing('/profile/ze-withdash', :controller => 'profile', :action => 'index', :profile => 'ze-withdash')
  end

  def test_profile_with_underscore_routing
    assert_routing('/profile/ze_with_underscore', :controller => 'profile', :action => 'index', :profile => 'ze_with_underscore')
  end

  def test_profile_route_for_tags_with_dot
    assert_routing('/profile/ze/tags/tag.withdot', :controller => 'profile', :profile => 'ze', :action => 'content_tagged', :id => 'tag.withdot')
  end

  def test_profile_with_tilde_routing
    assert_routing('/profile/ze~withtilde', :controller => 'profile', :action => 'index', :profile => 'ze~withtilde')
  end

  def test_search_routing
    assert_routing('/search', :controller => 'search', :action => 'index')
  end

  def test_search_filter_routing
    assert_routing('/search/filter/a/b', :controller => 'search', :action => 'filter', :category_path => 'a/b')
  end

  def test_assets_routing
    assert_routing('/search/assets/a/b/c', :controller => 'search', :action => 'assets', :category_path => 'a/b/c')
  end

  def test_content_view_with_dot
    assert_routing('/ze.withdot', :controller => 'content_viewer', :action => 'view_page', :profile => 'ze.withdot')
  end

  def test_content_view_with_dash
    assert_routing('/ze-withdash', :controller => 'content_viewer', :action => 'view_page', :profile => 'ze-withdash')
  end

  def test_content_view_with_underscore
    assert_routing('/ze_with_underscore', :controller => 'content_viewer', :action => 'view_page', :profile => 'ze_with_underscore')
  end

  def test_content_view_with_tilde_routing
    assert_routing('/ze~withtilde', :controller => 'content_viewer', :action => 'view_page', :profile => 'ze~withtilde')
  end

  def test_catalog_routing
    assert_routing('/catalog/colivre', :controller => 'catalog', :action => 'index', :profile => 'colivre')
  end

  def test_hosted_domain_routing
    user = create_user('testuser').person
    domain = Domain.new(:name => 'example.com').tap { |d| d.owner = user; d.save! }

    ActionDispatch::Request.any_instance.stubs(:host).returns('www.example.com')

    assert_routing('/work/free-software', :controller => 'content_viewer', :action =>  'view_page', :page => 'work/free-software' )
  end

  def test_root_of_hosted_domain
    user = create_user('testuser').person
    domain = Domain.new(:name => 'example.com').tap { |d| d.owner = user; d.save! }

    ActionDispatch::Request.any_instance.stubs(:host).returns('www.example.com')

    assert_routing('', :controller => 'content_viewer', :action =>  'view_page')
  end

  def test_profile_under_hosted_domain
    community = Community.create!(:identifier => 'testcomm', :name => "test community")
    domain = Domain.new(:name => 'example.com').tap { |d| d.owner = community; d.save! }

    ActionDispatch::Request.any_instance.stubs(:host).returns('www.example.com')

    assert_routing('/profile/testcomm/refuse_for_now', :controller => 'profile', :action =>  'refuse_for_now', :profile => 'testcomm')
  end

  def test_must_not_route_as_profile_hosted_domain_for_domains_registered_for_environments
    environment = Environment.default
    domain = Domain.new(:name => 'example.com').tap { |d| d.owner = environment; d.save! }
    ActionDispatch::Request.any_instance.stubs(:host).returns('www.example.com')

    assert_routing('/', :controller => 'home', :action =>  'index')
  end

  def test_myprofile_with_dot
    assert_routing('/myprofile/profile.withdot', :controller => 'profile_editor', :action => 'index', :profile => 'profile.withdot')
  end

  def test_contact_routing
    assert_routing('/contact/wintermute/new', :controller => 'contact', :action => 'new', :profile => 'wintermute')
  end

  # online documentation routes
  def test_doc_routing_with_section_and_topic
    assert_routing('/doc/admin/settings', :controller => 'doc', :action => 'topic', :section => 'admin', :topic => 'settings')
  end
  def test_doc_routing_with_section_only
    assert_routing('/doc/admin', :controller => 'doc', :action => 'section', :section => 'admin')
  end
  def test_doc_routing_root
    assert_routing('/doc', :controller => 'doc', :action => 'index')
  end

  def test_invite_routing
    assert_routing('/profile/colivre/invite/friends', :controller => 'invite', :action => 'invite_friends', :profile => 'colivre')
  end

  def test_chat_routing
    assert_routing('/chat', :controller => 'chat', :action => 'index')
    assert_routing('/chat/avatar/chemical-brothers', :controller => 'chat', :action => 'avatar', :id => 'chemical-brothers')
  end

  def test_plugins_generic_routes
    assert_routing('/plugin/foo/public_bar/play/1', {:controller => 'foo_plugin_public_bar', :action => 'play', :id => '1'})
    assert_routing('/profile/test/plugin/foo/profile_bar/play/1', {:controller => 'foo_plugin_profile_bar', :action => 'play', :id => '1', :profile => 'test'})
    assert_routing('/myprofile/test/plugin/foo/myprofile_bar/play/1', {:controller => 'foo_plugin_myprofile_bar', :action => 'play', :id => '1', :profile => 'test'})
    assert_routing('/admin/plugin/foo/admin_bar/play/1', {:controller => 'foo_plugin_admin_bar', :action => 'play', :id => '1'})
  end

  def test_not_found_images_on_nothing
    assert_recognizes({:controller => 'not_found', :action => 'nothing', :stuff => 'aksdhf'}, '/images/aksdhf')
  end

  def test_not_found_stylesheets_on_nothing
    assert_recognizes({:controller => 'not_found', :action => 'nothing', :stuff => 'aksdhf'}, '/stylesheets/aksdhf')
  end

  def test_not_found_designs_on_nothing
    assert_recognizes({:controller => 'not_found', :action => 'nothing', :stuff => 'aksdhf'}, '/designs/aksdhf')
  end

  def test_not_found_articles_on_nothing
    assert_recognizes({:controller => 'not_found', :action => 'nothing', :stuff => 'aksdhf'}, '/articles/aksdhf')
  end

  def test_not_found_javascripts_on_nothing
    assert_recognizes({:controller => 'not_found', :action => 'nothing', :stuff => 'aksdhf'}, '/javascripts/aksdhf')
  end

  def test_not_found_thumbnails_on_nothing
    assert_recognizes({:controller => 'not_found', :action => 'nothing', :stuff => 'aksdhf'}, '/thumbnails/aksdhf')
  end

  def test_not_found_user_themes_on_nothing
    assert_recognizes({:controller => 'not_found', :action => 'nothing', :stuff => 'aksdhf'}, '/user_themes/aksdhf')
  end

  should 'have route to versions of an article' do

    assert_routing('/ze/work/free-software/versions', :controller => 'content_viewer', :action => 'article_versions', :profile => 'ze', :page => 'work/free-software')
  end

  should 'have route to versions of an article if profile has domain' do
    user = create_user('testuser').person
    domain = Domain.create!(:name => 'example.com', :owner => user)

    assert_routing('http://www.example.com/work/free-software/versions', :controller => 'content_viewer', :action =>  'article_versions', :page => 'work/free-software')
  end

  should 'have route to get HTML code of Blocks to embed' do
    assert_routing('/embed/block/12345', :controller => 'embed', :action => 'block', :id => '12345')
  end

  should 'accept ~ as placeholder for current user' do
    assert_routing('/profile/~', :controller => 'profile', :profile => '~', :action => 'index')
  end

end